首页 / 交易学院 / 小布知识库 / 统计估计:用 MQL5 与 Gnuplot 估计序列参数并可视化
统计估计:用 MQL5 与 Gnuplot 估计序列参数并可视化
📈

统计估计:用 MQL5 与 Gnuplot 估计序列参数并可视化

量化评估 难度 · 高阶 2013 12 分钟阅读
统计估计异常值Gnuplot可视化MQL5

大多数交易模型都假设序列服从某分布(正态、某方差)。要用模型,先得能从有限样本估出这些参数,且尽量不被极端值带偏。本文给出一套 MQL5 工具:先按 Bulashev 法剔异常值,再用 dStat 算六大统计量,用 dHist 画自适应直方图,用 dRankit 做正态概率图(Q-Q 图),最后用 Gnuplot 把结果画出来。

一、先剔异常值(Bulashev 法)

异常值会严重扭曲均值方差,尤其小样本。Bulashev 思路:先算分布中心的五个估计(中位数、中四分位距 MQR、全样本均值、四分位距均值 IQM、中列数),升序取第 3 个作分布中心 Xcen(受异常值影响最小);据此算标准差 s、峰度 K、删减系数,超出范围的值判为异常值剔除。实现见 erremove()。

// erremove:剔除异常值,y[] 返回清洗后序列
int erremove(const double &x[], double &y[], int visual=1){
  n=ArraySize(x); if(n<4) return -1;
  ArraySort(a);
  b[1]=a[(n-1)/2];                       // 中位数
  m=n/4; b[2]=(a[m]+a[n-m-1])/2.0;       // MQR
  // ... 算 IQM、均值,取 b[2] 为 Xcen
  // 超出 [Xcen-范围, Xcen+范围] 的判异常,写入 y[]
}
y[] 必须声明为动态数组,函数内才能改大小;否则 erremove 直接报错返回 -1。

二、dStat:六大统计量一次算齐

dStat 把均值、中位数、方差、标准差、偏度、峰度装进 statParam 结构体一口气算出。偏度看不对称、峰度看胖尾——金融收益常峰度>3(比正态胖),这是风控必须知道的形状。

struct statParam { double mean,median,var,stdev,skew,kurt; };
int dStat(const double &x[], statParam &sP){
  // 排序取中位数;循环累加算 mean/var/stdev/skew/kurt
  sP.var=sum2/(n-1); sP.stdev=MathSqrt(sP.var);
  sP.skew=n*sum3/(n-2)/sum2/sP.stdev;
  sP.kurt=((n*n-2*n+3)*sum4/sum2/sum2-(6.*n-9.)/n)*(n-1.)/(n-2.)/(n-3.);
}

三、dHist 与 dRankit:两种可视化

四、用 Gnuplot 把结果画出来

作者用免费 Gnuplot 画图。MQL5 脚本先写 gplot.txt(命令+数据),再用从 shell32.dll 导入的 ShellExecuteW() 拉起 wgnuplot.exe。注意用窗口终端(windows)而非 wxt:关闭图窗时进程自动退出,不会在系统里堆积僵尸进程。

#import "shell32.dll"
bool ShellExecuteW(int,string,string,string,string,int);
// 调用:ShellExecuteW(0,"open","wgnuplot.exe","-p MQL5\\Files\\gplot.txt",...,0);
可视化是‘看分布’的捷径:直方图肉眼看形状,Q-Q 图一眼判正态与否。两者结合,比单看数字稳。

五、实战怎么串起来

流程:erremove 清洗 → dStat 取六大参数 → dHist/dRankit 画图 → 肉眼+Gnuplot 双确认。把这套接进你的回测,每次出绩效前先诊断样本分布,避免被单根极端K线骗。OnStart 里 dat[25]=3 故意造异常,正是演示 erremove 如何把它揪出。

铁律:出任何统计量前先问‘样本洗过没’。没剔异常值的均值方差,信不得。

六、样本量底线与置信

统计估计不是样本越多越好,但太少必然不准。erremove 与 dStat 都要求 n≥4,否则直接报错;实践中建议清洗前至少几十、上百个样本,峰度/偏度才稳定。样本量越小,异常值剔除的‘阈值’越要保守,否则容易把真信号当异常删掉。

七、接进回测管线的具体步骤

把诊断前置:每次回测跑完,先对‘每笔平仓的收益序列’跑 erremove→dStat→dHist/dRankit,把 six 参数与图存进报告。连续多段样本对比,若某段峰度骤升,说明那段时间策略暴露在胖尾风险,该复盘而非单纯看总收益。

落地清单:① 收益序列收集 → ② erremove 清洗 → ③ dStat 六量 → ④ 双图可视化 → ⑤ 跨样本对比。五步做成函数,回测结束自动跑。

八、小结

统计估计是‘从样本到参数’的桥梁。本文工具链——erremove 剔异常、dStat 算六量、dHist/dRankit 双图可视化、Gnuplot 出图——让 MQL5 程序能像统计软件一样诊断序列。把它嵌进回测前置步骤,你的绩效数字才立得住,不会被一两笔极端成交带偏。

常见问题

异常值会严重扭曲均值和方差,小样本时尤其明显,可能让后续模型建立在错误的分布假设上。Bulashev 法用五个中心估计取中位数作分布中心,再据经验公式划定异常范围剔除,能显著提升估计精度。
偏度描述分布不对称方向,峰度描述尾部胖瘦。金融收益常峰度高于正态(胖尾),意味着极端行情比正态假设更频繁。知道这两值,你才不会用正态 VaR 低估黑天鹅风险。
直方图直观看形状(双峰/偏斜),但分组数主观;Q-Q 图把样本分位数对标理论正态分位数,点越贴对角线越正态,对‘是否正态、胖尾多严重’一目了然。两图互补,文中建议结合看。
脚本先写 gplot.txt(绘图命令+数据),再用 #import "shell32.dll" 的 ShellExecuteW() 拉起 wgnuplot.exe,把文件名作参数传入。注意用窗口终端(windows)而非 wxt,关图窗时进程会自动退出,避免堆积僵尸进程。