Разработка торговых агентов на основе RL с FinRL
FinRL — open-source фреймворк для Deep Reinforcement Learning в финансовых задачах. Унифицированный интерфейс: данные из Yahoo Finance/Alpaca/CCXT → gym-совместимая торговая среда → обучение DRL агентов (PPO/SAC/TD3/A2C) → бэктест → деплой. Разработан Columbia University.
Архитектура FinRL
Три слоя:
-
Data layer: FinRL DataProcessor — загрузка OHLCV из Yahoo Finance, Alpaca, Binance, CCXT. Вычисление технических индикаторов (MACD, RSI, Bollinger, CCI) через stockstats. Нормализация feature engineering.
-
Environment layer: Gym-совместимые среды — StockTradingEnv, StockPortfolioEnv, CryptoEnv. State space: цены + индикаторы + портфель. Action space: buy/sell/hold для каждого актива.
-
Agent layer: DRLAgent — wrapper над Stable Baselines3. Унифицированный API для PPO, A2C, DDPG, TD3, SAC.
from finrl.train import train
from finrl.test import test
from finrl.config import INDICATORS
# обучение
train(
start_date='2015-01-01',
end_date='2022-12-31',
ticker_list=["AAPL", "MSFT", "GOOGL", "AMZN", "TSLA"],
data_source='yahoofinance',
technical_indicator_list=INDICATORS,
drl_lib='stable_baselines3',
env='stock_trading',
model_name='ppo',
cwd='./ppo-portfolio',
total_timesteps=100000
)
# тест
test(
start_date='2023-01-01',
end_date='2024-12-31',
...
)
Торговая среда
State vector (для N активов):
[cash_balance, shares_held_1..N, close_1..N, MACD_1..N, RSI_1..N, CCI_1..N, ADX_1..N]
Размерность: 1 + N + N × (1 + num_indicators).
Action vector: Непрерывный: [-1, 1]^N, где -1 = max sell, +1 = max buy для каждого актива.
Дискретный: [0, 1, 2]^N (sell/hold/buy). Зависит от алгоритма.
Reward:
reward = portfolio_value[t+1] - portfolio_value[t]
# или
reward = log(portfolio_value[t+1] / portfolio_value[t]) # log-return
Transaction costs:
buy_cost_pct = 0.001 # 0.1% комиссия
sell_cost_pct = 0.001
slippage_pct = 0.0005 # проскальзывание
Особенности финансовых RL-сред
Non-stationarity: цены — нестационарный процесс. Решение: нормализация на скользящем окне, или обучение на returns вместо цен.
Temporal leakage: feature engineering нельзя использовать "будущие" данные. FinRL автоматически формирует lookback window правильно.
Sparse rewards: прибыль/убыток виден только при закрытии позиции. Intermediate rewards (unrealized PnL) ускоряют обучение но вносят bias.
Overfitting к историческим данным: train/val/test split по времени (не random). Walk-forward validation: обучение на [t0, t1] → тест на [t1, t2] → сдвиг окна.
Метрики оценки
from finrl.plot import backtest_stats
stats = backtest_stats(account_value=test_results)
# Annualized Return, Annualized Volatility
# Sharpe Ratio, Calmar Ratio, Max Drawdown
# Win Rate, Profit Factor
Сравнение с бенчмарком:
- Buy & Hold S&P500 — минимальный бенчмарк
- MVO (Mean-Variance Optimization) — классический портфельный подход
- Equal weight — 1/N allocation
Если агент не бьёт Buy & Hold — переобучение или неверная структура среды.
Избегание распространённых ошибок
Look-ahead bias: самая частая ошибка. Индикатор рассчитан на включение данных следующего дня → нереалистичные результаты. FinRL DataProcessor корректен в этом плане, но кастомные фичи требуют осторожности.
Survivorship bias: тестирование только на существующих сейчас акциях. Решение: использовать исторический состав индекса.
Нереалистичные транзакционные издержки: backtesting без commissions → реальная торговля с -30% к результатам.
Сроки: 8–16 недель
Базовый агент на 5–10 активах — 4 недели. Multi-asset портфель с feature engineering, walk-forward validation, интеграция с брокерским API — 12–16 недель.







