欢迎光临散文网 会员登陆 & 注册

股票交易软件:以横盘和趋势行情为例强化策略测试器的指标优化

2023-07-19 16:39 作者:大牛啊呢  | 我要投稿

问题

有太多的参数可以优化。

带有多个指标的智能交易程序需要花费大量时间来组合参数进行测试。在我们开始优化智能交易程序之前能否降低组合的数量?换言之, 在编写交易 EA 之前, 我们可以编写伪 EA. 只针对行情查询特殊问题。我们将一个大问题细分为一个个小问题, 并分别解决他们。这个伪 EA 不可进行交易!作为例子, 我们选择了 ADX. 并检查此指标是否能够区分横盘行情和趋势行情, 可能的话, 我们也许能够获得额外的信息。赫兹量化软件

想象一款短线交易 EA, 依据行情是否横盘来进行 '振荡-交易' (回至移动均线) 或应用趋势策略进行顺交易 (沿着移动均线交易)。为了区分, 我们的交易 EA 应在较高的时间帧使用 (唯一) ADX - 此处是 1 小时柱线。除了 ADX, 交易 EA 也许还有 5 个指标 (用于短线交易管理)。每个指标大概有 4 个设置参数, 并且由于它们的步长较小所以它们当中的每一个都有 2000 个不同的数值。这将总计产生 2000*5*4 = 40,000。让我们现在来加入 ADX。对于 ADX 的每个参数组合, 理论上, 我们要进行额外的 40,000 次计算。赫兹量化软件

在此例中我们设置 ADX 的周期 (PER), 它的价格 (PRC) 和极限 (LIM), 因此我们定义趋势开始为 ADX (MODE_MAIN) 上穿 LIM, 而横盘行情为下穿 LIM。对于周期 PER 我们可以尝试 2,..,90 (步长 1=> 89 不同的数值), 对于价格我们可以选择 0,..,6 (=收盘价,.., 加权, 步长 1=> 7), 而对于 LIM 我们尝试 4,..,90 (步长 1=> 87)。总计我们要进行 89*7*87 = 54,201 次组合测试。这里是策略测试器的设置:赫兹量化软件


如果您要重复优化, 不要忘记删除在 \tester\cache\ 里的缓存文件。否则您将发现在策略测试器里的优化结果和优化图形并未保存在 csv-文件, 因为在此情况下 OnTester() 根本就未执行。赫兹量化软件

当然, 一般人会通过策略测试器使用这个参数范围来优化, 但首先我们应查找无意义的结果, 看看我们能否检测并排除它们, 其次是有无教育理由来扩展范围。由于事实上我们的伪 EA 不会交易 (无需使用每笔分时!) 且我们只有一个指标和 54,201 次组合来测试, 我们可以关闭遗传模式并让测试器计算所有组合。赫兹量化软件

如果我们不做这个预-Adx-优化 或者我们不能降低 Adx 参数组合的数量, 我们将不得不把交易 EA 其它变量的 40,000 次组合乘以 ADX 的 54,201 次组合, 然后我们将得到 2,168,040,000 次组合来优化 - 工作量很大, 以至于我们不得不使用遗传优化。赫兹量化软件

最后我们可以大幅降低 Adx 的参数范围 - 这很好, 符合预期!我们将会更好地理解 ADX, 因为我们能够看到 ADX 确实有能力在横盘和趋势行情之间进行鉴别 - 即使判断横盘行情略滞后于趋势行情 (改进的余地?)!进而, 我们会有一些想法, 根据所发现的横盘和趋势行情的范围来确定交易 EA 的止损和目标。测试的 ADX 周期 PER 从: 11..20 (步长 1=> 10), PRC: 0,6 (步长 6=>2) 以及 LIM: 17,..,23 (步长 1=> 7) - 总计 140 组合。这意味着, 我们仅用 4,680,000 次组合即可替换 2,168,040,000 词组和来测试交易 EA, 即在非遗传模式, 速度快了 ~460 倍, 或比遗传模式快了 ~460 倍。在遗传模式, 测试仅需 ~10.000 遍, 但现在交易 EA 的其它参数的更多数值也被测试!赫兹量化软件

备注, 如果您使用遗传算法: 其结果很大程度上要依据可用组合总数和实际执行遍数的关系。在优化期间您遇到的最坏结果, 比较小的是来自下一组选择设置的优良结果数量。赫兹量化软件


理念

我们建立的伪 EA 不进行交易。它只实现了三个重要功能。OnTick(), 在此我们查验指标并判断行情状态, OnTester() 在此我们输出最终结果到我们的 csv 文件, 还有 calcOptVal() 在此我们计算 OptVal 值, 它将由 OnTester() 返回到策略测试器用于排序和遗传算法。函数 OnTester() 将会在一次优化过程的结尾调用, 返回一个特殊值, 且它在 csv 文件里添加一个新行用来在整个优化完成后进行分析。


伪 EA, 第一种方法


现在我们需要确定准则用来计算返回值: OptVal。我们选择横盘和趋势行情的范围, 即实际行情中最高价的最高值与最低价的最低值之间的差价, 以及 "TrndRange" 除以 "FlatRange" 以便优化可以将其最大化:

double   TrndRangHL,       // 趋势行情的 (最高价最高值 - 最低价的最低值) 之和         TrndNum,          // 趋势行情的编号         FlatRangHL,       // 横盘行情的 (最高价最高值 - 最低价的最低值) 之和         FlatNum,          // 横盘行情的编号         RangesRaw,        // 趋势行情范围除以横盘行情的范围 (越大越好)         // ...            参阅以下double calcOptVal() // 第一种方法!!   {
      FlatRange    = FlatRangHL / FlatNum;
      TrndRange    = TrndRangHL / TrndNum;
      RangesRaw    = FlatRange>0 ? TrndRange/FlatRange : 0.0;
      return(RangesRaw);
   }
...double OnTester()
   {
      OptVal = calcOptVal();
      return( OptVal );
   }

可笑的高关联!如果我们查看 csv 文件, 我们会看到横盘行情的平均长度为 1 根柱线, 而开关数量 (横盘行情编号 + 趋势行情编号) 对于实际应用也太小了。(奇怪的数字 PRC=1994719249 而非 0,..,6 应该不会干扰我们, 因为 Adx 的价格正确数字被写在 csv 文件里!)。赫兹量化软件

这个不令人满意的结果意味着, 我们必须多补充一些准则, 以排除那些可笑的情况。


股票交易软件:以横盘和趋势行情为例强化策略测试器的指标优化的评论 (共 条)

分享到微博请遵守国家法律