首页 / 交易学院 / 小布知识库 / 用 MQL5 表示统计概率分布:pdf/cdf/逆函数全实现
用 MQL5 表示统计概率分布:pdf/cdf/逆函数全实现
🎲

用 MQL5 表示统计概率分布:pdf/cdf/逆函数全实现

量化评估 难度 · 高阶 2013 13 分钟阅读
概率分布pdfcdf误差函数MQL5量化

交易者天天和“概率、随机性”打交道。要用统计工具,先得有描述随机变量的“分布类”。本文用 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); }
};

三、常用分布类一览

选错分布=错的风险画像。价格类正数优先对数正态;小样本或极端行情用学生 t / 柯西更贴近现实胖尾。

四、为什么交易者要自己实现分布类

现成库未必有你要的分布或分位数函数。自己封装成类后,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/卡方检验。读懂这套类族,后面整条统计链路才能接上。

学习顺序建议:先吃透本文的分布类(pdf/cdf/invcdf/sf 各司何职),再去看参数估计与假设检验,否则后面公式会看天书。

六、实战:用分布类算 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 只作参考线,别当硬约束;配合压力测试(历史极端情景)才稳。

七、常见坑:别把正态当万能

铁律:选分布前先看数据形状(用 dHist/dRankit,见《统计估计》)。形状没看清就套公式,风险模型等于摆设。

八、小结

用 MQL5 把统计分布封装成带 pdf/cdf/invcdf/sf 的类族,是量化交易的“数学地基”。面对 MQL5 无多继承的限制,作者借 Numerical Recipes 的 C++ 实现改写成扁平类层次(CErf 基类被正态等复用)。正态、对数正态、柯西、学生 t 等覆盖从“标准钟形”到“厚尾极端”的需求——选对分布,你的风险模型才不至于睁眼瞎。

常见问题

现成库往往缺你要的分布或分位数函数。自己封装成带 pdf(密度)、cdf(累积)、invcdf(分位数)、sf(可靠度)的类后,EA 能直接算“收益落某区间概率”“95% VaR 对应分位数”等,把统计真正用进实盘风控。
正态作基准对照;价格、市值等正数用对数正态(取对数后正态);小样本或极端行情用学生 t / 柯西,它们尾部更胖,更贴近真实市场的黑天鹅频率。选错分布会低估风险。
作者不堆复杂继承层次,而是把公共函数(如误差函数 erf)抽成 CErf 基类,让 CNormaldist 等继承复用;其余分布各自独立实现 pdf/cdf。结构扁平、可读、易维护,也方便照搬 Numerical Recipes 的 C++ 代码。
invcdf(p) 给定概率 p 返回对应分位数,是风险建模的核心:比如 invcdf(0.05) 给出 5% 左尾的分位价,即 95% 置信 VaR 的临界值。没有它就无法把“概率”翻译成“具体价格/点位”。