Торговая стратегия RAG-DF

Недавно я наткнулся на статью в квантовых источниках о торговой стратегии для S&P, которая может конкурировать с Buy&Hold. В итоге я решил немного модифицировать его и применить к торговле BTC.

Что мне понравилось в стратегии, так это ее простота и то, что она основана на статистических данных и моделях временных рядов, которые я ежедневно использую в аналитике.

Коротко о моделях:

ARIMA (Авторегрессивная интегрированная скользящая средняя)

  • ARIMA — это модель временных рядов, используемая для прогнозирования значений на основе их прошлых значений. Модель состоит из трех компонентов:
  • AR (AutoRegressive): прогнозирование будущего значения на основе его зависимости от предыдущих значений временных рядов. Например, AR(1) прогнозирует текущее значение на основе предыдущего значения.
  • I (интегрированный): Количество раз, когда временной ряд должен быть дифференцирован, чтобы сделать его стационарным (т.е. его статистические свойства не изменяются со временем).
  • MA (Moving Average): Прогнозирование будущего значения на основе ошибок прогнозирования за прошлые периоды.

GARCH (Обобщенная авторегрессионная условная гетероскедастичность)

  • GARCH — это модель, используемая для прогнозирования волатильности временного ряда. Это особенно полезно для финансовых данных, где волатильность часто меняется с течением времени. Модель состоит из двух компонентов:
  • AR (AutoRegressive): прогнозирование текущей волатильности на основе прошлых значений волатильности.
  • MA (Moving Average): Прогнозирование текущей волатильности на основе прошлых ошибок прогнозирования волатильности.
  • GARCH позволяет учитывать «всплески волатильности», что делает его особенно полезным для анализа финансовых рынков.

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

Шаги в стратегии:

  1. Подготовка данных
  2. Прогнозирование с помощью ARIMA
  3. Прогнозирование волатильности с помощью GARCH
  4. Визуализация результатов

Подготовка данных

Загружаем библиотеки, которые нам понадобятся для нашей торговой стратегии:import yfinance as yf
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from arch import arch_model
import matplotlib.pyplot as plt
import pyfolio as pf

import warnings
warnings.filterwarnings(‘ignore’)

yfinance — это популярная библиотека Python, предназначенная для извлечения исторических данных о финансовых инструментах из Yahoo Finance.

Как им пользоваться? Чтобы загрузить данные о биткоинах с 2014 года, используйте функцию загрузки, где «BTC-USD» — тикер биткоина на Yahoo Finance:df = yf.download(‘BTC-USD’, start=’2014-01-01′)

Вычисление логарифмической доходности

Что это такое? Логарифмическая доходность — это мера изменения цены актива от одного периода к другому. Его часто используют в финансовом анализе благодаря удобным статистическим свойствам.

Почему это важно? Логарифмическая доходность учитывает процентное изменение цены, что делает ее более информативной, чем простое арифметическое изменение. Кроме того, логарифмическая доходность может быть суммирована, что полезно для расчета совокупной доходности.df[‘Returns’] = np.log(df[‘Close’] / df[‘Close’].shift(1))

Далее мы устанавливаем длину «окна» данных, которое мы будем использовать для прогнозирования, равной 90 дням. То есть для прогнозирования каждого нового дня мы будем использовать данные за предыдущие 90 дней. *Эти входные параметры могут варьироваться в зависимости от объема исторических данных о ценах.

И мы считаем, сколько дней останется для прогнозирования после вычитания длины окна.windowLength = 90
foreLength = len(df) — windowLength

Прогнозирование с помощью ARIMA

Для каждого временного окна мы стараемся выбрать наилучшую модель ARIMA, основанную на информационном критерии Акаике (AIC). AIC помогает нам определить, какая комбинация параметров ARIMA обеспечивает наилучший прогноз.

Важным элементом служит поиск подходящих параметров p и q для нашей модели.

p — Этот компонент основан на прошлых значениях временного ряда.

q — MA (Moving Average) — компонент основан на ошибках прогнозирования (или «шоках») прошлых периодов.

Прогнозирование волатильности с помощью GARCH

После выбора оптимальной модели ARIMA мы используем GARCH для прогнозирования волатильности. Это важно, потому что волатильность на финансовых рынках часто меняется.

В контексте GARCH-моделирования:

  • fore: Этот объект содержит результаты прогнозирования модели. Прогнозы GARCH обычно включают прогнозируемую волатильность и, возможно, прогнозируемые средние значения, особенно если модель включает средние условия (например, ARIMA+GARCH).
  • fore.mean: Атрибут среднего значения fore содержит прогнозируемые средние значения. В контексте финансовых временных рядов это может означать прогнозируемую среднюю доходность или изменение цен. Если бы вы использовали чистую GARCH-модель (без ARIMA или других средних моделей), вы бы прогнозировали только волатильность. Однако, если модель включает в себя как волатильность, так и средние значения (например, ARIMA+GARCH), у вас будут прогнозы как для средних значений, так и для волатильности.

Если полученное значение fore.mean отрицательное, то открываем сделку в направлении короткой продажи [-1]

Если значение положительное, берем длинное направление. [1]

Если модели ARIMA и GARCH не находят оптимальных значений, то по умолчанию торговля отсутствует. [0]

  • В коде это выглядит так:

try:
garch_model = arch_model(ReturnsOffset, vol=’Garch’, p=final_order[0], q=final_order[2], dist=’skewt’)
fit = garch_model.fit(disp=’off’)

# Forecasting
fore = fit.forecast(horizon=1)
if fore.mean.iloc[-1].item() < 0:
direction = -1
else:
direction = 1
forecasts.append((ReturnsOffset.index[-1], direction))
except:
forecasts.append((ReturnsOffset.index[-1], 0))

Заключительный шаг включает в себя расчет доходности стратегии, визуализацию эквити и сравнение с бенчмарком. Соответственно, я взял исторические данные за 2014–01–01 год.

ARIMA GARCH MODEL против Buy&Hold (биткоин с 2014 года)

Выглядит очень многообещающе по сравнению с обычным buy&hold.
Конечно, мы не учитываем комиссии, проскальзывание и многое другое.
Но есть еще много способов уточнить модель, используя разные параметры и модели машинного обучения

Ссылка на GitHub

Источник