Настройка FinRL Meta для обучения на нескольких рынках
FinRL-Meta — расширение FinRL с поддержкой множества рынков: акции, крипто, форекс, фьючерсы. DataOps пайплайн для нормализации данных из разных источников. Meta-learning (MAML) для быстрой адаптации к новым рынкам.
Мультирыночная архитектура
from finrl.meta.data_processor import DataProcessor
# акции (Yahoo Finance)
dp_stocks = DataProcessor(data_source='yahoofinance',
start_date='2015-01-01',
end_date='2023-12-31')
df_stocks = dp_stocks.download_data(ticker_list=SP500_TICKERS)
# крипто (Binance)
dp_crypto = DataProcessor(data_source='binance',
start_date='2019-01-01',
end_date='2023-12-31')
df_crypto = dp_crypto.download_data(
ticker_list=['BTCUSDT', 'ETHUSDT', 'SOLUSDT']
)
# нормализация: единый feature space
df_stocks = dp_stocks.clean_data(df_stocks)
df_crypto = dp_crypto.clean_data(df_crypto)
Meta-Learning для быстрой адаптации
MAML (Model-Agnostic Meta-Learning): Агент учится "как учиться" на новом рынке за минимум шагов. Полезно при выходе на новый актив с малой историей.
# FinRL-Meta MAML setup (упрощённо)
meta_tasks = [
TradingTask(market='stocks', ticker='AAPL'),
TradingTask(market='stocks', ticker='MSFT'),
TradingTask(market='crypto', ticker='BTCUSDT'),
]
for meta_epoch in range(meta_epochs):
task_grads = []
for task in meta_tasks:
# fast adaptation: K шагов на задаче
adapted_params = inner_loop(task, K=5)
# оценка adapted policy
task_grads.append(compute_grad(task, adapted_params))
# meta update
meta_optimizer.step(sum(task_grads))
DataOps пайплайн
Нормализация между рынками:
- Цены: log-returns вместо абсолютных значений
- Объём: нормировка на скользящее среднее 20 дней
- Индикаторы: z-score нормализация в рамках скользящего окна
def normalize_multi_market(df):
df['log_return'] = np.log(df['close'] / df['close'].shift(1))
df['vol_ratio'] = df['volume'] / df['volume'].rolling(20).mean()
for col in ['rsi', 'macd', 'cci']:
rolling_mean = df[col].rolling(252).mean()
rolling_std = df[col].rolling(252).std()
df[f'{col}_norm'] = (df[col] - rolling_mean) / (rolling_std + 1e-8)
return df.dropna()
Обучение с несколькими рынками одновременно
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import SubprocVecEnv
def make_market_env(df, market_type):
return lambda: FinRLMetaEnv(df, market_type=market_type)
envs = SubprocVecEnv([
make_market_env(df_stocks_train, 'stocks'),
make_market_env(df_crypto_train, 'crypto'),
make_market_env(df_forex_train, 'forex'),
make_market_env(df_futures_train, 'futures'),
] * 2) # 8 параллельных сред
model = PPO("MlpPolicy", envs, verbose=1)
model.learn(total_timesteps=5_000_000)
Агент видит рыночный тип как feature → учится адаптировать поведение.
Оценка генерализации
Walk-forward по каждому рынку отдельно + общий агрегированный Sharpe. Критерий: агент не должен превосходить специализированного агента более чем на 20% на знакомом рынке, но быть в пределах 10% на новом.
Сроки: 3–5 недель
Мультирыночный датапайплайн — 1 неделя. Обучение + валидация на 3+ рынках — 2–3 недели. Meta-learning адаптация — дополнительно 1–2 недели.







