# 再現方法と検証上の限界

## 1. 研究対象・ソース監査

`research/candidates.csv` の33件は TradingView OSS の公開 Pine 本文を確認した候補。2026-09-21 に前プロジェクトで取得・監査した記録を `research/legacy_audit.md` に複製した。作者別ライセンスのため Pine 本文は Git 管理外。再実行者は記載 URL の Source code を開き、公開状態と変更履歴を再確認する。公開ページ説明だけから安全性を断定しない。

監査項目: `request.security`、`barmerge.lookahead_on`、pivot/zigzag 確定遅れ、負 offset、未確定足、状態の遡及修正。特定モードを除外した理由は `research/rejected.md`。`[1]` 付き上位足の確定値取得や期間境界の time 取得は一律に危険扱いしない。33件の「監査済み」は元の研究の範囲に限り、今回の15 Python 売買ルールと厳密に一致する意味ではない。

## 2. 市場データ

MNQ: Databento GLBX.MDP3の継続先物1分足から作った5分足。旧系列に9月18日満期金曜の次限月と9月25日までを追加し、現行122,577本。原CSVとSHA256は `data/raw/manifest.json`、時刻一致状況は `results/summary/data_inventory.json`。`symbol`列の実限月切替を検出し、売買シグナルには同じ限月区間でウォームアップした指標を使う。切替時点までに観測した直前終値と新限月始値の差だけを新限月以降のOHLCへ加算するforward gap adjustment。将来の価格は使わないが、価格ギャップを除くため結果にはバイアスが残り得る。生CSVは保持する。

MESはSMT参照用。現行主系列は2025年〜2026年9月25日のDatabento 1分足611,239本と完全な5本から集約した5分足122,110本。9月18日満期金曜のみ次限月の450本を補った。旧2026-04-05〜09-15 TradingViewエクスポートは供給元比較の履歴として保持し、現行SMTとは混ぜない。MNQの売買損益にMES価格は使わない。ES、YM、RTYと2019–2023年の同条件データはない。

時刻は `America/New_York`。バー時刻はバー開始。原典の「20-day Donchian」を5分足で period=20 とすると100分であり、20営業日ではない。これは原著の名前を写した研究用変換である。

## 3. 15戦略と共通リスク

候補33件から、初回はトレンド3件、ブレイク3件、平均回帰3件、モメンタム1件を選択し、その後ADX/DI、BBW、Kaufman ER、Displacement、MADZの5件を追加した。選定理由は先読み回避、数値ルールの単純さ、カテゴリー分散、5分足で取引数が見込めること。`donchian_ema_atr` は Donchian と EMA200 を組み合わせた追加仮説であり、単一原著の正確な再現ではない。`ema_ribbon` は原著5本のうち9/30/200本だけの派生形。VWAP は日付でリセットした volume-weighted 乖離で、原著の既定週足 VWAP とは異なる。Opening Range は NY 09:30–10:00 の確定値で、原著の UTC 固定セッションを NY DST 対応へ変更。その他のエントリー・決済は `strategies/` にある実装を正本とする。

全戦略で同じ ATR14×2 stop と 2R target を加える。シグナル決済はそれより先に発生し得る。戦略の比較対象は「公開 Indicator の単体勝率」ではなく「指標由来の売買構造＋共通リスク枠」。ストップ距離はシグナル足の確定 ATR。逆指値・利確は次足以降の OHLC で判定する。

## 4. 約定モデル

確定バー `i` のシグナルは `i+1` 始値で約定。1枚、ピラミッディング無し。ロング買い・ショート買戻しは始値/閾値に片道1 tick を不利に加算、売りは減算。片道手数料 $0.62/枚、MNQ 1 point=$2、MES 1 point=$5。保有足で stop と target の両方に触れた場合 stop 優先。stop のギャップ越えは始値で悪化約定、target の有利ギャップは始値で約定。シグナル決済は次足始値。期間末の建玉のみ最終バー終値で強制決済（非通常約定の例外）。エクイティはバー終値時点の含み損益、往復損益は入出双方の費用を差し引く。

TradingView Strategy Tester と差が出る要因: バックテスト約定エミュレーターの OHLC 経路、Bar Magnifier の下位足、limit/stop 注文設定、`process_orders_on_close`、チャートの B-ADJ 価格、リアルタイム未確定バー、セッション境界、原著 Indicator と Python 派生ルールの差。本研究は一致を強制しない。

## 5. 分割と選抜

IS: 2025-01-01〜12-31。OOS: 2026-01-01〜2026-09-25 16:55 ET。9月25日が今回取得した最後の完了済みNY取引日。終値指標のウォームアップには前の履歴を使うが、ISの選抜には2026年バーを用いない。IS 15件の結果を順位付けし、全15件を同じ2026年OOSで評価する。Scoreは `aggregate_results.py` の簡易式で、PF、期待値、回復係数、DD、取引数を使用。統計的優劣を決める値ではない。2026年結果はすでに閲覧済みで、追加期間を未使用の独立OOSとは呼ばない。

Walk Forward は3 fold の固定パラメータ時系列検証。train 区間で最適化・学習しないため、本来の再最適化型 Walk Forward ではない。Robustness は最初の数値パラメータを±10%した3点を IS で比較。Monte Carlo は IS 損益順序500通りのランダム並べ替えであり、損益分布・市場条件そのものの不確実性は再現しない。seed は設定で固定。

隣接時間足は5分足から完全なバーだけを10分/15分に再集計。原著と同じ足数パラメータを固定するため、時間で見た窓幅は変わる。3分足は元データから生成できず試していない。

## 6. 指標と解釈

Expectancy = 勝率×平均勝ち−負率×平均負け = 1取引あたり純損益。Profit Factor = 総利益/総損失。Max DD はバーごとのエクイティ頂点からの最大下落額。Sharpe/Sortino は取引日最終エクイティの日次リターンを年率化（√252）する。0取引や損失なしでは PF は欠損。100未満は参考、100–299 は検証対象、300以上を望ましいとラベル付けする。

OOS PF / 勝率の変化率は `OOS/IS−1`、期待値の変化率は符号反転を正しく示すため `(OOS−IS)/abs(IS)`（負は悪化）、DD増加は `OOS DD−IS DD`。IS が0または欠損なら変化率は欠損とする。

## 7. 実行

README の Setup/Data を終え、`.venv/bin/python scripts/run_pipeline.py` を実行。必要なら段階別スクリプトを順に実行。`data/raw/manifest.json` と結果行の `data_sha256` で入力を検証し、設定と候補 CSV を Git に保存する。`reports/latest_report.md` は毎回結果から再生成。データや原著ソースにアクセスできない第三者は、本 Git リポジトリだけで同じ数値まで再現できないことを明記する。

## 8. Session / AMDX / SMT Feature

Sessionは`config/sessions.yaml`のNY現地時刻の半開区間 `[start,end)`。`America/New_York` のIANA timezoneを使い、夏時間を固定UTC offsetへ近似しない。`ny_open`はprimary sessionでは`ny_am`より優先する一方、`session_ny_am` membershipでは09:30–12:00全体を含む。このためSession別行は重複し、列間で件数を足さない。Time binは設定した15/30/60分の現地時計境界。A/M/D/Xは`config/amdx.yaml`の時間ベース区間のみであり、市場構造による事後的なAMDX判定を装わない。

MNQ/MESはUTC時刻の完全一致で内積集合へ揃え、片側欠損を補間しない。`data/aligned/quality_report.json`は共通期間中の片側専有本数、両側一致本数、欠損率、元データSHAを保存。両市場ともDatabentoを使用するが、MESの実限月コードは9月18日以降のみ確認済み。全期間の3分足SMTにはMNQの1分足を追加取得する必要がある。

Swing SMTは中心Pivotではなく、直前`config/smt.yaml:swing_lookback_bars`個の**確定済み時間足**の最大High/最小Lowを参照する。一方の現在足High/Lowがその参照を更新し、他方が更新しないときにBullish/Bearishを付与する。現在の60m/90m/4h/1d/1wのHigh/Lowは元の5m（両市場の1mが揃えば1m）バーが確定するたびの累積値で、後から完成した足全体を過去のEntryへ付けない。SMTは元バー確定時刻から利用可能になり、Entry足の始値時点に`merge_asof`で過去方向へ結合する。元バーより古い情報しかない場合は欠損。`detected_at`、参照level/銘柄、発生からの**元バー数**`age_bars`を保持する。両側で同時に逆方向の乖離が起きる曖昧バーは`none`と`ambiguous=true`を併記。MNQの既知ロールではSwing履歴をリセットする。MESの9月18日以前の実限月不明は分析上の制約。

5m現データから3mを再構成することは不可能。双方の1m正規データを`config/data_sources.yaml:raw_1m`に指定した場合だけ3mを生成する。60m/90m/4hは設定のNY時間アンカー（既定18:00 ETH）からの経過時刻で区切る。日足は18:00 ET、週足は日曜18:00 ET開始。アンカー変更は別研究条件として記録する。Previous-dayは直前完成ETH日足との比較。Session SMTは直前の同名完成Session高安値との比較。Liquidity sweepは直前3元バーの高安値をwickで抜き、確定終値が戻った場合のみ付与。FVGは3本目確定後だけ付与し、現段階では取引フィルターに利用しない。

## 9. Feature研究の分割・指標・解釈

`config/settings.yaml:feature_research`でDiscoveryを2025年通年、retrospective Validationを2026-01-01〜09-25に固定。2026年MNQの損益はすでに閲覧済みであり、独立した未使用Holdoutではない。旧2026年4〜7月の分割は履歴資料として残すが、現行の特徴別表は両期間で再集計した。将来の未使用期間が必要。

`run_feature_analysis.py`は全15戦略の保存済み取引をFeatureで分類する**事後コホート分析**。PFは利益合計/損失絶対値合計、Expectancyは平均純損益、Average Rは各取引の純損益/初期リスクUSDの平均、DDは各コホート取引の決済順累積損益のpeak-to-trough（元のバーごとDDと異なる）。100取引未満を`insufficient_sample`とし、条件を多数見て最高PFを自動採用しない。Filterによって取引を消すと単一ポジション制約による後続取引が変わるため、コホートはFilter後の実現可能な戦略損益ではない。

`run_predeclared_filters.py`は事前指定の`base → NY AM → NY AM+D → 5m/15m/60m方向一致SMT`を、各期間で**エントリー時フィルターとして約定エンジンから再実行**する。既存シグナル・費用・SL/TP・1ポジション制約は固定。これは計算上実行可能な比較だが、同一ベンダーデータ・新しい未使用期間での追試までは有効なEdgeの証明ではない。全組合せの最適化や、時間足の恣意的な重み付けはしない。
