Обсуждение статьи "Инжиниринг признаков для машинного обучения (Часть 4): Реализация временных признаков в MQL5"

Опубликована статья Инжиниринг признаков для машинного обучения (Часть 4): Реализация временных признаков в MQL5:

Применение границ сессий из Python к временным меткам брокера в MQL5 приводит на любом брокере с часовым поясом, отличным от UTC, к ошибочной классификации принадлежности к сессиям на два–три часа и искажает флаги сессий по всей истории бэктеста. Мы реализуем файл CTimeFeatures.mqh, содержащий классы CRingBuffer и CTimeFeatures, с тремя методами, доступными для советников: Initialize (фиксация смещения относительно UTC и настройка частотного фильтра), Update (добавление логарифмической доходности в кольцевые буферы для соответствующих торговых сессий) и Calculate (циклическое кодирование, флаги торговых сессий и волатильность сессий). Результат — плоский массив типа double, совместимый по формату с Python-функцией get_time_features для таймфреймов меньше часа, часовых и дневных таймфреймов.

В части 3 этой серии была создана Python-функция get_time_features, которая преобразует объект DatetimeIndex в структурированную матрицу признаков: циклические переменные, закодированные по Фурье, для часа, дня недели и дня года; флаги принадлежности к четырём основным торговым сессиям на рынке Форекс; индикатор перекрытия сессий; сессионно-зависимую скользящую волатильность; а также календарные эффекты на границах периодов. Реализация на языке Python обрабатывает пакетные данные с полной векторизацией. MQL5 обрабатывает данные бар за баром в режиме реального времени.

В этой статье тот же набор признаков реализован на MQL5 в виде многократно используемого файла включения CTimeFeatures.mqh. Любой советник может подключить его без изменений. Три проблемы требуют решений, выходящих за рамки простого механического перевода кода. Во-первых, MQL5 использует время брокера, а не UTC — при этом большинство розничных брокеров смещают время на своих серверах на два–три часа, что незаметно искажает определение границ торговых сессий для каждого бара в бэктесте. Во-вторых, Python вычисляет скользящую волатильность пакетно с помощью pandas. В MQL5 волатильность необходимо поддерживать инкрементально для каждой торговой сессии с помощью кольцевого буфера. В-третьих, Python применяет частотный фильтр с помощью вызова DataFrame.drop. В MQL5 частотный фильтр необходимо задать при инициализации, а его настройки должны быть отражены в реестре имён признаков, используемом последующими моделями ONNX.

Полученный класс предоставляет три метода, доступные советнику, — Initialize, Update и Calculate — и формирует плоский массив типа double, имена признаков и порядок столбцов в котором идентичны соответствующим значениям функции get_time_features. Модель, обученную в Python на признаках Python, можно развернуть в MQL5 с помощью OnnxRun, передав массив из Calculate без какого-либо изменения порядка элементов.


Автор: Patrick Murimi Njoroge