首页 / 交易学院 / 小布知识库 / 统计分布在交易者工作中的作用:从理论分布到实战采样
统计分布在交易者工作中的作用:从理论分布到实战采样
📊

统计分布在交易者工作中的作用:从理论分布到实战采样

量化评估 难度 · 进阶 2013 12 分钟阅读
统计分布随机数生成MQL5量化交易假设检验

统计分布描述的是“随机变量取值的可能规律”——比如收益率落在 +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[]”,顺带给出一堆描述统计:中位数、四分位距、均值、方差、标准差、偏度、峰度。

实战提醒:金融收益的“峰度”往往远高于正态(胖尾)。如果你硬套正态假设算 VaR,会严重低估黑天鹅风险。

四、直方图:把样本画出来(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 值
}

六、在交易里怎么用

落地清单:① 造随机样本验证方法 → ② 去异常值 → ③ 画直方图肉眼看 → ④ Jarque-Bera/卡方定量检验 → ⑤ 据分布形状选风险管理公式。五步走完,你的统计判断才算站得住。

七、小结

统计分布不是书斋里的数学,而是交易者把“经验”翻译成“概率”的必经之路。本文给出的 MQL5 工具链——随机数生成、CExpStatistics 清洗估计、Sturges/Allocate 直方图、Jarque-Bera 与卡方检验——正好覆盖从“造数据”到“验假设”的完整闭环。把这套链路接进你的回测和风险模块,决策就从拍脑袋变成了看分布。

常见问题

它是量化判断的地基:凯利公式、VaR、回测样本外可靠性都依赖收益分布假设。懂得分布,你才能区分‘正常波动’和‘策略失效’,也才不会把小样本噪声当规律去过度拟合。
用文中移植的 Random 基类 + CNormaldev 类(基于 Numerical Recipes 高质量生成器,Leva 均匀比例法)。CNormaldev 持有 CNormaldist 成员记录均值与标准差,调用 dev() 即返回一个正态随机数。
它检验一个样本是否来自‘均值方差未知的正态分布’,返回 p 值。p 很小说明样本明显非正态。金融收益常呈胖尾,硬套正态假设会低估黑天鹅风险,所以这一步不能省。
Sturges 公式 k = 1 + log2(n) 按样本量给一个经验分组数(上限 15),避免分组太多变噪声、太少丢形状。再用 Allocate 函数把每个样本点分配到对应区间,得到频率数组与区间中点。