Реализация AI-системы персонального инвестиционного портфеля
Типичный робоадвайзер предлагает стандартный набор ETF — но не учитывает, что вы хотите исключить нефтяные компании или запланировать крупную покупку через 3 года. Задача: автоматическая ребалансировка портфеля с учётом индивидуальных ограничений и налоговой оптимизации. Мы решили её через NLP-интерфейс на базе LLM, который понимает запросы на естественном языке и адаптируется под жизненные события. Наш опыт — более 5 лет в AI/ML, свыше 20 внедрённых финансовых решений.
Как AI обрабатывает ваш инвестиционный запрос?
Пользователь пишет: «Хочу инвестировать в AI-компании, но избежать Tesla». Система запускает цепочку: извлекает сектор (AI), исключение (TSLA), проверяет текущий портфель, предлагает конкретные действия. Модель использует chain-of-thought рассуждения для многошагового анализа.
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% от активов под управлением в год — это существенно при долгосрочном росте. Наш модуль автоматически высчитывает налог (13% НДФЛ) и предлагает продажи с расчётом выгоды. Например, при убытке в $5000 экономия на налогах достигает $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 месяцев в зависимости от сложности интеграции. Получите консультацию по внедрению уже сегодня.







