私たちのファンページに参加してください
- ビュー:
- 23
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
概要
標準的なMetaTrader 5ツールボックスに含まれるほぼすべてのリスク管理ツールには、ある隠れた前提が共通しています。それは、「計画すべき最悪の損失は、おおむね過去に実際に経験した最悪の損失と同程度である」というものです。平均真値範囲(ATR)は、直近のボラティリティに基づいてポジションサイズを決定します。モンテカルロ再サンプリングは、実際に実行した取引を再配置します。 ヒストリカル・バリュー・アット・リスク(HVAR)は、リターン履歴から直接パーセンタイル値を読み取ります。これらはいずれも分布の中心部のみを観察し、将来が過去よりも極端な動きを生じないことを密かに期待しています。
金融リターンはファットテール分布を示す ため、その期待は的外れです。大きな値動きは正規分布が許容する範囲よりも頻繁に発生し、その振れ幅も大きくなります。また、サンプルの中で最も悪い1日であっても、市場が引き起こし得る最悪の1日とはほぼ決して一致しません。損失を、その分析対象期間内にすでに発生した損失と同程度としか見なせない手法は、まれに起こる暴落を体系的に過小評価してしまうことになります。

正規分布モデル(曲線)と実際のファットテールリターン(ヒストグラム)の比較。網掛けされた左側の尾部は、そのモデルが見落としている損失を表しています。
このインジケーターは、そのギャップを埋めるために構築された統計学の一分野を、MQL5にネイティブに組み込んでいます。極値理論は 分布全体をモデル化するのではなく、尾部のみをモデル化します。その形状は、仮定に基づくものではなく、極限定理によって正当化されたものです。これにより、適合されたモデルはサンプル内のいかなる値をも超えて 外挿することが可能になります。例えば、99.9%の損失、およそ3年に1度発生する値動き、あるいは過去のデータでは実際に発生したことのない数値などです。
手法について。 このインジケーターは「Peaks-Over-Threshold」を実装しています。 これは、チャートの終値を片側の下方損失系列に変換し、すべての下落幅を保持し、すべての上昇幅をゼロにマッピングします。その系列の分位数に基づいて高い閾値u を選択し、それ以下の値をすべて除外して、損失が閾値を超えた金額である「超過値」のみを分析します。 Pickands-Balkema-de Haanの定理によれば、幅広い種類の基礎となる分布において、閾値が上昇するにつれて、これらの超過分は単一の分布族、すなわち一般化パレート分布 に収束する。したがって、テールの形状を推測する必要はなく、適合させるだけでよい。

「閾値超過値(Peaks-Over-Threshold)」:損失系列に閾値を設定し、それを超える超過値を抽出してから、それらの超過値のみに一般化パレート分布を適合させます。
この適合処理は、GPDの形状とスケールに対する真の最大尤度最適化であり、端末に同梱されているALGLIBの 制約付き最適化アルゴリズムを通じて実行される。Pythonブリッジも、DLLも、いかなる種類の外部依存関係も存在しない。
表示される情報
3つの数値がローリングウィンドウ上で算出され、チャート上のパネルに表示されます。そのうち最初の数値はサブウィンドウに線グラフとしてプロットされるため、時間の経過に伴うテールの収縮・拡大の推移を観察することができます。
| 読み方 | 概要 | 使用方法 |
|---|---|---|
| EVT VaR | 選択した信頼水準におけるバリュー・アット・リスク(VaR)で、過去のデータから読み取るのではなく、フィッティングされたテールから外挿されます。 | 計画に組み込むべき損失額です。パネル上ではパーセンテージで表示され、サブウィンドウの線としてプロットされます。線が上昇している場合は、テールが肥大化していることを意味します。 |
| EVT ES | 期待ショートフォール(Expected Shortfall)。VaRが超過した場合の 平均損失額。 | 最悪のシナリオが発生した場合の損失の深刻度。常にVaRよりも大きく、ストップ注文の設定においてより現実的な数値である。 |
| xi(形状) | フィッティングされたテール指数。値が大きいほどテールが重くなり、損失はより長期にわたって累積します。 | パネル上で色分け表示されるレジームの値。これは、外挿がどこまで及ぶかを決定するパラメータである。 |
これら2つの推定量は標準的な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は 閾値、シグマとxiは 推定されたスケールと形状、Nu / nは 超過率である。両者とも指数分布の極限を持ち、推定された形状がゼロに近い場合には自動的にこれが使用される。これにより、形状で割ることが算術的に不安定になるレジームにおいて、計算の安定性が保たれる。
テール分布の信号機。 パネルでは、数値を解釈することなく領域を読み取れるよう、形状を色分けしています:
| xi | 色 | 読み取り |
|---|---|---|
| 0.10未満 | 緑 | 尾部が細い指数関数的なケースに近い。穏やか。 |
| 0.10 ~ 0.30 | ゴールド | 中程度の変動。ほとんどの流動性の高い金融商品がここに該当する。 |
| 0.30以上 | 赤 | テールが重い。損失が複利的に膨らみ、暴落が集中する。 |
これらの区切りは、統計的な閾値というよりは読み取りの目安であり、好みに応じて調整可能です。重要なのは、色を決定する形状と計算式を決定する形状が同一であるため、計算が密かにファットテールのVaRを算出している間、パネルが緑色を表示することはあり得ないということです。

チャート上のゲージ:パネルにはVaR、期待ショートフォール、および色分けされたテール形状が表示され、サブウィンドウには経時的なEVT VaRがプロットされます。
推測を拒否する
これは、このモジュールを組み込む前に知っておくべき設計上の決定事項です。なぜなら、これにより「空白」が意味する内容が変化するからです。 2パラメータのテールフィットが信頼できるものとなるには、実数の超過回数が不可欠であり、EVTに関する文献では、実用的な下限としておよそ30~50のテールポイントが扱われています。このエンジンは30回を必須としています。その回数に満たない場合、数値ではなくステータスを報告し、パネルには次のように平易な言葉で表示されます:
| ステータス | 意味 |
|---|---|
| OK | 十分なテールデータに基づいてフィッティングが収束しました。VaR、ES、xiが有効です。 |
| テールデータ不足(超過件数 N/30 未満) | ウィンドウ内で30件未満の超過が発生しました。ルックバック期間を延長するか、しきい値となる分位数を下げてください。 |
| フィッティングが収束しませんでした | 最適化アルゴリズムが有効な形状およびスケールに到達しませんでした。何も報告されません。 |
| フィッティング未実行/不正な入力 | まだフィッティングが実行されていないか、ウィンドウが空または縮退状態でした。 |
実際の具体的な例:デフォルトの閾値 0.95 では、500 バーのルックバックでも超過回数は約 25 回しか得られず、ゲージは数値の代わりに「テールデータ不足(25/30 回)」 と報告します。 800バーでは下限値を超え、きれいにフィッティングされます。これは回避すべきバグではなく、モデルが推測を拒否しているだけであり、稀な事象について正直に報告することを唯一の目的とするツールに求められるまさにその挙動です。
同じ原理が反対側にも当てはまります。 適合した形状が1に達すると、尾部の平均値が発散し、期待ショートフォール(Expected Shortfall)が定義されなくなるため、エンジンはそこででっち上げた数値ではなくゼロを返します。適合が「OK」ステータスを得られなかった場合、そのバーのプロット線は古い値をそのまま引き継ぐのではなく空白のままにされるため、モデルが判定を拒否した箇所では、線が完全に空白となります。
推奨設定
| 設定 | 推奨値 | 備考 |
|---|---|---|
| シンボル | あらゆる上場商品 | 銘柄固有の要素はありません。分析は対数リターンを基に行われるため、結果はパーセンテージで表示され、銘柄間で比較可能です。出来高の少ない銘柄は、下限値を超過できない可能性が最も高いケースです。 |
| 時間枠 | H4またはD1 | VaRは1バーあたりの損失額であるため、時間軸によってその数値が何を意味するかが決まります。D1では1日の損失額となります。日中の取引でも機能しますが、1分足のリターンのテール部分は別の対象となります。 |
| ルックバック | 800バー | 0.95の閾値が、30回超過の下限を余裕を持ってクリアするように設定されています。ウィンドウを短くすると反応は速くなりますが、下限に抵触してしまいます。 |
| 必要な履歴期間 | ルックバック + 2バー | 最初にフィット可能なバーより前のデータは描画されません。チャートに実際にその分の履歴がダウンロードされていることを確認してください。そうでないと、ゲージは空白のままになります。 |
| しきい値の分位数 | 0.95 | 標準的なデフォルト値です。この値を低く設定すると、閾値が高くなるにつれて定理が成り立つため、漸近的な妥当性を犠牲にして超過回数を増やすことができます。 |
入力パラメータ
| パラメータ | デフォルト | 説明 |
|---|---|---|
| ルックバック | 800 | 各フィットの計算に用いられる、バー単位のローリングウィンドウ。利用可能なリターンがこのカウントの半分を下回るウィンドウは、データがまばらすぎるとして却下されます。 |
| 閾値量 | 0.95 | POTのしきい値uを設定するために使用される損失系列の分位数。0.5から0.999までの値が許容される。 |
| 信頼度 | 0.99 | VaR および ES の信頼水準。適合されたテールは外挿されるため、サンプルにそのような損失が含まれていなくても、0.999 は有効な設定となります。 |
| 再推定間隔 | 1 | 過去のバーに対する再フィットの頻度。1に設定すると、すべてのバーで再フィットが行われ、プロットされた線が完全に解像されます。この値を上げると、非常に長いチャートにおいて、過去の解像度を犠牲にして処理速度が向上します。いずれの場合でも、現在のバーは常に再フィットされます。 |
| ShowPanel | 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はリスク管理ツールキットにおいてその地位を確立していますが、これは特殊なツールであり、適切に活用するには、適用できない場面を把握しておく必要があります:
- テールデータへの依存度が高い。 2パラメータのテールフィットには、十分な数の超過データが必要である。取引量の少ない銘柄や短い期間では、正しい答えは「データ不足」であり、この設計は数値をでっち上げるのではなく、その事実を尊重する。
- 閾値に敏感です。 デフォルトの0.95は標準値ですが、適合した形状やスケールは閾値の変化に応じて変動します。本格的な導入においては、単一の設定を鵜呑みにするのではなく、その感度を検証する必要があります。そのため、分位数が入力パラメータとして公開されています。
- これは規模を測定するものであり、タイミングを測定するものではありません。 これが最も一般的な誤用であるため、繰り返し強調しておきます。テール指数の上昇は、方向性を示すシグナルではありません。
- テールが明確に定義されなくなる場合があります。 推定された形状が1に近づくにつれて、期待ショートフォールは存在しなくなり、その領域でのゼロは失敗ではなく、それ自体が情報となります。
ファイル構造
1つのインジケーターと1つのヘッダーファイルで構成されます。ヘッダーファイルは<EVT\GPDModel.mqh> として含まれているため、Include フォルダ内のEVT サブフォルダに配置する必要があります。
| ファイル | 役割 | 説明 |
|---|---|---|
| Indicators\EVT\EVTCrashGauge.mq5 | ゲージ | 終値のローリングウィンドウからダウンサイド損失の系列を構築し、バー単位のペースに合わせてフィットを行い、EVT VaR を描画し、色分けされたテール値を示すチャート上のパネルを維持します。 |
| Include\EVT\GPDModel.mqh | テールエンジン | CGPDModel クラス:閾値の選択、超過値の抽出、ALGLIB による制約付き最適化を用いた GPD の最尤推定、VaR および期待ショートフォール、そして各測定値を制御するステータス列挙型。 |
このエンジンは、最尤法を実行する前にモーメント法による推定値を最適化アルゴリズムの初期値として与え、形状を妥当な範囲に制限します。これにより、病的なウィンドウがあっても、一見妥当に見えるが実際には誤ったフィッティングではなく、拒否されるフィッティングへと導かれます。
研究の根拠
この実装は、極値理論における標準的な「閾値超過(Peaks-Over-Threshold)」の取り扱いに従っています: 閾値超過値が一般化パレート分布(GPD)に収束することに関するピックアンドス・バルケマ・デ・ハーンの定理、その形状とスケールの最尤推定、およびバリュー・アット・リスク(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
ブロックの「相対移動平均」フレームワークに基づく4つのクロス戦略すべてをMQL5で実装したもので、ボラティリティの局面に応じて切り替わる彼の「適応型クロスオーバー・エグジット」ルールが採用されています。エントリーとエグジットはフラクタイル空間で行われるため、閾値はどの銘柄でも同じ意味を持ちます。
GoldLondonBreakout
XAUUSDはアジア時間のレンジ内でポジションをロックし、ロンドン市場の寄り付きに向けてOCOブレイクアウト注文(買いストップ/売りストップ)を仕掛けます。ストップはATRに基づいて設定し、ポジションサイズはリスク比率で決定します。インジケーターも裁量も一切使わず、レンジは推測ではなく測定に基づいて判断します。
Sessionvolatilityheatmap
取引日の1時間あたりの平均価格帯をチャート上のヒートマップとして表示し、さらにローソク足の背景にアジア・ロンドン・ニューヨークの各セッションごとの色分けを施しています。これにより、単なる推測ではなく、銘柄が実際に動いたタイミングを把握することができます。