English Русский Español Deutsch 日本語 Português
preview
财经建模中合成数据的生成式对抗网络(GAN)(第 2 部分):创建测试合成品种

财经建模中合成数据的生成式对抗网络(GAN)(第 2 部分):创建测试合成品种

MetaTrader 5机器学习 |
185 0
LiviaObongo
LiviaObongo

概述

在财经建模中,交易者面临着重大挑战;大量时候仅有少量的可用数据。这种约束会阻碍交易技术的创建和评估,特别是当崩盘、高波动性、或长期的市场盘整,都未在数据集中得到很好的体现时。据此原因,在运用这些策略时,数据态少,不足以多样化或全面普适性能,尤其是在现实世界的环境中。甚至,财经市场的结构还受到地缘政治变化,及经济政策变化等多种因素的影响。历史数据在捕捉不同市场变量方面是有限的,依据良好回测记录的算法,仍可令交易者保持可靠,但无法适应新的或不可预测的市场盘整。 

为了克服所有这些挑战,现在认为借助人工数据是最佳方案。合成数据能够提供逼真、且丰富的各种市场条件,包括非对称条件,来取代或增强传统的历史数据。这有助于拓宽和加强交易策略,在于压力测试和普适模型的能力于此得到了改进。 

在我们的第 1 部分中,我们强化了数据集多样性和模型健壮性,现今在我们系列的第二部分中,讨论的主题是真正把 GAN 当作工具,创建可应用到财经数据集的合成数据。GAN 是一种尖端的机器学习方式,用于做出准确的预测,擅长映射现有的财经历史数字记录,并合成逼真复现真实市场趋势的数据。本文演示了如何利用 GAN(生成式对抗网络)等高级机器学习技术创建合成品种,并通过 Shapiro-Wilk、学生 t-检验、和 Levene 等统计方法验证它们与真实市场数据的相似性。通过确保数据完整,交易者可放心地在其交易系统中使用合成数据。


了解财经建模中的 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” 的图表窗口:

合成品种一旦构建完成,就需要对比真实市场数据进行验证。分析是利用统计检验来检查两套数据是否忠实于其基本形态。我们的测试验证了模拟数据的行为与实际市场数据相似,从而保持交易平台的可靠性。以下是应用的统计方法:


夏皮罗-威尔克(Shapiro-Wilk)检验

该测试检查一套数据是否符合正常的统计形态。经由统计测试,交易者验证合成数据是否与真实交易市场的整体价格走势形态相匹配。当这些数据集匹配良好时,逼真数据建模就能起作用了。

  • 假设:
    • 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 ,表明它们遵循正态分布。

以下是使用 scipy.stats 库对数据集执行夏皮罗-威尔克测试的 Python 代码:

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-检验

t-检验帮助我们查看两个数据集在统计上是否具有相同的平均测量值。我们的财经模型需要展现出合成数据的价格行为,与现实世界的市场形态相匹配。该分析有助于验证价格在典型市场中如何正常上下移动。

  • 假设:
    • H₀:中值相等。
    • H₁:中值不相等。

解释:

  • 如果 p > 0.05 ,则中值之间没有显著差异(H₀ 可接受)。
  • 如果 p ≤ 0.05 ,则中值显著不同(H₀ 被拒绝)。

文章示例:

使用独立的双样本 t-检验比较同一时间帧内的合成和真实 EURUSD 数据,来评估它们的中值是否不同。

结果:

  • T = 0.534 , p = 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.")


莱文(Levene's)检验

该检验比较两个检验集之间数据方差的稳定性。价格波动水平展现出交易数据的差异。验证证明,合成数据展现出相似的价格波动形态,这意味着它能准确代表市场行为。

  • 假设:
    • 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

附加的文件 |
MQL5 交易工具包(第 6 部分):使用最新成交的挂单函数扩展历史管理 EX5 库 MQL5 交易工具包(第 6 部分):使用最新成交的挂单函数扩展历史管理 EX5 库
了解如何创建可导出函数的 EX5 模块,无缝查询和保存最近填写的挂单数据。在本全面的分步指南中,我们将通过开发专用和分隔的函数来检索最后填写的挂单的基本属性,从而增强历史管理 EX5 库。这些属性包括订单类型、设置时间、执行时间、填充类型以及有效管理和分析挂单交易历史所需的其他关键细节。
MQL5交易策略自动化(第十二部分):实现缓解型订单块(MOB)策略 MQL5交易策略自动化(第十二部分):实现缓解型订单块(MOB)策略
在本文中,我们将构建一个MQL5交易系统,可针对“聪明资金”(Smart Money)交易自动检测订单块。我们将阐述该策略的规则,在MQL5中实现其逻辑,并融入风险管理以实现有效的交易执行。最后,我们将对该系统进行回测,以评估其表现,并对其进行优化以获得最优结果。
在 MQL5 中构建自优化EA(第六部分):自适应交易规则(二) 在 MQL5 中构建自优化EA(第六部分):自适应交易规则(二)
本文探讨了如何优化 RSI 的水平和周期,以获得更好的交易信号。我们介绍了估算最优 RSI 值的方法,并使用网格搜索和统计模型来自动选择周期。最后,我们在 MQL5 中实现了该解决方案,同时利用 Python 进行分析。我们的方法力求务实和直接,旨在以简单的方式帮助您解决潜在复杂的问题。
开发多币种 EA 交易(第 21 部分):准备重要实验并优化代码 开发多币种 EA 交易(第 21 部分):准备重要实验并优化代码
为了取得进一步的进展,最好看看我们是否可以通过定期重新运行自动优化并生成新的 EA 来改进结果。关于使用参数优化的许多争论中的绊脚石是,在将盈利能力和回撤保持在指定水平的同时,所获得的参数在未来一段时间内可用于交易的时间有多长。有可能做到这一点吗?