Тестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи

Торговля акциями требует гибкости, особенно когда речь идет о тестировании стратегий технического анализа на прошлых данных. Я выбрал Python и библиотеки backtesting.py и aiomoex, потому что они позволяют анализировать рынок без сложных платформ и ограничений. Python дает свободу автоматизации, backtesting.py обеспечивает удобный и быстрый механизм тестирования стратегий, а aiomoex позволяет скачивать данные напрямую с Московской биржи без привязки к брокеру. Важно, что backtesting.py получил обновление после четырех лет без обновлений, что делает его актуальным инструментом. И в отличие от MetaTrader, StockSharp, TSLab и Quik, которые работают с Московской биржей, но требуют Windows, если брокер имеет API, то можно запускать скрипт на любом сервере, включая облачные решения и Raspberry Pi. В этой статье я протестирую самую свежую стратегию теханализа Джона Ф. Элерса (John Ehlers), направленную на устранение запаздывания скользящей средней. Разберемся, как её адаптировать к акциям Московской биржи и протестировать с помощью Python. Новый индикатор Джона Элерса «устранение запаздывания скользящей средней»Одна из главных проблем стандартных скользящих средних (SMA) — это запаздывание. Поскольку SMA рассчитывается как среднее за определенный период, её значение всегда отстает от реальной цены, что мешает своевременному входу в сделку.Джон Элерс предложил решение — прогнозируемая скользящая средняя (PMA, Projected Moving Average). В отличие от обычных скользящих, PMA использует линейную регрессию для прогнозирования будущих значений, уменьшая лаг.SBERФормулаPMA:PMA = SMA + Slope * Length / 2,где Slope — наклон линии регрессии.Дополнительно Элерс предложил прогнозировать саму PMA:PredictPMA = PMA + 0.5 (Slope - Slope[2]) Length и наклон:PredictSlope = 1.5 Slope - 0.5 Slope[4].Пересечения PredictPMA и PMA помогают находить точки входа и выхода, делая стратегию более адаптивной к изменениям рынка.S&P 500 E-Mini FuturesСтратегия на основе индикатора PMA Джона Ф. ЭлерсаВход в длинную позицию:– Цена закрытия на недельном графике выше 50-недельной PMA. – Цена закрытия на дневном графике выше 50-дневной PMA. – 10-дневная PMA выше 50-дневной.Риск-менеджмент:– Первоначальный стоп-лосс устанавливается на 10% ниже цены входа. – Выход из позиции осуществляется по скользящему стопу на основе ATR.Реализация бэктестинга через backtesting.py. Определение топ-20 акций по объемуВесь код представлен на GitHub.Модуль data_loader.pyДля тестирования стратегии необходимо загружать актуальные данные о торгах.В этом помогает библиотека aiomoex, которая предоставляет API-доступ к Московской бирже. В модуле data_loader.py реализована функция fetch_moex_data, позволяющая асинхронно получать исторические данные по свечам.Функция запрашивает данные за последние 1825 дней (примерно 5 лет) и конвертирует их в формат Pandas DataFrame. Особенность реализации — использование асинхронного HTTP-клиента aiohttp, что ускоряет загрузку. Данные приводятся к удобному формату: преобразуются даты, устанавливается индекс, а названия колонок заменяются на стандартные для анализа.Фильтрация ликвидных бумаг для тестирования. Модуль scanner.pyПосле загрузки данных важно отобрать ликвидные бумаги. Для этого в модуле scanner.py реализована функция get_top_20_stocks, которая анализирует объем торгов за последние 14 дней и выделяет 20 наиболее ликвидных акций.Алгоритм работы следующий:Получение списка всех торгуемых акций на основном рынке (TQBR) через API Московской биржи.Асинхронная загрузка дневных данных по каждому инструменту с помощью fetch_moex_data.Расчет суммарного объема торгов за 14 дней.Формирование списка из 20 акций с наибольшим объемом.Таким образом, отбираются бумаги с высоким оборотом, что повышает надежность тестирования стратегии и снижает риск торговли неликвидными активами.Реализация бэктестинга через backtesting.py. Тестирование стратегии на исторических данныхЗачем всё разделил на модули?Разделение кода на модули делает его более удобным для сопровождения, масштабирования и переиспользования. В нашем случае:data_loader.py отвечает за загрузку данных с Московской биржи.scanner.py фильтрует ликвидные бумаги.backtester.py выполняет бэктестинг.strategy.py содержит описание стратегии.main.py запускает сканирование и тестированиеТакой подход позволяет независимо модифицировать и тестировать каждый компонент системы.Пример кода для бэктестинга с использованием backtesting.pyimport asyncio import pandas as pd from backtesting import Backtest from data_loader import fetch_moex_data from strategy import LongOnlyPMAMultiTimeframeATRTrailingStop async def run_backtest(ticker): print(f"\n{'='*50}") print(f"

Мар 11, 2025 - 08:26
 0
Тестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи
Торговля акциями требует гибкости, особенно когда речь идет о тестировании стратегий технического анализа на прошлых данных. Я выбрал Python и библиотеки backtesting.py и aiomoex, потому что они позволяют анализировать рынок без сложных платформ и ограничений. Python дает свободу автоматизации, backtesting.py обеспечивает удобный и быстрый механизм тестирования стратегий, а aiomoex позволяет скачивать данные напрямую с Московской биржи без привязки к брокеру.

Важно, что backtesting.py получил обновление после четырех лет без обновлений, что делает его актуальным инструментом. И в отличие от MetaTrader, StockSharp, TSLab и Quik, которые работают с Московской биржей, но требуют Windows, если брокер имеет API, то можно запускать скрипт на любом сервере, включая облачные решения и Raspberry Pi.

В этой статье я протестирую самую свежую стратегию теханализа Джона Ф. Элерса (John Ehlers), направленную на устранение запаздывания скользящей средней. Разберемся, как её адаптировать к акциям Московской биржи и протестировать с помощью Python.

Новый индикатор Джона Элерса «устранение запаздывания скользящей средней»

Одна из главных проблем стандартных скользящих средних (SMA) — это запаздывание. Поскольку SMA рассчитывается как среднее за определенный период, её значение всегда отстает от реальной цены, что мешает своевременному входу в сделку.

Джон Элерс предложил решение — прогнозируемая скользящая средняя (PMA, Projected Moving Average). В отличие от обычных скользящих, PMA использует линейную регрессию для прогнозирования будущих значений, уменьшая лаг.Тестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи

SBER

Формула

PMA:PMA = SMA + Slope * Length / 2,
где Slope — наклон линии регрессии.

Дополнительно Элерс предложил прогнозировать саму PMA:
PredictPMA = PMA + 0.5 (Slope - Slope[2]) Length
и наклон:
PredictSlope = 1.5 Slope - 0.5 Slope[4].

Пересечения PredictPMA и PMA помогают находить точки входа и выхода, делая стратегию более адаптивной к изменениям рынка.Тестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи

S&P 500 E-Mini Futures

Стратегия на основе индикатора PMA Джона Ф. Элерса

Вход в длинную позицию:

– Цена закрытия на недельном графике выше 50-недельной PMA.
– Цена закрытия на дневном графике выше 50-дневной PMA.
– 10-дневная PMA выше 50-дневной.

Риск-менеджмент:

– Первоначальный стоп-лосс устанавливается на 10% ниже цены входа.
– Выход из позиции осуществляется по скользящему стопу на основе ATR.

Реализация бэктестинга через backtesting.py. Определение топ-20 акций по объему

Весь код представлен на GitHub.

Модуль data_loader.pyТестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи

Для тестирования стратегии необходимо загружать актуальные данные о торгах.

В этом помогает библиотека aiomoex, которая предоставляет API-доступ к Московской бирже. В модуле data_loader.py реализована функция fetch_moex_data, позволяющая асинхронно получать исторические данные по свечам.

Функция запрашивает данные за последние 1825 дней (примерно 5 лет) и конвертирует их в формат Pandas DataFrame. Особенность реализации — использование асинхронного HTTP-клиента aiohttp, что ускоряет загрузку. Данные приводятся к удобному формату: преобразуются даты, устанавливается индекс, а названия колонок заменяются на стандартные для анализа.

Фильтрация ликвидных бумаг для тестирования. Модуль scanner.pyТестирование торговой стратегии с использованием нового индикатора Джона Ф. Элерса на Python для дневных данных Московской биржи

После загрузки данных важно отобрать ликвидные бумаги. Для этого в модуле scanner.py реализована функция get_top_20_stocks, которая анализирует объем торгов за последние 14 дней и выделяет 20 наиболее ликвидных акций.

Алгоритм работы следующий:

  1. Получение списка всех торгуемых акций на основном рынке (TQBR) через API Московской биржи.
  2. Асинхронная загрузка дневных данных по каждому инструменту с помощью fetch_moex_data.
  3. Расчет суммарного объема торгов за 14 дней.
  4. Формирование списка из 20 акций с наибольшим объемом.

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

Реализация бэктестинга через backtesting.py. Тестирование стратегии на исторических данных

Зачем всё разделил на модули?

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

  • data_loader.py отвечает за загрузку данных с Московской биржи.
  • scanner.py фильтрует ликвидные бумаги.
  • backtester.py выполняет бэктестинг.
  • strategy.py содержит описание стратегии.
  • main.py запускает сканирование и тестирование

Такой подход позволяет независимо модифицировать и тестировать каждый компонент системы.

Пример кода для бэктестинга с использованием backtesting.py

import asyncio
import pandas as pd
from backtesting import Backtest
from data_loader import fetch_moex_data
from strategy import LongOnlyPMAMultiTimeframeATRTrailingStop

async def run_backtest(ticker):
    print(f"\n{'='*50}")
    print(f"