开发自适应算法 (第二部分): 提高效率·进阶篇
把固定阈值改成随样本量衰减的非线性函数
原版机器人只在固定分析窗口里数涨跌烛形,超额百分比一旦写死,样本里烛形越多,出现这种组合的概率就掉得越快。实测下来,30 根烛形里 24 根同向(80% 超额)的概率约 0.11%;但把样本拉到 100 根,要维持同等概率根本找不到对应档位,最近的两档是 66/34(概率 0.172%)和更稀有的 0.091%,只能往更稀有那边取。 这说明超额百分比和烛形数量是非线性关系。用组合数学算单向概率 P = C(n,k) / 2^n(同向多空都算所以要乘 2,仅当多空相等时不乘),就能反推每个样本量该配多少阈值。我据此写了个随 Nb 增大而下调百分比的函数,衰减比纯组合曲线更慢——因为样本越大,序列里堆的仓位越多,回撤负担越重,故意少给信号。 图 2 里紫线是固定发生概率下的理论阈值,红线是实装函数。两者都非线性,但实装线更平缓是有意的:让大样本上的信号更少见,且只在超额真的很高时才触发。外汇与贵金属杠杆高,这种过滤直接砍掉大量无效开仓,回测资金曲线更不容易断。 可以立刻在 MT5 里用下面这段把组合数算出来,验证 30 根 24 同向到底是不是约 0.11%,再对比你自己写的固定阈值 EA 信号数。
class="type">class="kw">double CombProb(class="type">int n, class="type">int k) { class=class="str">"cmt">// n: 样本烛形数 class=class="str">"cmt">// k: 同向烛形数 class="type">class="kw">double C = class="num">1.0; for(class="type">int i=class="num">1; i<=k; i++) C = C * (n - i + class="num">1) / i; class=class="str">"cmt">// 组合数 C(n,k) class="type">class="kw">double P = C / pow(class="num">2.0, n); class=class="str">"cmt">// 单向概率 if(k != n - k) P *= class="num">2.0; class=class="str">"cmt">// 多空不等则乘2 class="kw">return P * class="num">100.0; class=class="str">"cmt">// 返回百分比 }
◍ 跨周期跨品种的稳定性验证
把第二版算法直接架在 GBPUSD H1 上跑 2000.01.01–2020.12.08 近 21 年,控制点模式、烛形收盘触发、测试点差设 40 点。分析范围取 68–200 个烛形、15 个样本多重采样。对比第一版,仓位数量翻 3 倍,利润增 1.9 倍,利润因子从 7.5 掉到 2.74,信号生成更密但序列平均仓位更少了。 切到 M15 用同一套 H1 参数测 GBPUSD(2009.01.01 起通过),因短周期波动不均匀利润率自然降一截;手动把参数从 H1 挪过来没专门优化,表现仍算稳。EURUSD H1 上新版从 2000 年过测、最大回撤降 1.2 倍、利润增 3 倍、交易数增 2.3 倍;GBPJPY H1 从 2000 年过测、回撤降 1.8 倍、利润系数升到 3.3 倍。
- 个品种(含八大主流货币交叉)逐一在 MT4 分开回测再用第三方合报告,2010–2017 联合曲线平坦、年化约 100%,但实盘两年真实年化仅 56%。测试故意放大点差,点差越大稳定性越差反而利润显得高;实盘禁单向交易也削了信号量。外汇与贵金属杠杆品种波动剧烈,这类回测外推到实盘存在显著偏差风险。
基于 ATR 的动态手数(3000 美金 0.01、放大到 30000 美金 0.1)让盈利曲线更线性、夏普倾向更好,但最大回撤同步抬头。要验证参数鲁棒性,开 MT5 把同套 H1 设置丢进 M15 跑一段最难的 2008–2009,若只优化这 1.5 年基本就能让 EA 过完 21 年。
「多周期确认与资金护栏的附加开关」
在H1执行交易时,可让M1、M5、M15、M30、H1、H4、D1全部出现同规则信号才确认序列开始,各周期独立启停。这种跨周期过滤偏向剔除单边假突破,但原作者坦言因功能运行异常未能验证该模式有效性。 EA还藏了几道实用护栏:按算法设止盈止损,可复制实际平仓点也可独立;净值跌破阈值就平掉头寸并停手。单品种或全局最大持仓数、单品种当前亏损的虚拟止损都能限死。 两个相邻烛形系列间可插一段暂停,前一系列收完不立刻开下一个,腾出空窗去别的品种起序列。最低ATR门槛能卡掉低波动无利可图的启动。 平仓利润非线性——持仓越多越想快点结束,门槛利润随未平数量平方根下降。全局变量让PC或终端重启后捡回未平仓位接着跑。EA给28个品种塞了2337项设置,外汇贵金属高杠杆下建议先开MT5用单品种小周期验证这些开关再放大。
优化依赖与理论缺口
这套算法在 28 种货币对上做了设置示例,长时间跑下来稳定性不错,但有个绕不开的硬伤:每种工具都得单独优化。这说明我们根本没有一套完整理论模型,说不清某工具在某时段到底该用哪些参数、为什么用。 价格序列之间的差异对我们来说是黑箱。不知道 A 工具与 B 工具序列参数差在哪,就没法确认当前品种上是否真存在某种模式,也更谈不上控制盈利和稳定性受哪些序列参数影响。 选一套跨品种都稳的参数能跑,但实测盈利能力会明显往下掉。历史优化里排不掉的未知因素,正是未解释变量在啃稳定性。 真要脱坑,下个版本得大改理论、丢掉优化依赖。每个参数都得挂在一个可解释的市场逻辑上,不能只因为回测里 EA 用着顺手就塞进去。外汇与贵金属高波动,参数无解释即埋雷。 附件里 EA 代码、需求规格、测试设置、28 对设置样本和算事件概率的 Excel 都给了,开 MT5 把样本导进去比对不同对的优化落差,比空想模型来得快。
◍ 别急着下结论
从读者反馈看,这套自适应算法在 MT4 与 MT5 上的表现差异明显:同一 EURUSD、H1、仅开盘价建模、2018–2021 区间,MT4 单跑能出 1000–2000 笔交易,MT5 却只约 20 笔且回测耗时约 10 分钟,而 MT4 仅 20–30 秒。若 EA 在指定日期完全无交易,大概率不是 bug,而是样本期内没触发信号。 作者在讨论里点过:MT4 下须把对应货币对文件装入 EA,且测试器品种要与设置里第一个品种一致;换 NZDCAD 这类非默认对,也得在设置中显式指定。MT5 移植后交易量骤减的现象目前社区还没人给出完整版修正,属于待验证项。 外汇与贵金属杠杆高、滑点和隔夜成本会吃掉概率优势,上面这些数字只是别人回测现象,实盘可能偏离。先按原文附件把 EURUSD 跑通,再谈改参数或换品种。
<span>如果顾问没有在指定日期进行交易,请增加测试时间,也许是没有信号。</span>