Реализация 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 месяцев в зависимости от сложности интеграции. Получите консультацию по внедрению уже сегодня.







