一项智能交易系统失败原因分析·进阶篇
📘

一项智能交易系统失败原因分析·进阶篇

第 2/2 篇

「把自相关函数当成指标看」

自相关函数(ACF)和 ATR、布林带不是一类东西——它不靠波动率吃饭,而是专门在时间序列里找形态痕迹。它的核心是算序列里某个元素和滞后若干周期的元素之间的相关程度;序列里出现趋势时,小滞后下的 ACF 往往为正。这里把 Y[i] 直接定义成第 i 根 K 线的收盘价减开盘价,也就是单根实体方向。 拿数字序列 {1,2,3..14} 试算,ACF 约 0.786;但换成相邻差值序列后 ACF 趋近于零(加点噪声防除零)。这说明价格本身的 ACF 和价格变化的 ACF 完全是两码事,后者基本抹掉了趋势记忆。 EURUSD 十六年月度均值平滑 6 个月后,2008–2012 年那段 ACF 略高,和同期 MAC 类策略盈利表现有点同步倾向;GBPUSD 那边利润和 ACF 只是弱相关。外汇和贵金属杠杆高,这种相关只是统计现象,不能直接当开仓信号。 下面这段是 ACF 的计算实现,入参 ClsOpn 是收盘价减开盘价数组,CorrPer 为计算窗口,LagPer 是滞后周期,joff 是偏移。 别把正态当圣经:ACF 指标(Lag=1)实盘图上看不清趋势拐点,它更适合做背景相关性参考,而不是裸用做方向判断。

MQL5 / C++
class="type">class="kw">double GetAtCorrVal(class="type">class="kw">double &ClsOpn[],class="type">int CorrPer, class="type">int LagPer,class="type">int joff ) {
   class="type">class="kw">double corr;
   class="type">class="kw">double AIn[],BIn[];
   class="type">class="kw">double XMean,XNum,XDen;
   class="type">int jj;
   ArrayResize(AIn,CorrPer);
   ArrayResize(BIn,CorrPer);
   XMean = class="num">0.;
   XNum = class="num">0.;
   XDen = class="num">0.;
   corr = class="num">0.;
   if(CorrPer<class="num">2)
    {
     Print("No AutoCorr Processing Allowed ");
     class="kw">return(corr);
    }
   class=class="str">"cmt">// mean
   for(jj=class="num">0;jj<CorrPer;jj++)
    {
     XMean +=ClsOpn[jj+joff];
    }
   XMean = XMean/CorrPer;
  class=class="str">"cmt">// variances
   for(jj=class="num">0;jj<CorrPer;jj++)
    {
     if(jj<(CorrPer-LagPer))
       XNum  += (ClsOpn[jj+joff]-XMean)*(ClsOpn[jj+LagPer+joff]-XMean);
     XDen += (ClsOpn[jj+joff]-XMean)*(ClsOpn[jj+joff]-XMean);
    } 
     if(XDen==class="num">0.)
     {
       corr = class="num">0.;
     }
     else
     corr = XNum/XDen;
   class="kw">return(corr);
   }
class=class="str">"cmt">//----------------------------------------------------------------

SMA交叉后的ACF时间分离现象

把 SMA 交叉点当作 ACF 触发器来看,交叉刚发生后的窗口里仍可能开出交易 ACF 单子。交易 ACF 与 ACF 触发器属性不同,但都依赖交叉后的时间行为判断。 在 MT5 策略测试器里,把盈利与亏损交易的 ACF 值按时间分别绘出,EURUSD 与 GBPUSD 都出现两者随时间的明显分离。EURUSD 在 2008 年 1 月至 2013 年 6 月的盈利段,对应图例中 ACF 分离较大的区间;而 2018 年 1 月起,盈亏 ACF 值几乎贴在一起,同期利润回报也走平。 这提示:当 ACF 分离收窄,交叉策略的边际区分度倾向走弱,外汇与贵金属品种均属高风险,验证时请用自身品种重跑测试器。

◍ ACF 触发器当过滤器的真实成色

把 EURUSD 与 GBPUSD 的 ACF 触发器图(图例 10、11)叠在 SMA 交叉策略上观察,盈利段和亏损段之间的边界比直接交易 ACF 数据时更模糊,分离度明显更小。这一点直接削弱了它作为开仓过滤器的理论价值。 不过 ACF 数值在时间轴上基本走平,说明用一条固定阈值线去卡触发条件,在 MT5 里是可以稳定复现的,不至于因时序漂移而失效。 两张图的盈亏曲线互相穿插且回撤幅度大,意味着某些时段内被过滤器放行的交易照样不赚钱。外汇与贵金属属高风险品种,这类自相关过滤器只能降噪、不能逆天改命,实盘前请用 2020—2024 年数据在策略测试器跑一遍确认。

「给 SMA 交叉加一道自相关闸门」

SMA 交叉本身在 EURUSD、GBPUSD 上能跑出正回报,但盈利与亏损交易的自相关结构差异极小,直接裸跑容易在低效区反复挨打。把 ACF(自相关函数)阈值作为过滤器嵌进触发器后,局面明显不同。 以 16 年全周期回测看,EURUSD 的 SMA 交叉原版成交 3160 笔、净利 5830 美元、盈利因子 1.10、单笔均值 1.85 美元;叠加 ACF 过滤后成交降到 1548 笔,净利反升至 8511 美元,盈利因子 1.33,单笔均值 5.50 美元。GBPUSD 同理:原版 3672 笔 / 5352 美元 / PF 1.07 / PO 1.46,开启过滤后 3096 笔 / 8317 美元 / PF 1.13 / PO 2.69。 两组的共同点是总利润约抬升 50%,且每笔交易利润(PO)大幅改善——靠的是少做单、只做自相关结构达标的那段。外汇与贵金属属高风险品种,历史回测不代表未来分布,MT5 里加载同周期数据可自行复算这张表。 别把正态当圣经 ACF 过滤砍掉的是「结构无效」的成交,不是亏损单本身;它改善的是样本内的期望偏移,实盘仍要防Regime切换把自相关窗口打乱。

慢周期怎么选,ACF 会告诉你

在 SMA 交叉策略里,慢周期不是拍脑袋定的。拿 EURUSD M15 跑了一遍,不开相关性阈值过滤,纯靠交叉信号找最优慢周期,结果是 80。 把盈利单和亏损单的平均自相关函数(ACF)按慢周期拆开看,图 15 暴露了一个现象:当慢周期落在 65 到 80 之间时,盈单和亏单的 ACF 均值差得最开。也就是说,这段区间里价格序列的记忆性在两类交易上表现最分化。 这给实盘一个抓手——别只盯交叉金叉死叉,开单那一刻测一下 ACF,用阈值去反推当下该用哪个慢周期,可能比固定 80 更贴行情。外汇与贵金属高杠杆,回测结论仅代表历史样本,切换参数前请在 MT5 用策略测试器重跑。

◍ 把自相关当过滤器用起来

自相关函数能直接提升 EA 的实盘表现,它本质是过滤掉那些统计上无优势的价格区间,只让试验台触发器在自相关显著的区域出手。 这类相关系数不受波动率扰动,对趋势成型和反转形态都有反应;把 AutoCorr.mq5(4.12 KB)挂到图表,再配合 SMACrossAutoCorr_EURUDM15.mq5(66.68 KB)回测,能直观看到触发频率下降但单笔质量上升。 外汇和贵金属杠杆高、滑点随机,自相关只是概率层面的筛子,不是胜率保证;开 MT5 加载这两个文件,先跑 EURUSD M15 看 AC 值再决定是否上实盘。

常见问题

不靠谱。ACF 是序列统计量不是逐根价格指标,直接当信号线看会误判滞后结构,应只用于判断序列是否仍有记忆性。
金叉后价格序列的短期自相关常出现衰减断层,ACF 在滞后若干阶骤降说明趋势惯性窗口结束,可据此避开追单衰减区。
小布可读取品种近期 ACF 衰减形态,在 SMA 交叉触发时提示当前自相关闸门是否通过,省去手动跑统计。
看 ACF 在哪些滞后阶首次落入置信带,对应周期常是慢周期下限;选太短过滤无效,太长会漏信号。
外汇贵金属高风险,ACF 过滤只降噪不保盈利,需先在历史数据验证分离现象稳定性再上实盘。