Учебное пособие по использованию FinRL для торговли несколькими акциями в одном блокноте Jupyter | Представлено на NeurIPS 2020: Deep RL Workshop

Примечание редакторам Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не следует полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.

Этот блог представляет собой учебное пособие, основанное на нашей статье: FinRL: Библиотека глубокого обучения для автоматизированной торговли акциями в количественных финансах, представленной на NeurIPS 2020: Deep RL Workshop.



Коды записных книжек Jupyter доступны на наших Github и Google Colab.





Посетите наш предыдущий блог: FinRL для количественных финансов: Руководство по торговле отдельными акциями для подробного объяснения архитектуры и модулей FinRL.

Более полное применение FinRL для торговли несколькими акциями можно найти в нашем предыдущем блоге.

Обзор

Для начала я хотел бы объяснить логику торговли несколькими акциями с использованием глубокого обучения с подкреплением.

В этой статье мы используем компоненты Dow 30 в качестве примера, потому что это самые популярные акции.

Многие люди напуганы словом «глубокое обучение с подкреплением», на самом деле, вы можете просто рассматривать его как «умный ИИ», «умный торговец акциями» или «трейдер R2-D2», если хотите, и просто используйте его.

Предположим, у нас есть хорошо обученный агент DRL «DRL Trader», мы хотим использовать его для торговли несколькими акциями в нашем портфеле.

  1. Предположим, мы находимся в момент времени t, в конце дня в момент времени t, мы будем знать цену открытия-максимума-минимума-закрытия составляющих акций Dow 30. Мы можем использовать эту информацию для расчета технических индикаторов, таких как MACD, RSI, CCI, ADX. В обучении с подкреплением мы называем эти данные или функции состояниями.
  2. Мы знаем, что наша стоимость портфеля V (t) = баланс (t) + долларовая стоимость акций (t).
  3. Мы загружаем состояния в наш хорошо обученный трейдер DRL, трейдер выведет список действий, действие для каждой акции представляет собой значение в пределах [-1, 1], мы можем рассматривать это значение как торговый сигнал, 1 означает сильный сигнал на покупку, -1 означает сильный сигнал на продажу.
  4. Мы вычисляем k = actions * h_max, h_max - это предопределенный параметр, который задает максимальное количество акций для торговли. Таким образом, у нас будет список акций для торговли.
  5. Сумма акций в долларах = акции для торговли * цена закрытия (t).
  6. Обновите баланс и акции. Эта долларовая сумма акций - это деньги, которые нам нужны для торговли в момент времени t. Обновленный баланс = баланс (t) - сумма денег, которую мы платим за покупку акций + сумма денег, которую мы получаем за продажу акций. обновленные акции = акции (t) - акции для продажи + акции для покупки.
  7. Таким образом, мы предпринимаем действия для торговли на основе рекомендаций нашего трейдера DRL в конце дня в момент времени t (цена закрытия времени t равна цене открытия времени t + 1). Мы надеемся, что эти действия принесут нам пользу к концу дня в момент времени t + 1.
  8. Сделайте шаг ко времени t + 1, в конце дня мы узнаем цену закрытия в t + 1, долларовую сумму акций (t + 1) = сумма ( обновленные акции * цена закрытия (t + 1)). Стоимость портфеля V (t + 1) = баланс (t + 1) + долларовая стоимость акций (t + 1).
  9. Таким образом, ступенчатая награда за выполнение действий от DRL Trader в время от t до t + 1 составляет r = v (t + 1) - v (t). На этапе обучения награда может быть положительной или отрицательной. Но, конечно, нам нужно положительное вознаграждение в трейдинге, чтобы сказать, что наш DRL Trader эффективен.
  10. Повторяйте этот процесс до прекращения.

Ниже представлена ​​логическая диаграмма торговли несколькими акциями и вымышленный пример для демонстрации:

Торговля несколькими акциями отличается от торговли отдельными акциями, потому что по мере увеличения количества акций размер данных будет увеличиваться, а состояние и пространство действий в обучении с подкреплением будут расти в геометрической прогрессии. Так что здесь очень важны стабильность и воспроизводимость.

Мы представляем библиотеку DRL FinRL, которая помогает новичкам заниматься количественным финансированием и разрабатывать свои собственные стратегии торговли акциями.

FinRL отличается воспроизводимостью, масштабируемостью, простотой, применимостью и расширяемостью.

В этой статье рассматривается один из вариантов использования, описанных в нашей статье: Торговля несколькими акциями. Мы используем один блокнот Jupyter, чтобы включить все необходимые шаги.

Оглавление

  1. Определение проблемы
  2. Загрузить пакеты Python
  3. Скачать данные
  4. Предварительная обработка данных
  5. Среда сборки
  6. Реализовать алгоритмы DRL
  7. Бэктестирование производительности

Часть 1: Определение проблемы

Эта проблема состоит в том, чтобы разработать автоматическое торговое решение для торговли несколькими акциями. Мы моделируем процесс торговли акциями как Марковский процесс принятия решений (MDP). Затем мы формулируем нашу торговую цель как задачу максимизации.

Компоненты среды обучения с подкреплением:

  • Действие: {−k,…, −1, 0, 1,…, k}, где k обозначает количество акций. Для 30 акций все пространство действия составляет (2k + 1) ³⁰, в этой статье мы используем k≤h_max = 100, поэтому все пространство действия составляет около 10⁶⁰. Это означает, что мы можем выбрать максимум 10⁶⁰ пар комбинаций состояний и действий.
  • Состояние: {баланс, цена закрытия, акции, MACD, RSI, CCI, ADX}, 181-мерный вектор (30 акций * 6 + 1)
  • Функция вознаграждения: r (s, a, s ′) = v ′ - v, где v ′ и v представляют собой значения портфеля в состоянии s ′ и s соответственно.
  • Среда: торговля несколькими акциями компаний Dow 30.

Данные об акциях, входящих в Dow 30, которые мы будем использовать в этом тематическом исследовании, получены из Yahoo Finance API. Данные содержат цену и объем открытия-максимума-минимума-закрытия.

Часть 2. Начало работы - загрузка пакетов Python

Установите нестабильную разрабатываемую версию FinRL:

# Install the unstable development version in Jupyter notebook:
!pip install git+https://github.com/AI4Finance-Foundation/FinRL.git

Импортные пакеты:

Часть 3: Загрузить данные

FinRL использует класс YahooDownloader для извлечения данных.

class YahooDownloader:
    """Provides methods for retrieving daily stock data from
    Yahoo Finance API
Attributes
    ----------
        start_date : str
            start date of the data (modified from config.py)
        end_date : str
            end date of the data (modified from config.py)
        ticker_list : list
            a list of stock tickers (modified from config.py)
Methods
    -------
    fetch_data()
        Fetches data from yahoo API
"""

Загрузите и сохраните данные в фрейме данных pandas:

Часть 4: Предварительная обработка данных

FinRL использует класс FeatureEngineer для предварительной обработки данных.

class FeatureEngineer:
    """Provides methods for preprocessing the stock price data
Attributes
    ----------
        df: DataFrame
            data downloaded from Yahoo API
        feature_number : int
            number of features we used
        use_technical_indicator : boolean
            we technical indicator or not
        use_turbulence : boolean
            use turbulence index or not
Methods
    -------
    preprocess_data()
        main method to do the feature engineering
"""

Выполните проектирование функций:

Разделение данных по обучению и торговле:

В реальной торговле модель необходимо периодически обновлять с помощью скользящих окон. В этой статье мы просто один раз разрезаем данные на набор для обучения и торговли.

Часть 5: Среда сборки

FinRL использует класс EnvSetup для настройки среды.

class EnvSetup:
    """Provides methods for retrieving daily stock data from
    Yahoo Finance API
Attributes
    ----------
    stock_dim: int
        number of unique stocks
    hmax : int
        maximum number of shares to trade
    initial_amount: int
        start money
    transaction_cost_pct : float
        transaction cost percentage per trade
    reward_scaling: float
        scaling factor for reward, good for training
    tech_indicator_list: list
        a list of technical indicator names (modified from config.py)
Methods
    -------
    create_env_training()
        create env class for training
    create_env_validation()
        create env class for validation
    create_env_trading()
        create env class for trading
"""

Расчет пространства состояний и пространства действий:

Область действия - это просто количество уникальных акций 30. В этом примере пространство состояний - 181.

Инициализировать класс среды:

Пользовательская среда: класс среды моделирования.

В случае торговли несколькими акциями среда для обучения и торговли различается.

Обучение против. Торговля: индекс турбулентности используется как сигнал неприятия риска после действий, генерируемых алгоритмами DRL. Индекс турбулентности не следует включать в обучение, потому что он не является частью обучения модели, поэтому только торговая среда должна включать сигнал неприятия риска.

FinRL предоставляет схему обучения и торговли при торговле несколькими акциями.

Часть 6: Реализация алгоритмов DRL

FinRL использует класс DRLAgent для реализации алгоритмов.

class DRLAgent:
    """Provides implementations for DRL algorithms
Attributes
    ----------
    env: gym environment class
         user-defined class
Methods
    -------
    train_PPO()
        the implementation for PPO algorithm
    train_A2C()
        the implementation for A2C algorithm
    train_DDPG()
        the implementation for DDPG algorithm
    train_TD3()
        the implementation for TD3 algorithm 
    train_SAC()
        the implementation for SAC algorithm
    DRL_prediction() 
        make a prediction in a test dataset and get results
    """

Модельное обучение:

Мы используем Soft Actor-Critic (SAC) для торговли несколькими акциями, потому что это один из самых последних современных алгоритмов. SAC отличается своей стабильностью.

Торговля:

Предположим, что у нас есть начальный капитал в размере 1 000 000 долларов на 01.01.2019. Мы используем модель SAC для торговли акциями Dow 30.

Часть 7: Тестирование производительности

FinRL использует набор функций для тестирования на истории с квантопическим портфолио.

Левая таблица - это статистика эффективности тестирования на истории, правая таблица - статистика эффективности индекса (DJIA).

Сюжеты:

Заключение

Вклад FinRL:

  • FinRL - это библиотека с открытым исходным кодом, специально разработанная и реализованная для количественного финансирования. Используются и предоставляются торговые среды, учитывающие рыночные трения.
  • Торговые задачи, сопровождаемые практическими учебными пособиями со встроенными агентами DRL, доступны в удобной для новичков и воспроизводимой форме с использованием Jupyter notebook. Возможна настройка временных шагов торговли.
  • FinRL обладает хорошей масштабируемостью с широким спектром тонко настроенных современных алгоритмов DRL. Адаптация реализаций к быстро меняющемуся фондовому рынку хорошо поддерживается.
  • Выбираются типичные варианты использования, которые используются в качестве ориентира для финансового сообщества, занимающегося количественными исследованиями. Стандартные показатели тестирования и оценки также предоставляются для простой и эффективной оценки производительности.

Надеюсь, вы нашли эту статью полезной и узнали кое-что об использовании DRL для торговли несколькими акциями!

Пожалуйста, сообщайте о любых проблемах в наш Github.