统计分布在交易者工作中的作用:从理论分布到实战采样
统计分布描述的是“随机变量取值的可能规律”——比如收益率落在 +1% 到 +2% 之间的概率有多大。对交易者来说,它是一切量化判断的地基:凯利公式、风险价值(VaR)、回测的样本外可靠性,底层都依赖你对“收益分布形状”的假设。MQL5 作者把《用 MQL5 表示统计概率分布》里的分布类当作地基,本文直接用真实数据集来实践这些类,并演示如何做参数估计与假设检验。
一、为什么交易者要懂统计分布
市场不是掷硬币那样的纯随机过程。如果你连续记录 EURUSD 的K线,会发现‘前一根收阴后,下一根回补上涨’的概率显著高于 50%。这类规律必须放在“分布”的框架里才能量化:单个样本看不出什么,但把成千上万根K线聚合成分布,形状就出来了。懂得分布,你才分得清“这波亏损是正常波动还是策略失效”;懂得分布,你才不会把小样本里的噪声当成规律去过度拟合。
二、从随机数生成开始:Random 与 CNormaldev 类
要检验一个统计方法对不对,最干净的办法是:先按某个已知理论分布造一批随机数,再用品方法去还原它的参数,看能不能还原回来。作者移植了《Numerical Recipes》里的高质量生成器(周期约 3.138×10^57),封装成 Random 基类,再用 CNormaldev 继承它,专门产出服从正态分布的随机数。
注意 CNormaldev 里持有一个 CNormaldist 成员 N(均值 mu、标准差 sig)。这比 C 原版更清晰:随机数生成器和“它属于哪个分布”在编程上建立了逻辑连接。其余分布(指数、卡方、学生 t 等)的全部类都放在 Random_class.mqh 里,按需取用。
class CNormaldev : public Random {
public : CNormaldist N;
void setNormaldev(CNormaldist &Nn, ulong j) { N.mu=Nn.mu; N.sig=Nn.sig; randomSet(j); }
double dev() { // Leva 均匀比例法,从正态生成随机数
double u,v,x,y,q;
do { u=doub(); v=1.7156*(doub()-0.5); x=u-0.449871; y=fabs(v)+0.386595;
q=pow(x,2)+y*(0.19600*y-0.25472*x); }
while(q>0.27597 && (q>0.27846 || pow(v,2)>-4.*log(u)*pow(u,2)));
return N.mu+N.sig*v/u; }
};
三、经验分布与参数估计:CExpStatistics 类
拿到真实样本(比如 500 根K线的波动值)后,第一步是清洗:用 Bulashev 法删掉异常值(明显偏离主体的极端点),否则均值方差会被带偏。CExpStatistics 类返回的正是“去异常值后的数组 Parr[]”,顺带给出一堆描述统计:中位数、四分位距、均值、方差、标准差、偏度、峰度。
- median / median50:中位数与 50% 四分位中距(midquartile),对异常值不敏感
- expVariance / expStddev:估计的方差与标准差
- Moment:任意阶矩,用来算偏度(不对称)和峰度(胖尾)
- outlierDelete:按规则剔除异常值,censorR 给出删减系数
四、直方图:把样本画出来(Sturges + Allocate)
清洗完,用直方图把分布“看”出来。先按 Sturges 公式定分组数 k = 1 + log2(n)(经验上限 15),再用 Allocate 函数把每个样本点分配到对应区间,得到频率数组 f[] 和区间中点 b[]。作者用 histogramSave 把结果写成 HTML 直方图。
int Sturges(int n){ double s=1.+log2(n); if(s>15) s=15; return (int)floor(s); }
文中用 volatilityTest.mq5 画了 EURUSD H4 的波动直方图,又用 returnsTest.mq5 画了标准化对数收益的直方图。后者第 4、5 组最“扎眼”(244、124 个样本),说明真实收益明显偏离正态——这正是指令你别盲信正态假设的证据。
五、正态性检验与分布拟合:Jarque-Bera 与卡方
直方图只是肉眼判断。要下结论,得上检验:Jarque-Bera 检验“样本是否来自均值方差未知的正态分布”,返回 p 值;卡方检验(chsone)则把经验频率 f[] 和某理论分布的期望频率 ebins[] 比对,算出卡方统计量和接受概率 prob。prob 很小就说明“你的数据不服从这个理论分布”。
void jarqueberatest(double &x[], double &p){
int n=ArraySize(x); double s; p=0.;
if(n<5){ p=1.0; return; } // 样本太小,无法判断
jarquebera_jarqueberastatistic(x,n,s);
p=jarquebera_jarqueberaapprox(n,s); // 返回 p 值
}
六、在交易里怎么用
- 回测可信度:用随机分布造“安慰剂”行情,验证你的 EA 是不是靠运气盈利
- 风险建模:估计收益分布后算 VaR / CVaR,定仓位大小
- 参数校验:用 Jarque-Bera 检查策略收益是否正态,再决定用什么统计工具
- 样本诊断:用 CExpStatistics 抠掉异常成交(滑点尖刺)后再算绩效,避免被单次极端点误导
七、小结
统计分布不是书斋里的数学,而是交易者把“经验”翻译成“概率”的必经之路。本文给出的 MQL5 工具链——随机数生成、CExpStatistics 清洗估计、Sturges/Allocate 直方图、Jarque-Bera 与卡方检验——正好覆盖从“造数据”到“验假设”的完整闭环。把这套链路接进你的回测和风险模块,决策就从拍脑袋变成了看分布。