Исходный код
Стратегии возврата к среднему (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: Масштабирование и оптимизация.




