資料とデータへ
ORIGINAL REPORT RESEARCH

TradingView OSS Strategy Research Engine

研究リポジトリの記録をサイト上で表示しています。

元のMarkdown

TradingView OSS Strategy Research Engine

公開 Pine から売買構造を抽出し、同じ先物データ・費用・約定規則で比較する研究用基盤。33件の候補のうち、最初の10種類に5種類を追加して15種類の数値ルールを Python 実装した。結果は利益順位でなく IS/OOS、取引数、期待値、DD、周辺パラメータと市場依存で読む。

売買・損益計算の基本対象はMNQのみ。MESはMNQとのSMTを判定するための参照データとして取得し、MESの売買損益は計算しない。

Setup

uv venv .venv
uv pip install --python .venv/bin/python -r requirements.lock
.venv/bin/python -m pytest -q

requirements.lock は今回検証した固定バージョン。requirements.txt は互換範囲を示す。

Data

現行のMNQ売買用5分足とMES SMT参照用1分・5分足は、いずれもNY現地時間2026-09-25の完了済み取引日まで取得済み。MNQ 5分足122,577本、MES 5分足122,110本、時刻一致121,858本。scripts/refresh_databento_latest.py で9月18日以降を追加し、MESの満期金曜は scripts/fill_mes_expiry_20260918.py で次限月から補った。元ファイルは残し、各入力のSHA256を data/raw/manifest.json に記録。データ仕様と欠損状況は reports/data_specification.md、価格を含まない取得一覧は results/summary/data_inventory.json。

初期取り込み時は、ライセンスを持つ OHLCV CSV を次の手順で配置した。

.venv/bin/python scripts/import_data.py MNQ /absolute/path/to/mnq_5m_databento_2025-01-01_2026-09-19.csv
.venv/bin/python scripts/import_data.py MES /absolute/path/to/mes_5m_2026-04-05_2026-09-15.csv
.venv/bin/python scripts/prepare_data.py

MNQ はDatabento継続先物の1分足を5分足へ集計した系列で、9月満期金曜の次限月を含む。MESの現行主系列もDatabentoで、旧TradingView MESは供給元比較の履歴にのみ使用。MNQ/NQとMES/ESはpoint valueが異なるため、config/symbols.yaml を確認。フルサイズのNQ・ES・YM・RTYや2019–2023年の検証データはこの環境にない。

Research

.venv/bin/python scripts/research_candidates.py

research/candidates.csv が正本。research/candidates.md は自動生成。Pine 本文は原作者のライセンスに従う調査用ローカルコピーで Git 管理外。元 URL・作者・監査記録は CSV とファイル冒頭に保存。新規候補は CSV へ1行追加し、原典を確認してから config/strategies.yaml と strategies/ に実装する。

初回10構造と追加5構造の対応・選定理由は research/selection.md。追加分は原典の指標値から作った売買仮説であり、原著のStrategy Testerではない。

別環境で同じ公開ソースのスナップショットを復元するときは .venv/bin/python scripts/fetch_pine.py --id TV005。SHA256 が変わった原典は自動保存せず、再監査する。古いページ等、公開エンドポイントから復元できない場合もある。

新規候補は .venv/bin/python scripts/add_candidate.py --url 'https://www.tradingview.com/script/...' --name '公開scriptName' --author '作者' --category 'Trend' --logic '売買構造の要約' で登録。ソース本文を取得して pending_manual_audit とし、コード監査・ルール確定後に初めて config/strategies.yaml へ追加する。

Backtest / OOS / Robustness / Report

.venv/bin/python scripts/run_backtests.py
.venv/bin/python scripts/aggregate_results.py
.venv/bin/python scripts/run_oos.py
.venv/bin/python scripts/run_robustness.py
.venv/bin/python scripts/run_walk_forward.py
.venv/bin/python scripts/run_timeframes.py
.venv/bin/python scripts/analyze_context.py
.venv/bin/python scripts/generate_charts.py
.venv/bin/python scripts/generate_report.py

一括実行:

.venv/bin/python scripts/run_pipeline.py

Session / AMDX / MNQ×MES SMT

scripts/run_pipeline.py は従来の検証の後、build_features.py、run_feature_analysis.py、run_predeclared_filters.py、generate_feature_reports.py も実行する。単独更新時は以下の順序:

.venv/bin/python scripts/build_features.py
.venv/bin/python scripts/run_feature_analysis.py
.venv/bin/python scripts/run_predeclared_filters.py
.venv/bin/python scripts/generate_feature_reports.py
.venv/bin/python scripts/generate_report.py

インジケーターのセッション × AMDX 探索(SMTなし)

abo-lana-m-backtest と同じNY時間の4セッション(Asia 18:00、London 00:00、NY AM 06:00、NY PM 12:00開始)を各90分のA/M/D/Xに分ける。全15構造の5分足確定シグナルを、シグナル足の開始時刻で分類し、各窓のEntry条件を約定エンジンで再実行する。既存のNY AM専用 config/amdx.yaml とは別設定で、境界は config/session_amdx_matrix.yaml。

.venv/bin/python scripts/run_session_amdx_matrix.py

出力は results/summary/session_amdx_matrix.csv、reports/session_amdx_matrix.md、選択して各セルを比較できる reports/session_amdx_matrix.html。2025年ISと2026年OOSを別々に示し、両期間100取引以上・平均損益プラス・PF>1を探索候補とする。これは15戦略×16窓の事後探索であり、2026年損益も閲覧済みのため独立追試ではない。SMT条件は含めない。

Session Framework 4分類

config/session_frameworks.yaml でNY現地時刻のAsia 18:00–01:00、London 01:00–08:00、NY 08:00以降、Cash Open 09:30を定義する。America/New_York でDSTを処理し、固定UTCオフセットを使わない。F1はAsiaで前日高安をSweep/Reclaimした後のLondon Expansion、F2はLondonでAsia高安をSweep/Reclaimした後のNY Expansion、F3はLondon Protraction+事前に完了したHTF Target到達+NY Reversal、F4はNY AMでLondon高安をSweep/Reclaimした後の反対方向Expansion。1日に複数成立でき、該当なしも保存する。

.venv/bin/python scripts/run_session_frameworks.py
.venv/bin/python scripts/session_framework_expansion_sensitivity.py

Frameworkの確定時刻より前の約定には付与しない。5m/15m/60m/90m/4h/1d/1w SMTはDatabento MESとの一致5分足から、完成済みの時間足だけを採用する。Entry Signal、NY AM時間ベースAMD、HTF Bias、曜日、ボラティリティと結合する。既存約定の条件付きコホート集計に加え、各FrameworkをEntry Filterとして共通エンジンで再実行し、F4は09:30–10:00 Entryの許可・禁止を別々に計算する。Framework自体は注文を出さないため、Framework単独のPFは定義しない。

出力は results/features/session_framework_{daily,events,trades}.csv、results/summary/session_framework_{frequency,cohorts,filter_backtests,expansion_sensitivity}.csv、全件表示用JSON、reports/session_frameworks.md。サイトでは全件約定CSVを圧縮して配布する。2025年1〜8月、9〜12月、2026年1〜9月25日を分けるが、いずれも事後研究で未使用Holdoutではない。定義・欠損条件・MAE/MFEの制約はレポートと reports/data_specification.md を参照。

Framework確定後に入ったMNQ約定をインジケーター×AMDXで見る表は .venv/bin/python scripts/build_framework_amdx_matrix.py で更新する。既存4セッション×90分の16窓とNY AM専用A/M/D/Xを別の定義として保存し、results/summary/framework_amdx_matrix.csv と reports/framework_amdx_matrix.md に出力する。90m・4h SMTの完成足からEntry時点に確定していた状態別の表は results/summary/framework_amdx_smt_matrix.csv。present、方向一致、bullish、bearish、none、unknown を分ける。これは既存約定の記述的比較で、Entry Filterを再実行した値やSMT後最初のシグナルの成績ではない。

3枚分割のFramework×インジ×AMDX表は .venv/bin/python scripts/run_framework_scaleout_matrix.py で約定から再計算する。設定は config/framework_scaleout_targets.yaml。SqueezeはATR14×1・3R/5R/7Rで反対シグナル決済を無効にし、他14インジは既存初期SL(未定義時はATR14×2)・2R/3R/4Rで研究用のシグナル決済を維持する。TP1約定後の残り2枚は次の足から建値SL、同一足はSL優先。NY日の開始残高から−$1,000に達したら残玉を損切りし当日の新規取引を止める。結果は results/summary/framework_amdx_scaleout_matrix.csv、同90m/4h SMT表、全約定CSV圧縮版と reports/framework_amdx_scaleout_matrix.md に保存する。FrameworkとSMTはEntry時点で確定済みの状態を付けるが、これらを注文Filterにした再約定成績ではない。元インジケーターの多くに3段階TPはないため、2R/3R/4Rは利用者指定の研究ルール。

確定SMT後の最初のシグナル

5m/15m/60m SMTを各時間足の完成した足の終値で確定し、その時刻より後の最初のインジケーターシグナルだけを採用して再バックテストする。同じSMT方向が続く間は1イベント。最初のシグナルがSMT方向と一致した場合も別に集計する。先に逆方向シグナルが出た場合、後の方向一致シグナルはそのイベントでは採用しない。

.venv/bin/python scripts/run_first_signal_after_smt.py

更新版は2025-01-01〜2026-09-25をNY現地日付で区切り、Discoveryを2025年通年、retrospective Validationを2026年1月〜9月25日とする。MESは両期間でDatabentoに統一し、旧TradingView系列と混ぜない。欠損時刻は補間しない。さらにH007の候補だったNY AM Dのsqueeze_releaseとAsia Xのema_ribbonを同期間で重ねる。SMTイベントの最初のシグナルは窓で絞る前に決める。出力は results/summary/first_signal_after_smt.csv、results/summary/first_signal_after_smt_h007_zones.csv、reports/first_signal_after_smt.md、個別シグナル監査用の results/features/first_smt_signals.csv。SMT時間足の途中で出る暫定判定は使用しない。期間設定は config/settings.yaml:first_signal_research。

追加指示による4h SMTは別系列で実行する。NY 18:00起点の4時間に両市場の5分足48本が揃った場合だけ、4時間足の終値で確定する。

.venv/bin/python scripts/run_first_signal_after_smt.py --four-hour

出力は reports/first_signal_after_smt_4h.md、results/summary/first_signal_after_smt_4h.csv、results/summary/first_signal_after_smt_4h_h007_zones.csv、監査用 results/features/first_smt_signals_4h.csv。以前の5m/15m/60m結果は上書きしない。

設定は config/sessions.yaml(NY時間・DST対応・重複Session membership)、config/amdx.yaml(時間ベースA/M/D/X)、config/smt.yaml(Swing参照期間・時間足・アンカー)、config/data_sources.yaml。Entry 5mとSMT時間足は独立。現有の5m MNQ/MESでは5m/10m/15m/30m/60m/90m/4h/1d/1wを計算し、3mは欠損と記録する。none(両銘柄のSwing非乖離)と unknown(比較データ不足)は異なる。

売買とバックテストの対象はMNQで、MESはSMTの参照系列。主パイプラインのMES設定はDatabento 5mへ更新済み。上記2025〜2026年SMT研究では取得済みDatabento MESを別入力として使う。分足データの取得状況は scripts/build_data_inventory.py で元CSVのSHA256・期間・月別本数・時刻一致数を照合し、results/summary/data_inventory.json に価格を含まない集計として保存する。MNQ側も1分足を正規アクセスで追加する場合は、まず費用見積もりのみを実行し、許容額を明示してから取得する。databento は任意依存で、APIキーは環境変数から読み込む。取得コマンドは既存データを上書きせず、新しいファイルを data/raw/MES/ と data/raw/MNQ/ に保存する。両系列の1分足が揃い、config/data_sources.yaml の raw_1m を設定すると3m SMTも計算できる。

uv pip install --python .venv/bin/python databento
.venv/bin/python scripts/fetch_databento_pair.py --start 2026-04-05 --end 2026-09-16 --symbols MES MNQ
# 見積もりを確認した後のみ:
.venv/bin/python scripts/fetch_databento_pair.py --start 2026-04-05 --end 2026-09-16 --symbols MES MNQ --download --max-estimated-cost-usd 10

10 は例示上限であり、実際の許容額は見積もり確認後に決める。Databentoの費用見積もりは実請求額と完全一致を保証しない。自動購入・自動再取得はパイプラインに含めない。

取得済みDatabento MES 5分足と従来のTradingView MESを同一期間で比較する場合:

.venv/bin/python scripts/compare_mes_sources.py

reports/mes_source_comparison.md にSMT判定と固定Filterの差、results/sensitivity/ に全比較値を保存する。旧MESの比較結果は履歴として維持する。この比較はデータ供給元への感度確認であり、新しいMNQ損益による独立追試ではない。当時のMES系列は継続シンボルのみで、現在は9月18日の満期切替を別途確認した。

主な出力: data/aligned/quality_report.json、results/features/trade_features.csv、results/summary/{session,amdx,smt,smt_timeframe,interaction}_performance.csv、filter_backtests.csv、reports/{session,amdx,smt,feature}_analysis.md、reports/data_specification.md。filter_backtests.csv はEntry条件を変えて約定エンジンを再実行した比較。その他のFeature別表は既存約定Tradeの記述的コホート比較で、実行可能P&Lとは区別する。Final Holdout区間の集計は現在オフだが、2026年MNQ結果は過去研究で見ているため、この期間を真の未使用Holdoutと呼ばない。

設定は config/settings.yaml・symbols.yaml・strategies.yaml。IS 2025、OOS 2026-01〜2026-09-25 16:55 ET(9/25の完了済み取引日まで)。全戦略1枚、片道手数料 $0.62、片道1 tick、ATR14×2 stop、2R target。これらは研究用の仮定で実際の約定費用と異なる。reports/methodology.md に約定、ロール、TradingView との差異、選抜規則を記載。

結果: results/summary/backtest_results.csv、strategy_summary.csv、results/oos/、results/robustness/、results/charts/、reports/latest_report.md。市場データと Pine 本文はライセンスに配慮して Git に含めない。