Почему 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-dotenv2Создание 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: Переобучение на исторических данных
Стратегия, которая идеально работала в прошлом, может не сработать в будущем. Регулярно пересматривайте и адаптируйте торговые правила. Для более глубокого понимания работы с данными рекомендую гайд по прогнозированию акций.
Дальнейшее развитие: куда двигаться?
Ваш базовый трейдер готов, но это только начало. Вот направления для развития:
- Мультиагентная система: Создайте несколько специализированных агентов (аналитик, риск-менеджер, исполнитель), которые работают вместе
- Интеграция новостей: Добавьте анализ финансовых новостей через RAG-систему для учета фундаментальных факторов
- Бэктестинг: Реализуйте полноценную систему тестирования стратегий на исторических данных
- Визуализация: Создайте дашборд для мониторинга работы агента в реальном времени
Для тех, кто хочет углубиться в тему 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, оттачивайте стратегии, и только потом переходите к реальным деньгам. Удачи в торговле!