Бэктестинг Mean Reversion стратегий на Python с VectorBT

Бэктестинг Mean Reversion стратегий на Python с VectorBT Анализ данных и Бэктесты
Пошаговое руководство по бэктестингу стратегии возврата к среднему (Mean Reversion) на парах криптовалют с использованием библиотеки VectorBT в Python.
Суть: Пошаговое руководство по реализации и векторному бэктестингу стратегии возврата к среднему (Mean Reversion) на базе полос Боллинджера для криптоактивов с использованием библиотеки VectorBT. Мы разберем быструю загрузку данных, генерацию сигналов лонг/шорт и оценку метрик портфеля.

Исходный код

Стратегии возврата к среднему (Mean Reversion) основаны на предположении, что цена актива имеет тенденцию возвращаться к своему историческому среднему значению после сильных отклонений. На волатильном криптовалютном рынке такие паттерны возникают регулярно. Однако классический бэктестинг на исторических данных часто упирается в производительность циклов Python.

Для решения этой проблемы мы используем VectorBT — сверхбыструю библиотеку для векторного бэктестинга, которая компилирует код в машинные инструкции с помощью Numba. Если вам требуется работать с терабайтами тиковых данных перед запуском симуляции, рекомендуем изучить статью Интеграция ArcticDB для хранения tick data в pandas.

Ниже представлен готовый скрипт для загрузки данных через Yahoo Finance API, расчета полос Боллинджера и проведения векторного бэктестинга для корзины криптовалют (BTC-USD, ETH-USD, SOL-USD).

import vectorbt as vbt
import numpy as np
import pandas as pd

# Загрузка исторических данных по криптовалютам
symbols = ['BTC-USD', 'ETH-USD', 'SOL-USD']
data = vbt.YFData.download(symbols, period='1y')
close = data.get('Close')

# Параметры стратегии Bollinger Bands
window = 20
num_std = 2.0

# Расчет индикатора BBANDS через VectorBT
bbands = vbt.BBANDS.run(close, window=window, alpha=num_std)

# Сигналы на вход и выход (Mean Reversion)
# Long: цена падает ниже нижней ленты (перепроданность)
entries = close < bbands.lower
# Exit Long: цена возвращается к средней линии
exits = close >= bbands.middle

# Short: цена поднимается выше верхней ленты (перекупленность)
short_entries = close > bbands.upper
# Exit Short: цена возвращается к средней линии
short_exits = close <= bbands.middle

# Симуляция портфеля с учетом комиссий
portfolio = vbt.Portfolio.from_signals(
    close=close,
    entries=entries,
    exits=exits,
    short_entries=short_entries,
    short_exits=short_exits,
    init_cash=10000.0,
    fees=0.001,  # 0.1% комиссия (стандарт для Binance)
    freq='1D'
)

# Вывод метрик эффективности
print(portfolio.stats())

Разбор параметров

  • symbols: Список тикеров криптовалют для одновременного мультивалютного бэктестинга. VectorBT автоматически векторизует вычисления по всем колонкам.
  • window: Период скользящей средней для расчета полос Боллинджера (по умолчанию 20 дней).
  • num_std: Количество стандартных отклонений для построения верхней и нижней границ (стандартное значение 2.0).
  • entries / short_entries: Булевы матрицы сигналов на вход. Вход в лонг происходит при пересечении нижней границы сверху вниз, вход в шорт — при пересечении верхней границы снизу вверх.
  • exits / short_exits: Сигналы на выход из позиций при достижении средней линии (возврат к среднему).
  • fees: Торговая комиссия за сделку. Установлена на уровне 0.1% (0.001), что соответствует базовому тарифу биржи Binance.

Как запустить

Для запуска бэктеста вам понадобятся установленные библиотеки vectorbt, yfinance, numpy и pandas. Установите их с помощью команды pip install vectorbt yfinance pandas numpy.

После запуска скрипт выведет детальную статистику по каждому активу, включая общую доходность (Total Return), коэффициент Шарпа (Sharpe Ratio) и максимальную просадку (Max Drawdown). Помните, что торговля криптовалютными фьючерсами сопряжена с высокими рисками. Для оценки рисков вашего портфеля обязательно прочитайте материал про Расчет VaR историческим методом для фьючерсов Binance на Python.

Если в дальнейшем вы планируете перейти от простых эвристических правил к обучению с подкреплением (Reinforcement Learning) на огромных массивах данных, вам поможет наша статья про Распределенный бэктестинг RL в FinRL с Ray: Масштабирование и оптимизация.

Оцените статью
FinFluct