概述
MetaTrader 5 标准工具箱中的几乎每一种风险管理工具都隐含着一个共同的假设:值得规划的最坏亏损,大致就是你已经经历过的最坏亏损。真实波动范围(ATR)根据近期波动率来确定仓位大小。蒙特卡洛重采样器则会重新排列你实际执行过的交易。 历史风险值(VaR)直接从您的收益历史中读取一个百分位数。所有这些方法都着眼于分布的主体部分,并暗自希望未来不会出现比过去更极端的行情。
由于金融回报呈厚尾分布,这种希望是错误的。大幅波动的发生频率更高,幅度也更大,超出了正态分布的允许范围,而且样本中单日最差表现几乎绝不会是市场所能达到的最差表现。任何只能将损失视为其观察窗口内已发生损失的程度的方法,都会系统性地低估罕见的暴跌。

正态模型(曲线)与真实的厚尾回报(直方图)对比。阴影部分的左尾即为该模型未能预见的亏损。
该指标将专门为填补这一空白而构建的统计学分支原生引入了 MQL5。极值理论 并不对整个分布进行建模;它仅对尾部进行建模,且其形状由极限定理推导得出,而非基于假设。因此,拟合后的模型能够外推至 样本范围之外:例如99.9%的亏损,这种波动大约每三年出现一次,而您的历史数据中实际上从未出现过这一数值。
方法。 该指标实现了“峰值超过 阈值”(Peaks-Over-Threshold)算法。 它将图表的收盘价转换为单侧下行亏损序列,保留每次下跌的幅度,并将每次上涨映射为零。它在该序列的某个分位数处选取一个高阈值u, 舍弃其下的所有数据,仅研究超额值——即亏损超过阈值的幅度。 Pickands-Balkema-de Haan 定理指出,对于一类广泛的底层分布,随着阈值的提高,这些超出值将收敛到一个单一的分布族:广义帕累托分布。因此,无需猜测尾部形状,只需进行拟合即可。

“阈值以上峰值”(Peaks-Over-Threshold):在损失序列上设定一个阈值,剔除其上方的超额值,并仅针对这些超额值拟合广义帕累托分布。
该拟合过程是对广义帕累托分布(GPD)形状和尺度的真正最大似然优化,通过终端自带的ALGLIB 约束优化器运行。无需Python桥接库,无需DLL,也不存在任何形式的外部依赖。
报告内容
系统会在滚动窗口中计算三个数值,并显示在图表面板上;其中第一个数值还会以折线形式绘制在子窗口中,以便观察尾部随时间推移而收紧或松弛的变化。
| 解读 | 它是什么 | 使用方法 |
|---|---|---|
| EVT VaR | 在所选置信水平下的风险价值(VaR),由拟合的尾部外推得出,而非从历史数据中读取。 | 您应预先规划的损失。在面板上以百分比形式显示,并在子窗口中以曲线形式绘制。若曲线呈上升趋势,则表明尾部分布正在变厚。 |
| EVT ES | 预期短缺值,即在 VaR被突破时发生的 平均损失。 | 一旦最坏情况发生,损失会有多严重。该数值始终大于VaR,是设定止损位的更客观参考指标。 |
| xi(形状) | 拟合尾部指数。数值越大表示尾部越重:损失在更远的未来会进一步累积。 | 状态参数读数,在面板图中以颜色标示。该参数决定外推的范围。 |
这两个估计量是标准的GPD-POT形式,因此面板报告的具体内容为:
VaR_p = u + (sigma / xi) * [ ( (Nu / n) / (1 - p) )^xi - 1 ] ES_p = VaR_p / (1 - xi) + (sigma - xi * u) / (1 - xi)
这里u 是阈值,sigma 和xi 分别是拟合的尺度参数和形状参数,Nu / n 是超额率。两者均具有指数极限,当拟合形状接近零时会自动启用该极限,这恰恰在除以形状参数会导致运算不稳定的区域内,确保了计算的稳定性。
尾部交通信号灯。 面板通过颜色标示形状,从而无需解读数值即可识别所处的区域:
| xi | 颜色 | 解读 |
|---|---|---|
| 低于 0.10 | 绿色 | 接近薄尾指数分布的情况。平静。 |
| 0.10 至 0.30 | 黄金 | 波动适中,大多数流动性较高的金融工具都处于这一区间。 |
| 大于 0.30 | 红色 | 重尾分布。亏损呈复利增长,崩盘事件密集发生。 |
这些分界值仅作为阅读参考,而非统计阈值,可根据个人偏好进行调整。关键在于,决定颜色的曲线形态与驱动计算公式的曲线形态是相同的,因此当计算系统正在默默计算厚尾VaR时,面板上不可能显示绿色。

图表上的仪表:面板显示VaR、预期短缺和带颜色编码的尾部形状,而子窗口则绘制了随时间变化的EVT VaR曲线。
它拒绝进行猜测
这是在您将其嵌入系统前值得了解的设计决策,因为它改变了空白读数的含义。 一个两参数尾部拟合需要实际的超限次数才能可靠,而EVT文献中通常将大约三十到五十个尾部数据点视为实际下限。引擎强制要求三十个。低于此数时,它会报告状态而非具体数值,且面板会用通俗的语言说明这一点:
| 状态 | 含义 |
|---|---|
| 正常 | 拟合已收敛至足够的尾部数据。VaR、ES 和 xi 已生效。 |
| 尾部数据不足(N/30 次超限) | 该窗口产生的超限次数少于三十次。请延长回溯期或降低阈值分位数。 |
| 拟合未收敛 | 优化器未达到有效的形状和尺度。未生成任何报告。 |
| 未进行拟合 / 输入错误 | 尚未运行任何拟合,或者窗口为空或退化。 |
一个具体的实际应用示例:在默认阈值 0.95 时,500 根 K 线的回溯范围仅产生约二十五次超限,而指标会报告“尾部数据不足”(25/30 次超限) 而非具体数值。 当回溯期设为 800 根柱时,模型便能满足阈值要求并顺利完成拟合。这并非需要绕过的错误,而是模型拒绝进行推测——这恰恰是您对一款旨在如实反映罕见事件的工具所期望的行为。
同样的原理也适用于另一端。 当拟合形状达到1时,尾部的均值会发散,预期短缺(Expected Shortfall)将不复存在,因此引擎在此处返回零值,而非虚构的数值。凡是拟合未获得“OK”状态的情况,该柱的绘制曲线将留空,而非沿用过时的值,因此曲线在模型拒绝给出结果的位置恰好呈空白。
推荐设置
| 设置 | 推荐值 | 备注 |
|---|---|---|
| 符号 | 任何流动性较高的金融工具 | 没有任何指标是针对特定品种的:模型基于对数收益率运行,因此读数以百分比形式呈现,且不同品种间可进行比较。成交量较小的品种是唯一可能无法满足“不低于下限”要求的特例。 |
| 时间周期 | H4 或 D1 | VaR是按K线计算的亏损幅度,因此时间周期决定了该数值的具体含义。在D1周期下,它代表日亏损。虽然日内交易也适用,但1分钟回报率的尾部分布属于不同的统计对象。 |
| 回溯期 | 800根K线 | 此设置确保0.95的阈值能以一定余量突破30次超限的下限。较短的回溯窗口反应虽更快,但会触及该下限。 |
| 所需历史数据 | 回溯期 + 2根K线 | 在第一个可拟合K线之前不会绘制任何内容。请确保图表已实际下载了足够的历史数据,否则指标将保持空白。 |
| 阈值分位数 | 0.95 | 标准默认值。降低该值会增加超限次数,但会以渐近有效性为代价,因为随着阈值升高,该定理才成立。 |
输入参数
| 参数 | 默认值 | 描述 |
|---|---|---|
| 回溯 | 800 | 用于计算每次拟合的滚动窗口(以K线为单位)。若窗口内可用收益低于该计数的一半,则该窗口因数据过于稀疏而被剔除。 |
| 阈值量 | 0.95 | 用于设定POT阈值u的损失序列分位数。有效值范围为0.5至0.999。 |
| 置信度 | 0.99 | VaR和ES的置信水平。由于拟合的尾部会进行外推,因此即使样本中不存在此类损失,0.999也是一个有效的设置。 |
| 重新拟合间隔 | 1 | 历史K线的重新拟合频率。当设置为1时,每根K线都会被重新拟合,绘制的曲线将完全清晰;提高该值可在非常长的图表上以牺牲历史分辨率为代价来提升速度。无论如何,当前K线始终会被重新拟合。 |
| 显示面板 | true | 绘制图表上的文本面板。当指标被解除绑定时,面板对象将被移除。 |
在您自己的代码中使用该引擎
尾部模型是一个独立的“仅头文件”类CGPDModel, 不依赖于图表或指标缓冲区。它对一组损失值进行拟合,其中数值越大表示结果越差,因此符号约定由调用方决定,任何能生成损失序列的策略均可直接使用它:
#include <EVT\GPDModel.mqh> CGPDModel model; model.SetThresholdQuantile(0.95); if(model.Fit(losses,count) && model.IsReliable()) { double var = model.VaR(0.99); double es = model.ExpectedShortfall(0.99); double xi = model.Xi(); } else Print("tail not usable: ",model.StatusText());
此外,该类还公开了拟合尺度、选定的阈值、超限计数以及状态枚举,因此调用方可精确记录或显示读数被隐藏的具体原因。 若要直接读取指标而非调用该类,请通过EVT\EVTCrashGauge 的iCustom 获取句柄,并复制缓冲区0 的内容——该缓冲区承载 EVT VaR 值,并在拟合结果不可靠的任何柱线上保持为零。
局限性
EVT 作为风险工具箱中的重要组成部分,但它是一种专业工具,要善用它就必须了解其不适用的场景:
- 它对尾部数据需求极高。 双参数尾部拟合需要足够数量的超限值。对于成交量稀少的标的或短期时间窗口,正确的答案是“数据不足”,其设计会尊重这一事实,而非随意生成数值。
- 它对阈值敏感。 0.95 的默认值虽是 行业标准,但拟合的形状和尺度会随阈值变化而变化。在实际应用中,应研究这种敏感性而非仅依赖单一设置,这也是将分位数作为输入参数公开的原因。
- 该指标衡量的是幅度,而非时机。 这一点值得重申,因为这是最常见的误用。上升的尾部指数并非方向性信号。
- 尾部可能不再具有明确的定义。 当拟合形状趋近于1时,预期短缺将不复存在,而在该区间内出现零值本身即为一种信息,而非系统故障。
文件结构
一个指标和一个头文件。头文件名为<EVT\GPDModel.mqh>,因此必须位于Include目录下的EVT 子文件夹中。
| 文件 | 作用 | 描述 |
|---|---|---|
| Indicators\EVT\EVTCrashGauge.mq5 | 该指标 | 从收盘价的滚动窗口构建下行损失序列,以K线为周期进行拟合,绘制EVT VaR曲线,并在图表上维护一个带有颜色编码尾部读数的面板。 |
| Include\EVT\GPDModel.mqh | 尾部分析引擎 | CGPDModel 类:阈值选择、超额值提取、通过 ALGLIB 约束优化对 GPD 进行最大似然拟合、VaR 和预期短缺,以及控制每个读数输出的状态枚举。 |
该引擎在运行最大似然法之前,会使用矩法估计值对优化器进行初始化,并将分布形状限制在合理范围内,从而确保病态窗口会将模型推向被拒绝的拟合结果,而非看似合理但实则错误的拟合结果。
研究基础
该实现遵循极值理论中“峰值超过阈值(Peaks-Over-Threshold)”的标准处理方法: Pickands-Balkema-de Haan 定理(论阈值超额值收敛于广义帕累托分布)、其形状与尺度的大似然估计,以及用于计算风险价值(VaR)和预期短缺(Expected Shortfall)的常规 GPD-POT 表达式。
一篇配套文章推导了该方法,逐行讲解了引擎和指标的实现逻辑,并将尾部风险估计值集成到一个用于测算仓位大小的专家顾问中,以在策略测试器中验证其效果:《MQL5中的极值理论:构建超越蒙特卡洛VaR的尾部风险崩盘指标》。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/75557
RSI Histogram
这是一个名为“RSI 直方图”的 MetaTrader 5 MQL5 自定义指标。它会在单独的窗口中绘制标准的 RSI 线,同时还会根据动量变化,以颜色编码的形式显示基于相同 RSI 值的直方图:
Relative Moving Average EA
这是对布洛赫(Bloch)相对移动平均线框架中全部四种交叉策略的MQL5实现,其中采用了其根据波动率区间调整的自适应交叉平仓规则。入场和出场均在分位数空间中进行,因此阈值在每个交易品种上的含义都是一致的。
GoldLondonBreakout
在亚洲时段,对XAUUSD进行区间锁仓,随后为伦敦开盘设置一个OCO突破组合(买入止损/卖出止损),止损位基于ATR计算,仓位大小按风险百分比确定。不使用任何指标,不进行主观判断——区间是经过测算的,而非凭空猜测。
Sessionvolatilityheatmap
以图表热力图的形式显示交易日每小时的平均价格区间,并在K线背后添加亚洲/伦敦/纽约交易时段的阴影——这样您就能清楚看到该交易品种何时真正出现波动,而不仅仅是凭空猜测。