私たちのファンページに参加してください
- ビュー:
- 27
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
トリプル・バリア・ラベリング・パイプラインでは、min_ret の閾値として、任意の定数(0.5~1.0%)や従来のスプレッドの仮定が頻繁に使用されます。実際の往復取引コストよりも低い閾値を設定すると、パイプラインはコストに起因するノイズを取引可能なシグナルとしてラベル付けしてしまいます。 その結果、ラベル付けされたデータセットはエッジを体系的に過大評価することになり、それらのラベルを用いて学習されたモデルは、真の市場構造ではなく、ラベル付けスキームに起因する人工的な現象に過学習してしまう。
TransactionCostCollector.mq5 は、この問題のデータ収集段階を解決するスタンドアロンスクリプトです。このスクリプトは、過去のスプレッド分布をサンプリングし、対象のチャートシンボルに関するブローカーのスワップレートと手数料の診断情報を読み取り、すべてを構造化された CSV ファイルにエクスポートします。 このCSVファイルは、関連するPythonクラス「TransactionCostModel」 によって処理され、すべてのコストを比率リターンに変換し、ラベル付け処理のための銘柄固有のmin_ret 閾値を算出します。

TransactionCostCollectorの出力を示す3パネルの図:セッションごとの日中のコスト内訳(a)、全コスト分布(b)、およびmin_ret選定のためのパーセンタイル曲線(c)
スクリプトが収集する情報
このスクリプトは、1回の実行で単一の銘柄について以下の3つのコスト要素を収集します:
- スプレッド—CopySpread() による、指定されたバー数にわたる過去の分布。平均、標準偏差、およびパーセンタイル(p25、p50、p75、p90、p95、p99)として報告され、すべてピップ単位です。また、セッションごとの影響を明らかにするために、1日のUTC時間ごとに計算されます。
- スワップ—SYMBOL_SWAP_LONG/SYMBOL_SWAP_SHORT から直接読み取ったロングおよびショートのオーバーナイト・スワップレート。これには、スワップモード(ポイント、通貨、金利)およびトリプルスワップが課される曜日が含まれます。
- 手数料— 診断用のみ。MQL5では、すべてのブローカーにおいてロットあたりの手数料を直接API呼び出しで取得することはできません。このスクリプトは、ACCOUNT_COMMISSION_BLOCKEDを 記録するとともに、単一の参照取引からロットあたりの手数料率を算出する方法を説明する注記を記載しています。
入力パラメータ
| パラメータ | デフォルト | 説明 |
|---|---|---|
| InpBars | 50000 | サンプリングするスプレッド履歴のバー数。値を大きくすると、より代表的な分布が得られ、セッションごとの変動をより多く捉えることができます。H1では50,000バーで約5.7年、M15では約1.4年をカバーします。ターミナルで当該銘柄の履歴が限られている場合は、この値を小さくしてください。 |
| 入力/出力ファイル | (空白) | 出力ファイル名を上書きします。空白(デフォルト)の場合、ファイル名は<SYMBOL>_costs.csv となります。例えば、EURUSD の場合はEURUSD_costs.csv となります。 ファイルは、ターミナルのデータフォルダ内のMQL5\Files\ に書き込まれます(FILE_WRITE | FILE_CSV モード)。 |
CSV 出力形式
CSV は、セクション、キー、値、単位の 4 列構成を採用しています。セクションは以下の通りです。
- symbol_properties— ポイントサイズ、ピップ係数、ティック値、契約サイズ、通貨識別子。
- swap— ロング/ショート金利、スワップモード、トリプルスワップとなる曜日。
- commission— 診断値および導出に関する注記。
- spread_summary— サンプリングされたすべてのバーにわたる平均、標準偏差、およびパーセンタイル。
- spread_by_hour— 1日の各時間ごとの平均スプレッド(ピップス)。1時間ごとに1行(UTC、ブローカー時間)。
実行方法
- TransactionCostCollector.mq5 を MQL5\Scripts\Downloads\ フォルダに配置し、MetaEditor でコンパイルします。
- 任意の時間枠で対象銘柄のチャートを開きます。時間枠によって、スプレッド分布のサンプリング対象となるバーの種類が決まります。詳細度と履歴の長さのバランスを考慮すると、H1が推奨されます。
- スクリプトをチャートにドラッグします。入力ダイアログが表示されます(#property script_show_inputs で制御されます)。InpBars を 希望するサンプリング数に設定し、[OK] をクリックします。
- ターミナルのデータフォルダ内のMQL5\Files\ から出力 CSV ファイルを取得します(MetaTrader 5 の[ファイル] → [データフォルダを開く])。
Pythonとの連携
付属のPythonクラス「TransactionCostModel」は、CSVを読み込み、トリプルバリアのラベル付けに必要なmin_retを 計算します:
from afml.transaction_costs import load_cost_model import pandas as pd model = load_cost_model( csv_path = "EURUSD_costs.csv", spread_percentile = "p95_pips", # 保守的 slippage_pips = 0.4, commission_per_lot = 7.0, # 参照取引より lot_size = 0.01, ) close = pd.read_parquet("EURUSD_H1.parquet")["close"] min_ret = model.min_ret_for_symbol( price_series = close, holding_days = 1.0, cost_multiplier = 1.5, # 1.5倍の損益分岐点 ) print(f"min_ret = {min_ret:.6f}")
手数料に関する注意事項
ロットあたりの手数料率は、すべてのブローカーでプログラムから読み取れるわけではありません。推奨される手順は次のとおりです。デモ口座で正確に1.0標準ロットの参照取引を開き、取引開始直後にターミナルからACCOUNT_COMMISSION_BLOCKEDを読み取り、その後取引を決済します。 ブロックされた値を1.0で割ると、1ロットあたりの手数料率が得られます。口座明細書と照合して確認してください。この作業は、各ブローカーとの取引関係ごとに1回行う必要があります。
なぜ平均値ではなくp95なのか
平均スプレッドは、アジアセッション、夜間の上下動が収まる時間帯、および整然としたトレンド相場といった、相場が静かな期間の影響を強く受けます。 しかし、戦略のエントリーは、不確実性が最も高い瞬間(モデルがシグナルを生成するタイミング)と重なることがよくあります。min_retの 入力値として95パーセンタイルのスプレッドを使用することで、平均的な市場状況ではなく、典型的なエントリー条件におけるコスト環境を反映させることができます。
参考文献および関連記事
- López de Prado, M. (2018).『Advances in Financial Machine Learning』、第3章(ラベル)、p. 44–47. Wiley.
- 完全な実装と導出:MetaTrader 5 機械学習ブループリント — 第14部:取引コストモデル(著者:Patrick M. Njoroge)。
- 関連記事のダウンロードパッケージには、関連するPythonクラス「TransactionCostModel」および使用例が含まれています。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/73173
Institutional Harmonic Volumetric Gravity Center
加重調和平均の数学的手法を活用した定量的な出来高密度エンジンであり、算術上の外れ値を除去し、機関投資家の流動性の真の重心位置を特定する。
Close Profit Positions
利益確定のポジションを決済する
Adaptive Moving Average (AMA)
適応移動平均線は、ノイズの影響を受けにくい移動平均線を作るときに使われ、トレンドを検知する際にラグが最小に抑えられるという特徴を持ちます。
Accelerator Oscillator (AC)
アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。