# TradingView OSS Strategy Research Engine

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

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

## Setup

```bash
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 を次の手順で配置した。

```bash
.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

```bash
.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

```bash
.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
```

一括実行:

```bash
.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` も実行する。単独更新時は以下の順序:

```bash
.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`。

```bash
.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日に複数成立でき、該当なしも保存する。

```bash
.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方向と一致した場合も別に集計する。先に逆方向シグナルが出た場合、後の方向一致シグナルはそのイベントでは採用しない。

```bash
.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時間足の終値で確定する。

```bash
.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も計算できる。

```bash
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を同一期間で比較する場合:

```bash
.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 に含めない。
