English 中文 Español Deutsch 日本語 Português
preview
Интеграция ML-моделей с тестером стратегий (Заключение): Реализация регрессионной модели для прогнозирования цен

Интеграция ML-моделей с тестером стратегий (Заключение): Реализация регрессионной модели для прогнозирования цен

MetaTrader 5Примеры | 1 марта 2024, 12:11
591 0
Jonathan Pereira
Jonathan Pereira

Введение:

В предыдущей статье мы завершили реализацию класса управления CSV-файлами для хранения и извлечения данных, связанных с финансовыми рынками. Создав инфраструктуру, мы теперь готовы использовать эти данные для создания и обучения модели машинного обучения.

В данной статье мы ставим перед собой задачу реализовать регрессионную модель, способную прогнозировать цену закрытия финансового актива в течение недели. Этот прогноз позволит нам анализировать поведение рынка и принимать взвешенные решения при торговле финансовыми активами.

Прогноз цен может быть полезным инструментом для разработки торговых стратегий и принятия решений на финансовом рынке. Способность точно предсказывать ценовые тенденции может привести к принятию лучших инвестиционных решений, максимизации прибыли и минимизации потерь. Кроме того, прогноз цен может помочь в определении торговых возможностей и управлении рисками.

Чтобы реализовать нашу регрессионную модель, мы выполним следующие шаги:

  1. Сбор и подготовка данных: с помощью скрипта Python мы получим исторические данные о ценах и другую необходимую информацию. Эти данные мы будем использовать для обучения и тестирования нашей регрессионной модели.

  2. Выбор и обучение модели: мы выберем подходящую регрессионную модель для нашей задачи и обучим ее с использованием собранных данных. Существует несколько моделей регрессии, таких как линейная регрессия, полиномиальная регрессия и регрессия опорных векторов (SVR). Выбор модели зависит от ее пригодности для решения нашей задачи и производительности, полученной в процессе обучения.

  3. Оценка производительности модели: чтобы убедиться в том, что наша регрессионная модель работает правильно, нам необходимо оценить ее производительность в ходе ряда тестов. Данная оценка поможет нам выявить потенциальные проблемы и при необходимости исправить модель.

В конце данной статьи мы получим регрессионную модель, способную прогнозировать цену закрытия финансового актива на неделю. Этот прогноз позволит нам разрабатывать более эффективные торговые стратегии и принимать взвешенные решения на финансовом рынке.


Раздел 1: Выбор регрессионной модели

Прежде чем применять нашу регрессионную модель для прогноза цены закрытия финансового актива за неделю, необходимо разобраться в различных типах регрессионных моделей и их характеристиках. Это позволит нам выбрать наиболее подходящую модель для решения нашей с вами задачи. В этом разделе мы обсудим некоторые из наиболее распространенных регрессионных моделей:

  1. Линейная регрессия: Линейная регрессия - одна из самых простых и популярных регрессионных моделей. Она предполагает линейные отношения между независимыми переменными и зависимой переменной. Цель линейной регрессии - найти прямую линию, которая наилучшим образом соответствует данным, минимизируя при этом сумму квадратичной ошибки. Несмотря на простоту понимания и применения, линейная регрессия может не подойти для решения задач, в которых связь между переменными не линейная.

  2. Полиномиальная регрессия: Полиномиальная регрессия - это расширение линейной регрессии, но учитывающее нелинейные связи между переменными. Использует полиномы разных степеней, чтобы подогнать кривую к данным. Полиномиальная регрессия может обеспечить лучшее приближение для более сложных задач; однако важно избегать чрезмерной подгонки, которая происходит, когда модель слишком близко подходит к обучающим данным, что снижает способность обобщения на невидимые данные.

  3. Регрессия дерева решений: Регрессия на основе дерева решений - это модель, обоснованная на дереве решений, которая делит пространство признаков на отдельные, непересекающиеся области. В каждом регионе прогноз делается на основе среднего значения наблюдаемых значений. Регрессия дерева решений способна отражать сложные нелинейные взаимосвязи между переменными, но может подвергаться чрезмерной подгонке, особенно если дерево становится очень большим. Для борьбы с чрезмерной подгонкой можно использовать методы обрезки и кросс-валидации.

  4. Регрессия опорных векторов (SVR): Регрессия опорных векторов - это расширение алгоритма машины опорных векторов (SVM) для решения задач регрессии. SVR пытается найти наилучшую функцию для данных, сохраняя при этом максимальный запас между функцией и точками обучения. SVR способна моделировать нелинейные и сложные взаимосвязи, используя функции кернела, такие как радиальная базисная функция (RBF). Однако обучение SVR может потребовать значительных вычислительных затрат по сравнению с другими регрессионными моделями.

Чтобы выбрать наиболее подходящую регрессионную модель для прогнозирования цены закрытия финансового актива в течение недели, важно учитывать сложность задачи и взаимосвязь между переменными. Кроме того, необходимо учитывать баланс между производительностью модели и вычислительной сложностью. В целом, рекомендуем поэкспериментировать с различными моделями и настроить их параметры для достижения наилучшей производительности.

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

  1. Производительность: Производительность регрессионной модели очень важна для обеспечения точности и полезности прогнозов. Мы можем оценить производительность, используя такие метрики, как средняя квадратичная ошибка (MSE) и средняя абсолютная ошибка (MAE), среди прочих. При сравнении различных моделей, важно выбрать ту, которая лучше всего справляется с этими метриками.

  2. Интерпретируемость: Интерпретируемость модели - это способность понять взаимосвязь между переменными и то, как они влияют на прогноз. Более простые модели, такие как линейная регрессия, обычно интерпретируются легче, чем более сложные модели, такие как нейронные сети. Интерпретируемость особенно важна, если мы хотим объяснить свои прогнозы другим или понять факторы, влияющие на результаты.

  3. Сложность: Сложность регрессионной модели связана с количеством параметров, а также со структурой модели. Более сложные модели могут улавливать более тонкие и нелинейные взаимосвязи в данных, однако они также могут быть более склонны к чрезмерной подгонке. Важно соблюсти баланс между сложностью модели и способностью обобщать ее на неизвестные данные.

  4. Время обучения: Время обучения - важный момент, который необходимо учитывать, особенно при работе с большими наборами данных или при итеративном обучении моделей. Более простые модели, такие как линейная и полиномиальная регрессия, обычно требуют меньше времени на обучение, чем другие, более сложные модели, такие как нейронные сети или регрессия опорных векторов. Очень важно найти баланс между производительностью модели и временем обучения, чтобы обеспечить своевременную применимость модели.

  5. Устойчивость: Устойчивость регрессионной модели - это ее способность справляться с выбросами и шумом в данных. Надежные модели менее чувствительны к небольшим изменениям в данных и выдают более стабильные прогнозы. Важно выбрать модель, способную справиться с выбросами и шумом в данных.

При выборе наиболее подходящей регрессионной модели для прогнозирования закрытия цен важно взвесить данные критерии и найти правильный баланс между ними. Проверка различных моделей и настройки их параметров для оптимизации производительности - это рекомендуемая стратегия, позволяющая выбрать наилучшую модель для решения конкретной задачи.

Исходя из перечисленных критериев, мы решили использовать модель регрессии дерева решений (Decision Tree Regression) для прогнозирования закрытия цены. Выбор данной модели оправдан по следующим причинам:

  1. Производительность: Обычно деревья решений хорошо справляются с задачами регрессии, поскольку способны улавливать нелинейные взаимосвязи и взаимодействия между переменными. При правильной настройке гиперпараметров модели, таких как глубина дерева и минимальное количество образцов на лист, мы можем добиться баланса между приспособленностью и обобщением.

  2. Интерпретируемость: Одним из главных преимуществ деревьев решений является их интерпретируемость. Деревья решений представляют собой серию решений, основанных на атрибутах и их значениях, что делает их простыми для понимания. Это полезно для обоснования прогнозов и понимания факторов, влияющих на закрытие цен.

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

  4. Время обучения: Деревья решений обычно обучаются относительно быстро по сравнению с более сложными моделями, такими как нейронные сети или SVM. Данный факт делает модель регрессии дерева решений подходящей для случаев, когда время обучения является важным фактором.

  5. Устойчивость: Деревья решений устойчивы к выбросам и шумам в данных, поскольку каждое решение основывается на наборе образцов, а не на одном наблюдении, и это способствует стабильности прогнозов и надежности модели.

Учитывая рассмотренные критерии и преимущества регрессии дерева решений, я считаю, что эта модель подходит для прогнозирования недельного закрытия цены. Однако важно помнить, что выбор моделей может меняться в зависимости от конкретного контекста и требований каждой проблемы. Испытание и сравнение различных моделей регрессии может быть полезным для выбора наиболее подходящей модели.


Раздел 2: Подготовка данных

Подготовка и очистка данных - ключевые этапы в процессе реализации регрессионной модели, поскольку качество исходных данных напрямую влияет на эффективность и производительность модели. Данные этапы важны по следующим причинам:

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

  2. Заполнение и удаление недостающих значений: Неполные данные часто встречаются в наборах данных, и пропущенные значения могут привести к неудовлетворительной работе модели. Внесение недостающих значений, удаление записей с недостающими данными или использование специальных методов для работы с недостающими данными необходимы для обеспечения целостности и надежности данных. Выбор между интерполяцией и удалением недостающих значений зависит от характера данных, количества недостающих значений и потенциального влияния этих значений на эффективность модели. Важно тщательно проанализировать каждую ситуацию и выбрать наиболее адекватный подход к решению проблемы.

  3. Выбор переменных: Не все переменные, имеющиеся в наборе данных, могут быть важными или полезными для прогнозирования закрытия цены. Соответствующий выбор переменных позволяет модели сосредоточиться на наиболее важных признаках, улучшая производительность и уменьшая сложность модели.

  4. Преобразование данных: Иногда исходные данные необходимо преобразовать, для соответствия с предположениями регрессионной модели или улучшения связи между независимыми переменными и зависимой переменной. Примерами преобразований являются нормализация, стандартизация и применение математических функций, таких как логарифм или квадратный корень.

  5. Разделение данных: Важно разделить набор данных на обучающий поднабор и тестовый поднабор, чтобы правильно оценить эффективность регрессионной модели. Такое разделение позволяет обучить модель на поднаборе данных и проверить ее способность к обобщению на невидимые данные, что дает оценку эффективности модели в реальных ситуациях.

Подготовка и очистка данных - важный этап в процессе внедрения регрессионной модели, поскольку они обеспечивают обучение и оценку модели на основе качественных данных, максимально повышая ее эффективность и полезность в прогнозировании закрытия цен.

Мы рассмотрим базовый пример подготовки данных для регрессионной модели с помощью Python. Однако необходимо подчеркнуть важность углубления своих знаний по этой теме, поскольку каждый набор данных и каждая проблема могут потребовать особых подходов и методов очистки и подготовки. Поэтому настоятельно рекомендуем вам потратить время на изучение и понимание различных методов подготовки данных.

Для сбора данных мы воспользуемся функцией get_rates_between, которая была создана для облегчения сбора финансовых данных по конкретному активу и за определенный период. Она использует библиотеку MetaTrader 5 (mt5) для подключения к торговой платформе и получения исторических данных о ценах за различные временные интервалы.

Функция имеет следующие параметры:

  • symbol: строка, которая представляет символ финансового актива (например, "PETR3", "EURUSD").
  • period: целое число, которое указывает на период времени, в течение которого будут собираться данные (например, mt5.TIMEFRAME_W1 для еженедельных данных).
  • ini: объект datetime, который представляет начальную время и дату временного интервала для сбора данных.
  • end: объект datetime, который представляет дату и время окончания временного интервала для сбора данных.

Функция начинает с проверки правильности инициализации MetaTrader 5. Если инициализация не удалась, функция возвращает исключение и завершает работу программы.

Затем функция использует функцию mt5.copy_rates_range() для получения финансовых данных по указанным активу и периоду. Данные хранятся в объекте DataFrame из pandas, который представляет собой двумерную структуру данных, отмеченную осями, и которая подходит для хранения финансовых данных.

После получения данных функция проверит, пуст ли DataFrame. Если функция пуста, она вернет исключение, поскольку это указывает на ошибку при сборе данных.

Если всё прошло успешно, функция преобразует столбец 'time' DataFrame в формат даты и времени, удобный для чтения, используя функцию pd.to_datetime(). Столбец 'time' определяется как индекс DataFrame, что облегчает нам доступ к данным и работу с ними.

def get_rates_between(symbol:str, period : int, ini : datetime, end : datetime):
    if not mt5.initialize():
        print("initialize() failed")
        mt5.shutdown()
        raise Exception("Error Getting Data")

    rates = mt5.copy_rates_range(symbol, period, ini, end)
    mt5.shutdown()
    rates = pd.DataFrame(rates)

    if rates.empty:
        raise Exception("Error Getting Data")

    rates['time'] = pd.to_datetime(rates['time'], unit='s')
    rates.set_index(['time'], inplace=True)

    return rates

В данном примере мы будем использовать финансовые данные по валютной паре EUR/USD за недельный период с 1 января 2000 года по 31 декабря 2022 года. Для этого мы используем функцию get_rates_between. Сначала импортируем необходимые библиотеки:

import pandas as pd
from datetime import datetime, timezone
import MetaTrader5 as mt5
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

Затем определяем информацию о финансовых активах, которые хотим проанализировать:

symbol = "EURUSD"
date_ini = datetime(2000, 1, 1, tzinfo=timezone.utc)
date_end = datetime(2022, 12, 31, tzinfo=timezone.utc)
period = mt5.TIMEFRAME_W1

Теперь можно вызвать функцию get_rates_between, используя информацию, определенную выше:

df = get_rates_between(symbol=symbol, period=period, ini=date_ini, end=date_end)

После получения данных следующим шагом будет их подготовка к созданию модели машинного обучения. Подготовка включает в себя удаление выбросов и шума, выбор переменных, преобразование данных и разделение их на обучающий и тестовый наборы. Мы подробно просмотрим каждый этап.

Устранение выбросов и шумов:

Первый шаг - удаление выбросов и шумов из данных. Шум - это случайные и нежелательные изменения в данных, которые в итоге могут затруднить выявление закономерностей. Выбросы - это значения, которые значительно отличаются от других значений в нашем наборе данных. И то, и другое может негативно повлиять на производительность модели.

Существует несколько методов удаления выбросов и шумов. В данном материале мы будем использовать метод экспоненциального сглаживания, который присваивает экспоненциально уменьшающийся вес самым последним данным, помогая сгладить колебания. Для этого мы воспользуемся функцией ewm от pandas.

smoothed_df = df.ewm(alpha=0.1).mean()
Важно отметить, что существует несколько методов устранения выбросов и шумов в данных, и подход экспоненциального сглаживания, используемый в данной работе, является лишь одним из них. Данный метод был выбран для упрощения примера и демонстрации способа обработки данных. Однако в реальных сценариях рекомендуется изучить и оценить различные методы удаления выбросов и шумов, чтобы найти лучший подход для конкретного набора данных и конкретной проблемы. Среди прочих популярных методов выделяется фильтрация по скользящему среднему, отсев по перцентилям и кластеризация.


Выбор переменных

Следующий шаг - выбор переменных, которые будем использовать в качестве признаков и целей. В данном примере мы будем использовать цену открытия, индикатор Moving Average Convergence Divergence (MACD) и экспоненциальную скользящую среднюю (EMA) в качестве признаков. В качестве цели будем использовать цену закрытия.

# Função para calcular o MACD
def macd(df, fast_period=12, slow_period=26, signal_period=9):
    ema_fast = df['close'].ewm(span=fast_period).mean()
    ema_slow = df['close'].ewm(span=slow_period).mean()
    macd_line = ema_fast - ema_slow
    signal_line = macd_line.ewm(span=signal_period).mean()
    return macd_line, signal_line

# Função para calcular a EMA
def ema(df, period=30):
    return df['close'].ewm(span=period).mean()

# Calculando o MACD e a linha de sinal
smoothed_df['macd'], smoothed_df['signal'] = macd(smoothed_df)

# Calculando a EMA
smoothed_df['ema'] = ema(smoothed_df)

# Selecionando as variáveis
selected_df = smoothed_df[['open', 'macd', 'ema', 'close']].dropna()

Преобразование данных

Преобразование данных важно для того, чтобы переменные находились в одной шкале и мы могли бы их корректно сравнивать. В данном примере мы используем нормализацию Min-Max, которая преобразует данные в шкалу от 0 до 1.

scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(selected_df), columns=selected_df.columns, index=selected_df.index)

Разделение данных

И, наконец, мы разделим данные на обучающие и тестовые наборы. Обучающий набор мы будем использовать для обучения модели, а тестовый набор - для оценки ее работы.

X = normalized_df[['open', 'macd', 'ema']]
y = normalized_df['close']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

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

Мы начинаем с загрузки данных о финансовых активах с помощью MetaTrader5 API, конвертируем их в pandas DataFrame и потом настраиваем столбец времени для использования в качестве индекса. Затем мы очищаем данные, удаляя все недостающие значения и проверяя их на наличие выбросов и противоречий. Такое действие необходимо для того, чтобы исключить влияние на модель недействительных или нерелевантных значений.

Мы выбрали переменные, которые будут использоваться в качестве feature и target модели, выбрав Open, MACD и EMA в качестве features и Close в качестве цели. Однако следует отметить, что данный выбор был сделан случайным образом, чтобы представить наглядный пример.

Мы также провели нормализацию данных. Она важна для того, чтобы различия в масштабах данных не повлияли на модель машинного обучения. И, наконец, мы разделили данные на обучающий и тестовый наборы, чтобы оценить способность модели обобщать новые данные.

Эти этапы подготовки данных крайне важны для обеспечения точности и эффективности прогнозов модели. Когда данные готовы, можно переходить к следующему этапу, то есть, к созданию и обучению модели машинного обучения.


Раздел 3: Обучение и оценка регрессионной модели с помощью дерева решений

После создания обучающего и тестового наборов и соответствующей подготовки данных, мы готовы к созданию, обучению и оценке нашей регрессионной модели на основе дерева решений. Дерево решений - это метод контролируемого обучения, который мы можем применять как для решения задач классификации, так и для решения задач регрессии. В данном случае мы будем использовать дерево решений для прогнозирования цены закрытия финансового актива.

  • Импортируем библиотеки и создаем модель

Начнем с импорта необходимых библиотек и создания экземпляра модели DecisionTreeRegressor от scikit-learn.

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score

regressor = DecisionTreeRegressor(random_state=42)
  • Обучение модели

Далее мы обучаем модель, используя обучающий набор (X_train и y_train).

regressor.fit(X_train, y_train)
  • Выполнение прогнозов

С помощью обученной модели, мы можем осуществить прогнозы на тестовом наборе (X_test) и сравнить результаты с фактическими значениями тестового набора (y_test).

y_pred = regressor.predict(X_test)
  • Оцениваем эффективность модели

Оценка эффективности модели очень важна для понимания того, насколько хорошо она соответствует данным и выполняет прогнозы. Помимо средней квадратичной ошибки (MSE) и коэффициента детерминации (R²), мы можем использовать и другие метрики оценки эффективности нашей регрессионной модели дерева решений. Некоторые дополнительные показатели, которые мы можем изучать, включают:

  • Средняя абсолютная ошибка (MAE): MAE - это среднее значение абсолютной разницы между прогнозами и фактическими значениями. Это простая для понимания метрика, которая позволяет нам определить, насколько далеки прогнозы от реальных значений.
  • Средняя абсолютная процентная ошибка (MAPE): MAPE - это среднее значение абсолютных процентных ошибок между прогнозами и фактическими значениями. Данная метрика позволяет оценить эффективность модели в процентах, что может быть полезно при сравнении моделей с разными шкалами значений.
  • Среднеквадратичная ошибка (RMSE): RMSE - это квадратный корень от MSE. Преимущество этой метрики в том, что она ведется в тех же единицах, что и целевая переменная, что облегчает интерпретацию результатов.

Для расчета этих дополнительных показателей мы можем использовать библиотеку Scikit-learn. Сначала импортируем необходимые функции:

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
Затем рассчитываем метрики, используя прогнозные и фактические значения:
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

Теперь мы можем продемонстрировать результаты:

print(f"MAE: {mae:.4f}")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R²: {r2:.4f}")
  • Настройка и оптимизация модели

В зависимости от полученных результатов может понадобиться корректировка и оптимизация модели. Это можно сделать с помощью настройки гиперпараметров дерева решений, таких как максимальная глубина (max_depth), минимальное количество образцов, необходимое для разбиения внутреннего узла (min_samples_split), минимальное количество образцов, необходимое для нахождения в листовом узле (min_samples_leaf) и другие.

Для оптимизации гиперпараметров можно использовать такие методы, как поиск по сетке (GridSearchCV) или рандомизированный поиск (RandomizedSearchCV) из scikit-learn. Данные методы позволяют тестировать различные комбинации гиперпараметров и находить наилучшую конфигурацию для модели.

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeRegressor


regressor = DecisionTreeRegressor(random_state=42)

param_grid = {
    'max_depth': [3, 4, 5, 6, 7, 8],
    'min_samples_split': [2, 3, 4],
    'min_samples_leaf': [1, 2, 3]
}

grid_search = GridSearchCV(estimator=regressor, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)

best_params = grid_search.best_params_
print(f"Melhores hiperparâmetros: {best_params}")

best_regressor = DecisionTreeRegressor(**best_params, random_state=42)
best_regressor.fit(X_train, y_train)

y_pred_optimized = best_regressor.predict(X_test)

mae_optimized = mean_absolute_error(y_test, y_pred_optimized)
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
rmse_optimized = np.sqrt(mse_optimized)
r2_optimized = r2_score(y_test, y_pred_optimized)

print(f"MAE otimizado: {mae_optimized:.4f}")
print(f"MSE otimizado: {mse_optimized:.4f}")
print(f"RMSE otimizado: {rmse_optimized:.4f}")
print(f"R² otimizado: {r2_optimized:.4f}")

  • Денормализация цен и построение графика

Чтобы денормализовать цены и построить график, можно использовать inverse_transform из MinMaxScaler Сначала денормализуем фактическую цену (y_test) и ожидаемую цену (y_pred_optimised), а затем построим график с помощью библиотеки matplotlib. Вот обновленный код:

import matplotlib.pyplot as plt

# Função para desnormalizar os preços
def denormalize_price(scaler, normalized_price, column_name):
    dummy_df = pd.DataFrame(np.zeros((len(normalized_price), len(selected_df.columns))), columns=selected_df.columns)
    dummy_df[column_name] = normalized_price
    denormalized_df = scaler.inverse_transform(dummy_df)
    return denormalized_df[:, selected_df.columns.get_loc(column_name)]

# Desnormalizar os preços reais e previstos
y_test_denorm = denormalize_price(scaler, y_test, 'close')
y_pred_optimized_denorm

В данном разделе рассматривается реализация регрессионной модели с деревом решений для прогнозирования цены закрытия финансового актива. После обучения и оценки модели, мы получили показатели эффективности и настроили гиперпараметры для оптимизации ее работы.

Однако важно отметить, что данный пример является лишь базовым подходом, и существует множество продвинутых методов и стратегий, позволяющих повысить точность и производительность модели. Кроме того, выбор регрессионной модели и подготовка данных могут меняться в зависимости от контекста и специфических требований каждой задачи.

И, наконец, необходимо подчеркнуть важность тестирования, проверки и итераций модели в различных сценариях и наборах данных, чтобы убедиться в ее устойчивости и надежности при прогнозировании цен на финансовом рынке.


Раздел 4: Интеграция регрессионной модели в тестер стратегий

В этом разделе мы подробно рассмотрим создание системы, позволяющей тестировать Python-модель непосредственно в MetaTrader Strategy Tester. Такой подход добавит дополнительный уровень гибкости в создании модели, используя преимущества простоты Python. Процесс проверки будет происходить в самом MetaTrader, так как мы экспортируем модель в формат ONNX для MQL5. Это означает, что мы можем с легкостью создавать и совершенствовать свою модель, в то время как строгая проверка проводится в среде MetaTrader, гарантируя, что она готова к сложностям финансового рынка.

Эффективное взаимодействие между Python и MQL5

В основе данной системы лежит критическая необходимость наладить эффективное взаимодействие между Python и MQL5. Для достижения этой цели мы создадим класс Python, упрощающий обмен сообщениями с тестером стратегий MQL5. Пока программа на Python работает, она будет внимательно следить за сделками, заключенными в тестере стратегии, оперативно передавая данные о цене актива в Python, как только тестер будет запущен. Этот непрерывный поток информации необходим для предоставления регрессионной модели данных в режиме реального времени, что позволяет ей принимать решения на основе этих данных. Кроме того, важно помнить о реализации в MQL5 класса, облегчающего работу с CSV-файлами, о чем рассказывали в этой статье.

Построение класса File для взаимодействия между Python и MQL5

Класс File играет ключевую роль в эффективном взаимодействии между Python и тестером стратегий MQL5. Теперь мы проанализируем основные функциональные возможности этого класса, который упрощает обмен данными и работу с файлами между этими двумя языками.

Инициализация класса

Класс File разработан как Singleton, что гарантирует нам, что во всей программе будет только один его экземпляр. Этот момент важен для сохранения целостности связи между Python и MQL5.

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


Проверка и управление файлами

Класс File предоставляет основные методы для проверки присутствия файлов, обработки ошибок, связанных с файлами, и выполнения операций чтения и записи.

  • Метод __init_file проверяет, есть ли файл или нет. Если файл не существует, метод подождет одну секунду, прежде чем вернуть False. Это полезно для того, чтобы убедиться, что файл готов к доступу.

  • Метод __handle_error обрабатывает исключения, которые могут произойти при работе с файлами. Он определяет распространенные ошибки, такие как PermissionError и FileNotFoundError, и предоставляет подробную информацию об этих ошибках.

  • Методы check_init_param и check_open_file нужны для чтения CSV-файлов. Первый проверяет, существует ли файл, и, если он существует, считывает его и возвращает определенное значение из столбца typerun в DataFrame. Второй метод проверяет существование файла и считывает его как полный DataFrame.

from pathlib import Path
from time import sleep
from typing import Tuple
import pandas as pd
from pandas.core.frame import DataFrame
import os
from errno import EACCES, EPERM, ENOENT
import sys

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

CSV_SEPARATOR = ';'

class File(metaclass=Singleton):

    def __init__(self) -> None:
        pass

    def __init_file(self, name_arq: str) -> bool:
        return Path(name_arq).is_file() or sleep(1) or False

    def __handle_error(self, e, name_arq: str):
        ERRORS = {
            EPERM: "PermissionError",
            EACCES: "PermissionError",
            ENOENT: "FileNotFoundError"
        }
        print(f"{ERRORS.get(e.errno, 'Unknown error')} error({e.errno}): {e.strerror} for:\n{name_arq}")

    def check_init_param(self, name_arq : str) -> Tuple[str]:
        while True:
            try:
                if self.__init_file(name_arq):
                    df = pd.read_csv(name_arq, sep=CSV_SEPARATOR)
                    return (df.typerun.values[0])
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    def check_open_file(self, name_arq: str) -> pd.DataFrame():
        while True:
            try:
                if self.__init_file(name_arq):
                    return pd.read_csv(name_arq, sep=CSV_SEPARATOR)
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    @staticmethod
    def save_file_csv(name_arq: str, dataset:DataFrame = pd.DataFrame({'col':['ok']})):
        dataset.to_csv(name_arq, sep=CSV_SEPARATOR)

    @staticmethod
    def save(name_arq:str, data:str):
        with open(name_arq, 'w') as f:
            f.write(data)

    @staticmethod
    def delete_file(name_arq: str):
        try:
            os.remove(name_arq)
        except:
            pass


Сохранение и удаление файлов

Класс File также облегчает нам задачу сохранения и удаления файлов.

  • Метод save_file_csv обеспечивает сохранения DataFrame в CSV-файл. Это удобно, когда нам нужно сохранить данные в доступном формате для последующего анализа.

  • Метод Save используется для сохранения данных в текстовый файл. Это удобно, когда нужно хранить простую информацию в удобном для чтения формате.

  • Метод delete_file предоставляет простой способ удаления файла из системы.

Обработка данных в Python

На стороне Python программа получает данные о цене актива и выполняет ряд шагов по предварительной их обработке. Вот эти шаги необходимы для того, чтобы убедиться, что данные готовы к использованию в регрессионной модели. Давайте сейчас рассмотрим подробнее, как это работает:

  1. Стандартизация данных: На начальном этапе выполняется нормализация данных. Это означает установку значений в определенном диапазоне, обычно между 0 и 1. Нормализация необходима для того, чтобы различные характеристики (например, цены на акции и объемы торгов) находились в одной шкале. Это позволяет избежать погрешностей в модели.

  2. Обнаружение и удаление выбросов: Финансовые данные могут быть нестабильными, и выбросы могут отрицательно повлиять на результаты моделирования. Программа на языке Python обнаруживает и, при необходимости, устраняет эти отклонения, чтобы обеспечить качество исходных данных.

  3. Создание дополнительных функций: Во многих случаях, на основе исходных данных создаются дополнительные признаки. Это могут быть, к примеру, скользящие средние, технические индикаторы или другие метрики, которые модель может использовать для принятия более обоснованных решений.

Только после полной подготовки данных регрессионная модель вступает в действие.

Регрессионная модель в действии

Хорошо, мы уже предварительно обучили на исторических данных регрессионную модель, которая может представлять собой линейную регрессию, регрессию дерева решений или другую подходящую модель. Теперь она загружается в программу Python и используется для составления прогнозов на основе последних ценовых данных. Данные прогнозы являются основополагающими для принятия торговых решений, так как они предоставляют ценную информацию о будущем поведении актива. Следует отметить, что хотя в данном примере мы используем конкретную регрессионную модель (линейная регрессия), этот подход может быть применен к различным моделям, таким как нейронные сети, алгоритмы дерева решений и другие, в зависимости от конкретных требований нашей торговой стратегии. Таким образом, гибкость данной системы позволяет включать в нее разнообразные модели для удовлетворения индивидуальных потребностей каждой стратегии.

Интеграция ONNX для улучшения MetaTrader 5

Хотел бы поделиться интересным советом, который может улучшить нашу систему в MetaTrader 5: интеграция с ONNX (Open Neural Network Exchange). ONNX - очень удобный инструмент для искусственного интеллекта, так как позволяет легко переносить модели в MetaTrader 5.

После тщательного тестирования и подтверждения эффективности нашей модели в MetaTrader 5 можно рассмотреть возможность ее экспорта в формат ONNX. Это не только расширит возможности MetaTrader 5, но и облегчит использование данной модели в различных стратегиях и системах платформы.

Благодаря встроенной интеграции ONNX в MetaTrader 5, данный совет предлагает захватывающие возможности для дальнейшего расширения использования моделей в наших торговых стратегиях на платформе.

Обширное тестирование перед экспортом

Выбор нашего текущего подхода, предполагающего взаимодействие со средой MQL5, обусловлен необходимостью проведения обширного тестирования в контролируемой среде, перед тем как приступать к экспорту модели в формат ONNX. Построение и непосредственная интеграция модели в MQL5 может оказаться сложным процессом и подверженным ошибкам. Таким образом, данная методология позволяет нам тщательно дорабатывать и настраивать модель, добиваясь желаемых результатов, еще до того, как она будет экспортирована в формат ONNX.


Заключение

Подводя итоги, можно сказать, что в данной статье рассмотрен комплексный подход к реализации регрессионной модели. В разделе 1 мы обсудили выбор регрессионной модели, уделив особое внимание важности выбора правильного алгоритма для решения поставленной задачи. В разделе 2 мы рассмотрели подготовку данных, подчеркнув необходимость их обработки и очистки, чтобы они были готовы к обучению модели.

В разделе 3 мы сосредоточились на обучении и оценке регрессионной модели, используя в качестве примера дерево решений. Кроме того, мы объясняли важность разделения данных на обучающие и тестовые наборы, а также подбора гиперпараметров для оптимизации работы модели.

Наконец, в разделе 4 мы исследовали интеграцию регрессионной модели в тестер стратегий MetaTrader, подчеркивая необходимость эффективного взаимодействия между Python и MQL5, а также указывая на возможность использования формата ONNX для улучшения реализации в MetaTrader 5.

Подводя итоги, можно сказать, что в данной статье был представлен обзор основных этапов внедрения моделей в торговые стратегии, подчеркивающий важность правильного выбора модели, подготовки данных, обучения и оценки, а также эффективной интеграции в торговую среду. Данные шаги являются основой для создания более надежных торговых систем, основанных на данных.
Приведенный выше код доступен по адресу на хранилище Git для дальнейшего использования.

Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/12471

Нейросети — это просто (Часть 79): Агрегирование запросов в контексте состояния (FAQ) Нейросети — это просто (Часть 79): Агрегирование запросов в контексте состояния (FAQ)
В предыдущей статье мы познакомились с одним из методом обнаружение объектов на изображении. Однако, обработка статического изображения несколько отличается от работы с динамическими временными рядами, к которым относится и динамика анализируемых нами цен. В данной статье я хочу предложить Вам познакомиться с методом обнаружения объектов на видео, что несколько ближе к решаемой нами задаче.
Разрабатываем мультивалютный советник (Часть 4): Отложенные виртуальные ордера и сохранение состояния Разрабатываем мультивалютный советник (Часть 4): Отложенные виртуальные ордера и сохранение состояния
Приступив к разработке мультивалютного советника мы уже достигли некоторых результатов и успели провести несколько итераций улучшения кода. Однако наш советник не мог работать с отложенными ордерами и возобновлять работу после перезапуска терминала. Давайте добавим эти возможности.
DoEasy. Сервисные функции (Часть 1): Ценовые паттерны DoEasy. Сервисные функции (Часть 1): Ценовые паттерны
В статье начнём разрабатывать методы поиска ценовых паттернов по данным таймсерий. Паттерн имеет определённый набор параметров, общий для любого вида и типа паттернов. Все данные такого рода будут сосредоточены в классе объекта базового абстрактного паттерна. Сегодня создадим класс абстрактного паттерна и класс паттерна Пин-бар.
Мультибот в MetaTrader (Часть II): улучшенный динамический шаблон Мультибот в MetaTrader (Часть II): улучшенный динамический шаблон
Развивая тему предыдущей статьи про мультибота, я решил создать более гибкий и функциональный шаблон, который обладает большими возможностями и может эффективно применяться как во фрилансе, так и использоваться в виде базы для разработки мультивалютных и мультипериодных советников с возможностью интеграции с внешними решениями.