用 MQL5 表示统计概率分布:pdf/cdf/逆函数全实现
交易者天天和“概率、随机性”打交道。要用统计工具,先得有描述随机变量的“分布类”。本文用 MQL5 把一维统计概率分布封装成类族:每个分布给出概率密度(pdf)、累积分布(cdf)、逆累积(invcdf,分位数)、可靠度(sf)四个函数。这是后面所有统计检验、风险建模的地基。
一、分布是什么,怎么定义
随机变量按取值分连续/离散;描述规律的方式有概率密度函数(pdf)、分布函数(cdf)、逆分布函数(invcdf)、可靠函数(sf)等。市场里很少纯正态,但把经验分布和理论分布(如正态)比对,能判断“偏离程度与性质”——这正是风控第一步。
二、MQL5 没有多继承,怎么办
作者最大挑战是 MQL5 不支持多重继承,所以不肯堆复杂类层次。他大量借鉴《Numerical Recipes》的 C++ 最佳实践,按 MQL5 习惯重写。比如误差函数 erf 抽成 CErf 基类,正态分布类 CNormaldist 继承它复用 erf/erfc。
class CNormaldist : CErf { // 继承误差函数基类
public: double mu, sig; // 均值 μ,标准差 σ
double pdf(double x){ return (0.39894228/sig)*exp(-0.5*pow((x-mu)/sig,2)); }
double cdf(double x){ return 0.5*erfc(-0.70710678*(x-mu)/sig); }
double invcdf(double p){ /* 分位数 */ return -1.4142*sig*inverfc(2.*p)+mu; }
double sf(double x){ return 1-cdf(x); }
};
三、常用分布类一览
- CNormaldist 正态分布:对称钟形,作基准对照(X~Nor(μ,σ²))
- CLognormaldist 对数正态:取对数后正态,专治正数(价格、市值)
- CCauchydist 柯西分布:尾部极厚,比正态更易出极端值
- CHypersecdist 双曲正割:类正态但有更胖尾
- CStudenttdist 学生 t:带自由度 ν,ν 小则胖尾明显(继承 CBeta)
四、为什么交易者要自己实现分布类
现成库未必有你要的分布或分位数函数。自己封装成类后,EA 里能直接算“收益落在某区间的概率”“95% VaR 对应的分位数(invcdf(0.05))”,把统计从论文搬进实盘。CErf 里 28 个切比雪夫系数是精度关键,照搬 Numerical Recipes 即可。
// 柯西分布:没有均值方差,只有位置/尺度参数
double pdf(double x){ return 0.318309886/(sig*(1.0+pow((x-mu)/sig,2))); }
double cdf(double x){ return 0.5 + 0.318309886*atan2(x-mu,sig); }
五、和后续文章的关系
本文是“分布类”地基,下一篇《统计分布在交易者工作中的作用》就在它之上做随机数生成、参数估计、Jarque-Bera/卡方检验。读懂这套类族,后面整条统计链路才能接上。
六、实战:用分布类算 VaR
封装好分布类后,EA 里算风险就一行的事。以正态分布为例,95% 单日 VaR 对应分位数 invcdf(0.05);若用学生 t(自由度 ν 由样本估),尾部更厚,同一置信度下 VaR 更大、更保守。把‘当前持仓收益序列’喂给 CStudenttdist,再调 invcdf 即得临界回撤,超过就触发减仓。
// 伪代码:用学生 t 算 95% VaR CStudenttdist dist; dist.setCStudenttdist(nu, 0.0, 1.0); double var95 = dist.invcdf(0.05); // 左尾 5% 分位数(负值) if(currentReturn < var95) ReducePosition();
注意:分布类假设‘样本来自该分布’。金融收益常不严格服从任何理论分布,所以 VaR 只作参考线,别当硬约束;配合压力测试(历史极端情景)才稳。
七、常见坑:别把正态当万能
- 价格类正数用对数正态,直接套正态会得到负价概率,荒谬
- 小样本下学生 t 的 ν 估计不稳,VaR 会跳;样本<30 谨慎用
- 柯西分布没有有限均值/方差,用均值方差类指标会发散
- 切比雪夫系数错一位,erf 精度崩,连带 cdf/invcdf 全偏
八、小结
用 MQL5 把统计分布封装成带 pdf/cdf/invcdf/sf 的类族,是量化交易的“数学地基”。面对 MQL5 无多继承的限制,作者借 Numerical Recipes 的 C++ 实现改写成扁平类层次(CErf 基类被正态等复用)。正态、对数正态、柯西、学生 t 等覆盖从“标准钟形”到“厚尾极端”的需求——选对分布,你的风险模型才不至于睁眼瞎。