Создание агентов для анализа акций, криптовалют, финансовых отчётов и автоматической торговли с использованием LLM, Python и рыночных API. От парсинга новостей до предиктивных моделей.
Архитектура: Data Sources → AI Agent Core → Analysis Pipeline → Output Channels
Установим все необходимые библиотеки: LangChain для оркестрации агентов, yfinance для рыночных данных, OpenAI для LLM.
# Создаём виртуальное окружение python3 -m venv fin-agent && source fin-agent/bin/activate # Устанавливаем зависимости pip install langchain langchain-openai yfinance pandas numpy pip install python-dotenv streamlit plotly # .env файл echo 'OPENAI_API_KEY=sk-...' > .env
Создаём набор инструментов для агента: получение котировок, финансовых показателей, новостей и исторических данных.
from langchain.tools import tool import yfinance as yf import pandas as pd @tool def get_stock_price(ticker: str) -> dict: """Получить текущую цену и дневное изменение акции.""" stock = yf.Ticker(ticker) info = stock.info return { 'ticker': ticker, 'price': info.get('currentPrice'), 'change_pct': info.get('regularMarketChangePercent'), 'market_cap': info.get('marketCap') } @tool def get_financial_ratios(ticker: str) -> dict: """Получить ключевые финансовые показатели.""" stock = yf.Ticker(ticker) info = stock.info return { 'P/E': info.get('trailingPE'), 'EPS': info.get('trailingEps'), 'ROE': info.get('returnOnEquity'), 'Debt/Equity': info.get('debtToEquity'), 'Dividend Yield': info.get('dividendYield') } @tool def get_historical_data(ticker: str, period: str = '6mo') -> str: """Получить исторические данные за период.""" stock = yf.Ticker(ticker) hist = stock.history(period=period) return hist.tail(30).to_json() tools = [get_stock_price, get_financial_ratios, get_historical_data]
Добавляем функции расчёта технических индикаторов: SMA, RSI, MACD. Агент сможет определять тренды и сигналы входа/выхода.
import numpy as np @tool def calculate_technicals(ticker: str) -> dict: """Рассчитать RSI, MACD и скользящие средние.""" stock = yf.Ticker(ticker) df = stock.history(period='1y') close = df['Close'] # RSI (14-периодный) delta = close.diff() gain = delta.clip(lower=0).rolling(14).mean() loss = (-delta.clip(upper=0)).rolling(14).mean() rs = gain / loss rsi = 100 - (100 / (1 + rs)) # SMA 50/200 sma_50 = close.rolling(50).mean() sma_200 = close.rolling(200).mean() # MACD ema_12 = close.ewm(span=12).mean() ema_26 = close.ewm(span=26).mean() macd = ema_12 - ema_26 signal = macd.ewm(span=9).mean() latest = { 'RSI': round(rsi.iloc[-1], 2), 'SMA_50': round(sma_50.iloc[-1], 2), 'SMA_200': round(sma_200.iloc[-1], 2), 'MACD': round(macd.iloc[-1], 2), 'MACD_Signal': round(signal.iloc[-1], 2), 'Trend': 'BULLISH' if sma_50.iloc[-1] > sma_200.iloc[-1] else 'BEARISH' } return latest
Интегрируем новостной API и используем LLM для анализа тональности новостей — это критически важно для предсказания краткосрочных движений рынка.
from langchain_openai import ChatOpenAI import requests @tool def analyze_news_sentiment(ticker: str) -> str: """Анализ тональности последних новостей по тикеру.""" # Используем Alpha Vantage News API api_key = os.getenv('ALPHA_VANTAGE_KEY') url = f'https://www.alphavantage.co/query?function=NEWS_SENTIMENT&tickers={ticker}&apikey={api_key}' data = requests.get(url).json() llm = ChatOpenAI(model='gpt-4o', temperature=0) articles = data.get('feed', [])[:10] headlines = '\n'.join([a['title'] for a in articles]) prompt = f"""Проанализируй тональность новостей для {ticker}: {headlines} Выведи: общий сентимент (POSITIVE/NEGATIVE/NEUTRAL), ключевые темы, возможное влияние на цену (1-5).""" return llm.invoke(prompt).content
Собираем агента на LangChain с доступом ко всем инструментам. Агент сам решает, какой инструмент вызвать для ответа на вопрос пользователя.
from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # Системный промпт для финансового аналитика SYSTEM_PROMPT = """Ты — AI финансовый аналитик. Твои задачи: 1. Анализировать акции по тикеру, используя доступные инструменты 2. Рассчитывать технические индикаторы (RSI, MACD, SMA) 3. Оценивать сентимент новостей 4. Давать СБАЛАНСИРОВАННЫЙ анализ (и риски, и возможности) 5. ВСЕГДА добавлять дисклеймер: это не инвестиционная рекомендация. Формат ответа: структурированный анализ с секциями.""" prompt = ChatPromptTemplate.from_messages([ ('system', SYSTEM_PROMPT), ('user', '{input}'), MessagesPlaceholder(variable_name='agent_scratchpad') ]) llm = ChatOpenAI(model='gpt-4o', temperature=0.2) all_tools = [get_stock_price, get_financial_ratios, get_historical_data, calculate_technicals, analyze_news_sentiment] agent = create_openai_tools_agent(llm, all_tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=all_tools, verbose=True, max_iterations=8, handle_parsing_errors=True ) # Пример запроса result = agent_executor.invoke({ 'input': 'Проанализируй AAPL: цена, мультипликаторы, RSI, новостной фон и дай оценку перспектив' }) print(result['output'])
Добавляем генерацию PDF-отчётов и уведомления в Telegram при достижении заданных условий (цена, RSI-сигналы).
import asyncio from fpdf import FPDF import telegram async def daily_report(tickers: list): """Генерация ежедневного отчёта по списку тикеров.""" pdf = FPDF() pdf.add_page() pdf.set_font('Arial', 'B', 16) pdf.cell(0, 10, 'Daily Market Report', ln=True) analyses = [] for ticker in tickers: result = agent_executor.invoke({ 'input': f'Краткий анализ {ticker}: цена и рекомендация (2-3 предложения)' }) analyses.append({'ticker': ticker, 'analysis': result['output']}) # Сохраняем PDF pdf.output('/tmp/daily_report.pdf') # Отправляем в Telegram bot = telegram.Bot(token=os.getenv('TG_BOT_TOKEN')) await bot.send_message( chat_id=os.getenv('TG_CHAT_ID'), text=f'📊 Daily Report готов: {len(analyses)} тикеров' ) # Запуск по крону каждое утро # 0 9 * * 1-5 cd /opt/fin-agent && python3 daily_report.py
Мы создали полноценного AI-агента для финансового анализа, который умеет: получать рыночные данные через yfinance, рассчитывать технические индикаторы (RSI, MACD, SMA), анализировать сентимент новостей с помощью LLM, генерировать структурированные отчёты и отправлять алерты в Telegram. Агента можно расширить: добавить анализ криптовалют (CCXT), фундаментальный анализ (SEC EDGAR), бэктестинг стратегий, интеграцию с Alpaca/Interactive Brokers для автоматической торговли.
⚠️ Дисклеймер: данный материал носит образовательный характер. Торговля на финансовых рынках связана с риском потери капитала. Всегда консультируйтесь с лицензированным финансовым советником.