無料でロボットをダウンロードする方法を見る
Telegram上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
スクリプトを気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ビュー:
31
評価:
(5)
パブリッシュ済み:
FFD.mq5 (3.38 KB) ビュー
\MQL5\Include\
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

外国為替や先物の生データ価格は非定常である。これらを用いて学習させた標準的な回帰モデルや分類モデルは、深刻な先読みバイアスや偽の相関に直面する。単純な対処法である「整数差分」は非定常性を排除するが、その過程で価格の記憶情報をすべて失い、予測モデルに不可欠な自己相関構造そのものを捨ててしまうことになる。

『Advances in Financial Machine Learning』(López de Prado, 2018)の第5章で導入された固定幅分数差分法(FFD)は、 は、定常性を確保するのにちょうど十分な非整数次d ∈ (0, 1) で差分計算を行い、記憶効果を最大限に保持することでこの問題を解決します。本投稿では、その手法の実用レベルのMQL5実装を提供します。

FFD指標:生価格(上)対 定常FFD系列(下)

FFDの出力を示す2つのパネル:非定常な生価格(a)と、ルックバックウィンドウがマークされた定常なFFD時系列(b)


構成要素

  • FFDEngine.mqhCFFDEngineクラスを含むヘッダーのみの ライブラリ。Init()Compute()(1バー分)、およびComputeBuffer()prev_calculated最適化を 備えた完全なインジケーターバッファ)を提供します。OnInit() 実行後は動的メモリ割り当てを行いません。
  • FFD.mq5CFFDEngineを ラップするカスタムインジケータ。FFD系列を別のチャートウィンドウに描画します。すべてのENUM_APPLIED_PRICE 値に対応しています。

アルゴリズムの仕組み

重みベクトルは、以下の再帰式(AFML 式 5.4)によって定義されます:

w[0] = 1 w[k] = -w[k-1] * (d - k + 1) / k, k = 1, 2, ...

|w[k]| < 閾値 となった時点で反復を停止します。 その後、ベクトルの順序を逆転させ、ルックバックウィンドウ内の最も古い価格に最小の重みを、最も新しい価格に1.0を割り当てる。バーiにおける FFD値は、逆順の重みベクトルと対数価格ウィンドウ[i−width, …, i] との内積である。

d = 0.4threshold = 1e-5 の場合、ウィンドウ幅は 1 457 バーとなる。threshold = 1e-3 の場合、54 バーとなる。threshold は、定常性と記憶性のトレードオフを制御する。値が小さいほど、より広いルックバック要件を犠牲にして、より多くの記憶性を保持する。

入力パラメータ

パラメータ デフォルト 説明
InpD 0.4 分数差分順序。一般的な範囲:0.1~0.9。0.5 より大きい値ではほぼ整数差分が得られ、0.1 より小さい値ではほぼ原価に近い値が得られます。 最適なd は、選択された有意水準で ADF 検定を通過する最小値である。Python による探索手順については、関連記事参照。
InpThreshold 1e-5 重みのカットオフ値τ|w[k]| < τ となった時点で反復処理が停止します。値を小さくするとウィンドウ幅が広がり、記憶の保存性が向上しますが、最初の有効な出力が得られるまでに必要な過去のバー数が増加します。推奨範囲:1e-4 ~ 1e-5。
InpUseLog true 差分計算の前にln(価格) を適用します。生価格系列(終値、始値、高値、安値)に推奨されます。入力がすでにリターンまたは対数リターン系列である場合にのみfalse に 設定してください。
InpPrice PRICE_CLOSE 適用される価格タイプ。ENUM_APPLIED_PRICE の 任意の値(PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_CLOSE、PRICE_MEDIAN、PRICE_TYPICAL、PRICE_WEIGHTED)を受け付けます。

インストール

  1. FFDEngine.mqh を MQL5\Include\ フォルダ(または CodeBase ダウンロード時に指定されたサブフォルダ — ファイルの保存場所については以下を参照)にコピーしてください。
  2. FFD.mq5 を MQL5\Indicators\Downloads\ にコピーします(CodeBase からのダウンロード時に自動的にこの場所に配置されます)。
  3. MetaEditor で両方のファイルをコンパイルします。#property strict の下で、警告なしでインジケータがコンパイルされるはずです。
  4. FFD を 任意のチャートに追加します。ルックバックウィンドウ(幅 + 1 バー)が埋まると、メインチャートの下にインジケータウィンドウが表示されます。

独自のEAやインジケータでCFFDEngineを使用する場合

FFDEngine.mqhは ヘッダーのみのライブラリです。これをインクルードし、OnInit() 内で一度Init()を 呼び出してください:

#include <FFDEngine.mqh>

//--- 固定幅分数差分エンジンのグローバルインスタンス
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| エキスパートの初期化関数                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- d=0.4、閾値=1e-5、対数変換を有効にしてFFDエンジンを初期化する
//--- この設定により、EAの初期化フェーズ中に静的なメモリウェイトウィンドウが構築されます
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| エキスパート・ティック関数                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- エンジンに問い合わせ、必要な過去のバーの正確な数を調べる
//--- 閾値に基づいて有効なFFD値を算出するため
   int need = g_engine.GetMinBars();
   double close[];

//--- 必要な期間分の過去の価格データを取得する。
//--- 履歴がまだ同期されていない、または不十分な場合は、エラーを防ぐために実行をスキップします。
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- 配列のインデックスが時系列順と一致するようにする(最も古いバーがインデックス 0 になるように)
//--- FFD重みベクトル行列の変換が逆順になった場合に正しく位置合わせを行うため
   ArraySetAsSeries(close, false);

//--- 現在のライブバーについて、定常状態の分数差分による出力値を計算する
   double ffd_value = g_engine.Compute(close, need);

//--- モデルの特徴量として ffd_value を使用してください。
  }

Python との交差検証

付属ファイルFFDValidation.mq5(記事のダウンロードから入手可能)は、FFD値をCSVファイルにエクスポートします。Pythonスクリプトffd_cross_validate.py は、afml ライブラリを使用して同じ値を再計算し、バーごとに比較します。 EURUSDのH1チャート5,000バーにおいて、d = 0.4threshold = 1e-5 の条件下で、最大絶対誤差は1e-12未満でした。

パフォーマンスに関する注意事項

  • 重みベクトルの割り当て:OnInit() 内で1回のみ。ティックパス上での割り当てはゼロ。
  • バーごとの計算:O(width) の内積。最新のハードウェアでは、1,457 要素の内積は 50 μs 未満で完了します。
  • ComputeBuffer() は prev_calculated 引数を使用して、すでに計算済みのバーをスキップします。各ティックで再計算されるのは、現在の未完了のバーのみです。

参考文献および関連記事

  • López de Prado, M. (2018). 『Advances in Financial Machine Learning』第5章(分数微分)、76–95ページ。Wiley。
  • 完全な理論、Python実装、およびADFベースのパラメータ探索:『Feature Engineering for ML — Part 2: Implementing Fixed-Width Fractional Differentiation in MQL5』(著者:Patrick M. Njoroge)。
  • 関連検証ツール:FFDValidation.mq5 およびffd_cross_validate.py— 本記事のダウンロードパッケージに含まれています。

MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/72499

長期トレンド TRIX オシレーター 長期トレンド TRIX オシレーター

デュアルTRIXおよびLWMAフィルタリングに基づく、長期のモメンタムおよびトレンドオシレーター。

Institutional Kinematic Price Physics (Velocity and Acceleration) Institutional Kinematic Price Physics (Velocity and Acceleration)

価格変動に微分計算を適用する定量的な物理エンジンであり、真の「市場速度(1階微分)」と「市場加速度(2階微分)」を抽出することで、トレンドの終息が実際に起こる前にそれを予測します。

Adaptive Moving Average (AMA) Adaptive Moving Average (AMA)

適応移動平均線は、ノイズの影響を受けにくい移動平均線を作るときに使われ、トレンドを検知する際にラグが最小に抑えられるという特徴を持ちます。

Accelerator Oscillator (AC) Accelerator Oscillator (AC)

アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。