Генеративно-состязательные сети (GAN) для синтетических данных в сфере финансового моделирования (Часть 2): Создание синтетического символа для тестирования
Введение
При финансовом моделировании трейдеры сталкиваются с серьезной проблемой: большую часть времени доступны лишь незначительные данные. Это ограничение может затруднить создание и оценку торговых методов, особенно когда обвалы, высокая волатильность или длительная консолидация рынка недостаточно хорошо представлены в наборах данных. По этой причине при использовании этих стратегий данные редко бывают достаточно разнообразными или полными, чтобы обобщать результаты, особенно в условиях реального мира. Более того, на структуру финансовых рынков влияют различные факторы, такие как геополитические сдвиги и изменения экономической политики. Исторические данные ограничены в плане охвата различных рыночных переменных, что позволяет трейдерам полагаться на алгоритмы с хорошими результатами тестирования на истории. Но при этом у них нет возможности адаптироваться к новым или непредсказуемым рыночным консолидациям.
Для преодоления всех этих проблем в настоящее время оптимальным решением считается использование искусственных данных. Синтетические данные могут заменить или дополнить традиционные исторические данные, предоставляя реалистичное и широкое разнообразие рыночных условий, включая асимметричные. Это помогает расширить и укрепить стратегии торговли, поскольку здесь совершенствуется стресс-тестирование и способность обобщать модели.
В части 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
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Разрабатываем менеджер терминалов (Часть 1): Постановка задачи
Алгоритм голубых обезьян — Blue Monkey (BM) Algorithm
От начального до среднего уровня: Индикатор (II)
Автоматизация торговых стратегий на MQL5 (Часть 10): Разработка стратегии Trend Flat Momentum
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования