请观看如何免费下载自动交易
请在Telegram上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
显示:
32
等级:
(2)
已发布:
\MQL5\Include\EVT\
GPDModel.mqh (12.21 KB) 预览
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

概述

MetaTrader 5 标准工具箱中的几乎每一种风险管理工具都隐含着一个共同的假设:值得规划的最坏亏损,大致就是你已经经历过的最坏亏损。真实波动范围(ATR)根据近期波动率来确定仓位大小。蒙特卡洛重采样器则会重新排列你实际执行过的交易。 历史风险值(VaR)直接从您的收益历史中读取一个百分位数。所有这些方法都着眼于分布的主体部分,并暗自希望未来不会出现比过去更极端的行情。

由于金融回报呈厚尾分布,这种希望是错误的。大幅波动的发生频率更高,幅度也更大,超出了正态分布的允许范围,而且样本中单日最差表现几乎绝不会是市场所能达到的最差表现。任何只能将损失视为其观察窗口内已发生损失的程度的方法,都会系统性地低估罕见的暴跌。

在厚尾收益直方图上叠加正态分布,尾部缺口以阴影标出

正态模型(曲线)与真实的厚尾回报(直方图)对比。阴影部分的左尾即为该模型未能预见的亏损。

该指标将专门为填补这一空白而构建的统计学分支原生引入了 MQL5。极值理论 并不对整个分布进行建模;它仅对尾部进行建模,且其形状由极限定理推导得出,而非基于假设。因此,拟合后的模型能够外推 样本范围之外:例如99.9%的亏损,这种波动大约每三年出现一次,而您的历史数据中实际上从未出现过这一数值。

方法。 该指标实现了“峰值超过”(Peaks-Over-Threshold算法。 它将图表的收盘价转换为单侧下行亏损序列,保留每次下跌的幅度,并将每次上涨映射为零。它在该序列的某个分位数处选取一个高阈值u, 舍弃其下的所有数据,仅研究超额值——即亏损超过阈值的幅度。 Pickands-Balkema-de Haan 定理指出,对于一类广泛的底层分布,随着阈值的提高,这些超出值将收敛到一个单一的分布族:广义帕累托分布。因此,无需猜测尾部形状,只需进行拟合即可。

对损失序列设定阈值,剔除超限值,并采用GPD模型进行拟合

“阈值以上峰值”(Peaks-Over-Threshold):在损失序列上设定一个阈值,剔除其上方的超额值,并仅针对这些超额值拟合广义帕累托分布。

该拟合过程是对广义帕累托分布(GPD)形状和尺度的真正最大似然优化,通过终端自带的ALGLIB 约束优化器运行。无需Python桥接库,无需DLL,也不存在任何形式的外部依赖。

关于适用范围的说明: EVT 是一款衡量风险幅度的 工具,而非市场时机把握 工具。它能告诉你罕见亏损可能有多严重,以及当前尾部是偏重还是偏轻。它不会告诉你市场崩盘何时到来,也不会指示你该朝哪个方向交易。 将上升的尾部形态解读为“做空”信号,属于对该工具的误用。面对变粗的尾部,正确的应对方式是控制风险敞口,绝非预测市场方向。


报告内容

系统会在滚动窗口中计算三个数值,并显示在图表面板上;其中第一个数值还会以折线形式绘制在子窗口中,以便观察尾部随时间推移而收紧或松弛的变化。

解读
它是什么
使用方法
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 是阈值,sigmaxi 分别是拟合的尺度参数和形状参数,Nu / n 是超额率。两者均具有指数极限,当拟合形状接近零时会自动启用该极限,这恰恰在除以形状参数会导致运算不稳定的区域内,确保了计算的稳定性。

尾部交通信号灯。 面板通过颜色标示形状,从而无需解读数值即可识别所处的区域:

xi
颜色
解读
低于 0.10
绿色
接近薄尾指数分布的情况。平静。
0.10 至 0.30
黄金
波动适中,大多数流动性较高的金融工具都处于这一区间。
大于 0.30
红色
重尾分布。亏损呈复利增长,崩盘事件密集发生。

这些分界值仅作为阅读参考,而非统计阈值,可根据个人偏好进行调整。关键在于,决定颜色的曲线形态与驱动计算公式的曲线形态是相同的,因此当计算系统正在默默计算厚尾VaR时,面板上不可能显示绿色。

图表中显示的EVT Crash Gauge指标,图表包含面板和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
绘制图表上的文本面板。当指标被解除绑定时,面板对象将被移除。
关于性能: GPD拟合是一种优化,而非查找操作。之所以设置重拟合频率规则,是因为在非常长的图表上对每个K线进行重拟合是一项实际计算工作。如果首次加载感觉较慢,请提高RefitEvery的数值;无论如何,实时读数始终保持精确,因为最新K线总是会被重拟合。


在您自己的代码中使用该引擎

尾部模型是一个独立的“仅头文件”类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\EVTCrashGaugeiCustom 获取句柄,并复制缓冲区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 Histogram

这是一个名为“RSI 直方图”的 MetaTrader 5 MQL5 自定义指标。它会在单独的窗口中绘制标准的 RSI 线,同时还会根据动量变化,以颜色编码的形式显示基于相同 RSI 值的直方图:

Relative Moving Average EA Relative Moving Average EA

这是对布洛赫(Bloch)相对移动平均线框架中全部四种交叉策略的MQL5实现,其中采用了其根据波动率区间调整的自适应交叉平仓规则。入场和出场均在分位数空间中进行,因此阈值在每个交易品种上的含义都是一致的。

GoldLondonBreakout GoldLondonBreakout

在亚洲时段,对XAUUSD进行区间锁仓,随后为伦敦开盘设置一个OCO突破组合(买入止损/卖出止损),止损位基于ATR计算,仓位大小按风险百分比确定。不使用任何指标,不进行主观判断——区间是经过测算的,而非凭空猜测。

Sessionvolatilityheatmap Sessionvolatilityheatmap

以图表热力图的形式显示交易日每小时的平均价格区间,并在K线背后添加亚洲/伦敦/纽约交易时段的阴影——这样您就能清楚看到该交易品种何时真正出现波动,而不仅仅是凭空猜测。