统计估计:用 MQL5 与 Gnuplot 估计序列参数并可视化
大多数交易模型都假设序列服从某分布(正态、某方差)。要用模型,先得能从有限样本估出这些参数,且尽量不被极端值带偏。本文给出一套 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[]
}
二、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:两种可视化
- dHist 自适应直方图:柱数随峰度与样本量自动定(nbar≈(kurt+1.5)·n^0.4/6),先把数据标准化再分组
- dRankit 正态概率图(Q-Q 图):把样本分位数对标理论正态分位数,点越贴对角线越正态——比直方图更直白地暴露厚尾/偏斜
四、用 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);
五、实战怎么串起来
流程:erremove 清洗 → dStat 取六大参数 → dHist/dRankit 画图 → 肉眼+Gnuplot 双确认。把这套接进你的回测,每次出绩效前先诊断样本分布,避免被单根极端K线骗。OnStart 里 dat[25]=3 故意造异常,正是演示 erremove 如何把它揪出。
六、样本量底线与置信
统计估计不是样本越多越好,但太少必然不准。erremove 与 dStat 都要求 n≥4,否则直接报错;实践中建议清洗前至少几十、上百个样本,峰度/偏度才稳定。样本量越小,异常值剔除的‘阈值’越要保守,否则容易把真信号当异常删掉。
- n<30:学生 t 的 ν 不稳,分布结论仅供参考
- 30≤n<200:六大统计量可用,但置信区间宽
- n≥200:直方图与 Q-Q 图形态稳定,可放心建模
- 时间序列:异常值别盲目剔——跳空缺口可能是真事件,应标记而非删除
七、接进回测管线的具体步骤
把诊断前置:每次回测跑完,先对‘每笔平仓的收益序列’跑 erremove→dStat→dHist/dRankit,把 six 参数与图存进报告。连续多段样本对比,若某段峰度骤升,说明那段时间策略暴露在胖尾风险,该复盘而非单纯看总收益。
八、小结
统计估计是‘从样本到参数’的桥梁。本文工具链——erremove 剔异常、dStat 算六量、dHist/dRankit 双图可视化、Gnuplot 出图——让 MQL5 程序能像统计软件一样诊断序列。把它嵌进回测前置步骤,你的绩效数字才立得住,不会被一两笔极端成交带偏。