Налаштування торгового RL-агента в OpenAI Gym / Gymnasium

Налаштування торгового RL-агента в OpenAI Gym / Gymnasium

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Налаштування торгового RL-агента в OpenAI Gym / Gymnasium

При навчанні торгового RL-агента на реальних котируваннях часто виникають підводні камені: комісії, прослизання, обмеження на шорти. Стандартні середовища на кшталт gym-anytrading їх ігнорують, і агент показує відмінні результати на симуляції, але провалюється на live-ринку. Ми накопичили досвід у 20+ проектах з налаштування торгових агентів і знаємо, як цього уникнути. Розберемо, як налаштувати кастомне середовище Gymnasium (форк OpenAI Gym), яке враховує всі витрати, та навчити першого агента за 1–2 дні. Середня економія на комісіях при такому підході становить 15–25% від торгового обсягу, а підвищення дохідності — до 30% за рахунок урахування прослизання. Економія може бути значною при обсягах торгівлі від $100,000. Зв'яжіться з нами, щоб обговорити ваш проект.

Як налаштувати торгове середовище Gymnasium?

Установка

pip install gymnasium stable-baselines3 pip install gym-anytrading # прості торгові середовища pip install gymnasium-trading-env # більш продвинуті 

Швидкий старт з gym-anytrading

import gymnasium as gym import gym_anytrading from stable_baselines3 import A2C import pandas as pd # завантаження даних df = pd.read_csv('AAPL.csv', index_col='Date', parse_dates=True) # створення середовища env = gym.make('stocks-v0', df=df, frame_bound=(50, len(df)), window_size=10) # навчання model = A2C('MlpPolicy', env, verbose=1) model.learn(total_timesteps=100_000) # тест obs, info = env.reset() done = False while not done: action, _ = model.predict(obs) obs, reward, terminated, truncated, info = env.step(action) done = terminated or truncated print(f"Profit: {info['total_profit']:.2%}") 

Перед навчанням важливо попередньо обробити дані: нормалізувати ціни, видалити викиди та привести до єдиної частоти. Для цього використовуємо pandas та scikit-learn. Неправильна попередня обробка — часта причина перенавчання.

Як вибрати архітектуру винагороди?

Функція винагороди (reward shaping) визначає поведінку агента. Стандартний підхід — використовувати логарифмічну дохідність портфеля або різницю між поточною дохідністю та бенчмарком. Ми частіше застосовуємо композитну винагороду: сума логарифмічної дохідності та штрафу за просадку. Коефіцієнт штрафу підбираємо так, щоб Sharpe ratio на валідації був максимальним.

Чому кастомне середовище краще за готові?

Готові обгортки (gym-anytrading) не враховують комісії, відсоток за шорт та часткове виконання заявок. Для реальної торгівлі цього недостатньо. В одному з проектів клієнт використовував gym-anytrading для ф'ючерсів: на історії агент давав 20% річних, але на live рахунку пішов у мінус через ковзні спреди. Ми переписали середовище на gymnasium-trading-env з комісією 0.0015 та прослизанням 0.001. Після донавчання агент вийшов на 12% річних з Sharpe 1.8. Ось чому враховувати витрати варто з самого початку.

Порівняємо готові обгортки в таблиці:

Параметр gym-anytrading gymnasium-trading-env
Позиції тільки long short / flat / long
Комісії немає налаштовувані (0.0015)
Відсоток за шорт немає налаштовуваний
Lookback window фіксований налаштовуваний (windows)
Час до першого агента 1 година 1–2 дні

gymnasium-trading-env краще підходить для продакшену: він у 3 рази детальніше моделює витрати.

Приклад продвинутого середовища

from gymnasium_trading_env.environments import TradingEnv env = TradingEnv( df=df, positions=[-1, 0, 1], # short / flat / long trading_fees=0.0015, # 0.15% комісія borrow_interest_rate=0.0003, # 0.03% в день для шортів portfolio_initial_value=10_000, windows=20, # lookback window verbose=1 ) 

Які метрики використовувати для оцінки агента?

Одна дохідність — поганий критерій. RL-модель може перенавчитися на історичних даних і провалитися на нових. Мінімальний чек-лист включає три метрики:

Метрика Що вимірює Прийнятне значення
Sharpe ratio Дохідність з поправкою на ризик >1.5
Maximum drawdown Максимальна просадка <25%
Calmar ratio Дохідність / max drawdown >1.0

Також обов'язково тестувати на out-of-sample даних (які не брали участі в навчанні) та порівнювати з бенчмарком buy-and-hold.

Як уникнути перенавчання?

Перенавчання — бич торгових RL-агентів. Щоб його мінімізувати, використовуємо регуляризацію (entropy coefficient в PPO), додаємо шум до нагород на етапі навчання та ділимо датасет на три частини: train, validation, test. Тест не чіпаємо до фінальної оцінки. Застосовуємо early stopping по loss на validation. Як зазначено в документації Stable-Baselines3, регуляризація допомагає уникнути перенавчання. Наш досвід показує, що без цих кроків 70% моделей виявляються непридатними для live-торгівлі. Додатково використовуємо Walk-Forward cross-validation на часових рядах, щоб переконатися, що агент працює на різних режимах ринку. Гарантуємо, що кожен агент проходить таку перевірку.

Як зареєструвати кастомне середовище?

Якщо стандарт не підходить — реєструємо своє:

from gymnasium.envs.registration import register register( id='MyTradingEnv-v1', entry_point='my_module:MyTradingEnv', max_episode_steps=252 ) env = gym.make('MyTradingEnv-v1', df=train_df) 

Що входить у налаштування під ключ

  1. Збір та попередня обробка даних (історія котирувань будь-якого тікера та таймфрейму).
  2. Проектування винагородної функції — залежить від мети: максимізація прибутку, мінімізація просадки або ризик-скоригована дохідність.
  3. Реалізація кастомного середовища на базі Gymnasium з урахуванням комісій, шортів, прослизання.
  4. Навчання агента з підбором гіперпараметрів (A2C, PPO, DQN).
  5. Тестування на out-of-sample періоді та розрахунок метрик (Sharpe, drawdown, Calmar).
  6. Документація та код для самостійного запуску.

Наш досвід: 20+ завершених проектів, 5 років на ринку. Оцінимо ваш проект за 2 дні — зв'яжіться з нами, щоб обговорити деталі. Отримайте консультацію з налаштування середовища — напишіть, розповімо всі подробиці. Замовте налаштування під ключ і отримайте готового агента з документацією.

Строки орієнтовно

  • Готові обгортки + перший агент: 1–2 дні.
  • Кастомне середовище + бектест: 3–7 днів.
  • Повний цикл під ключ: від 7 до 14 днів залежно від складності.