CodeAct AI-агент: Создание финансового трейдера на Python | Гайд | AiManual
AiManual Logo Ai / Manual.
28 Дек 2025 Гайд

CodeAct — темная лошадка среди AI-агентов. Собираем финансового трейдера на Python

Пошаговый гайд по созданию автономного финансового AI-агента на CodeAct и Python. MCP протокол, анализ рынка, автоматическая торговля.

Почему CodeAct — это темная лошадка в мире AI-агентов?

Пока все обсуждают LangChain, AutoGPT и CrewAI, на заднем плане тихо развивается CodeAct — фреймворк, который подходит к созданию AI-агентов с принципиально другой философией. Вместо сложных цепочек промптов и абстрактных "рассуждений", CodeAct делает ставку на исполняемый код как основной способ взаимодействия с миром.

Ключевое отличие CodeAct: агент не просто "думает" и "обсуждает" — он пишет, исполняет и проверяет код. Это делает его действия предсказуемыми, воспроизводимыми и, что самое важное, отлаживаемыми.

Для финансового трейдера это идеально. Рынок требует точности, повторяемости и минимальной энтропии. CodeAct позволяет создать агента, который:

  • Анализирует данные через реальные Python-библиотеки (pandas, numpy, ta-lib)
  • Тестирует стратегии на исторических данных
  • Выполняет торговые операции через API
  • Логирует каждое действие в понятном формате

Архитектура финансового агента: MCP протокол как основа

Сердце CodeAct — это Model Context Protocol (MCP). В отличие от других фреймворков, где контекст передается через промпты, MCP предоставляет агентам структурированный доступ к инструментам и данным. В нашем случае это:

Компонент MCPРоль в трейдереПример инструмента
Data ToolsПолучение рыночных данныхyfinance, Alpha Vantage API
Analysis ToolsТехнический анализTA-Lib, pandas_ta
Execution ToolsИсполнение ордеровAlpaca, Binance API
Monitoring ToolsМониторинг портфеляCustom dashboard, Telegram bot

Такой подход напоминает движок исполнения на LLM, но с акцентом на финансовую специфику. Агент не просто генерирует код — он работает в строго определенном контексте с предсказуемыми инструментами.

Пошаговый план: Собираем трейдера с нуля

1Установка и настройка CodeAct

Начнем с базовой установки. CodeAct работает поверх популярных LLM, но для финансовых задач рекомендую использовать модели с сильными математическими способностями.

# Клонируем репозиторий CodeAct
 git clone https://github.com/some/codeact.git
 cd codeact
 
 # Устанавливаем зависимости
 pip install -r requirements.txt
 
 # Устанавливаем дополнительные пакеты для финансов
 pip install yfinance pandas-ta alpaca-trade-api python-dotenv
💡
Для локального запуска можно использовать Ollama с моделью CodeLlama или DeepSeek-Coder. Для облачного решения подойдут OpenAI GPT-4 или Anthropic Claude 3.5 Sonnet с включенным tool calling.

2Создание MCP-сервера с финансовыми инструментами

MCP-сервер — это набор инструментов, которые будут доступны агенту. Создадим файл financial_tools.py:

import yfinance as yf
 import pandas_ta as ta
 from alpaca.trading.client import TradingClient
 from alpaca.trading.requests import MarketOrderRequest
 from alpaca.trading.enums import OrderSide, TimeInForce
 import os
 from dotenv import load_dotenv
 
 load_dotenv()
 
 class FinancialTools:
     def __init__(self):
         self.alpaca_client = TradingClient(
             os.getenv('ALPACA_API_KEY'),
             os.getenv('ALPACA_SECRET_KEY'),
             paper=True  # Торгуем на бумажном счете!
         )
     
     def get_stock_data(self, symbol: str, period: str = "1mo"):
         """Получить исторические данные по акции"""
         ticker = yf.Ticker(symbol)
         data = ticker.history(period=period)
         return data.to_dict('records')
     
     def calculate_indicators(self, data, symbol: str):
         """Рассчитать технические индикаторы"""
         df = pd.DataFrame(data)
         # RSI
         df['RSI'] = ta.rsi(df['Close'])
         # MACD
         macd = ta.macd(df['Close'])
         df['MACD'] = macd['MACD_12_26_9']
         df['MACD_signal'] = macd['MACDs_12_26_9']
         # SMA
         df['SMA_20'] = ta.sma(df['Close'], length=20)
         df['SMA_50'] = ta.sma(df['Close'], length=50)
         
         return df.tail(1).to_dict('records')[0]
     
     def execute_trade(self, symbol: str, qty: int, side: str):
         """Исполнить торговый ордер"""
         order_data = MarketOrderRequest(
             symbol=symbol,
             qty=qty,
             side=OrderSide.BUY if side == "buy" else OrderSide.SELL,
             time_in_force=TimeInForce.DAY
         )
         
         try:
             order = self.alpaca_client.submit_order(order_data)
             return {"status": "success", "order_id": order.id}
         except Exception as e:
             return {"status": "error", "message": str(e)}
     
     def get_portfolio(self):
         """Получить текущий портфель"""
         positions = self.alpaca_client.get_all_positions()
         return [{
             "symbol": p.symbol,
             "qty": float(p.qty),
             "current_price": float(p.current_price)
         } for p in positions]

ВАЖНО: Всегда используйте paper trading (демо-счет) на этапе разработки! Реальные торги подключайте только после тщательного тестирования на исторических данных.

3Интеграция инструментов в CodeAct агента

Теперь создадим самого агента, который будет использовать наши инструменты. Основная логика — агент анализирует рынок, принимает решения и исполняет их через MCP-инструменты.

from codeact.agent import CodeActAgent
 from financial_tools import FinancialTools
 import json
 
 class TradingAgent(CodeActAgent):
     def __init__(self, model="gpt-4", tools=None):
         super().__init__(model=model, tools=tools)
         self.financial_tools = FinancialTools()
         self.trading_strategy = "mean_reversion"  # Можно менять
         
     def analyze_market(self, symbols):
         """Анализ нескольких акций"""
         analysis_results = []
         
         for symbol in symbols:
             # Получаем данные
             data = self.financial_tools.get_stock_data(symbol, "1mo")
             # Рассчитываем индикаторы
             indicators = self.financial_tools.calculate_indicators(data, symbol)
             
             # Применяем торговую стратегию
             signal = self._generate_signal(indicators)
             
             analysis_results.append({
                 "symbol": symbol,
                 "indicators": indicators,
                 "signal": signal,
                 "timestamp": datetime.now().isoformat()
             })
         
         return analysis_results
     
     def _generate_signal(self, indicators):
         """Генерация торгового сигнала на основе индикаторов"""
         if self.trading_strategy == "mean_reversion":
             # Стратегия возврата к среднему
             current_price = indicators['Close']
             sma_20 = indicators['SMA_20']
             
             # Если цена ниже SMA на 2% - покупаем
             if current_price < sma_20 * 0.98:
                 return "BUY"
             # Если цена выше SMA на 2% - продаем
             elif current_price > sma_20 * 1.02:
                 return "SELL"
             else:
                 return "HOLD"
         
         elif self.trading_strategy == "momentum":
             # Моментная стратегия на основе RSI и MACD
             rsi = indicators['RSI']
             macd = indicators['MACD']
             macd_signal = indicators['MACD_signal']
             
             if rsi < 30 and macd > macd_signal:
                 return "BUY"
             elif rsi > 70 and macd < macd_signal:
                 return "SELL"
             else:
                 return "HOLD"
     
     def execute_trading_decisions(self, analysis_results):
         """Исполнение решений на основе анализа"""
         trades = []
         
         for analysis in analysis_results:
             if analysis["signal"] in ["BUY", "SELL"]:
                 # Определяем количество (упрощенная логика)
                 qty = 1  # В реальности здесь сложная логика управления капиталом
                 
                 # Исполняем ордер
                 result = self.financial_tools.execute_trade(
                     symbol=analysis["symbol"],
                     qty=qty,
                     side=analysis["signal"].lower()
                 )
                 
                 trades.append({
                     "symbol": analysis["symbol"],
                     "action": analysis["signal"],
                     "result": result
                 })
         
         return trades
     
     def run_daily_routine(self):
         """Ежедневная рутина агента"""
         # 1. Анализ watchlist
         watchlist = ["AAPL", "MSFT", "GOOGL", "AMZN", "TSLA"]
         analysis = self.analyze_market(watchlist)
         
         # 2. Исполнение решений
         trades = self.execute_trading_decisions(analysis)
         
         # 3. Отчет о портфеле
         portfolio = self.financial_tools.get_portfolio()
         
         return {
             "analysis": analysis,
             "trades_executed": trades,
             "portfolio": portfolio,
             "timestamp": datetime.now().isoformat()
         }

4Запуск и мониторинг агента

Создадим простой скрипт для запуска агента и планировщик для регулярного выполнения:

from trading_agent import TradingAgent
 from apscheduler.schedulers.blocking import BlockingScheduler
 import logging
 
 # Настройка логирования
 logging.basicConfig(
     level=logging.INFO,
     format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
     handlers=[
         logging.FileHandler('trading_agent.log'),
         logging.StreamHandler()
     ]
 )
 
 logger = logging.getLogger(__name__)
 
 def daily_trading_job():
     """Ежедневная задача торговли"""
     logger.info("Starting daily trading routine...")
     
     agent = TradingAgent(model="gpt-4")
     
     try:
         result = agent.run_daily_routine()
         logger.info(f"Trading completed: {len(result['trades_executed'])} trades executed")
         
         # Сохраняем результат
         with open(f"trading_results_{datetime.now().date()}.json", "w") as f:
             json.dump(result, f, indent=2)
             
     except Exception as e:
         logger.error(f"Trading job failed: {str(e)}")
 
 if __name__ == "__main__":
     # Запускаем сразу для теста
     daily_trading_job()
     
     # Или планируем на каждый торговый день в 10:00 AM
     scheduler = BlockingScheduler()
     scheduler.add_job(
         daily_trading_job,
         'cron',
         day_of_week='mon-fri',
         hour=10,
         minute=0
     )
     
     logger.info("Trading agent scheduler started. Press Ctrl+C to exit.")
     
     try:
         scheduler.start()
     except KeyboardInterrupt:
         logger.info("Scheduler stopped by user")

Критические нюансы и частые ошибки

Ошибка №1: Слишком частые запросы к API
Биржевые данные и торговые API имеют лимиты. Всегда добавляйте задержки между запросами и кэшируйте данные там, где это возможно.

Ошибка №2: Отсутствие риск-менеджмента
Агент должен учитывать не только потенциальную прибыль, но и риски. Реализуйте лимиты на размер позиций, стоп-лоссы и максимальный дневной убыток.

Ошибка №3: Переобучение на исторических данных
Стратегия, которая идеально работала в прошлом, может не сработать в будущем. Регулярно пересматривайте и адаптируйте торговые правила. Для более глубокого понимания работы с данными рекомендую гайд по прогнозированию акций.

Дальнейшее развитие: куда двигаться?

Ваш базовый трейдер готов, но это только начало. Вот направления для развития:

  1. Мультиагентная система: Создайте несколько специализированных агентов (аналитик, риск-менеджер, исполнитель), которые работают вместе
  2. Интеграция новостей: Добавьте анализ финансовых новостей через RAG-систему для учета фундаментальных факторов
  3. Бэктестинг: Реализуйте полноценную систему тестирования стратегий на исторических данных
  4. Визуализация: Создайте дашборд для мониторинга работы агента в реальном времени

Для тех, кто хочет углубиться в тему AI-агентов, рекомендую бесплатный курс от Kaggle и Google. А когда ваш трейдер начнет приносить прибыль, изучите интеграцию ML-моделей в продакшн.

FAQ: Ответы на частые вопросы

В: Насколько CodeAct лучше LangChain для финансовых задач?

О: CodeAct лучше там, где нужна точность и воспроизводимость. LangChain отлично подходит для исследовательских задач и быстрого прототипирования, но CodeAct дает больше контроля над исполняемым кодом, что критично для торговли.

В: Можно ли использовать этот агент для криптовалют?

О: Да, достаточно заменить Alpaca API на Binance, Bybit или другую криптобиржу. Логика анализа данных останется той же, изменятся только инструменты исполнения.

В: Сколько стоит запуск такого агента?

О: Основные затраты — это API ключи для данных и LLM. Для начала хватит $20-50 в месяц. Paper trading бесплатен, реальная торговля зависит от вашего капитала.

В: Какой минимальный уровень Python нужен?

О: Средний. Нужно понимать классы, асинхронное программирование, работу с API. Если вы новичок, начните с базовых скриптов на yfinance, затем переходите к CodeAct.

CodeAct открывает новые горизонты для создания автономных финансовых агентов. Его сила — в балансе между гибкостью AI и предсказуемостью кода. Начните с paper trading, оттачивайте стратегии, и только потом переходите к реальным деньгам. Удачи в торговле!