- 发布者:
- Vladimir Karputov
- 显示:
- 3823
- 等级:
- 已发布:
- 2019.01.21 09:49
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
mq5 代码作者 - barabashkakvn
一点理论
许多自动交易系统倾向于过度优化和拟合结果,也就是说,它们在某段历史数据区间得到了很好的优化,但如果您随后在模拟或实盘账户上启动此优化系统进行交易,它会因交易信号过于随机而转为亏损。 这与金融产品的非固化特征有关,即它们的统计特征是不稳定的。
为判别过度拟合的可能性,您可以使用所谓的经典前瞻测试,这在 Robert Pardo 的书[1] 中已有描述。 经典方法的思想如下:为交易系统选择两个无交错的历史区间。 交易系统在一个区间进行优化,并且在第二个区间中按照第一区间中得到的优化参数进行前瞻测试。 如果在第二(前瞻)历史区间内的测试不成功,则认为交易系统过度优化,且不适合自动交易。 如果前瞻测试得出正面结果,则执行附加分析以来检查测试区间中的交易系统行为 — 这种分析能够辨别系统特征。
但是,可以通过 Robert Pardo 在书[1] 中描述的所有测试的系统实际上并不存在。 因此作者没有给出任何具体的例子。 在一个区间内优化并在另一个区间内前瞻测试,以及前瞻测试的进一步分析都不能提供任何保证:
- 在第二区间的前瞻测试中不成功,也许会将健壮的交易系统舍弃。 实际上,优化算法通常在局部极端情况下循环,并针对这部分数值过度拟合交易系统参数。
- 分析前瞻测试结果实际上没啥用,因为如果您选取另一段未经优化也未经测试的独立区间,并在这个区间内进行了附加分析,则新的分析结果将与之前的分析结果不一致。 原因是相同的,金融产品的非固化性。 甚或,在一个独立区间内成功的前瞻测试参数可能在其它任何区间都不会成功。 所以,这些情况下没啥好分析。
由于检验交易系统的经典方法有许多缺点,我已经开发并测试了另一套,我认为它更可靠: 金粉。
新方法和经典方法之间的区别在于交易系统优化不局限在一个区间内执行,而是在两个或更多区间内执行。 因此,我们能从每个区间获得不同的交易系统参数集合。 其中有些会是相同的,其它则不同。 也许,这些参数集合中有些会过度优化,而其它参数集合则不是。 这可以使用前瞻测试来发现。
前瞻测试与经典测试的不同之处在于,它使用两个或更多的优化参数集合来执行,而非仅使用一套。 该思路如下:如果交易系统的所有参数集合均给出商定的买入或卖出信号,则执行相应的交易。 如果信号不同,即系统的参数集合产生的交易信号不一致,则交易系统在下一个交易信号之前什么也不做。
这会带来什么?
在此,我们需要决定交易系统的稳健性。 交易系统可能具有潜在的稳健性,即在经典方法中能够通过前瞻测试的概率高于零; 而非稳健的,即过度拟合的概率非常高。
- 如果交易系统不稳健,那么在两个或更多历史区间中过度拟合它,如果多个过度拟合的交易信号是一致的,它也可以变得健壮。 即,如果我们由信号的一致性进行过滤,那么它们就可以用于自动交易。
- 如果交易系统或多或少具有稳健性,则交易信号一致性模式(拟合和非拟合)中的成功前瞻测试可以验明,在不同历史数据区间中获得的一个或多个优化结果参数集合并非过度拟合,且可用于自动交易。
我们不会在这里研究非稳健的交易系统,因为即使它们的信号基于一致性过滤,但在非优化区间的结果也不够稳定,不能用于交易。 这种交易系统更适合试验。
我们来验证一套稳健的交易系统,该系统可在附件中找到。 交易系统基于未来价格方向预测,它由基础单层神经网络(基于历史数据的感知器)的选择性权重系数来实现,并使用标准 MetaTrader 策略测试器的遗传算法。
优化、测试和检测交易系统参数稳健性的方法
我们将在 H1 时间帧内,使用 EURUSD 前 9 个月或更长时间的历史数据。 我们将整个区间分为三个独立的时间段,每个时间段三个月。 第一个间隔将用于最终测试,其它两个将用来历史优化。 我将两个感知器合并到一个交易系统当中,因此不需要每次单独启动系统。
EA 代码中的 Supervisor() 切换器函数启用三种 EA 操作模式,具体取决于 'pass' 输入参数:
- 优化并和测试第一个感知器;
- 优化并和测试第二个感知器;
- 在测试模式中滤除两个感知器的冲突值,未优化。
以下感知器的的权重系数正在优化:x11,x12 ... x42,以及 MA: averaging period 和 Stop Loss。 Stop Loss 输入参数对于所有区间都是常量。 这是所有持仓的止损级别。 另一个输入参数 MA: averaging period 表示开盘价差值的滞后时间周期; 它也是常量。
入场是在新柱线形成时进行的,即依据 pass 参数值基础上的感知器信号所在柱线的开盘价进行。 离场仅由止损执行。 使用遗传算法进行优化,遗传算法搜索极值(即在我们的情况下的最大余额)。
为了避免追加保证金对算法的影响,初始数额应该非常大,例如 $1,000,000。
At the first phase, 我们需要判断
MA: averaging period 和 Stop Loss 变量的输入值。 为此,我们选择最后两个历史区间,即从 6 个月前到今天。 将感知器权重的所有参数起始 = 0,停止 = 100,步幅为 10。 MA: averaging period 的数值起始 = 3 停止 =100,步幅为 10; Stop Loss 的数值起始 = 10 停止 =75,步幅为 10。 数值 pass = 1。 选择优化参数: x11, x21, x31, x41, MA: averaging period 和 Stop Loss。 应禁用所有其它复选框。 开始优化。 之后根据最优递次设置输入参数值。
第二阶段。 优化第二历史数据区间中的第一感知器权重。 设置优化日期和时间从 6 个月前到 3 个月前。 删除 MA: averaging period 和 Stop Loss 的复选框。 开始优化。 之后根据最优递次设置输入参数值。 pass 的数值依旧为 1。
第三阶段。 优化第三历史数据区间中的第二感知器权重。 将优化日期和时间从 3 个月前设置为今天。 从选择参数中删除 x11, x21, x31, x41 并选择 x12, x22, x32 和 x42。 应禁用其它参数。 设置 pass=2。 开始优化。 之后根据最优递次设置输入参数值。
第四阶段。 交易系统已针对过去六个月的历史数据进行了优化。 将输入参数的值保存到配置文件中。 设置 pass 输入参数为 3。 现在我们需要验证我们的系统稳健性,即输入参数没有过度拟合的概率,以及它们可能在非优化时间段内表现出盈利。 所以现在,我们将日期设置为 9 到 6 个月之前(在此时间段内未执行任何优化)并执行测试。
如果在模式 3 中测试结果是负数(亏损),那么我们很可能会发现两个感知器系数均过度拟合。 在此情况下,我们需要再次执行优化,以便在第一阶段获得 sl 和 tp 参数的其它值 - 亏损的可能原因也许就在这些参数中。 亏损的另一个原因可能是在第一和第二优化阶段(应该有不少于 100 笔成交)的成交量太少 — 在这种情况下,应该减少 sl 参数的最大结束范围。
如果第四阶段成功,那么我们可以假设第一个或第二个感知器,甚或它们都可以在优化间隔之外产生利润,因此可以用于交易。 现在我们需要选择感知器。 为此,我们将日期从 9 个月前设置为当天,并在 pass 为 1 和 2 模式下运行智能交易系统测试。
具有更好结果的模式很可能是过度拟合较低且适合交易的模式。 将 EA 切换到此模式,保存 EA 设置到文件。 之后在图表上运行 EA,将时间帧设置为 H1 并从先前保存的文件加载设置。
当然,为了确保这种交易系统稳健性检测方法真实有效,所有历史数据区间应该移至历史更深层,以便再获得一个额外的区间,并测试在此区间内的参数设置。
上述判定交易系统稳健性的方法并不简单。 但与 Robert Pardo 书[1] 中描述的经典方法相比,它更简单,并且在大多数情况下更可靠,因为它摒弃了在前瞻测试之后资源密集但几乎无用的交易系统分析。
参考文献列表
1. Robert Pardo. 交易系统的设计、测试和优化(Design, Testing and Optimisation of Trading System)。 - Minax, 2002。 - 224 页。 ISBN 5-902270-01-4
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/23220

Float_Pivot_Digit 指标,计算输入时间序列中使用了平滑。 时间序列平滑参数由指标输入变量确定

布林带® 的另一种替代方案,在通道内填充颜色,并绘制为云,显示最后数值的价格标签,并可以将通道级别舍入到所需的位数