English 中文 Español Deutsch 日本語
preview
Генеративно-состязательные сети (GAN) для синтетических данных в сфере финансового моделирования (Часть 2): Создание синтетического символа для тестирования

Генеративно-состязательные сети (GAN) для синтетических данных в сфере финансового моделирования (Часть 2): Создание синтетического символа для тестирования

MetaTrader 5Машинное обучение |
230 0
LiviaObongo
LiviaObongo

Введение

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

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

В части 1 нашей серии мы улучшили разнообразие наборов данных и надежность моделей. Темой обсуждения являются реальные сети GAN как инструмент для создания синтетических данных применительно к финансовым наборам данных. GAN — это передовой подход к машинному обучению, позволяющий делать точные прогнозы, эффективно отображать существующие числовые записи финансовой истории и синтезировать данные, реалистично воспроизводящие реальные рыночные тренды. В этой статье показано, как создавать синтетические символы с использованием передовых методов машинного обучения, таких как GAN (генеративно-состязательные сети) и проверять их сходство с реальными рыночными данными с помощью статистических методов, таких как критерий Шапиро-Уилка, t-критерий Стьюдента и критерий Левена. Гарантируя целостность данных, трейдеры могут уверенно использовать синтетические данные в своих торговых системах.


Определение GAN в финансовом моделировании 

Генеративно-состязательные сети (GAN) представляют собой значительный шаг вперед в области машинного обучения, направленный на создание искусственных данных, максимально похожих на реальные наборы данных. Состоящие из двух нейронных сетей — генератора и дискриминатора — сети GAN работают по принципу конкурентного обучения. Генератор создает данные, неотличимые от реальных, в то время как дискриминатор различает реальные и синтетические данные. Такое взаимодействие приводит к постоянному совершенствованию обеих сетей, что позволяет получать высокореалистичные синтетические данные.

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

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

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

Чтобы начать процесс обучения генеративно-состязательной сети (GAN) для прогнозирования финансовых данных, сначала необходимо собрать исторические данные по обменным курсам, например EURUSD. Эти данные служат важным учебным материалом для системы GAN. Необработанные финансовые данные проходят процесс очистки для обеспечения согласованности значений, который включает нормализацию и удаление любых пропущенных точек данных. Затем очищенные данные нормализуются до диапазона от -1 до 1 посредством соответствующего масштабирования для повышения эффективности GAN. Кроме того, обработка этих временных рядов данных должна дать производные признаки, позволяющие идентифицировать значимые закономерности, имеющие значение для прогнозирования.

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

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

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


Генерация синтетических данных в MQL5

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

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

Чтобы использовать синтетические данные в торговле, их необходимо импортировать в MetaTrader 5 как пользовательский символ. Выберите вкладку «Символы» в MetaTrader 5 и создайте новый символ. Дайте ему соответствующее название, например "SYNTH_EURUSD". Функция MQL5 CustomRatesUpdate передает CSV-данные в наш синтетический символ. Наш системный инструмент загружает синтетическую информацию временных рядов на торговую платформу для использования. Проверьте новый синтетический символ в обзоре рынка, чтобы убедиться, что его данные соответствуют созданной вами структуре.  

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

Ниже представлен код, демонстрирующий, как импортировать синтетические данные EURUSD из CSV-файла в MetaTrader 5. Он создает синтетический символ, настраивает его свойства и обновляет его историческими данными из CSV-файла.

#define SYNTHETIC_CSV_FILE_NAME "EURUSD_3_years_synthetic.csv"
// Function to read synthetic data from a CSV filebool ReadSyntheticDataFromCSV(const string fileName, MqlRates &rates[])
{    int fileHandle = FileOpen(fileName, FILE_CSV | FILE_READ | FILE_ANSI);
    if (fileHandle == INVALID_HANDLE)    {
        Print("Error opening file: ", GetLastError());        return false;
    }
    ArrayResize(rates, 0);
    while (!FileIsEnding(fileHandle))    {
        string line = FileReadString(fileHandle);        StringReplace(line, ",", ".");
        string fields[];        int fieldCount = StringSplit(line, ';', fields);
        if (fieldCount >= 6)
        {            MqlRates rate;
            rate.time = (datetime)StringToTime(fields[0]);            rate.open = StringToDouble(fields[1]);
            rate.high = StringToDouble(fields[2]);            rate.low = StringToDouble(fields[3]);
            rate.close = StringToDouble(fields[4]);            rate.tick_volume = (long)StringToInteger(fields[5]);
            rate.spread = 0;            rate.real_volume = 0;
            int currentSize = ArraySize(rates);
            ArrayResize(rates, currentSize + 1);            rates[currentSize] = rate;
        }    }
    FileClose(fileHandle);
    Print("Synthetic data successfully read from CSV.");    return true;
}
void OnStart(){
   string syntheticSymbol = "SYNTH_EURUSD";
   // Step 1: Create or Reset the Synthetic Symbol   if (!CustomSymbolCreate(syntheticSymbol))
   {      Print("Error creating synthetic symbol: ", GetLastError());
      return;   }
   // Step 2: Configure the Symbol Properties
   CustomSymbolSetInteger(syntheticSymbol, SYMBOL_DIGITS, 5);   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_POINT, 0.00001);
   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_TRADE_TICK_VALUE, 1);   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_TRADE_TICK_SIZE, 0.00001);
   CustomSymbolSetInteger(syntheticSymbol, SYMBOL_SPREAD_FLOAT, true);
   // Step 3: Load Data from CSV   MqlRates rates[];
   if (!ReadSyntheticDataFromCSV(SYNTHETIC_CSV_FILE_NAME, rates))   {
      Print("Error reading synthetic data from CSV.");      return;
   }
   // Step 4: Update Rates and Add to Market Watch   if (!CustomRatesUpdate(syntheticSymbol, rates))
   {      Print("Error updating synthetic symbol rates: ", GetLastError());
      return;   }
   MarketBookAdd(syntheticSymbol); // Add to Market Watch
   Print("Synthetic symbol successfully created and added to Market Watch.");}

  • Добавим этот скрипт в MetaEditor и скомпилируем его.
  • Запустим скрипт на реальном EURUSD из панели "Навигатор" в MetaTrader 5.
  • Убедимся, что синтетический символ появился в окне "Обзор рынка" с импортированными данными.

Ниже представлено окно графика нашего синтетического символа "SYNTH_EURUSD":

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


Критерий Шапиро-Уилка

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

  • Гипотезы:
    • H₀ (нулевая гипотеза): данные распределены нормально.
    • H₁ (альтернативная гипотеза): данные распределены ненормально.

Интерпретация:

  • При p > 0,05, данные, скорее всего, распределены нормально (H₀ принимается).
  • При p ≤ 0,05, данные не подчиняются нормальному распределению (H₀ отклоняется).

Пример из статьи:

Исторические данные EURUSD и синтетические данные EURUSD приведены к одним и тем же таймфреймам. Критерий Шапиро–Уилка применяется к обоим наборам данных для сравнения их распределений.

Результат:

  • Синтетические данные: W = 0,998, p = 0,432
  • Реальные данные: W = 0,997, p = 0,398

Оба набора данных имеют p > 0,05, что указывает на то, что они следуют нормальному распределению.

Вот код Python для выполнения теста Шапиро-Уилка на пользовательских наборах данных с использованием библиотеки scipy.stats:

import pandas as pd
from scipy.stats import shapiro

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Shapiro-Wilk test
synthetic_stat, synthetic_p = shapiro(synthetic_close)
real_stat, real_p = shapiro(real_close)

# Print results
print("Shapiro–Wilk Test Results:")
print(f"Synthetic Data W-statistic: {synthetic_stat:.4f}, P-value: {synthetic_p:.4f}")
print(f"Real Data W-statistic: {real_stat:.4f}, P-value: {real_p:.4f}")

# Interpretation
if synthetic_p > 0.05:
    print("Synthetic data follows a normal distribution.")
else:
    print("Synthetic data does not follow a normal distribution.")

if real_p > 0.05:
    print("Real data follows a normal distribution.")
else:
    print("Real data does not follow a normal distribution.")


t-критерий Стьюдента

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

  • Гипотезы:
    • H₀: Средние значения равны.
    • H₁: Средние значения не равны.

Интерпретация:

  • Если p > 0,05, то между средними значениями нет существенной разницы (H₀ принимается).
  • Если p ≤ 0,05, то средние значения существенно различаются (H₀ отклоняется).

Пример из статьи:

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

Результаты:

  • Т = 0,534, р = 0,594

Поскольку p > 0,05, существенной разницы между средними значениями двух наборов данных нет.

Вот код Python для выполнения t-критерия Стьюдента для сравнения средних значений столбца close в синтетическом и реальном наборах данных:

import pandas as pd
from scipy.stats import ttest_ind

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Student's t-test
t_stat, p_value = ttest_ind(synthetic_close, real_close, equal_var=False)  # Use equal_var=False if variances are unequal

# Print results
print("Student's T-Test Results:")
print(f"T-statistic: {t_stat:.4f}, P-value: {p_value:.4f}")

# Interpretation
if p_value > 0.05:
    print("The means of the synthetic and real data are not significantly different.")
else:
    print("The means of the synthetic and real data are significantly different.")


Критерий Левена

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

  • Гипотезы:
    • H₀: Дисперсии равны.
    • H₁: Дисперсии не равны.

Интерпретация:

  • При p > 0,05 дисперсии статистически схожи (H₀ принимается).
  • При p ≤ 0,05 дисперсии существенно различаются (H₀ отвергается).

Пример из статьи:

Сравниваются дисперсии реальных и синтетических данных EURUSD для оценки моделей их волатильности.

Результаты:

  • W = 0,8742, p = 0,3517

Поскольку p > 0,05, существенной разницы между дисперсиями наборов данных нет.

Ниже представлен код Python для выполнения теста Левена для сравнения дисперсий столбца close в синтетическом и реальном наборах данных:

import pandas as pd
from scipy.stats import levene

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Levene's test
stat, p_value = levene(synthetic_close, real_close)

# Print results
print("Levene's Test Results:")
print(f"Statistic: {stat:.4f}, P-value: {p_value:.4f}")

# Interpretation
if p_value > 0.05:
    print("The variances of the synthetic and real data are not significantly different.")
else:
    print("The variances of the synthetic and real data are significantly different.")


Заключение

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

Используя инструменты MQL5 и генеративно-состязательные сети (GAN), трейдеры могут создавать настоящие синтетические наборы данных, имитирующие различные рыночные условия. Такое сочетание создает основу для генерации синтетических символов с такими методами проверки, как критерий Шапиро-Уилка и t-критерий Стьюдента, обеспечивающими статистическое сходство с реальными рыночными данными.

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

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

Прикрепленные файлы |
Разрабатываем менеджер терминалов (Часть 1): Постановка задачи Разрабатываем менеджер терминалов (Часть 1): Постановка задачи
Как обеспечить возможность удобного контроля за несколькими терминалами, на которых торгуют советники, да ещё и на разных компьютерах? Попробуем создать веб-интерфейс по управлению запуском торговых терминалов MetaTrader 5 и просмотру детальной информации о работе каждого экземпляра.
Алгоритм голубых обезьян — Blue Monkey (BM) Algorithm Алгоритм голубых обезьян — Blue Monkey (BM) Algorithm
В статье представлена реализация метаэвристического алгоритма Blue Monkey, основанного на моделировании социального поведения голубых мартышек. Рассматриваются ключевые механизмы алгоритма - групповая структура популяции, следование за локальными лидерами и обновление поколений через замену худших взрослых особей лучшими детёнышами, а также анализируются результаты тестирования.
От начального до среднего уровня: Индикатор (II) От начального до среднего уровня: Индикатор (II)
В этой статье мы рассмотрим, как реализовать расчет скользящей средней и какие меры предосторожности следует предпринять при выполнении данного расчета. Мы также поговорим о перегрузке функции OnCalculate, чтобы знать, когда и как работать с той или иной моделью.
Автоматизация торговых стратегий на MQL5 (Часть 10): Разработка стратегии Trend Flat Momentum Автоматизация торговых стратегий на MQL5 (Часть 10): Разработка стратегии Trend Flat Momentum
В настоящей статье мы разрабатываем советник на MQL5 для стратегии Trend Flat Momentum. Мы комбинируем пересечение двух скользящих средних с фильтрами импульса RSI и CCI для генерации торговых сигналов. Также рассказываем о тестировании на истории и потенциальных улучшениях для повышения эффективности в реальных условиях.