模式搜索的暴力方法(第二部分):深入(基础篇)
◍ 用暴力枚举挖历史形态的起点
在 MT5 里做模式搜索,最直观的办法就是把历史 K 线按固定窗口切片,逐段比对当前走势。这种做法不依赖任何先验假设,纯粹靠算力把相似形态捞出来,适合验证「某段行情是否重复出现过」。
- 年 2 月 5 日发布的测试案例里,单线程跑完 1779 根样本柱、匹配 13 组候选模式,耗时在普通 VPS 上约数分钟级——说明窗口长度和步长直接决定回测成本。
想自己复现,先开 MT5 的「策略测试器」选「逐笔」模式,把历史数据范围拉到足够长。外汇与贵金属杠杆高、滑点跳空频繁,暴力匹配出的形态在历史里「像」不代表未来概率占优,只能当线索。
「这次只跑几个货币对的全域扫描」
承接前一篇的框架,本次用改版后的应用程序对货币做更深入的剖析。得益于 Aleksey Vyazmikin 在底层逻辑上的建议,计算流程得以推进到能跑出可对比的区间分布。 受限于个人的时间与算力,本轮只在单一时间框架下覆盖数个货币对,不做全市场铺开。对初次接触全局节律的人,这几组样本已足够暴露最长与最短持续间隔之间的结构差异。 后续篇章会沿用本文及前篇的统计数据,继续放出更细的结果。外汇与贵金属属高风险品种,此类区间统计仅描述历史分布,不预示下一步方向。
把重复劳动丢给机器
写 MT4/MT5 EA 的人大多卡在同一个死循环里:堆几千行代码、跑无数次测试和优化,前后向验证做完,结果常常不是当初想要的。不少程序员被这种固定流程磨到没脾气,研究和搜索变成纯机械重复。 我自己就栽过跟头——当工作既给不了成就感也带不来钱,退出几乎是本能反应。后来我选了另一条路:把机器能稳定干的活全自动化。机器没情绪,是理想的执行者,计算资源管够,跑起批量任务比人轻松太多。 当时摆着两个选项:自研一套能进化的神经网络架构,或者用最朴素的方法先解决问题。我挑了后者。它看似简单,却比写常规 MQL 程序留出更多折腾空间——通用模板打底,再按需要逐步加功能,既能甩掉枯燥日常,又不耽误继续开发。 外汇和贵金属市场高波动、高杠杆,这类自动化思路只解决「效率」问题,不解决「策略盈亏」问题,实盘前务必在 MT5 策略测试器里用历史数据验证逻辑。 说句实在的,懒不是缺点,肯把常规活交给机器,才腾得出手做真正有意思的模块。
◍ 多项式重构与样本长度如何决定暴力搜索质量
这一版暴力程序只动了一处显式设置,却改了底层公式结构。新增的线性因子过滤器放在第二选项卡,用来在第一步按质量排序后,用「与直线的相似度」给图形形状打分,避免人工逐个肉眼筛。代价是:开启该过滤器后暴力计算速度大约慢 2 倍,但吐出来的主结果总数变少、平均质量更高,后续第二选项卡的丢弃率也更低。 旧版多项式只吃 Close[i]-Open[i],新版把单根 K 线的全部价格信息塞了进去:Close[i]-Open[i]、High[i]-Open[i]、Low[i]-Close[i]、Low[i]-Open[i]、High[i]-Close[i] 都可作为 x[i]。这些量的线性组合能退化出已有变量,比如 C1=1、C2=-1 时 NewQuant = High[i]-Low[i],所以基本式里不必重复塞可由现有系数生成的项,它们会在系数寻优中自然浮现。 Y = Sum(0,NC-1)( C[i]*Variant of product(x[1]^p[1]*x[2]^p[2]...*x[N]^p[N]) ),且 Sum(0,N)(p[i])=MaxPowOfPolinom。柱数最少时我几乎只用 1~3 次项,更高阶在普通机器甚至服务器上都跑不动。NC 是项数也即系数个数,总次数超上限任何电脑都展不开。 用多项式而非条件堆叠,核心是把交易信号压成一个连续函数:输出正分或负分,信号强度随函数值走,唯一可调优化参数就是多项式值,不用去猜「用几个条件、什么条件」。但试图强化进场信号,必然在固定时间内减少成交笔数——这是带随机分量的函数普遍现象。 样本大小直接决定随机坑的概率。小样本更容易撞出看似能跑、放到品种全局历史就崩的随机公式。期望策略数 Mn(t)=W(t,F)*Ef(T,N,L),其中 W=F*t,Ef 随分析区间长度 T、最小成交数 N、最大线性系数 L 变化;L 越小(越贴近直线)系统越难找但越稳。 我自己用 P_FACTOR=(Profit-Loss)/(Profit+Loss) 代替无上限的利润因子,它锁在 [-1,1],Mx(T) 上限就是 1 且随 T 单调递增。Mq(T,N,S) 永远穿不过 Mx(T) 这条渐近线——真能贴上去就是圣杯,现实没有。外汇和贵金属属高风险市场,这类暴力拟合结论只代表历史样本上的概率倾向,实盘前务必用 MT5 多品种、多周期重跑验证。