📈

AI-агенты для финансового анализа: полный гайд

Создание агентов для анализа акций, криптовалют, финансовых отчётов и автоматической торговли с использованием LLM, Python и рыночных API. От парсинга новостей до предиктивных моделей.

advanced ⏱ 20 мин
Архитектура AI-агента финансового анализа Data Sources Yahoo Finance / Alpha Vantage NewsAPI / SEC EDGAR AI Agent CoreLLM + Function Calling LangChain Financial Tools Analysis Pipeline Technical Indicators Sentiment + Risk Scoring Slack Telegram PDF Reports + Dashboards

Архитектура: Data Sources → AI Agent Core → Analysis Pipeline → Output Channels

# 1. Установка и настройка окружения

Установим все необходимые библиотеки: 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
    

# 2. Инструменты для рыночных данных

Создаём набор инструментов для агента: получение котировок, финансовых показателей, новостей и исторических данных.

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]
    

# 3. Технический анализ и индикаторы

Добавляем функции расчёта технических индикаторов: 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
    

# 4. Анализ новостей и сентимента

Интегрируем новостной 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
    

# 5. Сборка финансового агента

Собираем агента на 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'])
    

# 6. Автоматическая отчётность и алерты

Добавляем генерацию 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 для автоматической торговли.

⚠️ Дисклеймер: данный материал носит образовательный характер. Торговля на финансовых рынках связана с риском потери капитала. Всегда консультируйтесь с лицензированным финансовым советником.