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

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

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



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





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

Обзор

Для начала я хотел бы объяснить логику распределения портфелей с помощью Deep Reinforcement Learning.

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

Допустим, у нас есть миллион долларов в начале 2019 года. Мы хотим инвестировать этот 1 000 000 долларов в фондовые рынки, в данном случае 30 участников Dow Jones.

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

Мы нанимаем умного портфельного менеджера - г-на Глубокого обучения с подкреплением. Мистер DRL будет давать нам ежедневные советы, включая вес портфеля или пропорцию денег для инвестирования в эти 30 акций. Поэтому каждый день нам просто нужно перебалансировать вес портфеля акций.

Основная логика такова.

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

Традиционным и наиболее популярным способом распределения портфелей является средняя дисперсия или современная теория портфеля (MPT):

Однако MPT не так хорошо работает с данными вне выборки. MPT рассчитывается только на основе доходности акций, и если мы хотим принять во внимание другие соответствующие факторы, например, некоторые технические индикаторы, такие как MACD или RSI, MPT не сможет их объединить. информация вместе хорошо.

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

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

Оглавление

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

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

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

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

  • Действие: вес портфеля каждой акции находится в пределах [0,1]. Мы используем функцию softmax, чтобы нормализовать действия до суммы 1.
  • Состояние: {Матрица ковариации, MACD, RSI, CCI, ADX}, форма пространства состояний: (34, 30). 34 - количество строк, 30 - количество столбцов.
  • Функция вознаграждения: r (s, a, s ′) = p_t, p_t - совокупная стоимость портфеля.
  • Окружающая среда: распределение портфеля для участников Dow 30.

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

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

Часть 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
"""

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

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

Среда для распределения портфеля:

Часть 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
    """

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

Мы используем A2C для распределения портфелей, потому что это стабильно, рентабельно, быстрее и лучше работает с большими партиями.

Торговля:

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

Действия вывода или веса портфеля выглядят следующим образом:

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

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

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

Сюжеты:

Заключение

Вклад FinRL:

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

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

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

Использованная литература: