Тестировании торговой системы Александра Резвякова для фьючерсов Московской биржи с использованием Python
В этой статье расскажу о том, как воспроизвел и протестировал торговую систему для фьючерсов Московской биржи, основанную на идеях Александра Резвякова. Недавно, просматривая раздел алготрейдинга на Смартлабе, я наткнулся на видео с его выступления на конференции 2024 года под названием "5-6 идей для построения прибыльной торговой системы на фьючерсах". Меня привлекла четкость и понятность предложенных им правил торговли.Поскольку я активно занимаюсь автоматизацией процессов и стремлюсь глубже изучить возможности Python библиотеки backtesting.py, мне показалось это хорошей идеей для практического применения.Хотя я лично не знаком с Александром, полагаю, что публичное представление идеи предполагает возможность её независимого анализа и тестирования сообществом трейдеров и программистов. Обзор стратегии Александра Резвякова на фьючерсахОсновная идея — открывать сделки в строго определенное время и использовать структуру рынка последних дней для принятия решений.Правила входа Время входа: сделки совершаются только в 10:00.Лонг:Должно быть не менее трех дневных свечей в наличии.За последние два дня минимумы (Low) и максимумы (High) должны повышаться.Вероятность входа — 50%.Шорт:Также минимум три дневных бара.За последние два дня максимумы и минимумы снижаются.Вероятность входа — 50%.Правила выходаПо времени: позиция закрывается в 20:40, независимо от результата.По трейлинг-стопу:Для ЛОНГА: если цена закрытия предыдущего бара падает больше чем на 2% от уровня покупки, то продажа. Если цена закрытия бара увеличивается, то этот уровень 2% убытка отчитывается уже от этой нового максимального уровня цены закрытия бара.Для ШОРТА: обратно лонгу — если цена растет на определенный процент от минимальной цены закрытия, достигнутой во время существования позиции, то обратная покупка.Дополнительно предлагалось увеличивать объем позиции при успешных сделках.Для лонгаПодготовка среды для тестированияДля реализации и тестирования стратегии Александра Резвякова я выбрал Python и библиотеку backtesting.py. Этот выбор обусловлен несколькими факторами: Python предоставляет гибкие возможности для работы с данными, а backtesting.py позволяет эффективно моделировать торговые стратегии. В своем проекте применил модульный подход, разделив функциональность на несколько основных компонентов:main.py — центральный модуль, запускающий весь процесс сканирования данных и бэктестирования стратегииresample_data_1min.py — отвечает за фильтрацию и преобразование данных, получаемых через API; выбирает только необходимый временной интервал котировокdata_loader.py — преобразует данные из CSV-формата в структуру, пригодную для работы с backtesting.pybacktester.py — содержит основную логику запуска и настройки бэктестаstrategy_Random_1min.py — реализует саму торговую систему Резвякова с описанными правилами входа и выходаХотя в оригинальном видео Александр Резвяков рекомендовал работать на 5-минутном таймфрейме, я принял решение использовать 1-минутные свечи. Это позволяет более детально анализировать движение цены и точнее отслеживать срабатывание трейлинг-стопов. Благодаря более гранулярным данным, становится проще визуализировать и понять всю логику выхода из позиции, особенно в критических моментах, когда цена колеблется вблизи уровня стопа. Шорт фьючерса CRH5 (CNY-3.25)Полный исходный код всех модулей доступен в моем репозитории на GitHub для тех, кто захочет воспроизвести эксперимент или улучшить предложенную реализацию.Реализация стратегии на Python с использованием backtesting.pyВот подробное описание каждого шага с точки зрения программирования:Подготовка данных:Первым шагом является загрузка и предобработка исторических данных о фьючерсах. Модуль resample_data_1min.py отвечает за получение минутных данных с использованием API брокера (в данном случае, T-Invest API) и выборку необходимых временных интервалов. Он загружает данные из CSV-файлов, содержащих котировки, и фильтрует их по заданному диапазону дат. Ключевым моментом является функция filter_by_date, которая обеспечивает выборку данных за определенный период.save_filtered_data сохраняет обработанные данные в отдельные файлы для каждого тикера, готовые к дальнейшему использованию. Загрузка данных из CSV:Модуль data_loader.py отвечает за загрузку исторических данных из CSV-файлов и преобразование их в формат, пригодный для использования с библиотекой backtesting.py. Функция load_data_for_ticker считывает данные для указанного тикера, выполняет парсинг дат и устанавливает столбец timestamp в качестве индекса. Это позволяет backtesting.py правильно интерпретировать временные ряды.Реализация условий для входа и выхода:В модуле strategy_Random_1min.py реализована основная логика торговой стратегии. Класс RandomEntryStrategy наследуется от класса Strategy из библиотеки backtesting.py. В методе init происходит инициализация необходимых параметров и индикаторов.Метод resample_to_daily пересчитывает минутные данные в дневные бары, необходимые для принятия решений о входе в пози

В этой статье расскажу о том, как воспроизвел и протестировал торговую систему для фьючерсов Московской биржи, основанную на идеях Александра Резвякова. Недавно, просматривая раздел алготрейдинга на Смартлабе, я наткнулся на видео с его выступления на конференции 2024 года под названием "5-6 идей для построения прибыльной торговой системы на фьючерсах". Меня привлекла четкость и понятность предложенных им правил торговли.
Поскольку я активно занимаюсь автоматизацией процессов и стремлюсь глубже изучить возможности Python библиотеки backtesting.py, мне показалось это хорошей идеей для практического применения.
Хотя я лично не знаком с Александром, полагаю, что публичное представление идеи предполагает возможность её независимого анализа и тестирования сообществом трейдеров и программистов.
Обзор стратегии Александра Резвякова на фьючерсах
Основная идея — открывать сделки в строго определенное время и использовать структуру рынка последних дней для принятия решений.
Правила входа
Лонг:
- Должно быть не менее трех дневных свечей в наличии.
- За последние два дня минимумы (Low) и максимумы (High) должны повышаться.
- Вероятность входа — 50%.
Шорт:
- Также минимум три дневных бара.
- За последние два дня максимумы и минимумы снижаются.
- Вероятность входа — 50%.
Правила выхода
- По времени: позиция закрывается в 20:40, независимо от результата.
По трейлинг-стопу:
- Для ЛОНГА: если цена закрытия предыдущего бара падает больше чем на 2% от уровня покупки, то продажа. Если цена закрытия бара увеличивается, то этот уровень 2% убытка отчитывается уже от этой нового максимального уровня цены закрытия бара.
- Для ШОРТА: обратно лонгу — если цена растет на определенный процент от минимальной цены закрытия, достигнутой во время существования позиции, то обратная покупка.
Дополнительно предлагалось увеличивать объем позиции при успешных сделках.
Для лонгаПодготовка среды для тестирования
Для реализации и тестирования стратегии Александра Резвякова я выбрал Python и библиотеку backtesting.py. Этот выбор обусловлен несколькими факторами: Python предоставляет гибкие возможности для работы с данными, а backtesting.py позволяет эффективно моделировать торговые стратегии.
В своем проекте применил модульный подход, разделив функциональность на несколько основных компонентов:
- main.py — центральный модуль, запускающий весь процесс сканирования данных и бэктестирования стратегии
- resample_data_1min.py — отвечает за фильтрацию и преобразование данных, получаемых через API; выбирает только необходимый временной интервал котировок
- data_loader.py — преобразует данные из CSV-формата в структуру, пригодную для работы с backtesting.py
- backtester.py — содержит основную логику запуска и настройки бэктеста
- strategy_Random_1min.py — реализует саму торговую систему Резвякова с описанными правилами входа и выхода
Хотя в оригинальном видео Александр Резвяков рекомендовал работать на 5-минутном таймфрейме, я принял решение использовать 1-минутные свечи. Это позволяет более детально анализировать движение цены и точнее отслеживать срабатывание трейлинг-стопов. Благодаря более гранулярным данным, становится проще визуализировать и понять всю логику выхода из позиции, особенно в критических моментах, когда цена колеблется вблизи уровня стопа.
Полный исходный код всех модулей доступен в моем репозитории на GitHub для тех, кто захочет воспроизвести эксперимент или улучшить предложенную реализацию.Реализация стратегии на Python с использованием backtesting.py
Вот подробное описание каждого шага с точки зрения программирования:
Подготовка данных:
Первым шагом является загрузка и предобработка исторических данных о фьючерсах. Модуль resample_data_1min.py отвечает за получение минутных данных с использованием API брокера (в данном случае, T-Invest API) и выборку необходимых временных интервалов. Он загружает данные из CSV-файлов, содержащих котировки, и фильтрует их по заданному диапазону дат. Ключевым моментом является функция filter_by_date, которая обеспечивает выборку данных за определенный период.
save_filtered_data сохраняет обработанные данные в отдельные файлы для каждого тикера, готовые к дальнейшему использованию.
Загрузка данных из CSV:
Модуль data_loader.py отвечает за загрузку исторических данных из CSV-файлов и преобразование их в формат, пригодный для использования с библиотекой backtesting.py. Функция load_data_for_ticker считывает данные для указанного тикера, выполняет парсинг дат и устанавливает столбец timestamp в качестве индекса. Это позволяет backtesting.py правильно интерпретировать временные ряды.
Реализация условий для входа и выхода:
В модуле strategy_Random_1min.py реализована основная логика торговой стратегии. Класс RandomEntryStrategy наследуется от класса Strategy из библиотеки backtesting.py. В методе init происходит инициализация необходимых параметров и индикаторов.
Метод resample_to_daily пересчитывает минутные данные в дневные бары, необходимые для принятия решений о входе в позицию.
В методе next реализуются правила входа и выхода из позиции, описанные Александром Резвяковым. Время входа строго фиксировано (10:00), а решение о входе в лонг или шорт принимается на основе анализа предыдущих двух дневных баров. Вероятность входа в сделку устанавливается как 50%. Время выхода установлено на 20:40.
Интерактивный HTML
Настройка трейлинг-стопов:
Для реализации трейлинг-стопов в strategy_Random_1min.py используются методы update_long_position и update_short_position. В этих методах вычисляется уровень трейлинг-стопа на основе текущей цены и заданного процента (2%).
Трейлинг-стоп автоматически подтягивается вверх для длинных позиций и вниз для коротких, обеспечивая фиксацию прибыли и ограничение убытков. При достижении ценой уровня трейлинг-стопа позиция автоматически закрывается.Тестирование стратегии
Библиотека backtesting.py позволяет не только моделировать сделки, но и визуализировать их в интерактивных HTML-отчетах. Это помогает детально анализировать точки входа и выхода, проверять корректность реализации логики и выявлять возможные ошибки в коде.
Чтобы избежать нагромождения данных в интерактивных HTML-отчетах решил загружать данные по неделям.
Кроме того, я задал комиссию в размере 0,2%, поскольку комиссии оказывают заметное влияние на итоговую доходность:
bt = Backtest(
df,
DynamicStrategyClass,
cash=1_000_000,
commission=0.002,
margin=0.1, # Требование к первоначальной марже 10%
trade_on_close=True,
hedging=False,
)
Так как стратегия использует случайный вход в сделки (вероятность 50% на покупку или продажу), результаты тестирования также носят случайный характер. Однако, уже на первых тестах удалось увидеть интересные закономерности.
Вот пример удачного теста на фьючерсе NGH5:
==================================================