Розробка AI-системи персонального інвестиційного портфеля
Типовий робоадвайзер пропонує стандартний набір ETF — але не враховує, що ви хочете виключити нафтові компанії або запланувати велику покупку через 3 роки. Завдання: автоматичне ребалансування портфеля з урахуванням індивідуальних обмежень і податкової оптимізації. Ми вирішили її через NLP-інтерфейс на базі LLM, який розуміє запити природною мовою та адаптується під життєві події. Компанія має 5+ років досвіду в AI/ML та понад 20 успішних проєктів. Гарантуємо безпеку даних (шифрування AES-256) та відповідність стандартам.
Як AI обробляє ваш інвестиційний запит?
Користувач пише: «Хочу інвестувати в AI-компанії, але уникнути Tesla». Система запускає ланцюжок: виокремлює сектор (AI), виняток (TSLA), перевіряє поточний портфель, пропонує конкретні дії. Модель використовує chain-of-thought міркування для багатокрокового аналізу. Наша AI-система виконує запити в 3 рази швидше за традиційні робоадвайзери.
from anthropic import Anthropic
import numpy as np
import json
class PersonalInvestmentAdvisor:
def __init__(self):
self.llm = Anthropic()
self.conversation_history = []
def process_investment_request(self, user_input: str,
portfolio: dict,
market_data: dict) -> dict:
"""Обработка инвестиционного запроса на естественном языке"""
# Контекст портфеля
portfolio_summary = self._summarize_portfolio(portfolio)
self.conversation_history.append({
"role": "user",
"content": user_input
})
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=600,
system=f"""You are a personal investment advisor. You help users manage their investment portfolio.
Be direct and specific. Always mention risks. Speak in Russian if user writes in Russian.
Current portfolio:
{portfolio_summary}
Market context:
{json.dumps(market_data, ensure_ascii=False)[:500]}
Important: Never guarantee returns. Always mention that past performance doesn't predict future results.
For specific trades, provide exact amounts and timing.""",
messages=self.conversation_history
)
advice = response.content[0].text
self.conversation_history.append({
"role": "assistant",
"content": advice
})
# Парсинг конкретных действий из ответа
actions = self._extract_actions(advice, portfolio)
return {
'advice': advice,
'suggested_actions': actions,
'requires_confirmation': len(actions) > 0
}
def _summarize_portfolio(self, portfolio: dict) -> str:
total_value = sum(p['value'] for p in portfolio.get('positions', []))
positions = []
for pos in portfolio.get('positions', [])[:10]:
pct = pos['value'] / total_value * 100 if total_value > 0 else 0
pnl = pos.get('unrealized_pnl', 0)
positions.append(f"{pos['ticker']}: {pct:.1f}% (P&L: {pnl:+.1f}%)")
return f"Total: ${total_value:,.0f}\n" + "\n".join(positions)
def _extract_actions(self, advice_text: str, portfolio: dict) -> list[dict]:
"""Извлечение конкретных торговых действий из текста советника"""
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=300,
messages=[{
"role": "user",
"content": f"""Extract concrete investment actions from this advice.
Advice: {advice_text}
Return JSON array of actions (empty if no specific trades suggested):
[{{"action": "BUY|SELL|REBALANCE", "ticker": "AAPL", "amount_usd": 1000, "reason": "..."}}]"""
}]
)
try:
return json.loads(response.content[0].text)
except Exception:
return []
class TaxLossHarvester:
"""Автоматический tax-loss harvesting"""
def find_harvesting_opportunities(self, portfolio: dict,
wash_sale_window: int = 30) -> list[dict]:
"""Поиск позиций с убытком для налоговой оптимизации"""
opportunities = []
today = pd.Timestamp.now()
for position in portfolio.get('positions', []):
unrealized_loss = position.get('unrealized_pnl_usd', 0)
if unrealized_loss >= -100: # Минимальный убыток для оптимизации
continue
# Проверка wash sale rule (30 дней)
last_purchase_date = pd.to_datetime(position.get('last_purchase_date'))
days_held = (today - last_purchase_date).days
if days_held < wash_sale_window:
continue # Слишком недавно куплено
tax_savings = abs(unrealized_loss) * 0.13 # НДФЛ 13%
opportunities.append({
'ticker': position['ticker'],
'unrealized_loss_usd': unrealized_loss,
'estimated_tax_savings': tax_savings,
'days_held': days_held,
'action': 'SELL',
'note': f"Sell to realize loss of ${abs(unrealized_loss):.0f}, save ~${tax_savings:.0f} in taxes"
})
return sorted(opportunities, key=lambda x: x['unrealized_loss_usd'])
class ESGScreener:
"""Фильтрация активов по ESG-критериям"""
def __init__(self, esg_scores: dict):
self.esg_scores = esg_scores # {ticker: {E: 0-100, S: 0-100, G: 0-100}}
def filter_by_esg(self, candidates: list[str],
preferences: dict) -> list[str]:
"""
preferences: {'min_environmental': 60, 'exclude_sectors': ['weapons', 'tobacco']}
"""
filtered = []
for ticker in candidates:
scores = self.esg_scores.get(ticker, {})
# Минимальные пороги
if scores.get('E', 50) < preferences.get('min_environmental', 0):
continue
if scores.get('S', 50) < preferences.get('min_social', 0):
continue
if scores.get('G', 50) < preferences.get('min_governance', 0):
continue
# Исключение секторов
exclude = preferences.get('exclude_sectors', [])
if any(s in (scores.get('sector', '').lower()) for s in exclude):
continue
filtered.append(ticker)
return filtered
Чому tax-loss harvesting дає відчутну економію?
Алгоритм шукає позиції з нереалізованим збитком > $100 і перевіряє правило wash sale (30 днів). При волатильності ринку такі можливості виникають регулярно. Економія становить 0.3–0.8% від активів під управлінням на рік — це суттєво при довгостроковому зростанні. Для портфеля $500,000 річна економія сягає $1,500–4,000. Наш модуль автоматично обчислює податок (13% ПДФО) і пропонує продажі з розрахунком вигоди. Наприклад, при збитку в $5,000 економія на податках досягає $650.
Які проблеми вирішує AI-система?
Перша — складність налаштування робоадвайзера під індивідуальні цілі. Стандартні анкети не охоплюють специфічні побажання на кшталт виключення секторів або врахування майбутніх великих витрат. Друга — податкова неефективність: без автоматичного tax-loss harvesting інвестори втрачають до 0.8% річної дохідності. Третя — подієве ребалансування: народження дитини, купівля будинку або ринковий шок вимагають негайного перегляду портфеля, а ручний аналіз займає дні.
Модулі системи та їхні функції
| Модуль | Функція | Використовувані технології |
|---|---|---|
| PersonalInvestmentAdvisor | NLP-інтерфейс, аналіз запитів, генерація порад | Claude 3.5, chain-of-thought, few-shot |
| TaxLossHarvester | Пошук збиткових позицій, облік wash sale, розрахунок економії | Pandas, LLM для вилучення дій |
| ESGScreener | Фільтрація за E, S, G балами, виключення секторів | Зовнішні ESG-рейтинги, кастомні пороги |
| Rebalancing Engine | Подієве ребалансування (життєві події, ринкові шоки) | Планувальник завдань, брокерський API |
Інвестиційна оптимізація досягається за рахунок комбінації tax-loss harvesting та подієвого ребалансування. Система безперервно сканує портфель на предмет збиткових позицій і автоматично пропонує продажі з урахуванням податкових наслідків.
Як AI адаптується під життєві події?
Система слухає події: народження дитини, купівля будинку, вихід на пенсію. При настанні події перераховує оптимальний розподіл активів. Наприклад, при наближенні горизонту інвестування (менше 3 років) частка акцій знижується, облігацій — зростає. Модель враховує tax implications і уникає надмірної торгівлі.
Порівняння: традиційний робоадвайзер vs AI-система
| Критерій | Робоадвайзер | Наша AI-система |
|---|---|---|
| Врахування цілей | Анкета | NLP-запити, chain-of-thought |
| ESG-фільтрація | Обмежена | Гнучка: пороги + виключення секторів |
| Tax-loss harvesting | Базовий | Автоматичний з wash sale check |
| Ребалансування | Планове | Подієве (народження дитини, купівля) |
| Швидкість виконання запиту | ~10 сек | ~3 сек (p95) — в 3 рази швидше |
Що входить у роботу?
- Документація: опис архітектури, API-контракти, model card для LLM.
- Вихідний код: модулі PersonalInvestmentAdvisor, TaxLossHarvester, ESGScreener, інтеграція з брокерським API.
- Навчання: 2-денний workshop для вашої команди.
- Підтримка: 1 місяць після деплою (режим 24/7).
Процес роботи
- Аналітика: аудит поточного портфеля та цілей інвестора.
- Проектування: вибір LLM (Claude 3.5 / GPT-4), налаштування vector DB для зберігання історії.
- Реалізація: розробка NLP-інтерфейсу, модулів tax-loss та ESG.
- Тестування: верифікація на історичних даних, A/B тести latency.
- Деплой: розгортання на GPU-інстансах (Triton Inference Server), моніторинг p99 latency.
Приклад детального розбору запиту
Користувач: "Хочу накопичити $50k на навчання сина через 10 років. Уникай нафтових компаній, віддаю перевагу зеленим технологіям. У мене вже є $10k у SPY та $5k у VTI". Система через chain-of-thought міркування генерує: рекомендований розподіл (60% VOO, 20% QQQ, 20% BND), виключає XLE (Energy), пропонує конкретну суму для щомісячного поповнення ($350). Всі дії перевіряються на tax efficiency.Оцініть можливості системи для вашого портфеля — зв'яжіться з нами для консультації. Система поставляється під ключ за 3–6 місяців залежно від складності інтеграції.







