From 1cebebf79aff00ff53a5b4cd6bf7bed924d5394c Mon Sep 17 00:00:00 2001 From: Harwinder Sekhon Date: Sun, 6 Sep 2026 17:35:41 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20keep=20only=20what=20the=20system=20ne?= =?UTF-8?q?eds=20=E2=80=94=20drop=20research=20tooling,=20study=20scripts,?= =?UTF-8?q?=20diagram,=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner directive 2026-09-06: Dukascopy and similar research material is irrelevant to the running system; keep only code and files with a role in system functioning. Deleted (all in git history before this commit): - backtest/research/ tooling and data: book_report, book_diff, burst_map, burst_precursors, burst_indicator_map, open_trade_bursts, calendar_impact, watch_rule_eval, sizing_model, commit_ladder, llm_news_eval + llm_news_golden.csv, ff_calendar_scraper, duka_spread + duka_spread_by_hour.csv (the Dukascopy spread study), feed_divergence_oanda_vs_tiingo.csv, the panel dry-test JSONL, __init__.py - scripts/feed_divergence_study.py, scripts/signal_parity_study.py (completed studies; their reports keep the results) - docs/architecture.png + architecture_diagram.py (developer illustration) - docs/data_source_change_test_plan.md (Phase 4 shadow scan stays noted in CLAUDE.md) Kept: the campaign .md reports in backtest/research/ as the decision ledger CLAUDE.md cites (rule 1 evidence); scripts/shadow_scan.py (pending operational step); backtest/diagnose_filters.py (test-locked backtester diagnostic). Local, untracked material removed on this box: .superpowers/, walkforward/, baseline/, the commit-ladder and LLM-eval result folders, the Dukascopy boundary CSV; the sizing_2026-09 folder is pruned to the four 3-year baseline books CLAUDE.md names. .gitignore no longer lists the removed research outputs; the backtest instructions and CLAUDE.md no longer point at deleted tools. Suite: 461 passed, 0 failed (nothing imported the removed files). Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0156YhogLytzj9P2iH1skGbL --- .gitignore | 5 - CLAUDE.md | 10 +- backtest/instructions_for_backtest.txt | 17 +- backtest/research/__init__.py | 5 - backtest/research/book_diff.py | 86 -- backtest/research/book_report.py | 581 ----------- backtest/research/burst_indicator_map.py | 121 --- backtest/research/burst_map.py | 444 -------- backtest/research/burst_precursors.py | 127 --- backtest/research/calendar_impact.py | 111 -- backtest/research/commit_ladder.py | 178 ---- backtest/research/duka_spread.py | 193 ---- backtest/research/duka_spread_by_hour.csv | 25 - .../research/feed_divergence_2026-08-14.md | 4 +- .../feed_divergence_oanda_vs_tiingo.csv | 2 - backtest/research/ff_calendar_scraper.py | 144 --- backtest/research/llm_news_eval.py | 697 ------------- backtest/research/llm_news_golden.csv | 79 -- backtest/research/open_trade_bursts.py | 150 --- .../panel_payload_drytest_2026-08-15.jsonl | 7 - backtest/research/signal_parity_2026-08-14.md | 2 +- backtest/research/sizing_model.py | 961 ------------------ backtest/research/watch_rule_eval.py | 78 -- docs/architecture.png | Bin 592401 -> 0 bytes docs/architecture_diagram.py | 191 ---- docs/data_source_change_test_plan.md | 92 -- scripts/feed_divergence_study.py | 259 ----- scripts/signal_parity_study.py | 246 ----- 28 files changed, 15 insertions(+), 4800 deletions(-) delete mode 100644 backtest/research/__init__.py delete mode 100644 backtest/research/book_diff.py delete mode 100644 backtest/research/book_report.py delete mode 100644 backtest/research/burst_indicator_map.py delete mode 100644 backtest/research/burst_map.py delete mode 100644 backtest/research/burst_precursors.py delete mode 100644 backtest/research/calendar_impact.py delete mode 100644 backtest/research/commit_ladder.py delete mode 100644 backtest/research/duka_spread.py delete mode 100644 backtest/research/duka_spread_by_hour.csv delete mode 100644 backtest/research/feed_divergence_oanda_vs_tiingo.csv delete mode 100644 backtest/research/ff_calendar_scraper.py delete mode 100644 backtest/research/llm_news_eval.py delete mode 100644 backtest/research/llm_news_golden.csv delete mode 100644 backtest/research/open_trade_bursts.py delete mode 100644 backtest/research/panel_payload_drytest_2026-08-15.jsonl delete mode 100644 backtest/research/sizing_model.py delete mode 100644 backtest/research/watch_rule_eval.py delete mode 100644 docs/architecture.png delete mode 100644 docs/architecture_diagram.py delete mode 100644 docs/data_source_change_test_plan.md delete mode 100644 scripts/feed_divergence_study.py delete mode 100644 scripts/signal_parity_study.py diff --git a/.gitignore b/.gitignore index 091d623..b2750c0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,12 +26,7 @@ Thumbs.db # Backtesting data (keep scripts, ignore generated files) backtest/cache/ backtest/*.csv -backtest/research/*.parquet -backtest/research/duka_m5_boundary_spreads.csv backtest/__pycache__/ .env.* logs/ -backtest/research/commit_ladder_2026-08/ -backtest/research/llm_news_eval_2026-08/ - backtest/research/sizing_2026-09/ diff --git a/CLAUDE.md b/CLAUDE.md index 907ebed..b7b227f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,7 +37,7 @@ python backtest/gpu_backtest.py --pair XAUUSD --start 2025-01-01 --end 2025-06-0 **`test_all.py` is NOT pytest** — it uses a custom `@test("name")` decorator that runs each test immediately at import; don't grep for `def test_` or try `pytest test_all.py`. Run the whole file; it prints per-module results and exits non-zero on failure. There is no way to run a single test short of commenting modules out. Tests must stay green; every new gate/knob needs tests. Signal-log fixtures: use a WEEKDAY signal bar when a test exercises candle continuity — the outcome model treats weekend and 21:00 UTC gaps as scheduled, so Saturday-dated bars never produce a gap. `_candles_json` stores `df.tail(14)`, so a test snapshot longer than 14 bars silently drops its head. When patching weekend logic in tests, patch `providers.base._is_forex_weekend` — but know there are THREE independent signal-path weekend implementations (`providers/base.py`, `signal_aggregator.py`, and an inline copy in `backtest/gpu_backtest.py:_is_xau_blocked_by_calendar`) plus the advisory-only continuity copy in `advisory_outcome.py`; patching one does not reach the others. -Python 3.12; a `venv/` exists in-repo. Dependencies in `requirements.txt` (numpy, pandas, requests, twelvedata, python-telegram-bot ≥20, websockets). scikit-learn and lightgbm are installed in the dev `venv/` for `backtest/research/` only — never add them to `requirements.txt` or import them from live code; anything shipped must be numpy-only. +Python 3.12; a `venv/` exists in-repo. Dependencies in `requirements.txt` (numpy, pandas, requests, twelvedata, python-telegram-bot ≥20, websockets). scikit-learn and lightgbm are installed in the dev `venv/` for ad-hoc research only — never add them to `requirements.txt` or import them from live code; anything shipped must be numpy-only. ## Configuration & credentials @@ -96,11 +96,11 @@ Signal currency everywhere is `SignalStrength` (−2..+2). DataFrames are UTC tz ## Current state notes (dated per entry) - Oanda v20 is the live feed (`data_providers.active: "oanda"`). The 2026-08-04 re-pin made the 27 `backtest/oanda_*.csv` books the baseline; all TD-era books are superseded. (2026-08-14) The re-pin M5 book `oanda_m5_12mo_065_nopb_20260814.csv` (+106.82R PF 1.51) is itself SUPERSEDED by the 2026-09-03 book in the entry below; the M15 reference is unchanged since 2026-08-04: `oanda_m15_12mo_065.csv` (397 / +73.93R / PF 1.53). See `backtest/research/repin_verification_2026-08-14.md`. -- Cost reporting is dual: $0.65 is the measured-Oanda realistic headline ($0.65-$0.72 round trip), while $0.30 remains for cross-book comparability and as the live TP spread-gate input. Raising `round_trip_cost` from $0.30 would move the TP floor from about $9 to $19.50 and requires full rule-1 revalidation. The $0.65 figure comes from the 2026-07-24 Dukascopy tick study (`backtest/research/duka_spread.py` + `duka_spread_by_hour.csv`, kept as the evidence driver although nothing imports it). +- Cost reporting is dual: $0.65 is the measured-Oanda realistic headline ($0.65-$0.72 round trip), while $0.30 remains for cross-book comparability and as the live TP spread-gate input. Raising `round_trip_cost` from $0.30 would move the TP floor from about $9 to $19.50 and requires full rule-1 revalidation. The $0.65 figure comes from the 2026-07-24 Dukascopy tick study (9M ticks over 12 months; its tooling was removed 2026-09-06 — the conclusion lives here and in memory). - Twelve Data is signal-incompatible with Oanda (Phase 1: about 19% M5 bar-direction disagreement and a systematic ~$1 high bias; see `backtest/research/feed_divergence_2026-08-14.md`). On an Oanda candle outage, stop scanning rather than switching to TD candles. -- Tiingo is streaming-only (`data_providers.streaming: "tiingo"`), not a designated candle fallback. Oanda-Tiingo signal parity is documented in `backtest/research/signal_parity_2026-08-14.md`; Phase 4's two-week live shadow scan remains a manual operational step. +- Tiingo is streaming-only (`data_providers.streaming: "tiingo"`), not a designated candle fallback. Oanda-Tiingo signal parity is documented in `backtest/research/signal_parity_2026-08-14.md`; Phase 4's two-week live shadow scan (`scripts/shadow_scan.py`) remains a manual operational step. - Human-facing docs in `docs/` (`user_guide.html`, `beginner_guide.html` + PDF builds) must be kept in sync when signal behavior changes. As of 2026-09-06 the PDF builds are BEHIND the HTML (violent-move watch entry added without a PDF rebuild). - 2026-09-03 signal-log campaign shipped two new per-TF gates (`backtest/research/signal_log_campaign_2026-09.md`): M5 `sell_blocked_regimes=["transitioning"]` and H1 `sell_min_quality=[]` (all H1 shorts blocked). Current-HEAD M5 canonical book is now `backtest/oanda_m5_12mo_065_nopb_20260903.csv` (557 / +112.21R / PF 1.56, halves +55.9/+56.4); H1 reference `backtest/oanda_h1_12mo_065_20260903.csv` (91 / +22.2R / PF 1.79; 5yr +49.1R PF 1.46; OOS +16.7R PF 1.74). -- 2026-09-06 stake-sizing campaign (`backtest/research/sizing_campaign_2026-09.md`): a walk-forward "second opinion" stake multiplier (meta-labelling on 65 decision-time features, 3-year Oanda books at $0.65) FAILED the pre-registered rule on M5 (clean null) and M15 (lift inside the label-shuffle null, explained by BUY-vs-SELL). Nothing that changes numbers shipped. Behaviour-neutral tooling remains: `position_sizing.build_features` + `--export-features` (default export stays 63 columns), `SignalReport.penalty_tags/penalty_total/momentum_fading`, `TradeSetup.stake_multiplier` (None; reserved), `backtest/research/{book_report,burst_map,sizing_model}.py`. Stage-B facts: M5 stretch measures are POSITIVE in both halves (do not re-propose exhaustion sizing on M5); M15 exhaustion tag is weakly negative (≈ +3R/yr, noise); bursts cluster at 12–15 UTC and 01 UTC bar-close and do NOT hurt entries. +- 2026-09-06 stake-sizing campaign (`backtest/research/sizing_campaign_2026-09.md`): a walk-forward "second opinion" stake multiplier (meta-labelling on 65 decision-time features, 3-year Oanda books at $0.65) FAILED the pre-registered rule on M5 (clean null) and M15 (lift inside the label-shuffle null, explained by BUY-vs-SELL). Nothing that changes numbers shipped. Behaviour-neutral tooling remains: `position_sizing.build_features` + `--export-features` (default export stays 63 columns), `SignalReport.penalty_tags/penalty_total/momentum_fading`, `TradeSetup.stake_multiplier` (None; reserved) (the campaign's research scripts were removed 2026-09-06; git history has them). Stage-B facts: M5 stretch measures are POSITIVE in both halves (do not re-propose exhaustion sizing on M5); M15 exhaustion tag is weakly negative (≈ +3R/yr, noise); bursts cluster at 12–15 UTC and 01 UTC bar-close and do NOT hurt entries. - Auto-execution (oanda_daemon.py / oanda_executor.py) was removed 2026-09-03 — the owner is not auto-trading; last commit containing it is 31002cb. Book-parity rules that lived in its docstring (no broker TP, 5-bar cooldown, once-per-bar trail) remain the backtester's model. -- 2026-09-06 stale-code cleanup (behaviour-neutral; suite green, M5/H1 12-month books byte-identical after every signal-side commit): `main.py --timeframe` now accepts M5/M15/H1/H4 and takes its confirmation TFs from the pair factory (the CLI's private table had paired M5 with M1+M15); `PlatformConfig.pip_value` is gone (`PAIR_INFO` is the source); removed as dead or superseded: `_get_affected_pairs`/`event_impact_on_pairs`, `SignalLogger.advance_with_bars`/`path`/`news_for`, `reset_llm_client`, the Telegram scan-summary/keyboard helpers and duplicate confirmation map, the 2026-07 Oanda-vs-TD research pager+study, `burst_profile.py`, `hour_analysis.py`, `scripts/compare_oanda_tiingo.py`, the never-implemented LLM-provider plan and the merged config.json spec. `docs/architecture_diagram.py` only writes the PNG when run as a script. +- 2026-09-06 stale-code cleanup (behaviour-neutral; suite green, M5/H1 12-month books byte-identical after every signal-side commit): `main.py --timeframe` now accepts M5/M15/H1/H4 and takes its confirmation TFs from the pair factory (the CLI's private table had paired M5 with M1+M15); `PlatformConfig.pip_value` is gone (`PAIR_INFO` is the source); removed as dead or superseded: `_get_affected_pairs`/`event_impact_on_pairs`, `SignalLogger.advance_with_bars`/`path`/`news_for`, `reset_llm_client`, the Telegram scan-summary/keyboard helpers and duplicate confirmation map, the 2026-07 Oanda-vs-TD research pager+study, `burst_profile.py`, `hour_analysis.py`, `scripts/compare_oanda_tiingo.py`, the never-implemented LLM-provider plan and the merged config.json spec. Second pass the same day (owner directive: keep only what the system needs): every research script and data file under `backtest/research/` (book_report, book_diff, the burst tools, sizing_model, commit_ladder, llm_news_eval + golden CSV, ff_calendar_scraper, calendar_impact, watch_rule_eval, the Dukascopy spread study + CSVs, the panel dry-test JSONL), the two completed study scripts in `scripts/`, the architecture diagram + generator and the data-source test plan were deleted; the campaign `.md` reports stay as the decision ledger. Git history before `953c5ad` has all of it. diff --git a/backtest/instructions_for_backtest.txt b/backtest/instructions_for_backtest.txt index 35003d8..eb63be6 100644 --- a/backtest/instructions_for_backtest.txt +++ b/backtest/instructions_for_backtest.txt @@ -9,21 +9,18 @@ Every backtest report must record: - Per trade (the exported CSV already carries these): entry/exit time and price, exit reason, R multiple, MFE/MAE, entry reasons, and every indicator's signal / value / agreement at decision time. -- Breakdowns by session/hour, weekday, regime and volatility regime - (backtest/research/book_report.py) and, for any candidate change, the - removed/added/shifted trade diff against the control book - (backtest/research/book_diff.py). +- Breakdowns by session/hour, weekday, regime and volatility regime, and, + for any candidate change, the removed/added/shifted trade diff against the + control book (the 5-bar cooldown displaces entries, so judge run-level + numbers, never the added-trade bucket alone). - The md5 of the exported book whenever the run is a parity or regression check. Replays go through the real signal code (analyze_from_dataframes) — never a re-implementation. - --- 2026-09-06: decision-time feature export --- - `--export-features` appends stake_multiplier, r_sized and the 65 `f_*` decision-time features (position_sizing.FEATURE_ORDER) AFTER the 63 pinned columns; default export is - byte-identical to the pinned books. Use backtest/research/book_report.py for weekday / - hour x weekday / session / streak / rolling-WR / feature-quintile (both halves) tables, - backtest/research/burst_map.py for the burst-by-hour map, and - backtest/research/sizing_model.py for the walk-forward + shuffle-control harness. + byte-identical to the pinned books. - Any sizing report must show the FLAT book and the SIZED book side by side and the - label-shuffle null; the 2026-09-06 campaign verdict (nothing ships) is the reference. + label-shuffle null; the 2026-09-06 campaign verdict (nothing ships, + backtest/research/sizing_campaign_2026-09.md) is the reference. diff --git a/backtest/research/__init__.py b/backtest/research/__init__.py deleted file mode 100644 index 575b2ff..0000000 --- a/backtest/research/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Research tooling: calendar sourcing/store and edge-screening utilities. - -Nothing here is imported by the live bot; these modules support -backtesting and edge validation only. -""" diff --git a/backtest/research/book_diff.py b/backtest/research/book_diff.py deleted file mode 100644 index c143131..0000000 --- a/backtest/research/book_diff.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Trade-book diff: relaxed/gated run vs its control. - -Usage: - python backtest/research/book_diff.py CONTROL.csv CANDIDATE.csv BAR_MINUTES - -Decision numbers are RUN-LEVEL (ΔtotalR, ΔPF, ΔmaxDD, Δtrades) — never -the added-trade bucket alone: the 5-bar entry cooldown means new -entries displace existing ones. The added/removed decomposition and the -per-decision-hour histogram of added trades are diagnostics. - -Shifted trades = removed+added pairs in the same direction within -±5 bars (cooldown displacement, not a genuinely new/lost signal). -""" -import sys - -import pandas as pd - - -def _metrics(df): - r = df["r_multiple"] - gains, losses = r[r > 0].sum(), -r[r <= 0].sum() - cum = r.cumsum() - return dict(trades=len(df), total_r=r.sum(), - pf=gains / max(losses, 1e-9), - wr=(r > 0).mean() * 100 if len(df) else 0.0, - max_dd=(cum.cummax() - cum).max() if len(cum) else 0.0) - - -def diff_books(control_csv, candidate_csv, bar_minutes, split="2026-01-29"): - ctrl, cand = pd.read_csv(control_csv), pd.read_csv(candidate_csv) - for df in (ctrl, cand): - df["_t"] = pd.to_datetime(df["entry_time"], utc=True, format="mixed") - df["_key"] = df["entry_time"].astype(str) + "|" + df["direction"] - - added = cand[~cand["_key"].isin(ctrl["_key"])].copy() - removed = ctrl[~ctrl["_key"].isin(cand["_key"])].copy() - - # cooldown displacement: same-direction removed/added within ±5 bars - tol = pd.Timedelta(minutes=5 * bar_minutes) - shifted = 0 - rem_pool = removed.copy() - for _, a in added.iterrows(): - m = rem_pool[(rem_pool["direction"] == a["direction"]) - & ((rem_pool["_t"] - a["_t"]).abs() <= tol)] - if len(m): - shifted += 1 - rem_pool = rem_pool.drop(m.index[0]) - - mc, mk = _metrics(ctrl), _metrics(cand) - split_ts = pd.Timestamp(split, tz="UTC") - halves = (cand[cand["_t"] < split_ts]["r_multiple"].sum(), - cand[cand["_t"] >= split_ts]["r_multiple"].sum()) - hour_hist = None - if len(added): - added["dec_hour"] = (added["_t"] - - pd.Timedelta(minutes=bar_minutes)).dt.hour - hour_hist = added.groupby("dec_hour")["r_multiple"] \ - .agg(["count", "sum"]).round(2) - return dict( - control=mc, candidate=mk, - delta_r=mk["total_r"] - mc["total_r"], - delta_pf=mk["pf"] - mc["pf"], - delta_dd=mk["max_dd"] - mc["max_dd"], - delta_trades=mk["trades"] - mc["trades"], - added_n=len(added), added_r=added["r_multiple"].sum(), - removed_n=len(removed), removed_r=removed["r_multiple"].sum(), - shifted=shifted, halves=halves, added_by_hour=hour_hist, - ) - - -if __name__ == "__main__": - d = diff_books(sys.argv[1], sys.argv[2], int(sys.argv[3])) - c, k = d["control"], d["candidate"] - print(f"control : {c['trades']:4d} trades {c['total_r']:+7.1f}R " - f"PF {c['pf']:.2f} WR {c['wr']:.1f}% DD {c['max_dd']:.1f}") - print(f"candidate: {k['trades']:4d} trades {k['total_r']:+7.1f}R " - f"PF {k['pf']:.2f} WR {k['wr']:.1f}% DD {k['max_dd']:.1f}") - print(f"ΔR {d['delta_r']:+.1f} ΔPF {d['delta_pf']:+.2f} " - f"ΔDD {d['delta_dd']:+.1f} Δtrades {d['delta_trades']:+d}") - print(f"added {d['added_n']} ({d['added_r']:+.1f}R) " - f"removed {d['removed_n']} ({d['removed_r']:+.1f}R) " - f"shifted≈{d['shifted']}") - print(f"candidate halves: H1 {d['halves'][0]:+.1f}R H2 {d['halves'][1]:+.1f}R") - if d["added_by_hour"] is not None: - print("\nadded trades by decision hour:") - print(d["added_by_hour"].to_string()) diff --git a/backtest/research/book_report.py b/backtest/research/book_report.py deleted file mode 100644 index 8855c33..0000000 --- a/backtest/research/book_report.py +++ /dev/null @@ -1,581 +0,0 @@ -"""Full descriptive report of a backtest trade book (research only). - -Usage: - python backtest/research/book_report.py --book BOOK.csv --bar-minutes N \ - [--split YYYY-MM-DD|median] [--parquet-4h PATH] [--parquet-1d PATH] \ - [--out DIR] - -Prints (and writes to DIR/report.txt) headline metrics for the whole book -and for each half, group tables (weekday / decision hour / session / quality -/ regime / vol_regime / direction / strategy / exit_reason / indicators_agree), -win-loss streaks, a rolling win-rate summary, and a quantile-bucket screen of -every numeric decision-time feature the book carries (`f_*` / `x_*` columns -plus score, confidence, rr_planned, indicators_agree/oppose and `ind_*_value`). - -The screen is deliberately half-split: a feature only "passes" when the -top-bucket-minus-bottom-bucket mean-R gap has the SAME SIGN in both halves of -the book and both extreme buckets are populated in both halves. Bin edges are -fit on the WHOLE book (so the halves share edges and stay comparable) — that -leaks a little cross-half information into the edges themselves, which is why -the sign test, not the size of the gap, is the thing to trust. - -Everything here is measurement, not simulation: it never re-runs the signal -engine, it only describes a book that gpu_backtest.py already produced. -Analysis tooling only — never imported by the live code. -""" -from __future__ import annotations - -import argparse -import math -import os -from typing import Iterable - -import numpy as np -import pandas as pd - -SESSIONS = ( - ("asian", 3, 6), - ("london", 7, 12), - ("overlap", 13, 16), - ("ny", 17, 22), -) - -# Numeric non-`f_`/`x_` columns that are known at DECISION time and are -# therefore legal screen candidates. bars_held / r_multiple / mfe_r / mae_r -# are post-entry outcomes and must never appear here. -BASE_SCREEN_COLS = ("score", "confidence", "rr_planned", - "indicators_agree", "indicators_oppose") - - -def session_of(hour: int) -> str: - for name, lo, hi in SESSIONS: - if lo <= hour <= hi: - return name - return "off" - - -def feature_columns(df: pd.DataFrame) -> list[str]: - """Decision-time feature columns carried by this book, generically.""" - extra = [c for c in df.columns if c.startswith(("f_", "x_"))] - base = [c for c in BASE_SCREEN_COLS if c in df.columns] - ind = [c for c in df.columns - if c.startswith("ind_") and c.endswith("_value")] - out, seen = [], set() - for c in extra + base + ind: - if c not in seen: - seen.add(c) - out.append(c) - return out - - -# ───────────────────────────── loading ────────────────────────────── - -def load_book(csv: str, bar_minutes: int = 5, - split: str = "median") -> pd.DataFrame: - """Read a gpu_backtest trade book and add the decision-time columns. - - `decision_time` = entry_time − one bar: entries fill at the NEXT bar's - open, so the bar the signal actually decided on closed one bar earlier. - That is the clock blocked_hours_utc and every session filter evaluate. - `half` is 1 before the split instant and 2 at/after it. - """ - df = pd.read_csv(csv) - for col in ("entry_time", "exit_time"): - if col in df.columns: - df[col] = pd.to_datetime(df[col], utc=True, format="mixed") - df["decision_time"] = df["entry_time"] - pd.Timedelta(minutes=bar_minutes) - df["decision_hour"] = df["decision_time"].dt.hour - df["weekday"] = df["decision_time"].dt.weekday - df["session"] = df["decision_hour"].map(session_of) - df = df.sort_values("entry_time", kind="mergesort").reset_index(drop=True) - df["half"] = _halves(df["entry_time"], split) - return df - - -def split_instant(entry_time: pd.Series, split: str) -> pd.Timestamp: - if split == "median": - return entry_time.median() - return pd.Timestamp(split, tz="UTC") - - -def _halves(entry_time: pd.Series, split: str) -> pd.Series: - cut = split_instant(entry_time, split) - return np.where(entry_time < cut, 1, 2) - - -# ───────────────────────────── metrics ────────────────────────────── - -def base_metrics(r: pd.Series, df: pd.DataFrame | None = None) -> dict: - """Headline stats for a series of R multiples. - - max_dd uses the gpu_backtest.compute_metrics convention: a 0.0 is - prepended to the cumulative-R curve so an opening losing streak counts - as drawdown from flat, not from an already-negative first trade. - pf/expectancy split on r > 0 / r < 0 (exact zeros are neither). - """ - r = pd.Series(r, dtype="float64").dropna() - n = int(len(r)) - if n == 0: - return {"n": 0, "total_r": 0.0, "mean_r": 0.0, "median_r": 0.0, - "wr": 0.0, "pf": 0.0, "max_dd": 0.0, "sharpe": 0.0, - "expectancy": 0.0, "expectancy_alt": 0.0, "recovery": 0.0, - "avg_bars": float("nan"), "avg_mfe": float("nan"), - "avg_mae": float("nan")} - wins, losses = r[r > 0], r[r < 0] - gross_win = float(wins.sum()) - gross_loss = float(-losses.sum()) - cum = np.concatenate(([0.0], np.cumsum(r.to_numpy()))) - max_dd = float((np.maximum.accumulate(cum) - cum).max()) - std = float(r.std(ddof=0)) - mean_r = float(r.mean()) - wr = len(wins) / n - lr = len(losses) / n - avg_win = float(wins.mean()) if len(wins) else 0.0 - avg_loss = float(-losses.mean()) if len(losses) else 0.0 - expectancy_alt = wr * avg_win - lr * avg_loss - # Identity check: the textbook expectancy form must equal the plain mean - # whenever no trade is exactly flat (and it does even then, since a 0 R - # trade contributes 0 to both sides). - assert math.isclose(expectancy_alt, mean_r, rel_tol=1e-9, abs_tol=1e-9), ( - f"expectancy mismatch: {expectancy_alt} vs mean {mean_r}") - out = { - "n": n, - "total_r": float(r.sum()), - "mean_r": mean_r, - "median_r": float(r.median()), - "wr": wr * 100.0, - "pf": (gross_win / gross_loss) if gross_loss > 0 else float("inf"), - "max_dd": max_dd, - "sharpe": (mean_r / std) if std > 0 else 0.0, - "expectancy": mean_r, - "expectancy_alt": expectancy_alt, - "recovery": (float(r.sum()) / max_dd) if max_dd > 0 else float("inf"), - "avg_bars": float("nan"), - "avg_mfe": float("nan"), - "avg_mae": float("nan"), - } - if df is not None: - for key, col in (("avg_bars", "bars_held"), ("avg_mfe", "mfe_r"), - ("avg_mae", "mae_r")): - if col in df.columns: - out[key] = float(pd.to_numeric(df[col], - errors="coerce").mean()) - return out - - -def _pf(r: pd.Series) -> float: - """Profit factor (loss side is r <= 0).""" - pos = r[r > 0].sum() - neg = -r[r <= 0].sum() - return float(pos / max(neg, 1e-9)) - - -def group_table(df: pd.DataFrame, by, min_n: int = 10) -> pd.DataFrame: - """Per-group P&L with a half-1 / half-2 sign-stability flag.""" - keys = [by] if isinstance(by, str) else list(by) - rows = [] - for key, sub in df.groupby(keys, dropna=False, sort=True): - r = sub["r_multiple"] - h1, h2 = sub[sub["half"] == 1]["r_multiple"], sub[sub["half"] == 2]["r_multiple"] - m1 = float(h1.mean()) if len(h1) else float("nan") - m2 = float(h2.mean()) if len(h2) else float("nan") - stable = bool(len(h1) >= min_n and len(h2) >= min_n - and np.sign(m1) != 0 and np.sign(m1) == np.sign(m2)) - rec = {} - # pandas >= 2.2 hands back a 1-tuple even for a single group key. - vals = key if isinstance(key, tuple) else (key,) - for k, v in zip(keys, vals): - rec[k] = v - rec.update({ - "n": int(len(sub)), - "total_r": round(float(r.sum()), 2), - "mean_r": round(float(r.mean()), 3), - "wr": round(float((r > 0).mean() * 100), 2), - "pf": round(_pf(r), 2), - "n_h1": int(len(h1)), - "total_r_h1": round(float(h1.sum()), 2), - "mean_r_h1": round(m1, 3) if len(h1) else float("nan"), - "n_h2": int(len(h2)), - "total_r_h2": round(float(h2.sum()), 2), - "mean_r_h2": round(m2, 3) if len(h2) else float("nan"), - "sign_stable": stable, - }) - rows.append(rec) - out = pd.DataFrame(rows) - if not out.empty: - out = out.set_index(keys) - return out - - -def streaks(df: pd.DataFrame) -> dict: - """Longest win/loss runs and the longest stretch under water (in trades).""" - d = df.sort_values("entry_time", kind="mergesort") - r = d["r_multiple"].to_numpy(dtype="float64") - best_w = best_l = cur_w = cur_l = 0 - for x in r: - if x > 0: - cur_w, cur_l = cur_w + 1, 0 - elif x < 0: - cur_l, cur_w = cur_l + 1, 0 - else: - cur_w = cur_l = 0 - best_w, best_l = max(best_w, cur_w), max(best_l, cur_l) - cum = np.concatenate(([0.0], np.cumsum(r))) - peak = np.maximum.accumulate(cum) - flat, longest = 0, 0 - for i in range(1, len(cum)): - flat = 0 if cum[i] >= peak[i] else flat + 1 - longest = max(longest, flat) - return {"max_win_streak": best_w, "max_loss_streak": best_l, - "longest_flat_trades": longest} - - -def rolling_wr(df: pd.DataFrame, window: int = 20) -> pd.Series: - d = df.sort_values("entry_time", kind="mergesort") - s = (d["r_multiple"] > 0).astype(float).rolling(window).mean() * 100 - s.index = d["entry_time"].to_numpy() - return s - - -def equity_curve(df: pd.DataFrame) -> pd.DataFrame: - d = df.sort_values("entry_time", kind="mergesort") - cum = d["r_multiple"].cumsum() - peak = pd.concat([pd.Series([0.0]), cum]).cummax().iloc[1:] - peak.index = cum.index - return pd.DataFrame({"entry_time": d["entry_time"].to_numpy(), - "cum_r": cum.to_numpy(), - "drawdown": (peak - cum).to_numpy()}) - - -# ─────────────────────── quantile bucket screen ───────────────────── - -def quantile_buckets(df: pd.DataFrame, col: str, q: int = 5, - min_n: int = 10) -> pd.DataFrame: - """Equal-frequency buckets of `col` with per-half mean R. - - Bin edges are fit on the WHOLE book (both halves share edges). - Result carries gap_h1 / gap_h2 / sign_stable in `.attrs` and as - repeated columns so the CSV is self-describing. - """ - v = pd.to_numeric(df.get(col), errors="coerce") - d = df.loc[v.notna()].copy() - d["_v"] = v.loc[v.notna()] - empty = pd.DataFrame(columns=["bin", "lo", "hi", "n", "mean_r", "pf", "wr", - "n_h1", "mean_r_h1", "n_h2", "mean_r_h2", - "gap_h1", "gap_h2", "sign_stable"]) - empty.attrs = {"feature": col, "gap_h1": float("nan"), - "gap_h2": float("nan"), "sign_stable": False, "n": 0, - "mode": "empty"} - if d.empty: - return empty - - nuniq = int(d["_v"].nunique()) - if nuniq < 3: - mode = "values" - d["_bin"] = d["_v"] - order = sorted(d["_v"].unique()) - edges = {b: (float(b), float(b)) for b in order} - else: - mode = "qcut" - binned = pd.qcut(d["_v"], q, duplicates="drop") - d["_bin"] = binned - order = list(binned.cat.categories) - edges = {b: (float(b.left), float(b.right)) for b in order} - - rows = [] - for b in order: - sub = d[d["_bin"] == b] - if sub.empty: - continue - r = sub["r_multiple"] - h1 = sub[sub["half"] == 1]["r_multiple"] - h2 = sub[sub["half"] == 2]["r_multiple"] - lo, hi = edges[b] - rows.append({ - "bin": str(b), "lo": round(lo, 4), "hi": round(hi, 4), - "n": int(len(sub)), "mean_r": round(float(r.mean()), 3), - "pf": round(_pf(r), 2), - "wr": round(float((r > 0).mean() * 100), 2), - "n_h1": int(len(h1)), - "mean_r_h1": round(float(h1.mean()), 3) if len(h1) else float("nan"), - "n_h2": int(len(h2)), - "mean_r_h2": round(float(h2.mean()), 3) if len(h2) else float("nan"), - }) - out = pd.DataFrame(rows) - if out.empty: - return empty - - bot, top = out.iloc[0], out.iloc[-1] - gap_h1 = float(top["mean_r_h1"] - bot["mean_r_h1"]) - gap_h2 = float(top["mean_r_h2"] - bot["mean_r_h2"]) - populated = min(bot["n_h1"], bot["n_h2"], top["n_h1"], top["n_h2"]) >= min_n - signs_ok = (not math.isnan(gap_h1) and not math.isnan(gap_h2) - and np.sign(gap_h1) != 0 - and np.sign(gap_h1) == np.sign(gap_h2)) - sign_stable = bool(populated and signs_ok and len(out) >= 2) - out["gap_h1"] = round(gap_h1, 3) if not math.isnan(gap_h1) else float("nan") - out["gap_h2"] = round(gap_h2, 3) if not math.isnan(gap_h2) else float("nan") - out["sign_stable"] = sign_stable - out.attrs = {"feature": col, "gap_h1": gap_h1, "gap_h2": gap_h2, - "sign_stable": sign_stable, "n": int(len(d)), "mode": mode} - return out - - -def feature_screen(df: pd.DataFrame, q: int = 5, min_n: int = 10, - columns: Iterable[str] | None = None) -> pd.DataFrame: - """Bucket screen over every decision-time numeric feature in the book.""" - cols = list(columns) if columns is not None else feature_columns(df) - rows = [] - for c in cols: - bk = quantile_buckets(df, c, q=q, min_n=min_n) - a = bk.attrs - stable = bool(a.get("sign_stable")) - g1, g2 = a.get("gap_h1", float("nan")), a.get("gap_h2", float("nan")) - min_abs = (min(abs(g1), abs(g2)) if stable else 0.0) - rows.append({"feature": c, - "gap_h1": round(g1, 3) if g1 == g1 else float("nan"), - "gap_h2": round(g2, 3) if g2 == g2 else float("nan"), - "min_abs_gap": round(float(min_abs), 3), - "sign_stable": stable, - "n": int(a.get("n", 0)), - "bins": int(len(bk))}) - out = pd.DataFrame(rows) - if out.empty: - return out - return out.sort_values(["min_abs_gap", "n"], - ascending=[False, False]).reset_index(drop=True) - - -# ────────────────────── higher-timeframe extension ────────────────── - -def wilder_atr(bars: pd.DataFrame, period: int = 14) -> pd.Series: - h, l, c = bars["High"], bars["Low"], bars["Close"] - tr = pd.concat([h - l, (h - c.shift()).abs(), (l - c.shift()).abs()], - axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def _ext_series(parquet: str, minutes: int) -> pd.DataFrame: - bars = pd.read_parquet(parquet).sort_index() - bars = bars[~bars.index.duplicated(keep="last")] - ext = ((bars["Close"] - bars["Close"].rolling(20).mean()) - / wilder_atr(bars, 14)) - out = pd.DataFrame({ - "close_time": bars.index + pd.Timedelta(minutes=minutes), - "ext": ext.to_numpy(), - }).dropna().reset_index(drop=True) - # Books parse to datetime64[us, UTC] (format="mixed"), parquet indexes are - # [ns, UTC]; merge_asof refuses mismatched resolutions. - out["close_time"] = out["close_time"].astype("datetime64[ns, UTC]") - return out - - -def add_htf_extension(df: pd.DataFrame, parquet_4h: str | None, - parquet_1d: str | None) -> pd.DataFrame: - """Add direction-signed H4 / D1 stretch-from-mean in ATR units. - - ext = (close − 20-bar SMA of close) / Wilder ATR(14) on that timeframe, - taken from the LAST higher-TF bar whose CLOSE time (bar label + one bar) - is <= decision_time — i.e. only information the live scan could have had. - Signed +1 for BUY, −1 for SELL, so positive always means "extended in the - direction of the trade". - """ - out = df.copy() - sign = np.where(out["direction"].astype(str).str.upper().str.startswith("B"), - 1.0, -1.0) - for col, parquet, minutes in (("x_h4_ext_atr", parquet_4h, 240), - ("x_d1_ext_atr", parquet_1d, 1440)): - if not parquet: - continue - right = _ext_series(parquet, minutes) - left = out[["decision_time"]].reset_index() - left["decision_time"] = left["decision_time"].astype( - "datetime64[ns, UTC]") - left = left.sort_values("decision_time", kind="mergesort") - merged = pd.merge_asof(left, right, left_on="decision_time", - right_on="close_time", direction="backward") - merged["_stale_h"] = ((merged["decision_time"] - merged["close_time"]) - .dt.total_seconds() / 3600.0) - merged = merged.set_index("index").reindex(out.index) - out[col] = merged["ext"].to_numpy() * sign - out.attrs[f"{col}_max_stale_h"] = float( - merged["_stale_h"].max()) if len(merged) else float("nan") - return out - - -# ──────────────────────────── reporting ───────────────────────────── - -def _fmt(v, nd=3): - if isinstance(v, float): - if math.isinf(v): - return "inf" - if math.isnan(v): - return "n/a" - return f"{v:.{nd}f}" - return str(v) - - -def _metrics_block(name: str, m: dict) -> list[str]: - return [ - f" {name:<10} n={m['n']:<5} totalR={_fmt(m['total_r'], 2):>8} " - f"meanR={_fmt(m['mean_r'])} medR={_fmt(m['median_r'])} " - f"WR={_fmt(m['wr'], 2)}% PF={_fmt(m['pf'], 2)}", - f" {'':<10} maxDD={_fmt(m['max_dd'], 2)} recovery={_fmt(m['recovery'], 2)}" - f" sharpe={_fmt(m['sharpe'])} expectancy={_fmt(m['expectancy'])}" - f" (wr·avgW − lr·avgL = {_fmt(m['expectancy_alt'])})", - f" {'':<10} avg bars={_fmt(m['avg_bars'], 1)} " - f"avg MFE={_fmt(m['avg_mfe'])}R avg MAE={_fmt(m['avg_mae'])}R", - ] - - -def build_report(df: pd.DataFrame, book: str, bar_minutes: int, split: str, - out_dir: str, q: int = 5, min_n: int = 10) -> str: - lines: list[str] = [] - add = lines.append - cut = split_instant(df["entry_time"], split) - add("=" * 78) - add(f"BOOK REPORT {os.path.basename(book)}") - add("=" * 78) - add(f"trades : {len(df)}") - add(f"entry window : {df['entry_time'].min()} -> {df['entry_time'].max()}") - add(f"bar minutes : {bar_minutes} (decision_time = entry_time − 1 bar)") - add(f"split rule : {split} -> cut at {cut} " - f"(half 1 = before, half 2 = at/after)") - add(f"half sizes : h1={int((df['half'] == 1).sum())} " - f"h2={int((df['half'] == 2).sum())}") - add("session map : asian 3-6, london 7-12, overlap 13-16, ny 17-22, " - "else off (on DECISION hour, UTC)") - add("bucket edges : quantile bins are fit on the WHOLE book; the two " - "halves share the same edges.") - feats = feature_columns(df) - add(f"screen features : {len(feats)} " - f"({sum(1 for c in feats if c.startswith(('f_', 'x_')))} f_/x_ columns)") - for k, v in df.attrs.items(): - add(f"htf staleness : {k} = {_fmt(v, 1)} h (max age of the matched bar)") - - add("") - add("── HEADLINE METRICS ──") - lines.extend(_metrics_block("full", base_metrics(df["r_multiple"], df))) - for h in (1, 2): - sub = df[df["half"] == h] - lines.extend(_metrics_block(f"half {h}", - base_metrics(sub["r_multiple"], sub))) - - group_specs = [ - ("weekday", "weekday"), ("decision_hour", "decision_hour"), - ("session", "session"), ("quality", "quality"), ("regime", "regime"), - ("vol_regime", "vol_regime"), ("direction", "direction"), - ("strategy", "strategy"), ("exit_reason", "exit_reason"), - ("indicators_agree", "indicators_agree"), - ] - tables = {} - for name, col in group_specs: - if col not in df.columns: - continue - t = group_table(df, col, min_n=min_n) - tables[name] = t - add("") - add(f"── BY {name.upper()} ──") - add(t.to_string() if not t.empty else " (empty)") - - # (weekday, decision_hour) pivots - add("") - add("── weekday x decision_hour : TOTAL R ──") - wh = group_table(df, ["weekday", "decision_hour"], min_n=min_n) - if not wh.empty: - piv_r = wh["total_r"].unstack("decision_hour") - piv_n = wh["n"].unstack("decision_hour") - add(piv_r.fillna(0).round(2).to_string()) - add("") - add("── weekday x decision_hour : N ──") - add(piv_n.fillna(0).astype(int).to_string()) - tables["weekday_hour"] = wh - piv_r.to_csv(os.path.join(out_dir, "groups_weekday_hour_total_r.csv")) - piv_n.to_csv(os.path.join(out_dir, "groups_weekday_hour_n.csv")) - - st = streaks(df) - add("") - add("── STREAKS ──") - add(f" max consecutive wins : {st['max_win_streak']}") - add(f" max consecutive losses : {st['max_loss_streak']}") - add(f" longest flat stretch : {st['longest_flat_trades']} trades " - f"between equity highs") - - rw = rolling_wr(df, 20).dropna() - add("") - add("── ROLLING WIN RATE (20 trades) ──") - if len(rw): - add(f" min={_fmt(rw.min(), 2)}% median={_fmt(rw.median(), 2)}% " - f"max={_fmt(rw.max(), 2)}% n={len(rw)}") - add(" last 5: " + ", ".join( - f"{ts:%Y-%m-%d %H:%M}={v:.2f}%" for ts, v in rw.tail(5).items())) - else: - add(" (fewer than 20 trades)") - - scr = feature_screen(df, q=q, min_n=min_n) - add("") - add("── FEATURE SCREEN (top 25 by min |gap| across halves) ──") - add(" gap = mean R(top bucket) − mean R(bottom bucket), per half; " - "min_abs_gap is 0 unless the sign is stable.") - add(scr.head(25).to_string(index=False) if not scr.empty else " (none)") - - stable = scr[scr["sign_stable"]].head(10) if not scr.empty else scr - add("") - add(f"── BUCKET TABLES FOR THE TOP {len(stable)} SIGN-STABLE FEATURES ──") - if stable.empty: - add(" (no feature has a sign-stable top-vs-bottom gap)") - for feat in stable["feature"]: - bk = quantile_buckets(df, feat, q=q, min_n=min_n) - add("") - add(f" · {feat} (mode={bk.attrs['mode']}, n={bk.attrs['n']}, " - f"gap_h1={_fmt(bk.attrs['gap_h1'])}, " - f"gap_h2={_fmt(bk.attrs['gap_h2'])})") - add(bk.to_string(index=False)) - bk.to_csv(os.path.join(out_dir, f"buckets_{feat}.csv"), index=False) - - # CSV artefacts - for name, t in tables.items(): - t.to_csv(os.path.join(out_dir, f"groups_{name}.csv")) - scr.to_csv(os.path.join(out_dir, "feature_screen.csv"), index=False) - equity_curve(df).to_csv(os.path.join(out_dir, "equity.csv"), index=False) - all_buckets = [] - for c in feats: - bk = quantile_buckets(df, c, q=q, min_n=min_n) - if bk.empty: - continue - bk = bk.copy() - bk.insert(0, "feature", c) - all_buckets.append(bk) - if all_buckets: - pd.concat(all_buckets, ignore_index=True).to_csv( - os.path.join(out_dir, "buckets.csv"), index=False) - return "\n".join(lines) - - -def main() -> None: - ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) - ap.add_argument("--book", required=True) - ap.add_argument("--bar-minutes", type=int, required=True) - ap.add_argument("--split", default="median", - help="'median' (default) or YYYY-MM-DD") - ap.add_argument("--parquet-4h", default=None) - ap.add_argument("--parquet-1d", default=None) - ap.add_argument("--q", type=int, default=5) - ap.add_argument("--min-n", type=int, default=10) - ap.add_argument("--out", default="backtest/research/book_report_out") - args = ap.parse_args() - - os.makedirs(args.out, exist_ok=True) - df = load_book(args.book, args.bar_minutes, args.split) - if args.parquet_4h or args.parquet_1d: - df = add_htf_extension(df, args.parquet_4h, args.parquet_1d) - text = build_report(df, args.book, args.bar_minutes, args.split, - args.out, q=args.q, min_n=args.min_n) - print(text) - with open(os.path.join(args.out, "report.txt"), "w") as fh: - fh.write(text + "\n") - print(f"\n[written] {os.path.join(args.out, 'report.txt')}") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/burst_indicator_map.py b/backtest/research/burst_indicator_map.py deleted file mode 100644 index 0450ee7..0000000 --- a/backtest/research/burst_indicator_map.py +++ /dev/null @@ -1,121 +0,0 @@ -"""What do the system's OWN indicators read right before a violent bar? Analysis tooling only. - -Uses backtest.gpu_backtest.precompute_indicators (the same series the backtester feeds the -engine) on 3 years of bars; every state is taken at t-1 (known before the bar). Reports burst -rate (range >= 3x prior ATR14) for the NEXT bar and within the NEXT HOUR by indicator state, -by regime, by volatility regime, by weekday x hour, day of month, calendar proximity — each in -both halves — and whether the state predicts the burst's DIRECTION. - - python backtest/research/burst_indicator_map.py PARQUET BAR_MINUTES [--start --end] -""" -import argparse, sys -from pathlib import Path -import numpy as np, pandas as pd -ROOT = Path(__file__).resolve().parents[2]; sys.path.insert(0, str(ROOT)); sys.path.insert(0, str(ROOT / "backtest")) -from gpu_backtest import precompute_indicators -from config import TechnicalConfig - -CAL = ROOT / "backtest" / "cache" / "calendar.parquet" - - -def wilder_atr(df, period=14): - pc = df["Close"].shift(1) - tr = pd.concat([df["High"] - df["Low"], (df["High"] - pc).abs(), (df["Low"] - pc).abs()], axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def rate_table(d, col, target, half, order=None): - base1 = d.loc[half == 1, target].mean(); base2 = d.loc[half == 2, target].mean() - g = d.groupby(col, observed=True) - out = pd.DataFrame({"n": g.size(), - "h1_lift": d[half == 1].groupby(col, observed=True)[target].mean() / base1, - "h2_lift": d[half == 2].groupby(col, observed=True)[target].mean() / base2, - "rate%": 100 * g[target].mean()}) - if order is not None: out = out.reindex([o for o in order if o in out.index]) - out["stable"] = np.where((out.h1_lift > 1.15) & (out.h2_lift > 1.15), "HIGH", np.where((out.h1_lift < 0.85) & (out.h2_lift < 0.85), "low", "")) - return out.round(2) - - -def main(): - ap = argparse.ArgumentParser(); ap.add_argument("parquet"); ap.add_argument("bar_minutes", type=int) - ap.add_argument("--start", default="2023-09-05"); ap.add_argument("--end", default="2026-09-05") - a = ap.parse_args(); bm = a.bar_minutes - px = pd.read_parquet(a.parquet) - px = px[(px.index >= pd.Timestamp(a.start, tz="UTC") - pd.Timedelta(days=30)) & (px.index < pd.Timestamp(a.end, tz="UTC"))] - ic = precompute_indicators(px, TechnicalConfig()) - d = pd.DataFrame(index=px.index) - atr_prev = wilder_atr(px).shift(1) - rng = px["High"] - px["Low"] - d["burst"] = (rng >= 3.0 * atr_prev).astype(int) - H = max(1, 60 // bm) - d["next_hour"] = d["burst"][::-1].rolling(H, min_periods=1).max()[::-1].astype(int) - d["next_bar"] = d["burst"] - d["bdir"] = np.sign(px["Close"] - px["Open"]) - # states at t-1 - sh = lambda arr: pd.Series(np.asarray(arr, dtype=float), index=px.index).shift(1) - rsi = sh(ic.rsi); adx = sh(ic.adx); adxs = sh(ic.adx_slope); hist = sh(ic.macd_hist); bbp = sh(ic.bb_position) - bbw = sh(ic.bb_band_width); bbaw = sh(ic.bb_avg_width); kcsq = sh(ic.kc_squeeze); roc = sh(ic.roc) - ef, em, es = sh(ic.ema_fast), sh(ic.ema_medium), sh(ic.ema_slow); et = sh(ic.ema_trend) if ic.ema_trend is not None else None - close1 = px["Close"].shift(1); atr1 = sh(ic.atr) - kcu, kcl = sh(ic.kc_upper), sh(ic.kc_lower) - d["rsi"] = pd.cut(rsi, [0, 30, 40, 50, 60, 70, 100], labels=["<30", "30-40", "40-50", "50-60", "60-70", ">=70"]) - d["adx"] = pd.cut(adx, [0, 20, 25, 35, 50, 200], labels=["<20", "20-25", "25-35", "35-50", ">=50"]) - d["adx_slope"] = pd.cut(adxs, [-1e9, -3, 0, 3, 1e9], labels=["falling<-3", "-3..0", "0..3", "rising>3"]) - hist_prev = hist.shift(1) - d["macd"] = np.select([(hist > 0) & (hist > hist_prev), (hist > 0), (hist < 0) & (hist < hist_prev), (hist < 0)], - ["pos&rising", "pos&fading", "neg&falling", "neg&fading"], default="flat") - d["bb_pos"] = pd.cut(bbp, [-1e9, 0, 0.2, 0.8, 1.0, 1e9], labels=["<0 (below)", "0-0.2", "0.2-0.8", "0.8-1", ">1 (above)"]) - d["bb_squeeze"] = np.where(bbw < 0.75 * bbaw, "squeeze", "normal") - d["kc_squeeze"] = np.where(kcsq > 0, "TTM squeeze", "no") - d["kc_pos"] = np.select([close1 > kcu, close1 < kcl], ["above KC", "below KC"], default="inside") - align = np.sign(close1 - ef) + np.sign(ef - em) + np.sign(em - es) + (np.sign(es - et) if et is not None else 0) - d["ema_align"] = pd.cut(align, [-5, -3.5, -0.5, 0.5, 3.5, 5], labels=["fully bear(-4)", "mostly bear", "mixed", "mostly bull", "fully bull(+4)"]) - ribbon = (pd.concat([ef, em, es], axis=1).max(axis=1) - pd.concat([ef, em, es], axis=1).min(axis=1)) / atr1 - d["ribbon"] = np.where(ribbon < 1.0, "compressed(<1 ATR)", "expanded") - ema_dir = np.where(align > 0, 1, np.where(align < 0, -1, 0)) - d["regime"] = np.select([(adx >= 25) & (ema_dir > 0), (adx >= 25) & (ema_dir < 0), adx >= 25, adxs > 3.0], - ["trending_up", "trending_down", "trending(mixed)", "transitioning"], default="ranging") - atr_pct = atr1.rolling(50).apply(lambda w: (w[-1] > w).mean() * 100, raw=True) - d["vol_regime"] = pd.cut(atr_pct, [-1, 30, 60, 80, 101], labels=["low", "normal", "high", "extreme"]) - d["roc"] = pd.cut(roc, [-1e9, -1, -0.3, 0.3, 1, 1e9], labels=["<-1%", "-1..-0.3", "-0.3..0.3", "0.3..1", ">1%"]) - d["ema200_dist"] = pd.cut((close1 - et) / et * 100 if et is not None else pd.Series(np.nan, index=px.index), - [-1e9, -2.5, -0.5, 0.5, 2.5, 1e9], labels=["<-2.5%", "-2.5..-0.5", "near(±0.5%)", "0.5..2.5", ">2.5%"]) - # time - ct = px.index + pd.Timedelta(minutes=bm) - d["hour"] = ct.hour; d["weekday"] = ct.weekday; d["dom"] = pd.cut(ct.day, [0, 5, 10, 15, 20, 25, 31], labels=["1-5", "6-10", "11-15", "16-20", "21-25", "26-31"]) - d["first_friday"] = np.where((ct.weekday == 4) & (ct.day <= 7), "first Friday", "other") - # calendar proximity (high-impact USD) - cal = pd.read_parquet(CAL); cal["ts"] = pd.to_datetime(cal.dateline, unit="s", utc=True) - hi = np.sort(cal[(cal.currency == "USD") & (cal.impactName.str.lower() == "high")].ts.values.astype("datetime64[ns]")) - t = ct.values.astype("datetime64[ns]") - nxt = np.searchsorted(hi, t) # next event at/after bar close - mins_to = np.where(nxt < len(hi), (hi[np.minimum(nxt, len(hi) - 1)] - t) / np.timedelta64(1, "m"), 1e9) - prv = nxt - 1 - mins_since = np.where(prv >= 0, (t - hi[np.maximum(prv, 0)]) / np.timedelta64(1, "m"), 1e9) - d["calendar"] = np.select([mins_since <= 30, mins_to <= 15, mins_to <= 60, mins_to <= 180], ["0-30m AFTER hi-impact", "next 15m", "15-60m ahead", "1-3h ahead"], default="none within 3h") - d = d[d.index >= pd.Timestamp(a.start, tz="UTC")].dropna(subset=["rsi", "adx", "bb_pos", "vol_regime"]) - half = pd.Series(np.where(np.arange(len(d)) < len(d) // 2, 1, 2), index=d.index) - print(f"bars {len(d)} base next_bar {100*d.next_bar.mean():.3f}% next_hour {100*d.next_hour.mean():.2f}% (lift = rate / base; 'HIGH' = >1.15x in BOTH halves, 'low' = <0.85x in both)") - groups = ["calendar", "regime", "vol_regime", "rsi", "adx", "adx_slope", "macd", "bb_pos", "bb_squeeze", "kc_squeeze", "kc_pos", "ema_align", "ribbon", "roc", "ema200_dist", "dom", "first_friday"] - for target in ("next_bar", "next_hour"): - print(f"\n################ TARGET: {target} ################") - for g in groups: - print(f"-- {g}"); print(rate_table(d, g, target, half).to_string()) - # weekday x hour top cells (next_bar) - piv = d.pivot_table(index="weekday", columns="hour", values="next_bar", aggfunc="mean") * 100 - base = 100 * d.next_bar.mean() - cells = piv.stack().sort_values(ascending=False) - print(f"\n################ TOP 15 weekday x close-hour cells (next-bar burst pct, base {base:.2f}) ################") - names = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 6: "Sun"} - for (wd, h), v in cells.head(15).items(): - n = int(((d.weekday == wd) & (d.hour == h)).sum()) - print(f" {names.get(wd, wd)} {h:02d}:xx {v:.2f}% ({v/base:.1f}x, n={n})") - # direction: does the state predict the burst direction? - b = d[d.burst == 1] - print("\n################ BURST DIRECTION vs prior state (share of bursts going UP) ################") - for g, up_states in (("ema_align", None), ("rsi", None), ("macd", None), ("regime", None)): - print(f"-- {g}: " + ", ".join(f"{k}: {100*(v>0).mean():.0f}% up (n={len(v)})" for k, v in b.groupby(g, observed=True).bdir if len(v) >= 20)) - - -if __name__ == "__main__": - main() diff --git a/backtest/research/burst_map.py b/backtest/research/burst_map.py deleted file mode 100644 index a665d2a..0000000 --- a/backtest/research/burst_map.py +++ /dev/null @@ -1,444 +0,0 @@ -"""Where and when gold moves violently — burst map of the raw bars. - -Usage: - python backtest/research/burst_map.py --parquet PATH --bar-minutes N \ - [--k 3,4,5] [--book BOOK.csv] [--within-bars 12] \ - [--start YYYY-MM-DD --end YYYY-MM-DD] [--out DIR] - -A "burst" is one bar whose range is >= K x the PRIOR bar's Wilder ATR(14) — -the same definition every burst study in this folder has used (spelled -out here bar-for-bar: TR = max(H-L, |H-Cprev|, |L-Cprev|), ATR = -TR.ewm(alpha=1/14, min_periods=14, adjust=False).mean(), ratio = -(H-L) / ATR.shift(1)). - -Reports: - * burst frequency by (weekday, UTC bar-CLOSE hour), plus mean |1 h| and - |4 h| absolute moves in $ and in ATR units on the same grid; - * post-burst drift in the burst's own direction over 6/12/24/48 bars, - overall and by session bucket — does a violent bar continue or snap back; - * the largest trailing-60-minute close-to-close moves, de-overlapped; - * if a trade book is given: how trades that were decided just after a burst, - or that were OPEN when one printed, performed against the rest. - -Every ATR-unit number here is normalised by the PRIOR bar's ATR — the same -denominator as the burst test, so a "4x burst that ran another 4 ATR" reads -directly. All hours are UTC and are the bar's CLOSE hour (label + one bar), -matching the clock the live gates evaluate. - -Analysis tooling only — never imported by the live code. -""" -from __future__ import annotations - -import argparse -import math -import os - -import numpy as np -import pandas as pd - -try: # package import (backtest.research.burst_map) - from backtest.research.book_report import base_metrics, load_book, session_of -except ImportError: # run directly as a script from anywhere - from book_report import base_metrics, load_book, session_of - -SLOT_UNKNOWN = "" - - -# ─────────────────────────── bar primitives ───────────────────────── - -def load_bars(parquet: str, start: str | None = None, - end: str | None = None) -> pd.DataFrame: - """Read a cached OHLCV parquet, de-duplicated and oldest-first.""" - df = pd.read_parquet(parquet).sort_index() - df = df[~df.index.duplicated(keep="last")] - if start: - df = df[df.index >= pd.Timestamp(start, tz="UTC")] - if end: - df = df[df.index <= pd.Timestamp(end, tz="UTC")] - return df - - -def wilder_atr(df: pd.DataFrame, period: int = 14) -> pd.Series: - """Wilder ATR (the definition every burst study in this folder uses).""" - h, l, c = df["High"], df["Low"], df["Close"] - tr = pd.concat([h - l, (h - c.shift()).abs(), (l - c.shift()).abs()], - axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def burst_ratio(df: pd.DataFrame, period: int = 14) -> pd.Series: - """Bar range expressed in PRIOR-bar ATRs.""" - return (df["High"] - df["Low"]) / wilder_atr(df, period).shift(1) - - -def burst_flags(df: pd.DataFrame, k: float, period: int = 14) -> pd.Series: - """True where the bar's range is >= k x the prior bar's Wilder ATR(14).""" - return (burst_ratio(df, period) >= k).fillna(False) - - -def burst_dir(df: pd.DataFrame) -> pd.Series: - """+1 up bar, −1 down bar, 0 doji (sign of Close − Open).""" - return np.sign(df["Close"] - df["Open"]).astype(float) - - -def close_times(df: pd.DataFrame, bar_minutes: int) -> pd.DatetimeIndex: - """Bar CLOSE timestamps (the parquet index labels bar OPEN time).""" - return df.index + pd.Timedelta(minutes=bar_minutes) - - -# ───────────────────── when does gold move? tables ────────────────── - -def hour_weekday_table(df: pd.DataFrame, k: float, bar_minutes: int = 5, - ks: tuple[float, ...] | None = None) -> dict: - """Burst frequency and absolute-move size on a (weekday, close-hour) grid. - - Returns a dict of DataFrames (several tables are wanted, one frame each): - burst_pct : weekday rows x close-hour cols, % of bars that are >= k x - bursts (one frame; per-k frames live in `burst_pct_by_k`) - absmove : (weekday, close-hour) rows; bars, mean |1 h move| and - |4 h move| in $ and in prior-bar ATR units - by_hour : the same stats collapsed to close-hour - by_weekday : the same stats collapsed to weekday - """ - ks = tuple(ks) if ks else (k,) - ct = close_times(df, bar_minutes) - hour = pd.Series(ct.hour, index=df.index) - wd = pd.Series(ct.weekday, index=df.index) - atr_prev = wilder_atr(df).shift(1) - - per_hour = max(1, int(round(60 / bar_minutes))) - c = df["Close"] - mv1 = (c - c.shift(per_hour)).abs() - mv4 = (c - c.shift(4 * per_hour)).abs() - stats = pd.DataFrame({ - "weekday": wd, "hour": hour, - "abs1h_usd": mv1, "abs4h_usd": mv4, - "abs1h_atr": mv1 / atr_prev, "abs4h_atr": mv4 / atr_prev, - }) - for kk in ks: - stats[f"burst_{kk:g}x"] = burst_flags(df, kk).astype(float) * 100.0 - - agg = {"abs1h_usd": "mean", "abs4h_usd": "mean", - "abs1h_atr": "mean", "abs4h_atr": "mean"} - agg.update({f"burst_{kk:g}x": "mean" for kk in ks}) - - grid = stats.groupby(["weekday", "hour"]).agg(agg) - grid.insert(0, "bars", stats.groupby(["weekday", "hour"]).size()) - by_hour = stats.groupby("hour").agg(agg) - by_hour.insert(0, "bars", stats.groupby("hour").size()) - by_wd = stats.groupby("weekday").agg(agg) - by_wd.insert(0, "bars", stats.groupby("weekday").size()) - - pct_by_k = {kk: grid[f"burst_{kk:g}x"].unstack("hour") for kk in ks} - return { - "burst_pct": pct_by_k[k if k in pct_by_k else ks[0]].round(3), - "burst_pct_by_k": {kk: v.round(3) for kk, v in pct_by_k.items()}, - "absmove": grid.round(3), - "by_hour": by_hour.round(3), - "by_weekday": by_wd.round(3), - } - - -def post_burst_drift(df: pd.DataFrame, k: float, - horizons: tuple[int, ...] = (6, 12, 24, 48), - bar_minutes: int = 5) -> pd.DataFrame: - """Signed drift IN the burst's direction over the next h bars, in ATRs. - - A positive mean means violent bars continue; negative means they snap - back. Split by the session bucket of the burst bar's close hour. - """ - flags = burst_flags(df, k) - d = burst_dir(df) - atr_prev = wilder_atr(df).shift(1) - ct = close_times(df, bar_minutes) - bucket = pd.Series([session_of(h) for h in ct.hour], index=df.index) - c = df["Close"] - - rows = [] - for h in horizons: - fwd = (c.shift(-h) - c) * d / atr_prev - sub = fwd[flags].dropna() - buckets = bucket[flags].reindex(sub.index) - rows.append({"horizon_bars": h, "bucket": "ALL", "n": int(len(sub)), - "mean_atr": round(float(sub.mean()), 4) if len(sub) else float("nan"), - "median_atr": round(float(sub.median()), 4) if len(sub) else float("nan"), - "pct_positive": round(float((sub > 0).mean() * 100), 2) if len(sub) else float("nan")}) - for b, s in sub.groupby(buckets): - rows.append({"horizon_bars": h, "bucket": b, "n": int(len(s)), - "mean_atr": round(float(s.mean()), 4), - "median_atr": round(float(s.median()), 4), - "pct_positive": round(float((s > 0).mean() * 100), 2)}) - return pd.DataFrame(rows) - - -def slot_label(weekday: int, hour: int, day: int) -> str: - """Time-slot label for a big move. - - NOTE: there is no economic-calendar file in this repo, so these are - TIME SLOTS, not confirmed events — "payroll window" means "the clock - slot US payrolls normally print in", nothing more. - """ - if weekday == 4 and day <= 7 and hour in (12, 13): - return "first-Friday 12:30 slot (payroll-report window)" - if weekday == 2 and hour in (18, 19): - return "Wednesday 18:00 slot (central-bank window)" - if hour in (12, 13): - return "12:30 slot (US data window)" - if hour == 14: - return "14:00 slot" - if hour in (21, 22, 23): - return "settlement/after-hours" - if hour in (0, 1, 2): - return "Asia open" - return SLOT_UNKNOWN - - -def largest_moves(df: pd.DataFrame, n: int = 40, window_minutes: int = 60, - bar_minutes: int = 5) -> pd.DataFrame: - """The n biggest trailing-`window_minutes` close-to-close moves. - - Overlapping windows are de-duplicated greedily: the largest move wins and - anything whose close time is within +/- `window_minutes` of an already - kept move is dropped, so one violent hour contributes one row. - """ - bars = max(1, int(round(window_minutes / bar_minutes))) - c = df["Close"] - move = c - c.shift(bars) - atr_prev = wilder_atr(df).shift(1) - ct = close_times(df, bar_minutes) - tbl = pd.DataFrame({ - "close_time": ct, "move_usd": move.to_numpy(), - "move_atr": (move / atr_prev).to_numpy(), - }).dropna() - tbl["abs_usd"] = tbl["move_usd"].abs() - tbl = tbl.sort_values("abs_usd", ascending=False) - - keep, taken = [], [] - gap = pd.Timedelta(minutes=window_minutes) - for _, row in tbl.iterrows(): - t = row["close_time"] - if any(abs(t - u) <= gap for u in taken): - continue - taken.append(t) - keep.append(row) - if len(keep) >= n: - break - out = pd.DataFrame(keep).reset_index(drop=True) - if out.empty: - return out - out["weekday"] = out["close_time"].dt.weekday - out["hour"] = out["close_time"].dt.hour - out["direction"] = np.where(out["move_usd"] > 0, "UP", "DOWN") - out["slot"] = [slot_label(w, h, t.day) for w, h, t - in zip(out["weekday"], out["hour"], out["close_time"])] - out["move_usd"] = out["move_usd"].round(2) - out["move_atr"] = out["move_atr"].round(2) - return out[["close_time", "weekday", "hour", "direction", "move_usd", - "move_atr", "slot"]] - - -# ───────────────────────── book <-> burst join ────────────────────── - -def _stats(r: pd.Series) -> dict: - m = base_metrics(r) - return {"n": m["n"], "total_r": round(m["total_r"], 2), - "mean_r": round(m["mean_r"], 3), "wr": round(m["wr"], 2), - "pf": round(m["pf"], 2) if math.isfinite(m["pf"]) else float("inf")} - - -def join_book_to_bursts(book_df: pd.DataFrame, bars: pd.DataFrame, k: float, - within_bars: int = 12, - bar_minutes: int = 5) -> dict: - """Split a trade book by its relationship to burst bars. - - (a) `after_burst` : decision_time falls within `within_bars` bars after - the most recent burst's close (bar distance is counted POSITIONALLY on - the bar index, so weekend gaps cannot inflate it). - (b) `burst_during` : at least one burst closed inside [entry, exit). - (c) `burst_agrees` / `burst_opposes`: of (b), whether the FIRST burst that - printed during the trade pushed with or against the trade direction. - """ - ct = close_times(bars, bar_minutes) - ct_arr = ct.to_numpy() - flags = burst_flags(bars, k).to_numpy() - bdir = burst_dir(bars).to_numpy() - burst_pos = np.flatnonzero(flags) - - # Last burst position at or before each bar (−1 where none yet). - last_burst = np.where(flags, np.arange(len(flags)), -1) - last_burst = np.maximum.accumulate(last_burst) - - dec = book_df["decision_time"].astype("datetime64[ns, UTC]").to_numpy() - ent = book_df["entry_time"].astype("datetime64[ns, UTC]").to_numpy() - exi = book_df["exit_time"].astype("datetime64[ns, UTC]").to_numpy() - - # Position of the last bar that had CLOSED by decision_time. - idx = np.searchsorted(ct_arr, dec, side="right") - 1 - valid = idx >= 0 - lb = np.where(valid, last_burst[np.clip(idx, 0, len(flags) - 1)], -1) - bars_since = np.where((lb >= 0) & valid, idx - lb, np.iinfo(np.int32).max) - after = pd.Series((bars_since >= 0) & (bars_since <= within_bars), - index=book_df.index) - - # Bursts printing inside the open trade. - bct = ct_arr[burst_pos] if len(burst_pos) else np.array([], dtype=ct_arr.dtype) - lo = np.searchsorted(bct, ent, side="left") - hi = np.searchsorted(bct, exi, side="left") - during = pd.Series(hi > lo, index=book_df.index) - trade_sign = np.where( - book_df["direction"].astype(str).str.upper().str.startswith("B"), - 1.0, -1.0) - has = hi > lo - first_dir = np.zeros(len(book_df), dtype=float) - if len(burst_pos) and has.any(): - # hi > lo guarantees lo[has] indexes a real burst. - first_dir[has] = bdir[burst_pos[lo[has]]] - agrees = pd.Series(has & (first_dir * trade_sign > 0), - index=book_df.index) - opposes = pd.Series(has & (first_dir * trade_sign < 0), - index=book_df.index) - - r = book_df["r_multiple"] - out = { - "k": k, "within_bars": within_bars, - "bursts_in_window": int(len(burst_pos)), - "after_burst": _stats(r[after]), - "not_after_burst": _stats(r[~after]), - "burst_during": _stats(r[during]), - "no_burst_during": _stats(r[~during]), - "burst_agrees": _stats(r[agrees]), - "burst_opposes": _stats(r[opposes]), - "median_bars_since_burst": float(np.median( - bars_since[bars_since < np.iinfo(np.int32).max])) if ( - bars_since < np.iinfo(np.int32).max).any() else float("nan"), - } - return out - - -# ──────────────────────────── reporting ───────────────────────────── - -def _fmt_stats(name: str, s: dict) -> str: - pf = "inf" if math.isinf(s["pf"]) else f"{s['pf']:.2f}" - return (f" {name:<18} n={s['n']:<5} totalR={s['total_r']:>8.2f} " - f"meanR={s['mean_r']:>7.3f} WR={s['wr']:>6.2f}% PF={pf}") - - -def main() -> None: - ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) - ap.add_argument("--parquet", required=True) - ap.add_argument("--bar-minutes", type=int, required=True) - ap.add_argument("--k", default="3,4,5", - help="burst thresholds in prior-bar ATRs (default 3,4,5)") - ap.add_argument("--book", default=None) - ap.add_argument("--book-bar-minutes", type=int, default=None, - help="bar minutes of the BOOK (default: --bar-minutes)") - ap.add_argument("--within-bars", type=int, default=12) - ap.add_argument("--start", default=None) - ap.add_argument("--end", default=None) - ap.add_argument("--n-moves", type=int, default=40) - ap.add_argument("--out", default="backtest/research/burst_map_out") - args = ap.parse_args() - - ks = [float(x) for x in args.k.split(",") if x.strip()] - os.makedirs(args.out, exist_ok=True) - bars = load_bars(args.parquet, args.start, args.end) - bm = args.bar_minutes - primary = ks[0] - - lines: list[str] = [] - add = lines.append - add("=" * 78) - add(f"BURST MAP {os.path.basename(args.parquet)}") - add("=" * 78) - add(f"bars : {len(bars)} ({bars.index[0]} -> {bars.index[-1]}" - f", labels = bar OPEN time)") - add(f"bar minutes : {bm} hours below are bar CLOSE hours (UTC)") - add(f"burst definition : range >= K x PRIOR bar Wilder ATR(14); " - f"K = {', '.join(f'{k:g}' for k in ks)}") - add("ATR units : always normalised by the PRIOR bar's ATR") - for k in ks: - f = burst_flags(bars, k) - add(f" K={k:g}: {int(f.sum())} burst bars " - f"({float(f.mean()) * 100:.3f}% of bars)") - - tabs = hour_weekday_table(bars, primary, bm, ks=tuple(ks)) - add("") - add(f"── BURST % BY (weekday, close-hour), K={primary:g} ──") - add(tabs["burst_pct"].fillna(0).round(2).to_string()) - add("") - add("── MEAN ABSOLUTE MOVE BY CLOSE-HOUR (all weekdays) ──") - add(tabs["by_hour"].to_string()) - add("") - add("── MEAN ABSOLUTE MOVE BY WEEKDAY ──") - add(tabs["by_weekday"].to_string()) - - add("") - add(f"── POST-BURST DRIFT (in the burst's own direction), K={primary:g} ──") - drift = post_burst_drift(bars, primary, bar_minutes=bm) - add(drift.to_string(index=False)) - - add("") - add(f"── LARGEST {args.n_moves} TRAILING-60-MIN MOVES (de-overlapped) ──") - add(" slot labels are CLOCK SLOTS — no economic calendar exists in " - "this repo, so no event is confirmed.") - moves = largest_moves(bars, n=args.n_moves, bar_minutes=bm) - add(moves.to_string(index=False)) - - join_rows = [] - if args.book: - bbm = args.book_bar_minutes or bm - book = load_book(args.book, bbm) - add("") - add(f"── BOOK JOIN {os.path.basename(args.book)} " - f"({len(book)} trades, book bar = {bbm} min) ──") - first, last = close_times(bars, bm)[0], close_times(bars, bm)[-1] - outside = int(((book["decision_time"] < first) - | (book["exit_time"] > last)).sum()) - if outside: - add(f" !! {outside} trade(s) start before / end after the bar " - f"window ({first} .. {last}) — their burst context is " - f"partial. Widen --start/--end or use a longer parquet.") - add(" CAUTION: group (b) is survivorship-shaped — a trade only sees " - "a burst if it survived long enough to still be open, so its high " - "PF is mostly 'winners last longer', not a burst edge.") - for k in ks: - j = join_book_to_bursts(book, bars, k, args.within_bars, bm) - add(f" K={k:g} ({j['bursts_in_window']} bursts in window; " - f"median bars since last burst = " - f"{j['median_bars_since_burst']:.0f})") - add(f" (a) decided within {args.within_bars} bars of a burst") - add(_fmt_stats("after_burst", j["after_burst"])) - add(_fmt_stats("not_after_burst", j["not_after_burst"])) - add(" (b) a burst printed while the trade was open") - add(_fmt_stats("burst_during", j["burst_during"])) - add(_fmt_stats("no_burst_during", j["no_burst_during"])) - add(" (c) of (b), first burst vs the trade's direction") - add(_fmt_stats("burst_agrees", j["burst_agrees"])) - add(_fmt_stats("burst_opposes", j["burst_opposes"])) - for grp in ("after_burst", "not_after_burst", "burst_during", - "no_burst_during", "burst_agrees", "burst_opposes"): - join_rows.append({"k": k, "group": grp, - "within_bars": args.within_bars, - **j[grp]}) - - text = "\n".join(lines) - print(text) - with open(os.path.join(args.out, "burst_map.txt"), "w") as fh: - fh.write(text + "\n") - pd.concat([v.assign(k=kk) for kk, v in tabs["burst_pct_by_k"].items()] - ).to_csv(os.path.join(args.out, "hour_weekday_burst_pct.csv")) - tabs["absmove"].to_csv(os.path.join(args.out, "hour_weekday_absmove.csv")) - tabs["by_hour"].to_csv(os.path.join(args.out, "by_hour.csv")) - tabs["by_weekday"].to_csv(os.path.join(args.out, "by_weekday.csv")) - pd.concat([post_burst_drift(bars, k, bar_minutes=bm).assign(k=k) - for k in ks]).to_csv( - os.path.join(args.out, "post_burst_drift.csv"), index=False) - moves.to_csv(os.path.join(args.out, "largest_moves.csv"), index=False) - if join_rows: - pd.DataFrame(join_rows).to_csv( - os.path.join(args.out, "book_join.csv"), index=False) - print(f"\n[written] {os.path.join(args.out, 'burst_map.txt')}") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/burst_precursors.py b/backtest/research/burst_precursors.py deleted file mode 100644 index 2669077..0000000 --- a/backtest/research/burst_precursors.py +++ /dev/null @@ -1,127 +0,0 @@ -"""Are there signs BEFORE a violent bar? Analysis tooling only — never imported by the live code. - -For every bar t, features are computed from bars <= t-1 only. Targets: - next_bar : bar t itself is a burst (range >= K x prior Wilder ATR14) - next_hour : any burst in bars t .. t+H-1 -Reports per-quintile burst rates (lift vs base rate) in both halves, the same -within/outside the scheduled-data hours, and an out-of-sample logistic model -(fit on half 1, scored on half 2): AUC + lift in the top 5% of scores. - - python backtest/research/burst_precursors.py PARQUET BAR_MINUTES [--k 3] [--start ... --end ...] -""" -import argparse -import numpy as np, pandas as pd - - -def wilder_atr(df, period=14): - pc = df["Close"].shift(1) - tr = pd.concat([df["High"] - df["Low"], (df["High"] - pc).abs(), (df["Low"] - pc).abs()], axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def build(df, bar_minutes, k): - d = df.copy() - rng = d["High"] - d["Low"] - atr_prev = wilder_atr(d).shift(1) # ATR known at t-1 - d["burst"] = (rng >= k * atr_prev).astype(int) - H = max(1, 60 // bar_minutes) - # burst within next H bars (t..t+H-1) - d["next_hour"] = d["burst"][::-1].rolling(H, min_periods=1).max()[::-1].astype(int) - d["next_bar"] = d["burst"] - close_t = d.index + pd.Timedelta(minutes=bar_minutes) - d["hour"] = close_t.hour - r1 = rng.shift(1) - d["squeeze6"] = r1.rolling(6).mean() / atr_prev - d["squeeze12"] = r1.rolling(12).mean() / atr_prev - d["last_bar_range"] = r1 / atr_prev - sma = d["Close"].shift(1).rolling(20).mean(); sd = d["Close"].shift(1).rolling(20).std(ddof=0) - bbw = (4 * sd / sma) - d["bbw_pct500"] = bbw.rolling(500).rank(pct=True) - v1 = d["Volume"].shift(1) - d["vol_ratio"] = v1.rolling(3).mean() / v1.rolling(50).mean() - d["drift12"] = (d["Close"].shift(1) - d["Close"].shift(13)).abs() / atr_prev - d["atr_pct500"] = atr_prev.rolling(500).rank(pct=True) - b = d["burst"].shift(1).fillna(0).astype(int) - since = np.zeros(len(d)); cnt = 200 - bv = b.values - for i in range(len(d)): - cnt = 0 if bv[i] == 1 else min(200, cnt + 1) - since[i] = cnt - d["bars_since_burst"] = since - return d.dropna(subset=["squeeze6", "squeeze12", "bbw_pct500", "vol_ratio", "drift12", "atr_pct500"]) - - -FEATS = ["squeeze6", "squeeze12", "last_bar_range", "bbw_pct500", "vol_ratio", "drift12", "atr_pct500", "bars_since_burst"] - - -def quintile_table(d, feat, target, half): - q = pd.qcut(d[feat], 5, labels=False, duplicates="drop") - base1 = d.loc[half == 1, target].mean(); base2 = d.loc[half == 2, target].mean() - rows = [] - for b in sorted(q.dropna().unique()): - m = q == b - lo, hi = d.loc[m, feat].min(), d.loc[m, feat].max() - r1 = d.loc[m & (half == 1), target].mean(); r2 = d.loc[m & (half == 2), target].mean() - rows.append((int(b), lo, hi, int(m.sum()), 100 * r1, r1 / base1, 100 * r2, r2 / base2)) - t = pd.DataFrame(rows, columns=["bin", "lo", "hi", "n", "h1_rate%", "h1_lift", "h2_rate%", "h2_lift"]) - return t.round(3) - - -def main(): - ap = argparse.ArgumentParser(); ap.add_argument("parquet"); ap.add_argument("bar_minutes", type=int) - ap.add_argument("--k", type=float, default=3.0); ap.add_argument("--start"); ap.add_argument("--end") - a = ap.parse_args() - df = pd.read_parquet(a.parquet) - if a.start: df = df[df.index >= pd.Timestamp(a.start, tz="UTC")] - if a.end: df = df[df.index < pd.Timestamp(a.end, tz="UTC")] - d = build(df, a.bar_minutes, a.k) - half = pd.Series(np.where(np.arange(len(d)) < len(d) // 2, 1, 2), index=d.index) - print(f"bars {len(d)} K={a.k} base rate next_bar {100*d.next_bar.mean():.3f}% next_hour {100*d.next_hour.mean():.2f}%") - print(f"half 1 ends {d.index[len(d)//2 - 1]}") - # 1. the clock - hr = d.groupby("hour")[["next_bar", "next_hour"]].mean() * 100 - hr["lift_next_bar"] = hr["next_bar"] / (100 * d.next_bar.mean()) - print("\n== THE CLOCK (bar-close hour UTC): burst rate % and lift ==") - print(hr.round(2).T.to_string()) - sched = d["hour"].isin([1, 12, 13]) - print(f"\nscheduled hours (01,12,13) hold {100*d.loc[sched,'next_bar'].sum()/d.next_bar.sum():.1f}% of bursts in {100*sched.mean():.1f}% of bars") - # 2. per-feature quintiles, both halves - for target in ("next_bar", "next_hour"): - print(f"\n== TARGET {target}: quintile burst rate (lift vs base) — ALL hours ==") - for f in FEATS: - t = quintile_table(d, f, target, half) - print(f"-- {f}: lifts h1 {list(t.h1_lift)} h2 {list(t.h2_lift)} (bins lo..hi {t.lo.iloc[0]:.2f}..{t.hi.iloc[-1]:.2f})") - # 3. same, OUTSIDE the scheduled hours (does anything predict the unscheduled ones?) - u = d[~sched]; hu = half[~sched] - print(f"\n== next_bar lifts OUTSIDE scheduled hours (base {100*u.next_bar.mean():.3f}%) ==") - for f in FEATS: - t = quintile_table(u, f, "next_bar", hu) - print(f"-- {f}: h1 {list(t.h1_lift)} h2 {list(t.h2_lift)}") - # 4. OOS logistic model: fit half 1, score half 2 - try: - from sklearn.linear_model import LogisticRegression - from sklearn.metrics import roc_auc_score - X = d[FEATS].copy() - for h in range(24): X[f"h{h}"] = (d["hour"] == h).astype(float) - Xc = d[FEATS].copy() # clock-free variant - for name, XX in (("features+clock", X), ("features only", Xc), ("clock only", X[[f"h{h}" for h in range(24)]])): - mu, sd = XX[half == 1].mean(), XX[half == 1].std().replace(0, 1) - Z = (XX - mu) / sd - for target in ("next_bar", "next_hour"): - m = LogisticRegression(C=0.1, max_iter=2000, class_weight="balanced").fit(Z[half == 1], d.loc[half == 1, target]) - p = m.predict_proba(Z[half == 2])[:, 1]; y = d.loc[half == 2, target] - auc = roc_auc_score(y, p) - top = p >= np.quantile(p, 0.95) - print(f"OOS {name:15s} {target:9s}: AUC {auc:.3f} | top-5% of scores: burst rate {100*y[top].mean():.2f}% vs base {100*y.mean():.2f}% (lift {y[top].mean()/y.mean():.2f}x), captures {100*y[top].sum()/y.sum():.1f}% of bursts") - except ImportError: - print("sklearn missing — OOS model skipped") - # 5. direction: does the burst continue the prior 12-bar drift? - bt = d[d.burst == 1] - prior = np.sign(bt["Close"].shift(1) - bt["Close"].shift(13)) if False else np.sign(d["Close"].shift(1) - d["Close"].shift(13))[d.burst == 1] - bdir = np.sign(bt["Close"] - bt["Open"]) - agree = (prior == bdir)[(prior != 0) & (bdir != 0)] - print(f"\nburst direction == prior-hour drift direction: {100*agree.mean():.1f}% of {len(agree)} bursts (50% = no information)") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/calendar_impact.py b/backtest/research/calendar_impact.py deleted file mode 100644 index 6ba339c..0000000 --- a/backtest/research/calendar_impact.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Do scheduled economic events move gold violently, and do they hurt OPEN trades? Analysis tooling only. - -Needs backtest/cache/calendar.parquet (ff_calendar_scraper.py). Uses USD events by impact. - python backtest/research/calendar_impact.py PARQUET_BARS BAR_MINUTES BOOK.csv ARM DIST [--start --end] -""" -import argparse, sys -from pathlib import Path -import numpy as np, pandas as pd -sys.path.insert(0, str(Path(__file__).resolve().parent)) -from open_trade_bursts import wilder_atr, simulate, r_of, stats, K - -CAL = Path(__file__).resolve().parent.parent / "cache" / "calendar.parquet" - - -def main(): - ap = argparse.ArgumentParser(); ap.add_argument("parquet"); ap.add_argument("bar_minutes", type=int) - ap.add_argument("book"); ap.add_argument("arm", type=float); ap.add_argument("dist", type=float) - ap.add_argument("--start", default="2023-09-05"); ap.add_argument("--end", default="2026-09-05") - a = ap.parse_args(); bm = a.bar_minutes - cal = pd.read_parquet(CAL) - cal["ts"] = pd.to_datetime(cal["dateline"], unit="s", utc=True) - cal = cal[(cal.ts >= pd.Timestamp(a.start, tz="UTC")) & (cal.ts < pd.Timestamp(a.end, tz="UTC"))] - usd = cal[cal.currency == "USD"].copy() - usd["impact"] = usd["impactName"].str.lower() - print(f"calendar: {len(cal)} events in window, USD {len(usd)}: " + ", ".join(f"{k}={v}" for k, v in usd.impact.value_counts().items())) - px = pd.read_parquet(a.parquet); px = px[(px.index >= pd.Timestamp(a.start, tz="UTC")) & (px.index < pd.Timestamp(a.end, tz="UTC"))] - atr_prev = wilder_atr(px).shift(1) - rng = px["High"] - px["Low"]; burst = (rng >= K * atr_prev).fillna(False) - close = px["Close"]; idx = px.index - H1 = 60 // bm - move60 = (close.shift(-H1) - close).abs() / atr_prev # |move| over the next hour from bar OPEN-ish (label) - move15 = (close.shift(-max(1, 15 // bm)) - close).abs() / atr_prev - burst60 = burst[::-1].rolling(H1, min_periods=1).max()[::-1].astype(bool) - # event -> bar containing it (label <= ts < label + bm) - def bar_pos(ts): - p = idx.searchsorted(ts, side="right") - 1 - return p if 0 <= p < len(idx) and (ts - idx[p]) < pd.Timedelta(minutes=bm) else -1 - usd["pos"] = [bar_pos(t) for t in usd.ts] - usd = usd[usd.pos >= 0] - usd["bar_range_atr"] = rng.values[usd.pos] / atr_prev.values[usd.pos] - usd["burst_in_60m"] = burst60.values[usd.pos] - usd["move60_atr"] = move60.values[usd.pos]; usd["move60_usd"] = (close.shift(-H1) - close).abs().values[usd.pos] - usd["move15_atr"] = move15.values[usd.pos] - # baseline: all bars, and bars in the same close-hours without any USD high/medium event within the hour - chour = (idx + pd.Timedelta(minutes=bm)).hour - ev_bars = set() - for p in usd[usd.impact.isin(["high", "medium"])].pos: ev_bars.update(range(max(0, p - H1), min(len(idx), p + H1))) - quiet = ~np.isin(np.arange(len(idx)), list(ev_bars)) - def base_row(mask, label): - return dict(group=label, n=int(mask.sum()), bar_range_atr=float((rng / atr_prev)[mask].mean()), burst_in_60m_pct=100 * float(burst60[mask].mean()), - move15_atr=float(move15[mask].mean()), move60_atr=float(move60[mask].mean()), move60_usd=float((close.shift(-H1) - close).abs()[mask].mean())) - rows = [base_row(np.ones(len(idx), bool), "ALL bars"), base_row(quiet & np.isin(chour, [12, 13, 14]), "12-14 UTC bars with NO USD event")] - for imp in ("high", "medium", "low"): - g = usd[usd.impact == imp] - rows.append(dict(group=f"USD {imp}-impact events", n=len(g), bar_range_atr=g.bar_range_atr.mean(), burst_in_60m_pct=100 * g.burst_in_60m.mean(), - move15_atr=g.move15_atr.mean(), move60_atr=g.move60_atr.mean(), move60_usd=g.move60_usd.mean())) - print("\n== HOW MUCH GOLD MOVES AROUND USD EVENTS (event bar = the bar containing the release) ==") - print(pd.DataFrame(rows).round(2).to_string(index=False)) - hi = usd[usd.impact == "high"] - top = hi.groupby("name").agg(n=("ts", "size"), bar_range_atr=("bar_range_atr", "mean"), burst60_pct=("burst_in_60m", lambda s: 100 * s.mean()), - move60_usd=("move60_usd", "mean"), move60_atr=("move60_atr", "mean")).sort_values("n", ascending=False) - print("\n== HIGH-IMPACT USD EVENTS BY NAME (n >= 6) ==") - print(top[top.n >= 6].round(2).to_string()) - # what share of ALL bursts sit within ±30 min of a high/medium USD event? - near = np.zeros(len(idx), bool) - for p in usd[usd.impact.isin(["high", "medium"])].pos: near[max(0, p - 30 // bm):min(len(idx), p + 30 // bm + 1)] = True - nearh = np.zeros(len(idx), bool) - for p in hi.pos: nearh[max(0, p - 30 // bm):min(len(idx), p + 30 // bm + 1)] = True - print(f"\nshare of ALL violent bars within ±30 min of a USD high-impact event: {100*burst[nearh].sum()/burst.sum():.1f}% (those bars are {100*nearh.mean():.1f}% of time)") - print(f"share within ±30 min of a USD high- or medium-impact event: {100*burst[near].sum()/burst.sum():.1f}% (bars {100*near.mean():.1f}% of time)") - # open trades through high-impact events - book = pd.read_csv(a.book); book["entry_time"] = pd.to_datetime(book.entry_time, utc=True, format="mixed") - bars = dict(O=px.Open.values, H=px.High.values, L=px.Low.values, C=px.Close.values, burst=burst.values, chour=chour.values) - pos = idx.get_indexer(book.entry_time); ok = pos >= 0; book = book[ok].reset_index(drop=True); pos = pos[ok] - ev_pos = np.sort(hi.pos.values) - # flat mask: exit at the open of the bar that CONTAINS a high-impact event... use the bar before (exit ~5-15 min before) - flat_mask = np.zeros(len(idx), bool); tight_mask = np.zeros(len(idx), bool) - for p in ev_pos: - if p - 1 >= 0: flat_mask[p - 1] = True - tight_mask[max(0, p - 1):min(len(idx), p + H1)] = True - res = {} - for v, kw in (("base", {}), ("mask_flat", dict(flat_mask=flat_mask)), ("mask_tight", dict(tight_mask=tight_mask))): - rs, fl, thru = [], [], [] - for i, t in book.iterrows(): - xp, held, reason, flag = simulate(bars, pos[i], t.direction, t.entry, t.sl, a.arm, a.dist, v, **kw) - rs.append(r_of(t.direction, t.entry, t.sl, xp)); fl.append(flag) - if v == "base": - j0, j1 = pos[i], pos[i] + held - k = ev_pos[(ev_pos > j0) & (ev_pos <= j1)] - thru.append(k[0] if len(k) else -1) - res[v] = (np.array(rs), np.array(fl)) - if v == "base": book["ev_pos"] = thru - base = res["base"][0]; half = np.where(np.arange(len(book)) < len(book) // 2, 1, 2) - hit = book.ev_pos.values >= 0 - print(f"\n== OPEN TRADES THAT HELD THROUGH A HIGH-IMPACT USD EVENT ({a.book.split('/')[-1]}) ==") - print(f"trades through an event: {hit.sum()} of {len(book)} ({100*hit.mean():.1f}%) | mean R {base[hit].mean():+.3f} vs {base[~hit].mean():+.3f} for the rest | WR {100*(base[hit]>0).mean():.0f}% vs {100*(base[~hit]>0).mean():.0f}%") - if hit.sum(): - d = np.where(book.direction == "BUY", 1.0, -1.0) - m15 = np.array([ (close.shift(-max(1,15//bm)).values[p] - close.values[p]) if p >= 0 else np.nan for p in book.ev_pos]) - with_ = hit & (d * m15 > 0); against = hit & (d * m15 < 0) - print(f" event's first 15-min move WITH the trade: n={with_.sum()} mean R {base[with_].mean():+.3f} | AGAINST: n={against.sum()} mean R {base[against].mean():+.3f} (WR {100*(base[against]>0).mean():.0f}%)") - print("\n== PROTECTION AROUND HIGH-IMPACT USD EVENTS ==") - b = stats(base) - for v, (r, f) in res.items(): - s = stats(r); aff = f == 1 - d1 = r[half == 1].sum() - base[half == 1].sum(); d2 = r[half == 2].sum() - base[half == 2].sum() - print(f"{v:11s} total {s['total']:+8.2f} Δ {s['total']-b['total']:+7.2f} PF {s['pf']:.2f} DD {s['dd']:.2f} affected {aff.sum():4d} (affected: base {base[aff].sum():+.2f} -> {r[aff].sum():+.2f}) | Δ h1 {d1:+.2f} / h2 {d2:+.2f}") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/commit_ladder.py b/backtest/research/commit_ladder.py deleted file mode 100644 index 9dc03ef..0000000 --- a/backtest/research/commit_ladder.py +++ /dev/null @@ -1,178 +0,0 @@ -"""Commit-ladder campaign driver (2026-08). - -Question: of all signal-code states shipped in the last two months, which -configuration is the most accurate? Historical in-era backtest numbers are -not comparable (the backtester's realism model changed on 07-08/07-16 and -the data feed switched to Oanda on 07-28), so every historical -configuration is recreated on TODAY's harness via --set overrides and -replayed on the same pinned Oanda bars. Bug-fix commits stay on; the -ladder compares shipped tuning decisions only. - -Usage: - python backtest/research/commit_ladder.py # full matrix - python backtest/research/commit_ladder.py --tf 5min # one timeframe - python backtest/research/commit_ladder.py --windows 12mo,oos - -Resumable: a run whose CSV already exists in the output dir is skipped. -Outputs: backtest/research/commit_ladder_2026-08/_.csv - + .log per run, summary.csv, and a printed ranking table. -""" -from __future__ import annotations - -import argparse -import subprocess -import sys -from pathlib import Path - -import pandas as pd - -ROOT = Path(__file__).resolve().parents[2] -BT = ROOT / "backtest" / "gpu_backtest.py" -OUT = ROOT / "backtest" / "research" / "commit_ladder_2026-08" - -WINDOWS = { - "12mo": ("2025-07-30", "2026-07-30"), - "oos": ("2024-06-01", "2025-03-30"), - "5yr": ("2021-07-30", "2026-07-30"), -} -SPLIT_12MO = pd.Timestamp("2026-01-29", tz="UTC") # book_diff.py's split - -# (variant, "commit date what-it-represents", [--set overrides]) -VARIANTS: dict[str, list[tuple[str, str, list[str]]]] = { - "5min": [ - ("M5-A", "dad2432 07-09 gates+trailing+pullback", - ["xau_strategy.blocked_hours_utc=[0,1,2,10,11,13,16,21]", - "xau_strategy.cp_enabled=false", - "signals.trail_dist_r=0.75", - "xau_strategy.m5_min_abs_score=30", - "xau_strategy.m5_min_confirmation_score=10"]), - ("M5-B", "f3ba4d5 07-11 +hour-9 block", - ["xau_strategy.blocked_hours_utc=[0,1,2,10,11,13,16,21,9]", - "xau_strategy.cp_enabled=false", - "signals.trail_dist_r=0.75", - "xau_strategy.m5_min_abs_score=30", - "xau_strategy.m5_min_confirmation_score=10"]), - ("M5-C", "de6424e 07-16 +chart patterns", - ["xau_strategy.blocked_hours_utc=[0,1,2,10,11,13,16,21,9]", - "signals.trail_dist_r=0.75", - "xau_strategy.m5_min_abs_score=30", - "xau_strategy.m5_min_confirmation_score=10"]), - ("M5-D", "3ee79b5 07-21 +trail dist 0.85", - ["xau_strategy.blocked_hours_utc=[0,1,2,10,11,13,16,21,9]", - "xau_strategy.m5_min_abs_score=30", - "xau_strategy.m5_min_confirmation_score=10"]), - ("M5-E", "0396970 07-30 relaxation (HEAD)", []), - ], - "15min": [ - ("M15-A", "987ec5b 07-09 pre-campaigns", - ["signals.tp_floor_rr=0.5", - "xau_strategy.blocked_regimes=[]", - "xau_strategy.sell_blocked_hours_utc=[]", - "signals.trail_arm_r=0.60"]), - ("M15-B", "f3ba4d5/f88e39f 07-11 1R floor + regime block", - ["xau_strategy.sell_blocked_hours_utc=[]", - "signals.trail_arm_r=0.60"]), - ("M15-C", "7d3fd95 07-16 +SELL hour 15/17 block", - ["signals.trail_arm_r=0.60"]), - ("M15-D", "bf8e5fb 07-21 trail arm 0.70 (HEAD)", []), - ], - "1h": [ - ("H1-A", "pre-d95d31a 07-08 TP-tightening model", - ["signals.min_rr_ratio=0.4", - "signals.tp_tightening_factor=0.8"]), - ("H1-B", "HEAD", []), - ], -} - - -def run_one(tf: str, name: str, overrides: list[str], wkey: str, - spread: str | None = None) -> Path: - suffix = f"_s{spread}" if spread else "" - csv_path = OUT / f"{name}_{wkey}{suffix}.csv" - log_path = OUT / f"{name}_{wkey}{suffix}.log" - if csv_path.exists(): - print(f" [skip] {csv_path.name} exists") - return csv_path - start, end = WINDOWS[wkey] - cmd = [sys.executable, str(BT), "--pair", "XAUUSD", - "--primary-tf", tf, "--start", start, "--end", end, - "--export-csv", str(csv_path)] - if spread: - cmd += ["--spread", spread] - for ov in overrides: - cmd += ["--set", ov] - print(f" [run ] {csv_path.name} ...", flush=True) - with open(log_path, "w") as lf: - rc = subprocess.run(cmd, stdout=lf, stderr=subprocess.STDOUT, - cwd=ROOT).returncode - if rc != 0: - raise SystemExit(f"backtest failed (rc={rc}) — see {log_path}") - log = log_path.read_text() - n_ov = log.count("--set override") - if n_ov != len(overrides): - raise SystemExit( - f"{name}_{wkey}: expected {len(overrides)} --set overrides, " - f"log shows {n_ov} — see {log_path}") - if "Loading cached" not in log and wkey != "sanity": - print(f" [warn] {log_path.name}: no 'Loading cached' line — " - f"data was fetched live for at least one timeframe") - return csv_path - - -def metrics(csv_path: Path, wkey: str) -> dict: - df = pd.read_csv(csv_path, parse_dates=["entry_time"]) - if df.empty: - return {"trades": 0, "total_r": 0.0, "wr": 0.0, "pf": 0.0, - "max_dd": 0.0, "h1_r": 0.0, "h2_r": 0.0, "years_pos": ""} - if df["entry_time"].dt.tz is None: - df["entry_time"] = df["entry_time"].dt.tz_localize("UTC") - r = df["r_multiple"] - pos, neg = r[r > 0].sum(), r[r < 0].sum() - cum = r.cumsum() - dd = (pd.concat([pd.Series([0.0]), cum]).cummax()[1:] - cum).max() - out = { - "trades": len(df), - "total_r": round(r.sum(), 1), - "wr": round((r > 0).mean() * 100, 1), - "pf": round(pos / abs(neg), 2) if neg else float("inf"), - "max_dd": round(dd, 1), - "h1_r": "", "h2_r": "", "years_pos": "", - } - if wkey == "12mo": - h1 = r[df["entry_time"] < SPLIT_12MO].sum() - out["h1_r"] = round(h1, 1) - out["h2_r"] = round(r.sum() - h1, 1) - if wkey == "5yr": - by_year = r.groupby(df["entry_time"].dt.year).sum() - out["years_pos"] = f"{(by_year > 0).sum()}/{len(by_year)}" - return out - - -def main() -> None: - ap = argparse.ArgumentParser() - ap.add_argument("--tf", choices=list(VARIANTS), default=None) - ap.add_argument("--windows", default="12mo,oos,5yr") - args = ap.parse_args() - OUT.mkdir(parents=True, exist_ok=True) - wkeys = [w.strip() for w in args.windows.split(",")] - tfs = [args.tf] if args.tf else list(VARIANTS) - - rows = [] - for tf in tfs: - for name, label, overrides in VARIANTS[tf]: - for wkey in wkeys: - csv_path = run_one(tf, name, overrides, wkey) - m = metrics(csv_path, wkey) - rows.append({"tf": tf, "variant": name, "represents": label, - "window": wkey, **m}) - print(f" {name} {wkey}: {m['trades']} trades, " - f"{m['total_r']}R, PF {m['pf']}, WR {m['wr']}%") - - summary = pd.DataFrame(rows) - summary.to_csv(OUT / "summary.csv", index=False) - print("\n=== SUMMARY (also in summary.csv) ===") - print(summary.to_string(index=False)) - - -if __name__ == "__main__": - main() diff --git a/backtest/research/duka_spread.py b/backtest/research/duka_spread.py deleted file mode 100644 index 12eddf5..0000000 --- a/backtest/research/duka_spread.py +++ /dev/null @@ -1,193 +0,0 @@ -"""Dukascopy XAU/USD tick download + bid/ask spread study. - -Validates ForexBot2's $0.30 round-trip cost assumption (config: -SignalConfig.round_trip_cost / PAIR_INFO default_spread). Round-trip -cost of a market entry+exit = one ask-bid spread width (buy at ask, -sell at bid), so the assumption holds iff typical spread ~ $0.30. - -bi5 format: LZMA 'alone' stream of 20-byte big-endian records -(ms_in_hour uint32, ask uint32, bid uint32, ask_vol f32, bid_vol f32); -XAUUSD prices scaled x1000. URL months are 0-indexed. -""" -import lzma -import sys -from concurrent.futures import ThreadPoolExecutor -from datetime import date, timedelta -from pathlib import Path - -import numpy as np -import pandas as pd -import requests - -SCALE = 1000.0 -CACHE = Path(__file__).parent / "tick_cache" -CACHE.mkdir(exist_ok=True) -URL = "https://datafeed.dukascopy.com/datafeed/XAUUSD/{y}/{m:02d}/{d:02d}/{h:02d}h_ticks.bi5" - -# Bot's tradable bar-close hours: session 03:00-23:00 minus XAU blocked -# hours [0,1,2,10,11,13,16,21] (M5 additionally blocks 9 — reported -# separately below). -BLOCKED = {0, 1, 2, 10, 11, 13, 16, 21} -TRADABLE = sorted(set(range(3, 23)) - BLOCKED) - -# ── Day sample ──────────────────────────────────────────────────────── -recent = [date(2026, 7, 6) + timedelta(days=i) for i in range(17)] -recent = [d for d in recent if d.weekday() < 5] # Mon-Fri Jul 6-22 -monthly = [date(2025, 8, 13), date(2025, 9, 10), date(2025, 10, 15), - date(2025, 11, 12), date(2025, 12, 10), date(2026, 1, 14), - date(2026, 2, 11), date(2026, 3, 11), date(2026, 4, 15), - date(2026, 5, 13), date(2026, 6, 10)] # mid-month Wednesdays -nfp = [date(2026, 6, 5), date(2026, 7, 3)] # NFP Fridays -sundays = [date(2026, 7, 12), date(2026, 7, 19)] # Sun 22-24 open -DAYS = sorted(set(recent + monthly + nfp + sundays)) -assert all(d.weekday() < 5 for d in recent + monthly + nfp) - - -_tls = __import__("threading").local() - - -def _session() -> requests.Session: - if not hasattr(_tls, "s"): - _tls.s = requests.Session() - _tls.s.headers["User-Agent"] = "Mozilla/5.0 (research; spread-study)" - return _tls.s - - -def fetch(day: date, hour: int) -> Path: - p = CACHE / f"{day.isoformat()}_{hour:02d}.bi5" - if p.exists(): - return p - u = URL.format(y=day.year, m=day.month - 1, d=day.day, h=hour) - last = None - for attempt in range(4): - try: - r = _session().get(u, timeout=30) - if r.status_code != 200: - raise RuntimeError(f"{u} -> HTTP {r.status_code}") - p.write_bytes(r.content) - return p - except (requests.ConnectionError, requests.Timeout, RuntimeError) as exc: - last = exc - __import__("time").sleep(1.5 * (attempt + 1)) - if hasattr(_tls, "s"): - _tls.s.close() - del _tls.s - raise RuntimeError(f"giving up on {u}: {last}") - - -def decode(p: Path, day: date, hour: int) -> pd.DataFrame: - blob = p.read_bytes() - if not blob: - return pd.DataFrame() - raw = lzma.decompress(blob) - n = len(raw) // 20 - a = np.frombuffer(raw[: n * 20], dtype=">u4").reshape(n, 5) - f = np.frombuffer(raw[: n * 20], dtype=">f4").reshape(n, 5) - df = pd.DataFrame({ - "ms": a[:, 0].astype(np.int64), - "ask": a[:, 1] / SCALE, - "bid": a[:, 2] / SCALE, - }) - df["spread"] = df["ask"] - df["bid"] - df["date"], df["hour"] = day.isoformat(), hour - df["weekday"] = day.weekday() - return df - - -def load_all() -> pd.DataFrame: - jobs = [(d, h) for d in DAYS for h in range(24)] - with ThreadPoolExecutor(max_workers=3) as ex: - paths = list(ex.map(lambda j: fetch(*j), jobs)) - frames = [decode(p, d, h) for p, (d, h) in zip(paths, jobs)] - df = pd.concat([f for f in frames if not f.empty], ignore_index=True) - return df - - -def wstats(g: pd.DataFrame) -> pd.Series: - """Tick stats + time-weighted mean (each tick's spread held until the - next tick; last tick held to hour end).""" - tw_num = tw_den = 0.0 - keys = [k for k in ("date", "hour") if k in g.columns] - for _, grp in g.groupby(keys, sort=False): - ms = grp["ms"].to_numpy() - sp = grp["spread"].to_numpy() - w = np.diff(np.append(ms, 3_600_000)).clip(min=0) - tw_num += float((sp * w).sum()) - tw_den += float(w.sum()) - s = g["spread"] - return pd.Series({ - "ticks": len(s), - "tw_mean": tw_num / tw_den if tw_den else np.nan, - "mean": s.mean(), "median": s.median(), - "p75": s.quantile(0.75), "p90": s.quantile(0.90), - "p99": s.quantile(0.99), "max": s.max(), - "pct_le_030": (s <= 0.30).mean() * 100, - "pct_ge_060": (s >= 0.60).mean() * 100, - }) - - -def m5_boundary_spreads(df: pd.DataFrame) -> pd.DataFrame: - """Spread of the FIRST tick at/after each M5 boundary — what a - next-open fill actually pays.""" - rows = [] - for (day, hour), grp in df.groupby(["date", "hour"], sort=False): - ms = grp["ms"].to_numpy() - sp = grp["spread"].to_numpy() - wd = grp["weekday"].iat[0] - for b in range(0, 3_600_000, 300_000): - i = np.searchsorted(ms, b) - if i < len(ms) and ms[i] - b <= 30_000: # tick within 30 s - rows.append((day, wd, hour, b // 60_000, sp[i])) - return pd.DataFrame(rows, columns=["date", "weekday", "hour", "minute", "spread"]) - - -def main() -> None: - df = load_all() - print(f"days={df['date'].nunique()} ticks={len(df):,} " - f"price range {df['bid'].min():.0f}-{df['ask'].max():.0f}") - - print("\n── Overall (all sampled hours) ──") - print(wstats(df).round(3).to_string()) - - trad = df[df["hour"].isin(TRADABLE) & (df["weekday"] < 5)] - print("\n── Bot-tradable hours (session 03-23 minus blocked, Mon-Fri) ──") - print(wstats(trad).round(3).to_string()) - - roll = df[df["hour"].isin([21, 22, 23])] - print("\n── Rollover window 21-24 UTC ──") - print(wstats(roll).round(3).to_string()) - - print("\n── Per UTC hour ──") - per_hour = df[df["weekday"] < 5].groupby("hour").apply(wstats, include_groups=False).round(3) - per_hour["tradable"] = ["Y" if h in TRADABLE else "-" for h in per_hour.index] - print(per_hour.to_string()) - per_hour.to_csv(Path(__file__).parent / "duka_spread_by_hour.csv") - - print("\n── M5 next-open boundary fills ──") - mb = m5_boundary_spreads(df) - mb_trad = mb[mb["hour"].isin(TRADABLE) & (mb["weekday"] < 5)] - for name, d in [("all hours", mb), ("tradable hours", mb_trad)]: - s = d["spread"] - print(f"{name}: n={len(s):,} mean={s.mean():.3f} median={s.median():.3f} " - f"p90={s.quantile(0.9):.3f} p99={s.quantile(0.99):.3f} " - f"%<=0.30={(s <= 0.30).mean()*100:.1f} %>=0.60={(s >= 0.60).mean()*100:.1f}") - mb.to_csv(Path(__file__).parent / "duka_m5_boundary_spreads.csv", index=False) - - print("\n── By month (tradable hours, tick median / tw_mean) ──") - trad2 = trad.copy() - trad2["month"] = trad2["date"].str[:7] - bym = trad2.groupby("month").apply(wstats, include_groups=False).round(3) - print(bym[["ticks", "tw_mean", "median", "p90", "pct_le_030", "pct_ge_060"]].to_string()) - - print("\n── NFP Fridays 12:00-15:00 UTC vs same hours other days ──") - nfp_days = {"2026-06-05", "2026-07-03"} - win = df[df["hour"].isin([12, 13, 14])] - for name, d in [("NFP", win[win["date"].isin(nfp_days)]), - ("non-NFP", win[~win["date"].isin(nfp_days) & (win["weekday"] < 5)])]: - s = d["spread"] - print(f"{name}: n={len(s):,} tick-median={s.median():.3f} p90={s.quantile(0.9):.3f} " - f"p99={s.quantile(0.99):.3f} max={s.max():.2f}") - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/backtest/research/duka_spread_by_hour.csv b/backtest/research/duka_spread_by_hour.csv deleted file mode 100644 index a96a3ea..0000000 --- a/backtest/research/duka_spread_by_hour.csv +++ /dev/null @@ -1,25 +0,0 @@ -hour,ticks,tw_mean,mean,median,p75,p90,p99,max,pct_le_030,pct_ge_060,tradable -0,362893.0,0.749,0.768,0.79,0.82,0.86,1.1,7.69,0.053,94.561,- -1,540182.0,0.735,0.742,0.74,0.81,0.87,1.0,5.59,0.073,90.449,- -2,431589.0,0.716,0.722,0.73,0.8,0.86,0.95,2.96,0.1,85.27,- -3,343952.0,0.708,0.711,0.71,0.79,0.84,0.95,1.67,0.081,82.939,Y -4,246262.0,0.704,0.702,0.71,0.78,0.82,0.94,1.86,0.098,82.627,Y -5,388365.0,0.712,0.716,0.72,0.79,0.82,0.95,2.17,0.076,86.745,Y -6,368999.0,0.65,0.651,0.65,0.69,0.74,0.94,2.32,0.079,71.668,Y -7,313149.0,0.601,0.598,0.59,0.65,0.69,0.994,3.08,0.239,42.904,Y -8,347276.0,0.612,0.616,0.6,0.66,0.74,1.0,3.04,0.308,48.349,Y -9,321619.0,0.612,0.615,0.6,0.66,0.72,1.0,5.95,0.288,50.644,Y -10,295271.0,0.611,0.618,0.6,0.66,0.71,1.0,9.36,0.164,49.253,- -11,336963.0,0.619,0.624,0.6,0.67,0.79,1.0,4.97,0.203,50.178,- -12,476773.0,0.66,0.697,0.63,0.72,0.877,1.367,14.98,0.257,59.633,Y -13,651425.0,0.641,0.648,0.63,0.69,0.787,1.487,11.407,0.296,60.297,- -14,673391.0,0.625,0.625,0.63,0.68,0.77,0.9,11.98,0.458,59.085,Y -15,598398.0,0.636,0.638,0.64,0.7,0.78,0.91,4.49,0.433,66.296,Y -16,485023.0,0.648,0.644,0.64,0.7,0.757,0.917,4.09,0.118,68.496,- -17,450119.0,0.626,0.628,0.627,0.7,0.726,0.84,4.08,0.154,63.337,Y -18,411538.0,0.626,0.63,0.637,0.7,0.71,0.79,4.16,0.107,67.734,Y -19,435396.0,0.638,0.643,0.65,0.7,0.72,0.896,5.804,0.11,72.007,Y -20,212654.0,0.684,0.665,0.66,0.7,0.76,1.217,7.15,0.226,70.215,Y -21,31319.0,0.627,0.622,0.61,0.68,0.75,1.02,2.08,0.089,53.153,- -22,108879.0,0.829,0.834,0.797,0.84,0.98,2.05,10.11,0.056,95.434,Y -23,161079.0,1.032,0.913,0.8,0.89,1.307,2.77,13.174,0.092,95.41,- diff --git a/backtest/research/feed_divergence_2026-08-14.md b/backtest/research/feed_divergence_2026-08-14.md index 0558a96..f96e440 100644 --- a/backtest/research/feed_divergence_2026-08-14.md +++ b/backtest/research/feed_divergence_2026-08-14.md @@ -1,8 +1,8 @@ # Feed Divergence Study — Oanda vs Tiingo vs Twelve Data (Phase 1) **Date:** 2026-08-14 -**Test plan:** `docs/data_source_change_test_plan.md` -**Tool:** `scripts/feed_divergence_study.py` (fetch_range over 365d, parquet-cached) +**Test plan:** `docs/data_source_change_test_plan.md` (removed 2026-09-06, in git history; the pending Phase 4 shadow scan is noted in CLAUDE.md) +**Tool:** `scripts/feed_divergence_study.py` (script removed 2026-09-06, in git history) (fetch_range over 365d, parquet-cached) **Window:** 2025-08-14 → 2026-08-14 (12 months); Oanda-vs-TD truncated at TD cache head (2026-07-23) ## Headline diff --git a/backtest/research/feed_divergence_oanda_vs_tiingo.csv b/backtest/research/feed_divergence_oanda_vs_tiingo.csv deleted file mode 100644 index c6ceccd..0000000 --- a/backtest/research/feed_divergence_oanda_vs_tiingo.csv +++ /dev/null @@ -1,2 +0,0 @@ -tf,a,b,a_bars,b_bars,common,a_only,b_only,dir_agree_pct,ret_corr,mean_abs_dclose,p95_abs_dclose,max_abs_dclose,dclose_pct_atr_mean -5min,oanda,tiingo,70901,73241,70807,94,2434,97.674000,0.994970,0.123070,0.285000,26.105000,2.147942 diff --git a/backtest/research/ff_calendar_scraper.py b/backtest/research/ff_calendar_scraper.py deleted file mode 100644 index 6e8edac..0000000 --- a/backtest/research/ff_calendar_scraper.py +++ /dev/null @@ -1,144 +0,0 @@ -"""Forex Factory calendar scraper -> backtest/cache/calendar.parquet. - -Fetches weekly calendar pages and parses the event JSON embedded in -`window.calendarComponentStates` (the `days:` array). Event `dateline` -is a unix epoch, so timestamps carry no timezone ambiguity — verified -2026-07-11 against known release times (NFP 12:30/13:30 UTC across DST, -ECB 12:15/13:15) and against EUR/USD M15 volatility: the bar containing -a high-impact event averages 3.5x normal range, and shifting event -times by ±1h destroys that alignment. - -Usage: - python backtest/research/ff_calendar_scraper.py --start 2024-01-01 --end 2026-07-13 - python backtest/research/ff_calendar_scraper.py # refresh: last stored week -> today - -Merges into the existing parquet on event (id, dateline), so refreshing -is idempotent and also picks up revised `actual` values for recent weeks. -Be polite: ~1.6s between requests (a full year is ~52 requests). -""" -import argparse -import json -import time -from datetime import date, timedelta -from pathlib import Path -from typing import List, Optional - -import pandas as pd -import requests - -CACHE_DIR = Path(__file__).resolve().parent.parent / "cache" -PARQUET = CACHE_DIR / "calendar.parquet" - -UA = ("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/126.0 Safari/537.36") - -FIELDS = ["id", "dateline", "name", "country", "currency", "impactName", - "timeLabel", "timeMasked", "actual", "forecast", "previous", - "revision", "actualBetterWorse"] - - -def week_url(d: date) -> str: - return (f"https://www.forexfactory.com/calendar?week=" - f"{d.strftime('%b').lower()}{d.day}.{d.year}") - - -def extract_days(html: str) -> Optional[list]: - """Balanced-bracket extraction of the `days:` JSON array.""" - i = html.find("days:") - if i < 0: - return None - j = html.find("[", i) - depth, in_str, esc = 0, False, False - for k in range(j, len(html)): - ch = html[k] - if in_str: - if esc: - esc = False - elif ch == "\\": - esc = True - elif ch == '"': - in_str = False - else: - if ch == '"': - in_str = True - elif ch == "[": - depth += 1 - elif ch == "]": - depth -= 1 - if depth == 0: - return json.loads(html[j:k + 1]) - return None - - -def fetch_week(sess: requests.Session, d: date, retries: int = 4) -> Optional[List[dict]]: - for attempt in range(retries): - try: - r = sess.get(week_url(d), timeout=30) - if r.status_code == 200: - days = extract_days(r.text) - if days is not None: - return [{k: e.get(k) for k in FIELDS} - for day in days for e in day.get("events", [])] - except requests.RequestException: - pass - time.sleep(5 * (attempt + 1)) - return None - - -def scrape(start: date, end: date) -> pd.DataFrame: - sess = requests.Session() - sess.headers["User-Agent"] = UA - rows: List[dict] = [] - failed: List[date] = [] - d = start - while d <= end: - week_rows = fetch_week(sess, d) - if week_rows is None: - failed.append(d) - print(f"FAILED week {d}") - else: - rows.extend(week_rows) - d += timedelta(days=7) - time.sleep(1.6) - if failed: - print(f"WARNING: {len(failed)} weeks failed: {failed}") - return pd.DataFrame(rows) - - -def merge_into_store(new: pd.DataFrame, path: Path = PARQUET) -> pd.DataFrame: - if path.exists(): - old = pd.read_parquet(path) - combined = pd.concat([old, new]) - else: - combined = new - # keep="last": a refresh overwrites stale rows (actuals fill in - # after release, revisions land weeks later). - combined = (combined.drop_duplicates(subset=["id", "dateline"], keep="last") - .sort_values("dateline").reset_index(drop=True)) - combined.to_parquet(path, index=False) - return combined - - -def main() -> None: - ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) - ap.add_argument("--start", type=date.fromisoformat, default=None) - ap.add_argument("--end", type=date.fromisoformat, default=date.today()) - args = ap.parse_args() - - start = args.start - if start is None: - if PARQUET.exists(): - last = pd.read_parquet(PARQUET).dateline.max() - start = pd.Timestamp(last, unit="s").date() - timedelta(days=7) - else: - start = date(2024, 1, 1) - print(f"Scraping {start} -> {args.end}") - new = scrape(start, args.end) - combined = merge_into_store(new) - print(f"Store: {len(combined)} events " - f"({pd.Timestamp(combined.dateline.min(), unit='s')} -> " - f"{pd.Timestamp(combined.dateline.max(), unit='s')}) -> {PARQUET}") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/llm_news_eval.py b/backtest/research/llm_news_eval.py deleted file mode 100644 index de8d074..0000000 --- a/backtest/research/llm_news_eval.py +++ /dev/null @@ -1,697 +0,0 @@ -""" -DeepSeek news-analysis validation harness — XAU/USD. -==================================================== -Research-only (no production code changes). Answers: is the DeepSeek -layer's news analysis *correct*? - -Part A (events): replays every high-impact USD release with a genuine -surprise (2024-01 → 2026-07, from backtest/cache/calendar.parquet) -through the REAL `NewsEngine._llm_event_direction` — real prompt, real -payload, real validation — and scores its "gold bullish/bearish" calls -against gold's actual move (Oanda M15 mids) at +15m/30m/1h/4h/24h. -Baselines: mechanical surprise-sign doctrine, FF actualBetterWorse, -always-bullish/bearish (2024-26 is a gold bull regime), coin flip. - -Part B (headlines): a curated golden set (llm_news_golden.csv) through -the REAL `NewsEngine._llm_headline_scores` in production-sized batches, -vs the keyword scorer it overrides. Includes repeat-batch (determinism) -and shuffled-order (cross-contamination) probes. - -Implementation notes that keep the replay faithful to production: - * `_llm_event_direction`/`_llm_headline_scores` resolve the client via - `get_llm_client()`, so we seed the module singleton with a research - client (raised daily cap: 586 events > production cap 500). - * The event cache key omits the forecast, so a repeat `actual` would - silently re-serve a direction computed for a different forecast — - the cache is cleared before every call. - * A "neutral" reply and a hard failure both return None; they are - disambiguated by reading the event cache back after the call - (absent = failure, "" = neutral, "bullish:/bearish: …" = call). - * Raw request/response bytes are captured with a requests response - hook — the request-building code path is untouched. - -Usage (from repo root): - venv/bin/python backtest/research/llm_news_eval.py events --limit 5 - venv/bin/python backtest/research/llm_news_eval.py events --determinism 20 - venv/bin/python backtest/research/llm_news_eval.py headlines - venv/bin/python backtest/research/llm_news_eval.py report - -Artifacts land in backtest/research/llm_news_eval_2026-08/ (JSONL replay -logs are resume-safe: completed events are never re-paid). `report` is a -pure offline function of the artifacts. -""" - -import argparse -import json -import math -import random -import sys -import time -from datetime import datetime, timezone -from pathlib import Path - -import numpy as np -import pandas as pd - -REPO_ROOT = Path(__file__).resolve().parents[2] -sys.path.insert(0, str(REPO_ROOT)) - -import llm_client -from app_config import deepseek_api_key, get_app_config -from config import NewsConfig -from llm_client import DEFAULT_MODEL, DeepSeekClient -from news_engine import EconomicEvent, NewsEngine - -RESEARCH_DIR = Path(__file__).parent -ART_DIR = RESEARCH_DIR / "llm_news_eval_2026-08" -CALENDAR = REPO_ROOT / "backtest" / "cache" / "calendar.parquet" -BARS = (REPO_ROOT / "backtest" / "cache" / - "oanda_XAU_USD_15min_20210531_20260804.parquet") -GOLDEN = RESEARCH_DIR / "llm_news_golden.csv" -EVENTS_JSONL = ART_DIR / "events_replay.jsonl" -HEADLINES_JSONL = ART_DIR / "headlines_replay.jsonl" -SCORED_CSV = ART_DIR / "events_scored.csv" - -HORIZONS = [("15m", 15), ("30m", 30), ("1h", 60), ("4h", 240), - ("24h", 1440)] -NEUTRAL_BAND = 0.15 # |xau| below this = neutral prediction (Part B) -BATCH_CAP = 25 # production batch cap (news_engine.py:783) -EXPECTED_CORPUS = 586 - - -# ── shared plumbing ────────────────────────────────────────────────── - -class _Recorder: - """requests response hook capturing the exact wire traffic.""" - - def __init__(self): - self.last = None - - def hook(self, resp, **kwargs): - body = resp.request.body - if isinstance(body, bytes): - body = body.decode("utf-8", "replace") - self.last = { - "request_body": body, - "http_status": resp.status_code, - "response_body": resp.text, - "elapsed_s": round(resp.elapsed.total_seconds(), 3), - } - return resp - - def pop(self): - cap, self.last = self.last, None - return cap or {} - - -def install_research_client(timeout: float): - """Build a research DeepSeekClient (raised cap) and seed the module - singleton so the production code paths use it. Returns (client, - recorder).""" - app = get_app_config() - key = deepseek_api_key(app) - ds = app.deepseek_settings - if not key: - sys.exit("No DeepSeek API key (env DEEPSEEK_API_KEY or " - "config.json deepseek.api_key) — aborting before spend.") - if ds.get("enabled") is False: - sys.exit("deepseek.enabled is false in config.json — aborting.") - client = DeepSeekClient( - api_key=key, - model=str(ds.get("model", DEFAULT_MODEL)), - timeout=timeout, - daily_cap=10 ** 6, # research: corpus 586 > production cap 500 - ) - rec = _Recorder() - client._session.hooks["response"].append(rec.hook) - with llm_client._client_lock: - llm_client._client = client - return client, rec - - -def _s(x): - """Parquet str columns carry float NaN — EconomicEvent needs None.""" - return None if pd.isna(x) else str(x) - - -def load_corpus(): - """High-impact USD releases with a genuine surprise, through the - production `EconomicEvent.surprise` gate. Asserts run before any - API spend.""" - df = pd.read_parquet(CALENDAR) - df = df[(df["impactName"] == "high") & (df["currency"] == "USD")] - rows = [] - for r in df.itertuples(): - ev = EconomicEvent( - time=datetime.fromtimestamp(int(r.dateline), tz=timezone.utc), - currency="USD", impact="high", event=_s(r.name) or "", - forecast=_s(r.forecast), previous=_s(r.previous), - actual=_s(r.actual), - ) - if ev.surprise not in ("positive", "negative"): - continue - rows.append({ - "ffid": int(r.id), "dateline": int(r.dateline), - "utc_time": ev.time.isoformat(), "name": ev.event, - "actual": ev.actual, "forecast": ev.forecast, - "previous": ev.previous, "surprise": ev.surprise, - "better_worse": int(r.actualBetterWorse), "ev": ev, - }) - ids = [d["ffid"] for d in rows] - if len(rows) != EXPECTED_CORPUS: - sys.exit(f"corpus size {len(rows)} != {EXPECTED_CORPUS} — " - "calendar.parquet changed; re-verify before spending.") - if len(set(ids)) != len(ids): - sys.exit("FF ids not unique — resume keying would break.") - # Pin the actualBetterWorse mapping on two unambiguous NFP prints. - nfp = {d["utc_time"][:10]: d["better_worse"] for d in rows - if d["name"] == "Non-Farm Employment Change"} - if nfp.get("2024-01-05") != 1 or nfp.get("2024-05-03") != 2: - sys.exit("actualBetterWorse mapping pins failed (expected " - "1=better-for-USD on 2024-01-05 beat, 2=worse on " - "2024-05-03 miss).") - rows.sort(key=lambda d: (d["dateline"], d["ffid"])) - return rows - - -def _load_jsonl(path: Path): - recs = [] - if path.exists(): - with open(path) as f: - for line in f: - line = line.strip() - if line: - recs.append(json.loads(line)) - return recs - - -# ── Part A: event replay ───────────────────────────────────────────── - -def _extract_reason(cap): - try: - content = json.loads(cap["response_body"])[ - "choices"][0]["message"]["content"] - return json.loads(content).get("reason") - except Exception: - return None - - -def cmd_events(args): - ART_DIR.mkdir(exist_ok=True) - corpus = load_corpus() - if args.limit: - corpus = corpus[:args.limit] - engine = NewsEngine(NewsConfig()) - existing = _load_jsonl(EVENTS_JSONL) - done1 = {r["ffid"] for r in existing - if r.get("run_pass") == 1 and r.get("llm_direction")} - done2 = {r["ffid"] for r in existing - if r.get("run_pass") == 2 and r.get("llm_direction")} - pending = [d for d in corpus if d["ffid"] not in done1] - print(f"corpus {len(corpus)} | already recorded {len(done1)} | " - f"pending {len(pending)} | determinism re-calls " - f"{args.determinism} | model calls are ~100 tokens each " - f"(deepseek-v4-flash, static-prefix cached) → cost ≈ cents") - if not pending and not args.determinism: - print("nothing to do") - return - _, rec = install_research_client(args.timeout) - - out = open(EVENTS_JSONL, "a") - - def call_one(d, run_pass): - # Cache key omits forecast → cleared per call so 196 colliding - # corpus rows can't be served a stale direction. - with NewsEngine._cache_lock: - NewsEngine._llm_event_cache.clear() - ev = d["ev"] - engine._llm_event_direction(ev) - key = (ev.event, ev.currency, str(ev.actual or "")) - with NewsEngine._cache_lock: - cached = NewsEngine._llm_event_cache.get(key) - cap = rec.pop() - if cached is None: - direction, text = None, None # hard failure → retry - elif cached == "": - direction, text = "neutral", "" - else: - direction, text = cached.split(":", 1)[0], cached - recd = {k: d[k] for k in ( - "ffid", "dateline", "utc_time", "name", "actual", "forecast", - "previous", "surprise", "better_worse")} - recd.update({ - "llm_direction": direction, "llm_text": text, - "reason_raw": _extract_reason(cap), "run_pass": run_pass, - "ts": datetime.now(timezone.utc).isoformat(), **cap, - }) - out.write(json.dumps(recd) + "\n") - out.flush() - return direction - - remaining = pending - for npass in range(1, args.retry_passes + 1): - if not remaining: - break - failed = [] - for i, d in enumerate(remaining): - if call_one(d, 1) is None: - failed.append(d) - if args.sleep: - time.sleep(args.sleep) - if (i + 1) % 25 == 0: - print(f" pass {npass}: {i + 1}/{len(remaining)} " - f"({len(failed)} failed)") - print(f"pass {npass} done: {len(remaining) - len(failed)} ok, " - f"{len(failed)} failed") - remaining = failed - if remaining: - print(f"WARNING: {len(remaining)} events still unrecorded after " - f"{args.retry_passes} passes — re-run `events` to resume.") - - if args.determinism: - ok_ids = {x["ffid"] for x in remaining} - done_now = [d for d in corpus if d["ffid"] not in ok_ids] - done_now.sort(key=lambda d: (d["name"], d["dateline"])) - stride = max(1, len(done_now) // args.determinism) - sample = done_now[::stride][:args.determinism] - todo = [d for d in sample if d["ffid"] not in done2] - print(f"determinism probe: {len(todo)} re-calls " - f"({len(sample) - len(todo)} already recorded)") - for d in todo: - call_one(d, 2) - if args.sleep: - time.sleep(args.sleep) - out.close() - print("events replay complete →", EVENTS_JSONL) - - -# ── Part B: golden headlines ───────────────────────────────────────── - -def _load_golden(): - g = pd.read_csv(GOLDEN) - need = {"headline", "category", "expected_xau_sign", "rationale"} - if not need <= set(g.columns): - sys.exit(f"golden CSV missing columns {need - set(g.columns)}") - if not g["expected_xau_sign"].isin([-1, 0, 1]).all(): - sys.exit("expected_xau_sign must be -1/0/+1") - if not g["headline"].is_unique: - sys.exit("duplicate headlines in golden CSV") - return g - - -def cmd_headlines(args): - ART_DIR.mkdir(exist_ok=True) - g = _load_golden() - heads = list(g["headline"]) - _, rec = install_research_client(args.timeout) - engine = NewsEngine(NewsConfig()) - out = open(HEADLINES_JSONL, "w") # tiny (~9 calls): fresh each run - - def run_batch(texts, tag, batch_idx): - scores = None - for attempt in range(3): - scores = engine._llm_headline_scores(texts) - cap = rec.pop() - if scores is not None: - break - print(f" {tag} batch {batch_idx} attempt {attempt + 1} " - f"failed (http {cap.get('http_status')})") - time.sleep(2.0) - out.write(json.dumps({ - "run_tag": tag, "batch": batch_idx, "headlines": texts, - "scores": scores, - "ts": datetime.now(timezone.utc).isoformat(), **cap, - }) + "\n") - out.flush() - return scores - - batches = [heads[i:i + BATCH_CAP] for i in range(0, len(heads), - BATCH_CAP)] - for bi, b in enumerate(batches): - ok = run_batch(b, "main", bi) is not None - print(f"main batch {bi} ({len(b)} headlines): " - f"{'ok' if ok else 'FAILED'}") - time.sleep(args.sleep) - run_batch(batches[0], "repeat", 0) - print("repeat probe done") - shuffled = heads[:] - random.Random(20260806).shuffle(shuffled) - for bi in range(0, len(shuffled), BATCH_CAP): - run_batch(shuffled[bi:bi + BATCH_CAP], "shuffled", - bi // BATCH_CAP) - print("shuffled probe done →", HEADLINES_JSONL) - out.close() - - -# ── report: pure offline function of the artifacts ─────────────────── - -def _binom_p(k, n): - """Exact two-sided binomial p-value vs p=0.5 (no scipy).""" - if n == 0: - return float("nan") - dist = [math.comb(n, i) for i in range(n + 1)] - tot = float(2 ** n) - pk = dist[k] - return min(1.0, sum(c for c in dist if c <= pk) / tot) - - -def _mcnemar_p(hit_a, hit_b): - """Exact McNemar via binomial on discordant pairs. Inputs: aligned - boolean lists.""" - b = sum(1 for x, y in zip(hit_a, hit_b) if x and not y) - c = sum(1 for x, y in zip(hit_a, hit_b) if not x and y) - return b, c, _binom_p(min(b, c), b + c) - - -def _latest_events(recs): - """Last pass-1 record per ffid (retries append; last wins).""" - out = {} - for r in recs: - if r.get("run_pass") == 1: - out[r["ffid"]] = r - return list(out.values()) - - -def _fmt_rate(hits, n, label=""): - if n == 0: - return f"{label:<24} n=0" - p = _binom_p(hits, n) - return (f"{label:<24} {hits:>4}/{n:<4} = {hits / n * 100:5.1f}% " - f"(binom p={p:.3f})") - - -def report_events(): - recs = _latest_events(_load_jsonl(EVENTS_JSONL)) - if not recs: - print("no event replay records — run `events` first") - return - bars = pd.read_parquet(BARS) - closes = bars["Close"].to_numpy() - close_ns = (bars.index + pd.Timedelta(minutes=15)).asi8 - - def anchor(t_ns, h_min): - i = np.searchsorted(close_ns, t_ns, side="right") - 1 - if i < 0: - return None - stale_ns = max(45.0, h_min / 4.0) * 60e9 - if t_ns - close_ns[i] > stale_ns: - return None - return closes[i] - - rows, skip = [], {h: 0 for h, _ in HORIZONS} - base_skipped = 0 - for r in recs: - t_ns = int(r["dateline"]) * 10 ** 9 - base = anchor(t_ns, 0) - if base is None: - base_skipped += 1 - continue - row = dict(r) - row.pop("request_body", None) - row.pop("response_body", None) - row["year"] = r["utc_time"][:4] - row["base"] = base - for hname, hmin in HORIZONS: - p = anchor(t_ns + hmin * 60 * 10 ** 9, hmin) - if p is None: - skip[hname] += 1 - row[f"d_{hname}"] = np.nan - else: - row[f"d_{hname}"] = p - base - rows.append(row) - df = pd.DataFrame(rows) - df.to_csv(SCORED_CSV, index=False) - - n_fail = int((df["llm_direction"].isna()).sum()) - print("═" * 70) - print("PART A — event gold-direction vs actual XAU move") - print("═" * 70) - print(f"events replayed: {len(df)} (baseline-price skipped: " - f"{base_skipped}) | LLM hard failures: {n_fail}") - print("horizon skip counts (stale/closed):", - {k: v for k, v in skip.items() if v}) - dist = df["llm_direction"].value_counts(dropna=False).to_dict() - print("LLM call distribution:", dist) - - # Unconditional per-horizon noise scale (null): median |Δ| over all - # 2024+ bar times, position-shifted. - bars24 = bars[bars.index >= "2024-01-01"] - null_med = {} - for hname, hmin in HORIZONS: - k = hmin // 15 - d = (bars24["Close"].shift(-k) - bars24["Close"]).abs().dropna() - null_med[hname] = float(d.median()) - print("unconditional null median |Δ| ($):", - {k: round(v, 2) for k, v in null_med.items()}) - - # Strategy call columns: +1 gold up, −1 gold down, 0/NaN excluded. - df["c_llm"] = df["llm_direction"].map( - {"bullish": 1, "bearish": -1}).fillna(0) - df["c_doctrine"] = df["surprise"].map({"positive": -1, "negative": 1}) - df["c_ffbw"] = df["better_worse"].map({1: -1, 2: 1}).fillna(0) - df["c_bull"] = 1 - df["c_bear"] = -1 - - strategies = [("LLM", "c_llm"), ("doctrine(surprise)", "c_doctrine"), - ("FF betterWorse", "c_ffbw"), ("always-bullish", "c_bull"), - ("always-bearish", "c_bear")] - - for hname, _ in HORIZONS: - dcol = f"d_{hname}" - sub = df[df[dcol].notna()] - print(f"\n── horizon {hname} (n scored bars={len(sub)}) ──") - zeros = int((sub[dcol] == 0).sum()) - if zeros: - print(f" Δ==0 count (scored as miss): {zeros}") - for label, col in strategies: - s = sub[sub[col] != 0] - hits = int((np.sign(s[dcol]) == s[col]).sum()) - print(" " + _fmt_rate(hits, len(s), label)) - # noise-filtered LLM hit rate - s = sub[(sub["c_llm"] != 0) & - (sub[dcol].abs() >= null_med[hname])] - hits = int((np.sign(s[dcol]) == s["c_llm"]).sum()) - print(" " + _fmt_rate(hits, len(s), - f"LLM |Δ|≥null-med")) - # event-window magnitude vs null - mag = sub[dcol].abs().median() - print(f" event-window median |Δ| = ${mag:.2f} " - f"(null ${null_med[hname]:.2f})") - # paired McNemar: LLM vs each baseline on common directional set - for label, col in [("doctrine", "c_doctrine"), - ("FF betterWorse", "c_ffbw"), - ("always-bullish", "c_bull")]: - s = sub[(sub["c_llm"] != 0) & (sub[col] != 0)] - ha = list(np.sign(s[dcol]) == s["c_llm"]) - hb = list(np.sign(s[dcol]) == s[col]) - b, c, p = _mcnemar_p(ha, hb) - print(f" McNemar LLM vs {label:<15} b={b:>3} c={c:>3} " - f"p={p:.3f}") - - # neutral-call flatness (15m) - neu = df[(df["llm_direction"] == "neutral") & df["d_15m"].notna()] - dire = df[(df["c_llm"] != 0) & df["d_15m"].notna()] - if len(neu): - print(f"\nneutral calls (n={len(neu)}): median |Δ_15m| " - f"${neu['d_15m'].abs().median():.2f} vs directional " - f"(n={len(dire)}) ${dire['d_15m'].abs().median():.2f} " - f"(null ${null_med['15m']:.2f})") - - # breakdowns at 1h - dcol = "d_1h" - sub = df[df[dcol].notna() & (df["c_llm"] != 0)] - print("\n── LLM hit rate by event name (1h, top 10 by count) ──") - for name, grp in sorted(sub.groupby("name"), key=lambda kv: -len(kv[1]))[:10]: - hits = int((np.sign(grp[dcol]) == grp["c_llm"]).sum()) - print(" " + _fmt_rate(hits, len(grp), name[:24])) - print("── LLM hit rate by year (1h) ──") - for yr, grp in sub.groupby("year"): - hits = int((np.sign(grp[dcol]) == grp["c_llm"]).sum()) - print(" " + _fmt_rate(hits, len(grp), yr)) - - # cluster view: shared datelines - print("\n── same-timestamp clusters ──") - clus = df.groupby("dateline").filter(lambda g: len(g) > 1) - groups = list(clus.groupby("dateline")) - consistent = 0 - net_hits, net_n = 0, 0 - for _, g in groups: - signs = set(g.loc[g["c_llm"] != 0, "c_llm"]) - if len(signs) <= 1: - consistent += 1 - net = int(g["c_llm"].sum()) - d = g["d_1h"].iloc[0] - if net != 0 and pd.notna(d) and d != 0: - net_n += 1 - if np.sign(d) == np.sign(net): - net_hits += 1 - print(f"clusters: {len(groups)} datelines " - f"({len(clus)} events, {len(clus) / max(len(df), 1) * 100:.0f}% of " - f"corpus) | internally consistent: {consistent}/{len(groups)}") - print(" " + _fmt_rate(net_hits, net_n, "cluster net-call (1h)")) - - # determinism probe - p2 = {r["ffid"]: r for r in _load_jsonl(EVENTS_JSONL) - if r.get("run_pass") == 2 and r.get("llm_direction")} - if p2: - p1 = {r["ffid"]: r for r in recs} - agree = same_reason = n = 0 - for fid, r2 in p2.items(): - r1 = p1.get(fid) - if not r1 or not r1.get("llm_direction"): - continue - n += 1 - if r1["llm_direction"] == r2["llm_direction"]: - agree += 1 - if r1.get("reason_raw") == r2.get("reason_raw"): - same_reason += 1 - print(f"\ndeterminism probe: direction agreement {agree}/{n}, " - f"identical reason text {same_reason}/{n}") - - # stratified reason examples - print("\n── reason samples (1h hit/miss) ──") - sub = df[df[dcol].notna() & (df["c_llm"] != 0)].copy() - sub["hit"] = np.sign(sub[dcol]) == sub["c_llm"] - for verdict in (True, False): - picked, seen = [], set() - for _, r in sub[sub["hit"] == verdict].iterrows(): - if r["name"] in seen: - continue - seen.add(r["name"]) - picked.append(r) - if len(picked) == 10: - break - tag = "HIT " if verdict else "MISS" - for r in picked: - print(f" [{tag}] {r['utc_time'][:16]} {r['name'][:30]:<30} " - f"a={r['actual']} f={r['forecast']} → " - f"{r['llm_direction']:<7} Δ1h={r[dcol]:+7.2f} " - f"“{(r['reason_raw'] or '')[:60]}”") - print(f"\nscored table → {SCORED_CSV}") - - -def report_headlines(): - recs = _load_jsonl(HEADLINES_JSONL) - if not recs: - print("\n(no headline replay records — run `headlines` first)") - return - g = _load_golden() - engine = NewsEngine(NewsConfig()) - - def collect(tag): - m = {} - for r in recs: - if r["run_tag"] == tag and r["scores"]: - for h, sc in zip(r["headlines"], r["scores"]): - m[h] = tuple(sc) - return m - - main, shuf = collect("main"), collect("shuffled") - print("\n" + "═" * 70) - print("PART B — golden headline set: LLM vs keyword baseline") - print("═" * 70) - missing = [h for h in g["headline"] if h not in main] - if missing: - print(f"WARNING: {len(missing)} headlines missing from main run") - - def cls(x): - if x >= NEUTRAL_BAND: - return 1 - if x <= -NEUTRAL_BAND: - return -1 - return 0 - - rows = [] - for _, r in g.iterrows(): - h = r["headline"] - if h not in main: - continue - llm_xau = main[h][1] - kw = engine._analyze_headline_sentiment(h, for_currency="XAU") - rows.append({ - "headline": h, "category": r["category"], - "exp": int(r["expected_xau_sign"]), - "llm_xau": llm_xau, "llm_cls": cls(llm_xau), - "kw": kw, "kw_cls": cls(kw), - }) - t = pd.DataFrame(rows) - for who in ("llm", "kw"): - acc = (t[f"{who}_cls"] == t["exp"]).mean() - print(f"{who.upper():<4} 3-class accuracy (band ±{NEUTRAL_BAND}): " - f"{(t[f'{who}_cls'] == t['exp']).sum()}/{len(t)} " - f"= {acc * 100:.1f}%") - ha = list(t["llm_cls"] == t["exp"]) - hb = list(t["kw_cls"] == t["exp"]) - b, c, p = _mcnemar_p(ha, hb) - print(f"paired McNemar LLM vs keyword: b={b} c={c} p={p:.3f}") - - print("\nper-category accuracy (LLM | keyword):") - for cat, grp in t.groupby("category"): - a1 = (grp["llm_cls"] == grp["exp"]).sum() - a2 = (grp["kw_cls"] == grp["exp"]).sum() - print(f" {cat:<18} {a1:>2}/{len(grp):<2} | {a2:>2}/{len(grp)}") - - print("\nLLM confusion (rows=expected, cols=predicted -1/0/+1):") - cm = pd.crosstab(t["exp"], t["llm_cls"]).reindex( - index=[-1, 0, 1], columns=[-1, 0, 1], fill_value=0) - print(cm.to_string()) - - print("\nLLM misclassified headlines:") - for _, r in t[t["llm_cls"] != t["exp"]].iterrows(): - print(f" exp {r['exp']:+d} got {r['llm_xau']:+.2f} " - f"[{r['category']}] {r['headline'][:70]}") - - # repeat-batch determinism - m_b0 = [r for r in recs if r["run_tag"] == "main" and r["batch"] == 0] - r_b0 = [r for r in recs if r["run_tag"] == "repeat"] - if m_b0 and r_b0 and m_b0[0]["scores"] and r_b0[0]["scores"]: - a = np.array(m_b0[0]["scores"], dtype=float) - b_ = np.array(r_b0[0]["scores"], dtype=float) - exact = int((a == b_).all(axis=1).sum()) - print(f"\nrepeat-batch: {exact}/{len(a)} score pairs identical, " - f"max |diff| = {np.abs(a - b_).max():.3f}") - - # shuffled-order drift - if shuf: - both = [h for h in t["headline"] if h in shuf] - drift = [abs(main[h][1] - shuf[h][1]) for h in both] - if drift: - print(f"shuffled-order xau drift over {len(both)} headlines: " - f"mean {np.mean(drift):.3f}, max {np.max(drift):.3f}") - - -def cmd_report(args): - report_events() - report_headlines() - - -# ── CLI ────────────────────────────────────────────────────────────── - -def main(): - ap = argparse.ArgumentParser(description=__doc__.split("\n")[1]) - sub = ap.add_subparsers(dest="cmd", required=True) - - e = sub.add_parser("events", help="replay release surprises") - e.add_argument("--limit", type=int, default=0, - help="smoke-test on first N events") - e.add_argument("--determinism", type=int, default=0, - help="re-call N stratified events a second time") - e.add_argument("--sleep", type=float, default=0.3) - e.add_argument("--retry-passes", type=int, default=3) - e.add_argument("--timeout", type=float, default=30.0) - e.set_defaults(fn=cmd_events) - - h = sub.add_parser("headlines", help="golden-set probes") - h.add_argument("--sleep", type=float, default=0.3) - h.add_argument("--timeout", type=float, default=30.0) - h.set_defaults(fn=cmd_headlines) - - r = sub.add_parser("report", help="offline scoring report") - r.set_defaults(fn=cmd_report) - - args = ap.parse_args() - args.fn(args) - - -if __name__ == "__main__": - main() diff --git a/backtest/research/llm_news_golden.csv b/backtest/research/llm_news_golden.csv deleted file mode 100644 index 7c7c136..0000000 --- a/backtest/research/llm_news_golden.csv +++ /dev/null @@ -1,79 +0,0 @@ -headline,category,expected_xau_sign,rationale -"Powell says restrictive policy needed for longer as inflation proves sticky",hawkish_fed,-1,"higher-for-longer rates lift real yields, gold-bearish" -"Fed minutes show officials leaning toward two more rate hikes this year",hawkish_fed,-1,"more hikes = stronger dollar/yields" -"Hot CPI print fuels bets on additional Fed tightening",hawkish_fed,-1,"tightening expectations weigh on gold" -"Fed's Waller: higher-for-longer rates warranted by resilient economy",hawkish_fed,-1,"hawkish guidance" -"FOMC raises rates 50bp, flags further increases ahead",hawkish_fed,-1,"outsized hike plus hawkish guidance" -"Treasury yields spike as Fed pushes back on rate cut hopes",hawkish_fed,-1,"cut hopes dashed, yields up" -"Core inflation accelerates, cementing case for hawkish Fed stance",hawkish_fed,-1,"hawkish repricing" -"Fed dot plot shifts higher; markets price out easing for the year",hawkish_fed,-1,"easing priced out" -"Fed cuts rates 25bp and signals more easing to come",dovish_fed,1,"easing cycle is gold-bullish" -"Powell hints at rate cuts as inflation cools toward target",dovish_fed,1,"cut guidance" -"FOMC minutes reveal growing support for policy easing",dovish_fed,1,"dovish minutes" -"Fed's Williams says rate cuts appropriate later this year",dovish_fed,1,"cut guidance" -"Soft inflation data boosts odds of a dovish Fed pivot",dovish_fed,1,"pivot odds up" -"Fed pauses hikes, markets price aggressive easing cycle",dovish_fed,1,"easing priced in" -"Central banks turn dovish as global growth falters",dovish_fed,1,"global easing backdrop" -"Fed to restart bond purchases to support flagging economy",dovish_fed,1,"QE is gold-bullish" -"Dollar index hits 12-month high on robust US economic data",strong_usd,-1,"strong dollar pressures gold" -"US GDP grows 4.1% annualized, blowing past expectations",strong_usd,-1,"strong economy, hawkish implication" -"Blockbuster jobs report sends dollar surging across the board",strong_usd,-1,"strong jobs lift dollar and yields" -"US retail sales smash forecasts, underscoring consumer strength",strong_usd,-1,"strong data" -"Greenback rallies as US data outshines Europe and Asia",strong_usd,-1,"dollar strength" -"ISM services index jumps to two-year high on strong demand",strong_usd,-1,"strong data" -"Consumer confidence surges to post-pandemic high in the US",strong_usd,-1,"strong data" -"Dollar tumbles to eight-month low after dismal manufacturing data",weak_usd,1,"weak dollar lifts gold" -"US economy adds far fewer jobs than expected; dollar slides",weak_usd,1,"weak jobs, dovish implication" -"Greenback weakens as US retail sales unexpectedly contract",weak_usd,1,"weak data" -"US GDP growth revised down sharply, stoking slowdown fears",weak_usd,1,"slowdown is dovish" -"Dollar slumps as trade deficit balloons to record",weak_usd,1,"dollar weakness" -"Soft services PMI adds to evidence of cooling US economy",weak_usd,1,"cooling economy" -"US consumer sentiment plunges to two-year low",weak_usd,1,"weak data" -"Real yields climb to multi-year highs as TIPS sell off",real_yields,-1,"rising real yields raise gold's opportunity cost" -"10-year Treasury yield surges past 5% on supply glut",real_yields,-1,"yield spike" -"Rising real interest rates dim appeal of non-yielding assets",real_yields,-1,"explicit opportunity-cost story" -"Treasury yields sink as investors flock to bonds",real_yields,1,"falling yields support gold" -"Real yields turn negative as inflation outpaces rates",real_yields,1,"negative real yields are gold's best backdrop" -"Bond rally drives 10-year yield to lowest level in a year",real_yields,1,"falling yields" -"Geopolitical tensions escalate in Middle East, investors seek safety",safe_haven,1,"safe-haven bid" -"Stocks crater worldwide as banking crisis fears spread",safe_haven,1,"crisis flight to safety" -"Escalating conflict drives flight to safe-haven assets",safe_haven,1,"explicit haven flow" -"Investors dump risk assets after surprise sovereign default",safe_haven,1,"default shock" -"Military escalation on NATO border rattles global markets",safe_haven,1,"geopolitical stress" -"Wall Street plunges 4% in worst session since pandemic",safe_haven,1,"risk-off" -"Currency crisis in emerging markets sparks contagion fears",safe_haven,1,"contagion, haven bid" -"Nuclear rhetoric intensifies, sending investors to havens",safe_haven,1,"extreme geopolitical stress" -"Ceasefire agreement lifts global markets, haven demand fades",risk_on,-1,"haven unwind" -"Stocks roar to record highs as trade deal signed",risk_on,-1,"risk-on drains haven demand" -"Risk appetite returns as banking fears subside",risk_on,-1,"risk-on" -"Global equities rally on strong earnings and easing tensions",risk_on,-1,"risk-on" -"Gold hits record high as central banks keep buying bullion",gold_direct,1,"direct demand" -"Gold ETFs post biggest weekly inflows in three years",gold_direct,1,"investment inflows" -"China's central bank extends gold buying spree to 18th month",gold_direct,1,"official-sector demand" -"Miners struggle to meet gold demand as supply deficit widens",gold_direct,1,"supply deficit" -"Gold slides 2% as investors book profits after record run",gold_direct,-1,"profit-taking pressure" -"Gold tumbles below key support as ETF outflows accelerate",gold_direct,-1,"outflows" -"Bullion demand weakens as Indian jewellery buying stalls",gold_direct,-1,"physical demand soft" -"Speculators slash bullish gold bets as dollar strengthens",gold_direct,-1,"positioning unwind" -"Fed holds rates steady, signals no rate hike on the horizon",negation_traps,1,"dovish hold; keyword layer sees the phrase rate hike and flips it gold-bearish" -"Powell says no rate cuts until inflation shows sustained cooling",negation_traps,-1,"hawkish hold; keyword layer sees rate cut and calls it gold-bullish" -"Recession fears fade as US data streak beats estimates",negation_traps,-1,"fading fear is risk-on; keywords see recession plus beats and cancel out" -"Inflation fails to accelerate, easing pressure on the Fed",negation_traps,1,"disinflation opens door to cuts" -"Fed's Bowman: not yet confident inflation is beaten, cuts premature",negation_traps,-1,"hawkish pushback phrased around negations" -"Central bank stops short of hiking, but warns tightening may resume",negation_traps,-1,"hawkish hold with tightening bias" -"No safe-haven bid for gold despite equity wobble, analysts say",negation_traps,-1,"explicitly negated haven demand" -"Jobs report not as weak as feared, dollar recovers",negation_traps,-1,"less-bad data is dollar-positive" -"US manufacturing output plunges as new orders dry up",inverted_metrics,1,"weak economy is dovish/gold-bullish; keyword layer reads plunges as bearish" -"US factory activity slumps to three-year low",inverted_metrics,1,"weak data; keyword reads slumps as bearish" -"Consumer spending falls for third straight month",inverted_metrics,1,"weak data; keyword reads falls as bearish" -"Private payrolls growth slides to weakest pace since 2020",inverted_metrics,1,"weak jobs; keyword reads slides as bearish" -"Jobless claims hit two-year high as layoffs spread",inverted_metrics,1,"higher claims = weaker economy = gold-bullish" -"US unemployment rate hits 4.5%, highest since 2021",inverted_metrics,1,"higher unemployment = dovish = gold-bullish" -"Lakers clinch playoff berth with overtime win over Suns",distractors,0,"irrelevant" -"New Marvel film smashes box office records on opening weekend",distractors,0,"irrelevant" -"Apple unveils thinner MacBook with faster chip lineup",distractors,0,"irrelevant" -"Scientists discover new deep-sea species off Pacific coast",distractors,0,"irrelevant" -"Heavy rain forecast for the Midwest through the weekend",distractors,0,"irrelevant" -"Streaming service raises subscription prices in Europe",distractors,0,"irrelevant" -"Electric vehicle startup recalls 12,000 cars over software glitch",distractors,0,"irrelevant" -"Local elections see record turnout in several US states",distractors,0,"irrelevant" diff --git a/backtest/research/open_trade_bursts.py b/backtest/research/open_trade_bursts.py deleted file mode 100644 index 7ebef39..0000000 --- a/backtest/research/open_trade_bursts.py +++ /dev/null @@ -1,150 +0,0 @@ -"""What do violent bars do to OPEN trades, and can we protect them? Analysis tooling only. - -Replays every trade of a book on the raw bars with the backtester's exit model (SL-first, -gap-through at open, close-only trail ratchet, 300-bar timeout, $0.65 cost) and compares: - base : reproduce the book (validation: must match r_multiple for almost every trade) - flat_data : exit at the OPEN of the first bar whose close-hour enters {12,13} UTC (US data) - flat_asia : same for close-hour {0,1} UTC (Asian open) - tight_data : entering {12,13}, hold a protective stop 0.5R below the best price for the window - tight_asia : same for {0,1} - react_exit : a burst bar (range >= 3x prior ATR14) closes AGAINST the trade -> exit next open - react_tight : after an opposing burst, protective stop 0.5R below the best price for the rest -Plus a damage table: what happens to a trade when the first burst hits it (with vs against). - - python backtest/research/open_trade_bursts.py BOOK.csv PARQUET BAR_MINUTES ARM DIST -""" -import sys -import numpy as np, pandas as pd - -COST = 0.65; MAX_BARS = 300; K = 3.0; PROT = 0.5 - - -def wilder_atr(df, period=14): - pc = df["Close"].shift(1) - tr = pd.concat([df["High"] - df["Low"], (df["High"] - pc).abs(), (df["Low"] - pc).abs()], axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def simulate(bars, i0, direction, entry, sl, arm, dist, variant, hours_flat=(), hours_tight=(), flat_mask=None, tight_mask=None): - """bars: dict of numpy arrays; i0 = index of the entry bar. Returns (exit_price, bars_held, reason, flag).""" - O, H, L, C, burst, chour = bars["O"], bars["H"], bars["L"], bars["C"], bars["burst"], bars["chour"] - d = 1.0 if direction == "BUY" else -1.0 - risk = abs(entry - sl); stop = sl; peak = entry; flag = 0 - n = len(O); tight = False; tight_until = -1; exit_next = False - for j in range(i0, min(n, i0 + MAX_BARS)): - if exit_next: - return O[j], j - i0, "REACT", flag - h = chour[j] - in_flat = h in hours_flat; in_tight = h in hours_tight - if variant.startswith("flat") and in_flat: - return O[j], j - i0, "FLAT", 1 - if variant == "mask_flat" and flat_mask is not None and flat_mask[j]: - return O[j], j - i0, "FLAT", 1 - if variant.startswith("tight") and in_tight: - tight = True; tight_until = j; flag = 1 - if variant == "mask_tight" and tight_mask is not None and tight_mask[j]: - tight = True; tight_until = j; flag = 1 - # stop check (SL first, gap-through at open) - if d > 0: - if O[j] <= stop: return O[j], j - i0, "SL", flag - if L[j] <= stop: return stop, j - i0, "SL", flag - else: - if O[j] >= stop: return O[j], j - i0, "SL", flag - if H[j] >= stop: return stop, j - i0, "SL", flag - # update peak / trail at bar close - peak = max(peak, H[j]) if d > 0 else min(peak, L[j]) - fav = d * (peak - entry) - if fav >= arm * risk: - stop = max(stop, peak - dist * risk) if d > 0 else min(stop, peak + dist * risk) - if tight and (variant == "react_tight" or j <= tight_until or in_tight): - stop = max(stop, peak - PROT * risk) if d > 0 else min(stop, peak + PROT * risk) - if variant.startswith("react") and burst[j] and d * (C[j] - O[j]) < 0: - flag = 1 - if variant == "react_exit": exit_next = True - else: tight = True - j = min(n - 1, i0 + MAX_BARS - 1) - return C[j], j - i0, "TIMEOUT", flag - - -def r_of(direction, entry, sl, exit_price): - d = 1.0 if direction == "BUY" else -1.0 - return (d * (exit_price - entry) - COST) / abs(entry - sl) - - -def stats(r): - r = np.asarray(r); eq = np.concatenate([[0.0], np.cumsum(r)]); dd = (np.maximum.accumulate(eq) - eq).max() - pf = r[r > 0].sum() / max(-r[r < 0].sum(), 1e-9) - return dict(n=len(r), total=r.sum(), mean=r.mean(), wr=100 * (r > 0).mean(), pf=pf, dd=dd) - - -def main(): - book_csv, pq, bm, arm, dist = sys.argv[1], sys.argv[2], int(sys.argv[3]), float(sys.argv[4]), float(sys.argv[5]) - book = pd.read_csv(book_csv); book["entry_time"] = pd.to_datetime(book["entry_time"], utc=True, format="mixed") - px = pd.read_parquet(pq) - atr_prev = wilder_atr(px).shift(1) - bars = dict(O=px["Open"].values, H=px["High"].values, L=px["Low"].values, C=px["Close"].values, - burst=((px["High"] - px["Low"]) >= K * atr_prev).fillna(False).values, - chour=(px.index + pd.Timedelta(minutes=bm)).hour.values) - idx = pd.Index(px.index) - pos = idx.get_indexer(book["entry_time"]) - ok = pos >= 0 - print(f"{book_csv}: {len(book)} trades, {ok.sum()} matched to bars; arm {arm} dist {dist}") - book = book[ok].reset_index(drop=True); pos = pos[ok] - half = np.where(np.arange(len(book)) < len(book) // 2, 1, 2) - variants = {"base": {}, "flat_data": dict(hours_flat=(12, 13)), "flat_asia": dict(hours_flat=(0, 1)), - "tight_data": dict(hours_tight=(12, 13)), "tight_asia": dict(hours_tight=(0, 1)), - "react_exit": {}, "react_tight": {}} - results = {} - for v, kw in variants.items(): - rs, flags = [], [] - for i, t in book.iterrows(): - xp, held, reason, flag = simulate(bars, pos[i], t.direction, t.entry, t.sl, arm, dist, v, **kw) - rs.append(r_of(t.direction, t.entry, t.sl, xp)); flags.append(flag) - results[v] = (np.array(rs), np.array(flags)) - base = results["base"][0] - match = np.isclose(base, book["r_multiple"].values, atol=0.02).mean() - print(f"validation: replay reproduces the book's r_multiple (±0.02) on {100*match:.1f}% of trades; " - f"sum replay {base.sum():+.2f} vs book {book.r_multiple.sum():+.2f}") - print("\n== PROTECTION VARIANTS (whole book; 'affected' = trades where the rule fired) ==") - print(f"{'variant':12s} {'n':>5s} {'affected':>8s} {'total R':>9s} {'Δ vs base':>9s} {'PF':>5s} {'maxDD':>6s} {'WR%':>5s} | affected only: base R -> variant R | Δ h1 / Δ h2") - b = stats(base) - for v, (r, f) in results.items(): - s = stats(r); aff = f == 1 - d1 = r[half == 1].sum() - base[half == 1].sum(); d2 = r[half == 2].sum() - base[half == 2].sum() - print(f"{v:12s} {s['n']:5d} {aff.sum():8d} {s['total']:+9.2f} {s['total']-b['total']:+9.2f} {s['pf']:5.2f} {s['dd']:6.2f} {s['wr']:5.1f} | " - f"{base[aff].sum():+8.2f} -> {r[aff].sum():+8.2f} (n={aff.sum()}) | {d1:+.2f} / {d2:+.2f}") - # damage table: first burst while open (base path), with vs against - print("\n== DAMAGE: first violent bar that hits an OPEN trade (base exits) ==") - rows = [] - for i, t in book.iterrows(): - d = 1.0 if t.direction == "BUY" else -1.0; risk = abs(t.entry - t.sl) - xp, held, reason, _ = simulate(bars, pos[i], t.direction, t.entry, t.sl, arm, dist, "base") - j0 = pos[i]; j1 = j0 + held - for j in range(j0 + 1, j1 + 1): # bursts after the entry bar, up to and including the exit bar - if bars["burst"][j]: - against = d * (bars["C"][j] - bars["O"][j]) < 0 - mtm_before = (d * (bars["C"][j - 1] - t.entry) - COST) / risk - mtm_after = (d * (bars["C"][j] - t.entry) - COST) / risk - rows.append(dict(against=against, bars_open=j - j0, mtm_before=mtm_before, mtm_after=mtm_after, - final=r_of(t.direction, t.entry, t.sl, xp), ended_here=(j == j1), hour=bars["chour"][j], - sched=bars["chour"][j] in (0, 1, 12, 13))) - break - dmg = pd.DataFrame(rows) - if len(dmg): - g = dmg.groupby("against").agg(n=("final", "size"), bars_open_med=("bars_open", "median"), - mtm_before=("mtm_before", "mean"), mtm_after=("mtm_after", "mean"), - final=("final", "mean"), ended_on_that_bar_pct=("ended_here", lambda s: 100 * s.mean()), - in_sched_hours_pct=("sched", lambda s: 100 * s.mean())) - print(g.round(3).to_string()) - ag = dmg[dmg.against] - print(f"\nopposing bursts: {len(ag)} trades ({100*len(ag)/len(book):.1f}% of the book); " - f"mean R just before {ag.mtm_before.mean():+.3f} -> just after {ag.mtm_after.mean():+.3f} -> final {ag.final.mean():+.3f}; " - f"{100*(ag.final<0).mean():.0f}% end as losers; {100*ag.ended_here.mean():.0f}% are stopped ON that bar") - print(f" those with an open PROFIT before the burst (mtm>0): n={int((ag.mtm_before>0).sum())}, final mean {ag[ag.mtm_before>0].final.mean():+.3f}, " - f"{100*(ag[ag.mtm_before>0].final<0).mean():.0f}% end as losers") - print(f" by hour of the opposing burst (n, mean final R): " + ", ".join(f"{h:02d}:{n}/{m:+.2f}" for h, n, m in - ag.groupby("hour").final.agg(["size", "mean"]).reset_index().itertuples(index=False))) - - -if __name__ == "__main__": - main() diff --git a/backtest/research/panel_payload_drytest_2026-08-15.jsonl b/backtest/research/panel_payload_drytest_2026-08-15.jsonl deleted file mode 100644 index 022f7e8..0000000 --- a/backtest/research/panel_payload_drytest_2026-08-15.jsonl +++ /dev/null @@ -1,7 +0,0 @@ -{"probe": "P1 coherent-bullish", "payload": {"brief": {"pair": "XAU/USD", "timeframe": "15min", "direction": "BUY", "quality": "A", "score": 38.5, "confidence": 62, "price": 2000.0, "market_regime": "trending_up", "volatility_regime": "normal", "mtf_agreement": true}, "indicators": {"ema_trend": {"signal": "STRONG_BUY", "confidence": 90, "value": 1.0}, "rsi": {"signal": "BUY", "confidence": 65, "value": 58.0}, "macd": {"signal": "STRONG_BUY", "confidence": 80, "value": 1.25}, "bollinger": {"signal": "BUY", "confidence": 60, "value": 0.7}, "adx": {"signal": "BUY", "confidence": 70, "value": 32.0}, "roc": {"signal": "BUY", "confidence": 55, "value": 0.35}, "keltner": {"signal": "BUY", "confidence": 65, "value": 3.1}, "candlestick": {"signal": "BUY", "confidence": 60, "value": 2.0}}, "mtf": {"5min": {"signal": "BUY", "score": 30.0}, "1h": {"signal": "STRONG_BUY", "score": 45.0}}, "key_levels": {"resistance": 2012.0, "support": 1985.0}, "exhaustion": 0, "candles": {"15min": {"ref_close": 2000.0, "atr": 5.0, "bars": [[-2.4, -2.2, -2.4, -2.3], [-2.3, -2.1, -2.3, -2.2], [-2.2, -2.0, -2.2, -2.0], [-2.0, -1.9, -2.1, -1.9], [-1.9, -1.8, -2.0, -1.8], [-1.8, -1.6, -1.8, -1.7], [-1.7, -1.5, -1.7, -1.6], [-1.6, -1.4, -1.6, -1.4], [-1.4, -1.3, -1.5, -1.3], [-1.3, -1.2, -1.4, -1.2], [-1.2, -1.0, -1.2, -1.1], [-1.1, -0.9, -1.1, -1.0], [-1.0, -0.8, -1.0, -0.8], [-0.8, -0.7, -0.9, -0.7], [-0.7, -0.6, -0.8, -0.6], [-0.6, -0.4, -0.6, -0.5], [-0.5, -0.3, -0.5, -0.4], [-0.4, -0.2, -0.4, -0.2], [-0.2, -0.1, -0.3, -0.1], [-0.1, 0.0, -0.2, 0.0]]}}}, "raw_reply": {"stance": "support", "confidence": 70, "note": "The trend is up and all signs agree, so buying fits the flow."}} -{"probe": "P2 bearish-vs-BUY-brief", "payload": {"brief": {"pair": "XAU/USD", "timeframe": "15min", "direction": "BUY", "quality": "A", "score": 38.5, "confidence": 62, "price": 2000.0, "market_regime": "trending_down", "volatility_regime": "normal", "mtf_agreement": false}, "indicators": {"ema_trend": {"signal": "STRONG_SELL", "confidence": 85, "value": 0.1}, "rsi": {"signal": "SELL", "confidence": 70, "value": 74.0}, "macd": {"signal": "STRONG_SELL", "confidence": 80, "value": -1.4}, "bollinger": {"signal": "SELL", "confidence": 60, "value": 0.95}, "adx": {"signal": "SELL", "confidence": 70, "value": 35.0}, "roc": {"signal": "SELL", "confidence": 60, "value": -0.5}, "keltner": {"signal": "SELL", "confidence": 65, "value": -2.8}, "candlestick": {"signal": "SELL", "confidence": 55, "value": -2.0}}, "mtf": {"5min": {"signal": "SELL", "score": -28.0}, "1h": {"signal": "STRONG_SELL", "score": -41.0}}, "key_levels": {"resistance": 2012.0, "support": 1985.0}, "exhaustion": 3, "candles": {"15min": {"ref_close": 2000.0, "atr": 5.0, "bars": [[2.4, 2.4, 2.2, 2.3], [2.3, 2.3, 2.1, 2.2], [2.2, 2.2, 2.0, 2.0], [2.0, 2.1, 1.9, 1.9], [1.9, 2.0, 1.8, 1.8], [1.8, 1.8, 1.6, 1.7], [1.7, 1.7, 1.5, 1.6], [1.6, 1.6, 1.4, 1.4], [1.4, 1.5, 1.3, 1.3], [1.3, 1.4, 1.2, 1.2], [1.2, 1.2, 1.0, 1.1], [1.1, 1.1, 0.9, 1.0], [1.0, 1.0, 0.8, 0.8], [0.8, 0.9, 0.7, 0.7], [0.7, 0.8, 0.6, 0.6], [0.6, 0.6, 0.4, 0.5], [0.5, 0.5, 0.3, 0.4], [0.4, 0.4, 0.2, 0.2], [0.2, 0.3, 0.1, 0.1], [0.1, 0.2, -0.0, 0.0]]}}}, "raw_reply": {"stance": "oppose", "confidence": 85, "note": "The price is falling and every indicator says sell, so buying fights the trend."}} -{"probe": "P3 conflicting", "payload": {"brief": {"pair": "XAU/USD", "timeframe": "15min", "direction": "BUY", "quality": "A", "score": 12.0, "confidence": 35, "price": 2000.0, "market_regime": "ranging", "volatility_regime": "normal", "mtf_agreement": false}, "indicators": {"ema_trend": {"signal": "BUY", "confidence": 55, "value": 0.6}, "rsi": {"signal": "NEUTRAL", "confidence": 40, "value": 51.0}, "macd": {"signal": "SELL", "confidence": 55, "value": -0.3}, "bollinger": {"signal": "NEUTRAL", "confidence": 35, "value": 0.5}, "adx": {"signal": "NEUTRAL", "confidence": 40, "value": 18.0}, "roc": {"signal": "SELL", "confidence": 50, "value": -0.1}, "keltner": {"signal": "BUY", "confidence": 50, "value": 0.8}, "candlestick": {"signal": "NEUTRAL", "confidence": 30, "value": 0.0}}, "mtf": {"5min": {"signal": "NEUTRAL", "score": 4.0}, "1h": {"signal": "NEUTRAL", "score": -3.0}}, "key_levels": {}, "exhaustion": 0, "candles": {"15min": {"ref_close": 2000.0, "atr": 5.0, "bars": [[0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0], [0.0, 0.4, -0.1, 0.3], [0.3, 0.4, -0.1, 0.0]]}}}, "raw_reply": {"stance": "neutral", "confidence": 30, "note": "Mixed signals with no clear direction, so cannot strongly support or oppose."}} -{"probe": "P4 empty-evidence", "payload": {"brief": {"pair": "XAU/USD", "timeframe": "15min", "direction": "BUY", "quality": "A", "score": 38.5, "confidence": 62, "price": 2000.0, "market_regime": "trending_up", "volatility_regime": "normal", "mtf_agreement": true}, "indicators": {}, "mtf": {}, "key_levels": {}, "exhaustion": 0}, "raw_reply": {"stance": "neutral", "confidence": 20, "note": "Not enough data to judge the trade direction."}} -{"probe": "P5 hallucination-trap", "payload": {"brief": {"pair": "XAU/USD", "timeframe": "15min", "direction": "BUY", "quality": "A", "score": 38.5, "confidence": 62, "price": 2000.0, "market_regime": "trending_up", "volatility_regime": "normal", "mtf_agreement": true}, "indicators": {"ema_trend": {"signal": "STRONG_BUY", "confidence": 90, "value": 1.0}, "rsi": {"signal": "BUY", "confidence": 65, "value": 58.0}, "macd": {"signal": "STRONG_BUY", "confidence": 80, "value": 1.25}, "bollinger": {"signal": "BUY", "confidence": 60, "value": 0.7}, "adx": {"signal": "BUY", "confidence": 70, "value": 32.0}, "roc": {"signal": "BUY", "confidence": 55, "value": 0.35}, "keltner": {"signal": "BUY", "confidence": 65, "value": 3.1}, "candlestick": {"signal": "BUY", "confidence": 60, "value": 2.0}}, "mtf": {"5min": {"signal": "BUY", "score": 30.0}, "1h": {"signal": "STRONG_BUY", "score": 45.0}}, "key_levels": {}, "exhaustion": 0}, "raw_reply": {"stance": "support", "confidence": 70, "note": "The trend is up and all signs agree, so buying fits the flow."}} -{"probe": "P6 output-discipline", "payload": {}, "raw_reply": null} -{"probe": "P7 synthesizer", "payload": {"direction": "BUY", "takes": [{"persona": "macro", "stance": "support", "confidence": 70, "note": "evidence aligned"}, {"persona": "technical", "stance": "support", "confidence": 80, "note": "evidence aligned"}, {"persona": "risk", "stance": "support", "confidence": 65, "note": "evidence aligned"}, {"persona": "contrarian", "stance": "support", "confidence": 60, "note": "evidence aligned"}]}, "raw_reply": {"verdict": "AGREE", "confidence": 85, "rationale": "All four analysts support buying, with high confidence and consistent evidence. No one opposes, so the panel clearly backs the trade."}} diff --git a/backtest/research/signal_parity_2026-08-14.md b/backtest/research/signal_parity_2026-08-14.md index 7705890..48922fc 100644 --- a/backtest/research/signal_parity_2026-08-14.md +++ b/backtest/research/signal_parity_2026-08-14.md @@ -1,7 +1,7 @@ # Signal-Level Replay Parity — Oanda vs Tiingo (Phase 2) **Date:** 2026-08-14 -**Tool:** `scripts/signal_parity_study.py` (replays real `analyze_from_dataframes`, news off) +**Tool:** `scripts/signal_parity_study.py` (script removed 2026-09-06, in git history) (replays real `analyze_from_dataframes`, news off) **Window:** 2025-08-14 → 2026-08-14 (12 months); M15 stride 8, M5 stride 24 → ~2,900 sampled decisions each **Preceding:** Phase 1 price-diff study (`feed_divergence_2026-08-14.md`) diff --git a/backtest/research/sizing_model.py b/backtest/research/sizing_model.py deleted file mode 100644 index 47cd7f7..0000000 --- a/backtest/research/sizing_model.py +++ /dev/null @@ -1,961 +0,0 @@ -"""Stage-D stake-sizing model driver (2026-09 campaign). - -Walk-forward fit + evaluation of a per-signal stake multiplier on a trade -book exported by ``gpu_backtest.py --export-features`` (63 base columns + -``stake_multiplier``/``r_sized`` + 65 ``f_*`` decision-time features). - -The protocol implemented here is the one pre-registered in -``backtest/research/sizing_campaign_2026-09.md`` and is NOT to be varied to -rescue a result: - -* expanding walk-forward, 12-month burn-in, calendar-quarter refits, a - ``purge_bars × bar_minutes`` gap between the end of train and the start of - the test quarter, standardisation fit on train only; -* models: ridge on winsorised R (primary), L2 logistic on ``R > 0`` - (secondary), a one-feature ``f_is_buy`` simplicity baseline, an - exhaustion-block-only ablation, and an optional lightgbm upper bound; -* size map ``m = round_0.05(clip(normaliser × (0.5 + clip((z−lo)/(hi−lo),0,1)), - 0.5, 1.5))`` with ``lo``/``hi``/``normaliser`` calibrated on TRAIN - predictions only; -* a label-shuffle null (training labels permuted, test labels untouched); -* six acceptance clauses, printed PASS/FAIL individually. - -Usage: - python backtest/research/sizing_model.py --book BOOK.csv --bar-minutes 5 \ - --features f_a,f_b,... [--model ridge|logistic] [--out DIR] \ - [--n-shuffle 50] [--skip-lgbm] \ - [--write-artifact PATH --tf 5min --confirm-tfs 15min,1h] - -Analysis tooling only — never imported by the live code. -""" -from __future__ import annotations - -import argparse -import hashlib -import json -import math -import subprocess -import sys -import warnings -from pathlib import Path -from typing import Dict, List, Optional, Sequence, Tuple - -import numpy as np -import pandas as pd - -PROJECT_ROOT = Path(__file__).resolve().parents[2] -if str(PROJECT_ROOT) not in sys.path: - sys.path.insert(0, str(PROJECT_ROOT)) - -from position_sizing import FEATURE_ORDER, FEATURE_VERSION # noqa: E402 (read-only import) - -# ── Pre-registered constants (flag any change loudly) ────────────────── -WINSOR_LO, WINSOR_HI = -1.5, 4.0 -LAMBDA_GRID: Tuple[float, ...] = (1.0, 10.0, 100.0, 1000.0) -CV_FOLDS = 5 -MIN_TRAIN = 150 -MAP_Q_LO, MAP_Q_HI = 0.10, 0.90 -MAP_OUT_LO, MAP_OUT_HI = 0.5, 1.5 -MAP_CLIP_LO, MAP_CLIP_HI = 0.5, 1.5 -MAP_ROUND_TO = 0.05 -MEAN_MULT_TOL = 0.05 -DD_TOL = 1.10 -PF_FLOOR = 1.3 -NEWTON_MAX_ITER = 50 -NEWTON_TOL = 1e-8 - -#: The exhaustion-block ablation's fixed feature list. -EXHAUSTION_FEATURES: Tuple[str, ...] = ( - "f_swing_dist_atr", - "f_ema21_dist_atr", - "f_ema200_dist_atr", - "f_exhaustion_count", - "f_penalty_total", - "f_tag_bb_overextended", - "f_tag_rsi_extended", - "f_tag_no_pullback", - "f_tag_exhaustion", -) -ISBUY_FEATURES: Tuple[str, ...] = ("f_is_buy",) - -#: lightgbm never ships; running the full shuffle null through 200-tree fits -#: costs minutes for a number nobody acts on, so its null is capped here. -#: DEVIATION FROM THE PROTOCOL CONSTANT — printed in the summary when used. -LGBM_MAX_SHUFFLE = 10 - -LGBM_PARAMS = dict( - n_estimators=200, - learning_rate=0.03, - num_leaves=7, - min_child_samples=30, - subsample=0.8, - colsample_bytree=0.8, - reg_lambda=10, -) - -_LINES: List[str] = [] - - -def say(msg: str = "") -> None: - """Print and tee into the summary buffer.""" - print(msg) - _LINES.append(msg) - - -# ══════════════════════════════════════════════════════════════════════ -# Book loading -# ══════════════════════════════════════════════════════════════════════ -def load_book(path: Path) -> pd.DataFrame: - """Read a feature book, parse ``entry_time`` UTC, drop NaN-R rows.""" - df = pd.read_csv(path) - if "entry_time" not in df.columns or "r_multiple" not in df.columns: - raise SystemExit(f"{path}: not a trade book (no entry_time/r_multiple)") - df["entry_time"] = pd.to_datetime(df["entry_time"], utc=True, format="mixed") - n0 = len(df) - bad = ~np.isfinite(pd.to_numeric(df["r_multiple"], errors="coerce").to_numpy(float)) - if bad.any(): - say(f"WARNING: dropping {int(bad.sum())}/{n0} rows with non-finite r_multiple") - df = df.loc[~bad].copy() - df["r_multiple"] = df["r_multiple"].astype(float) - df = df.sort_values("entry_time", kind="mergesort").reset_index(drop=True) - return df - - -def resolve_features(df: pd.DataFrame, names: Sequence[str], label: str) -> List[str]: - """Validate a requested feature list against the book and FEATURE_ORDER.""" - missing = [n for n in names if n not in df.columns] - if missing: - raise SystemExit(f"{label}: columns absent from book: {', '.join(missing)}") - unknown = [n for n in names if n.startswith("f_") and n not in FEATURE_ORDER] - if unknown: - say(f"NOTE: {label}: {', '.join(unknown)} not in position_sizing.FEATURE_ORDER") - return list(names) - - -def sha256_file(path: Path) -> str: - h = hashlib.sha256() - with open(path, "rb") as fh: - for chunk in iter(lambda: fh.read(1 << 20), b""): - h.update(chunk) - return h.hexdigest() - - -def git_commit() -> str: - try: - return subprocess.check_output( - ["git", "rev-parse", "HEAD"], cwd=PROJECT_ROOT, text=True).strip() - except Exception: # pragma: no cover - research tool - return "unknown" - - -# ══════════════════════════════════════════════════════════════════════ -# Walk-forward geometry -# ══════════════════════════════════════════════════════════════════════ -def quarter_starts(first: pd.Timestamp, last: pd.Timestamp) -> List[pd.Timestamp]: - """Every Jan/Apr/Jul/Oct 1 00:00 UTC in ``[first, last]`` inclusive.""" - out: List[pd.Timestamp] = [] - year = first.year - while True: - for month in (1, 4, 7, 10): - ts = pd.Timestamp(year=year, month=month, day=1, tz="UTC") - if ts < first: - continue - if ts > last: - return out - out.append(ts) - year += 1 - - -def quarter_label(ts: pd.Timestamp) -> str: - return f"{ts.year}Q{(ts.month - 1) // 3 + 1}" - - -def build_folds(times: np.ndarray, n_folds: int) -> List[np.ndarray]: - """Contiguous-by-time index blocks (rows are already time-sorted).""" - n = len(times) - edges = np.linspace(0, n, n_folds + 1).astype(int) - return [np.arange(edges[i], edges[i + 1]) for i in range(n_folds) - if edges[i + 1] > edges[i]] - - -# ══════════════════════════════════════════════════════════════════════ -# Standardisation -# ══════════════════════════════════════════════════════════════════════ -def fit_standardiser(X: np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: - """Return (mean, scale, keep) from a training matrix. - - NaNs are ignored when computing the mean (they are later filled with it). - ``scale`` is the population std with zeros replaced by 1.0; ``keep`` is - False for zero-variance-in-train columns, which are dropped from the fit - and carry a coefficient of 0. - """ - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=RuntimeWarning) - mean = np.nanmean(X, axis=0) - std = np.nanstd(X, axis=0) - mean = np.where(np.isfinite(mean), mean, 0.0) - std = np.where(np.isfinite(std), std, 0.0) - keep = std > 0 - scale = np.where(keep, std, 1.0) - return mean, scale, keep - - -def apply_standardiser(X: np.ndarray, mean: np.ndarray, scale: np.ndarray) -> np.ndarray: - """Fill NaN with the TRAIN mean, then standardise.""" - Z = np.array(X, dtype=float, copy=True) - bad = ~np.isfinite(Z) - if bad.any(): - Z[bad] = np.take(mean, np.where(bad)[1]) - return (Z - mean) / scale - - -# ══════════════════════════════════════════════════════════════════════ -# Models (numpy only) -# ══════════════════════════════════════════════════════════════════════ -def _solve(A: np.ndarray, b: np.ndarray) -> np.ndarray: - try: - return np.linalg.solve(A, b) - except np.linalg.LinAlgError: # pragma: no cover - degenerate design - return np.linalg.lstsq(A, b, rcond=None)[0] - - -def fit_ridge(X: np.ndarray, y: np.ndarray, lam: float) -> Tuple[np.ndarray, float]: - """Closed-form ridge with an UNPENALISED intercept. - - Centring X and y is exactly equivalent to appending a 1-column carrying - zero penalty. Returns ``(coef, intercept)`` with ``pred = intercept + X @ coef``. - """ - if X.shape[1] == 0: - return np.zeros(0), float(y.mean()) if len(y) else 0.0 - xm = X.mean(axis=0) - ym = float(y.mean()) - Xc = X - xm - w = _solve(Xc.T @ Xc + lam * np.eye(X.shape[1]), Xc.T @ (y - ym)) - return w, ym - float(xm @ w) - - -def fit_logistic(X: np.ndarray, y: np.ndarray, lam: float, - max_iter: int = NEWTON_MAX_ITER, - tol: float = NEWTON_TOL) -> Tuple[np.ndarray, float, float]: - """L2 logistic via Newton-Raphson, intercept unpenalised. - - Returns ``(coef, intercept, grad_norm)`` where ``grad_norm`` is the - infinity-norm of the penalised gradient at the returned point. - """ - n, p = X.shape - A = np.hstack([np.ones((n, 1)), X]) - pen = np.zeros(p + 1) - pen[1:] = lam - beta = np.zeros(p + 1) - # Warm-start the intercept at the empirical log-odds. - frac = float(np.clip(y.mean(), 1e-6, 1 - 1e-6)) - beta[0] = math.log(frac / (1 - frac)) - grad = np.zeros(p + 1) - for _ in range(max_iter): - eta = A @ beta - prob = 1.0 / (1.0 + np.exp(-np.clip(eta, -35, 35))) - grad = A.T @ (y - prob) - pen * beta - W = np.clip(prob * (1 - prob), 1e-10, None) - H = A.T @ (A * W[:, None]) + np.diag(pen) - step = _solve(H, grad) - beta = beta + step - if np.max(np.abs(step)) < tol: - break - eta = A @ beta - prob = 1.0 / (1.0 + np.exp(-np.clip(eta, -35, 35))) - grad = A.T @ (y - prob) - pen * beta - return beta[1:], float(beta[0]), float(np.max(np.abs(grad))) - - -def predict_linear(X: np.ndarray, coef: np.ndarray, intercept: float) -> np.ndarray: - if X.shape[1] == 0: - return np.full(len(X), intercept, dtype=float) - return intercept + X @ coef - - -def sigmoid(z: np.ndarray) -> np.ndarray: - return 1.0 / (1.0 + np.exp(-np.clip(z, -35, 35))) - - -def log_loss(y: np.ndarray, p: np.ndarray) -> float: - p = np.clip(p, 1e-12, 1 - 1e-12) - return float(-np.mean(y * np.log(p) + (1 - y) * np.log(1 - p))) - - -def choose_lambda(X: np.ndarray, y: np.ndarray, kind: str, - grid: Sequence[float] = LAMBDA_GRID, - n_folds: int = CV_FOLDS) -> Tuple[float, Dict[float, float]]: - """5-fold time-contiguous CV inside the training window.""" - folds = build_folds(np.arange(len(y)), n_folds) - if X.shape[1] == 0 or len(folds) < 2: - return float(grid[0]), {} - scores: Dict[float, float] = {} - for lam in grid: - vals: List[float] = [] - for hold in folds: - mask = np.ones(len(y), dtype=bool) - mask[hold] = False - if mask.sum() < 2: - continue - if kind == "logistic": - ytr = y[mask] - if ytr.min() == ytr.max(): # single-class fold - p = np.full(len(hold), float(np.clip(ytr.mean(), 1e-6, 1 - 1e-6))) - else: - c, b, _ = fit_logistic(X[mask], ytr, lam) - p = sigmoid(predict_linear(X[hold], c, b)) - vals.append(log_loss(y[hold], p)) - else: - c, b = fit_ridge(X[mask], y[mask], lam) - resid = y[hold] - predict_linear(X[hold], c, b) - vals.append(float(np.mean(resid ** 2))) - scores[float(lam)] = float(np.mean(vals)) if vals else float("inf") - best = min(scores, key=lambda k: scores[k]) - return best, scores - - -def lgbm_available() -> bool: - try: - import lightgbm # noqa: F401 - return True - except Exception: - return False - - -def fit_lgbm(X: np.ndarray, y: np.ndarray, seed: int): - import lightgbm as lgb - model = lgb.LGBMRegressor(random_state=seed, verbose=-1, **LGBM_PARAMS) - model.fit(X, y) - return model - - -# ══════════════════════════════════════════════════════════════════════ -# Size map -# ══════════════════════════════════════════════════════════════════════ -def round_to(x, step: float = MAP_ROUND_TO) -> np.ndarray: - """Round to the nearest ``step`` and kill float dust (0.05 → 2 dp).""" - decimals = max(0, int(round(-math.log10(step)))) + 1 - return np.round(np.round(np.asarray(x, dtype=float) / step) * step, decimals) - - -def calibrate_map(z_train: np.ndarray) -> Dict[str, float]: - """lo/hi/normaliser from TRAIN predictions only.""" - lo = float(np.quantile(z_train, MAP_Q_LO)) - hi = float(np.quantile(z_train, MAP_Q_HI)) - if not np.isfinite(lo) or not np.isfinite(hi) or hi <= lo: - return {"lo": lo, "hi": hi, "normalizer": 1.0, "degenerate": True} - raw = MAP_OUT_LO + (MAP_OUT_HI - MAP_OUT_LO) * np.clip((z_train - lo) / (hi - lo), 0, 1) - mean_raw = float(np.mean(raw)) - norm = 1.0 / mean_raw if mean_raw > 0 else 1.0 - return {"lo": lo, "hi": hi, "normalizer": norm, "degenerate": False} - - -def apply_map(z: np.ndarray, cal: Dict[str, float]) -> np.ndarray: - z = np.asarray(z, dtype=float) - if cal.get("degenerate"): - return np.ones(len(z)) - lo, hi, norm = cal["lo"], cal["hi"], cal["normalizer"] - raw = MAP_OUT_LO + (MAP_OUT_HI - MAP_OUT_LO) * np.clip((z - lo) / (hi - lo), 0, 1) - return round_to(np.clip(raw * norm, MAP_CLIP_LO, MAP_CLIP_HI)) - - -# ══════════════════════════════════════════════════════════════════════ -# Metrics -# ══════════════════════════════════════════════════════════════════════ -def max_drawdown(r: np.ndarray) -> float: - """0-prepended cumulative-R drawdown (gpu_backtest.compute_metrics).""" - r = np.asarray(r, dtype=float) - if len(r) == 0: - return 0.0 - cum = np.concatenate(([0.0], np.cumsum(r))) - return float((np.maximum.accumulate(cum) - cum).max()) - - -def profit_factor(r: np.ndarray) -> float: - r = np.asarray(r, dtype=float) - gp = float(r[r > 0].sum()) if (r > 0).any() else 0.0 - gl = float(-r[r < 0].sum()) if (r < 0).any() else 0.0 - return gp / gl if gl > 0 else float("inf") - - -def multiplier_hist(m: np.ndarray) -> pd.DataFrame: - """Counts in 0.1-wide bins from 0.5 to 1.5. - - ``np.histogram`` already closes the final bin on the right, so an - exactly-1.5 multiplier lands in [1.4, 1.5] once and the counts sum to - ``len(m)``. - """ - edges = np.round(np.arange(MAP_OUT_LO, MAP_OUT_HI + 1e-9, 0.1), 2) - counts, _ = np.histogram(np.asarray(m, dtype=float), bins=edges) - counts = counts.astype(int) - return pd.DataFrame({ - "bin_lo": edges[:-1], "bin_hi": edges[1:], "count": counts, - "pct": np.where(len(m), counts / max(len(m), 1) * 100, 0.0), - }) - - -# ══════════════════════════════════════════════════════════════════════ -# Walk-forward driver -# ══════════════════════════════════════════════════════════════════════ -def walk_forward(df: pd.DataFrame, features: Sequence[str], model: str, - bar_minutes: int, burn_in_months: int, purge_bars: int, - seed: int, y_train_override: Optional[np.ndarray] = None, - verbose: bool = True) -> Dict: - """One full expanding walk-forward pass. - - ``y_train_override`` (full-book length, aligned to ``df``) replaces the - TRAINING labels only — this is how the shuffle null is run. Test labels - always come from the real ``r_multiple``. - """ - times = df["entry_time"].to_numpy() - r_all = df["r_multiple"].to_numpy(float) - r_train_src = r_all if y_train_override is None else np.asarray(y_train_override, float) - X_all = df[list(features)].apply(pd.to_numeric, errors="coerce").to_numpy(float) \ - if features else np.zeros((len(df), 0)) - - book_start = df["entry_time"].iloc[0] - book_end = df["entry_time"].iloc[-1] - burn_end = book_start + pd.DateOffset(months=burn_in_months) - purge = pd.Timedelta(minutes=purge_bars * bar_minutes) - - qs = [q for q in quarter_starts(book_start, book_end) if q >= burn_end] - rows: List[Dict] = [] - per_q: List[Dict] = [] - coef_rows: List[Dict] = [] - skipped: List[str] = [] - dropped_seen: set = set() - - for q_start in qs: - q_end = q_start + pd.DateOffset(months=3) - train_mask = df["entry_time"] < (q_start - purge) - test_mask = (df["entry_time"] >= q_start) & (df["entry_time"] < q_end) - n_tr, n_te = int(train_mask.sum()), int(test_mask.sum()) - if n_tr < MIN_TRAIN or n_te == 0: - skipped.append(f"{quarter_label(q_start)} (train={n_tr}, test={n_te})") - continue - - tr = np.flatnonzero(train_mask.to_numpy()) - te = np.flatnonzero(test_mask.to_numpy()) - Xtr_raw, Xte_raw = X_all[tr], X_all[te] - mean, scale, keep = fit_standardiser(Xtr_raw) - dropped = [features[i] for i in np.flatnonzero(~keep)] - if verbose and dropped: - tag = (quarter_label(q_start), tuple(dropped)) - if tag not in dropped_seen: - dropped_seen.add(tag) - say(f" WARNING {quarter_label(q_start)}: zero variance in train, " - f"dropped from fit (coef 0): {', '.join(dropped)}") - Xtr = apply_standardiser(Xtr_raw, mean, scale)[:, keep] - Xte = apply_standardiser(Xte_raw, mean, scale)[:, keep] - - r_tr = r_train_src[tr] - lam: Optional[float] = None - if model == "logistic": - y_tr = (r_tr > 0).astype(float) - lam, _ = choose_lambda(Xtr, y_tr, "logistic") - coef, b, _ = fit_logistic(Xtr, y_tr, lam) - z_tr = sigmoid(predict_linear(Xtr, coef, b)) - z_te = sigmoid(predict_linear(Xte, coef, b)) - elif model == "lgbm": - y_tr = np.clip(r_tr, WINSOR_LO, WINSOR_HI) - gbm = fit_lgbm(Xtr, y_tr, seed) - z_tr = np.asarray(gbm.predict(Xtr), dtype=float) - z_te = np.asarray(gbm.predict(Xte), dtype=float) - coef, b = np.zeros(int(keep.sum())), 0.0 - else: # ridge / isbuy / exhaustion - y_tr = np.clip(r_tr, WINSOR_LO, WINSOR_HI) - lam, _ = choose_lambda(Xtr, y_tr, "ridge") - coef, b = fit_ridge(Xtr, y_tr, lam) - z_tr = predict_linear(Xtr, coef, b) - z_te = predict_linear(Xte, coef, b) - - cal = calibrate_map(z_tr) - m_te = apply_map(z_te, cal) - - if model != "lgbm": - full_coef = np.zeros(len(features)) - full_coef[np.flatnonzero(keep)] = coef - for name, c in zip(features, full_coef): - coef_rows.append({"quarter": quarter_label(q_start), "feature": name, - "coef_std": float(c), "lambda": lam, - "dropped": name in dropped}) - coef_rows.append({"quarter": quarter_label(q_start), "feature": "_intercept", - "coef_std": float(b), "lambda": lam, "dropped": False}) - - r_te = r_all[te] - for i, idx in enumerate(te): - rows.append({ - "entry_time": df["entry_time"].iloc[idx], - "r_multiple": float(r_te[i]), - "mult": float(m_te[i]), - "r_sized": float(r_te[i] * m_te[i]), - "quarter": quarter_label(q_start), - "z": float(z_te[i]), - }) - per_q.append({ - "quarter": quarter_label(q_start), - "q_start": q_start, "n_train": n_tr, "n_test": n_te, - "flat_r": float(r_te.sum()), "sized_r": float((r_te * m_te).sum()), - "mean_m": float(m_te.mean()), "lambda": lam, - "map_lo": cal["lo"], "map_hi": cal["hi"], "normalizer": cal["normalizer"], - }) - - oos = pd.DataFrame(rows) - return {"oos": oos, "quarters": pd.DataFrame(per_q), - "coefs": pd.DataFrame(coef_rows), "skipped": skipped, - "quarter_starts": qs} - - -def evaluate(oos: pd.DataFrame) -> Dict: - """Headline OOS numbers for one model's walk-forward output.""" - if oos.empty: - return {"n": 0, "flat_r": 0.0, "sized_r": 0.0, "lift": 0.0} - r = oos["r_multiple"].to_numpy(float) - rs = oos["r_sized"].to_numpy(float) - m = oos["mult"].to_numpy(float) - med = oos["entry_time"].median() - first = (oos["entry_time"] < med).to_numpy() - second = ~first - return { - "n": int(len(oos)), - "flat_r": float(r.sum()), "sized_r": float(rs.sum()), - "lift": float(rs.sum() - r.sum()), - "flat_pf": profit_factor(r), "sized_pf": profit_factor(rs), - "flat_dd": max_drawdown(r), "sized_dd": max_drawdown(rs), - "mean_m": float(m.mean()), "min_m": float(m.min()), "max_m": float(m.max()), - "median_time": med, - "n_h1": int(first.sum()), "n_h2": int(second.sum()), - "flat_h1": float(r[first].sum()), "flat_h2": float(r[second].sum()), - "sized_h1": float(rs[first].sum()), "sized_h2": float(rs[second].sum()), - } - - -def acceptance(ev: Dict, real_lift: float, shuffle_p95: float) -> Dict: - """The six pre-registered clauses.""" - c1 = ev["sized_h1"] > ev["flat_h1"] and ev["sized_h2"] > ev["flat_h2"] - c2 = ev["sized_r"] > ev["flat_r"] - c3 = ev["sized_dd"] <= DD_TOL * ev["flat_dd"] - c4 = (ev["sized_pf"] >= PF_FLOOR) and ev["sized_h1"] > 0 and ev["sized_h2"] > 0 - c5 = real_lift > shuffle_p95 if np.isfinite(shuffle_p95) else False - c6 = (abs(ev["mean_m"] - 1.0) <= MEAN_MULT_TOL - and ev["min_m"] >= MAP_CLIP_LO - 1e-9 and ev["max_m"] <= MAP_CLIP_HI + 1e-9) - clauses = {"1_both_halves": bool(c1), "2_overall": bool(c2), "3_drawdown": bool(c3), - "4_pf_and_halves": bool(c4), "5_beats_shuffle": bool(c5), - "6_multiplier_bounds": bool(c6)} - clauses["overall"] = bool(all(clauses.values())) - return clauses - - -def shuffle_null(df: pd.DataFrame, features: Sequence[str], model: str, - bar_minutes: int, burn_in_months: int, purge_bars: int, - n_shuffle: int, seed: int) -> np.ndarray: - """Lift distribution under permuted TRAINING labels (test labels real).""" - rng = np.random.default_rng(seed) - r_all = df["r_multiple"].to_numpy(float) - lifts: List[float] = [] - for _ in range(n_shuffle): - r_perm = r_all[rng.permutation(len(r_all))] - res = walk_forward(df, features, model, bar_minutes, burn_in_months, - purge_bars, seed, y_train_override=r_perm, verbose=False) - ev = evaluate(res["oos"]) - lifts.append(ev["lift"]) - return np.asarray(lifts, dtype=float) - - -# ══════════════════════════════════════════════════════════════════════ -# Final fit + artifact -# ══════════════════════════════════════════════════════════════════════ -def final_fit(df: pd.DataFrame, features: Sequence[str], model: str, - seed: int) -> Dict: - """Fit on ALL trades; calibrate the map on in-sample predictions.""" - X_raw = df[list(features)].apply(pd.to_numeric, errors="coerce").to_numpy(float) - r = df["r_multiple"].to_numpy(float) - mean, scale, keep = fit_standardiser(X_raw) - X = apply_standardiser(X_raw, mean, scale)[:, keep] - if model == "logistic": - y = (r > 0).astype(float) - lam, _ = choose_lambda(X, y, "logistic") - coef, b, gnorm = fit_logistic(X, y, lam) - z = sigmoid(predict_linear(X, coef, b)) - target = "r_positive" - else: - y = np.clip(r, WINSOR_LO, WINSOR_HI) - lam, _ = choose_lambda(X, y, "ridge") - coef, b = fit_ridge(X, y, lam) - gnorm = float("nan") - z = predict_linear(X, coef, b) - target = "r_winsorised" - full_coef = np.zeros(len(features)) - full_coef[np.flatnonzero(keep)] = coef - cal = calibrate_map(z) - return {"mean": mean, "scale": scale, "keep": keep, "coef": full_coef, - "intercept": float(b), "lambda": float(lam), "z": z, - "mult": apply_map(z, cal), "map": cal, "target": target, - "grad_norm": gnorm} - - -def predict_multiplier(feature_dict: Dict[str, float], artifact: Dict) -> float: - """Runtime formula: standardise → linear score → size map → 0.05 grid.""" - names = artifact["features"] - mean = artifact["mean"] - scale = artifact["scale"] - coef = artifact["coef"] - z = float(artifact["intercept"]) - for i, name in enumerate(names): - raw = feature_dict.get(name, mean[i]) - if raw is None or not np.isfinite(float(raw)): - raw = mean[i] - z += float(coef[i]) * (float(raw) - float(mean[i])) / float(scale[i]) - if artifact["model"] == "logistic": - z = 1.0 / (1.0 + math.exp(-max(-35.0, min(35.0, z)))) - mp = artifact["map"] - if mp["hi"] <= mp["lo"]: - return 1.0 - frac = min(1.0, max(0.0, (z - mp["lo"]) / (mp["hi"] - mp["lo"]))) - raw_m = mp["out_lo"] + (mp["out_hi"] - mp["out_lo"]) * frac - val = min(mp["clip_hi"], max(mp["clip_lo"], raw_m * mp["normalizer"])) - step = mp["round_to"] - return float(round(round(val / step) * step, 2)) - - -def build_artifact(fit: Dict, features: Sequence[str], model: str, df: pd.DataFrame, - ev: Dict, clauses: Dict, real_lift: float, shuffle: np.ndarray, - n_shuffle: int, book: Path, tf: str, confirm_tfs: List[str], - burn_in_months: int, purge_bars: int, spread: float) -> Dict: - return { - "schema_version": 1, - "feature_version": FEATURE_VERSION, - "pair": "XAU/USD", - "primary_tf": tf, - "confirmation_tfs": confirm_tfs, - "model": model, - "target": fit["target"], - "features": list(features), - "mean": [float(v) for v in fit["mean"]], - "scale": [float(v) for v in fit["scale"]], - "coef": [float(v) for v in fit["coef"]], - "intercept": float(fit["intercept"]), - "map": { - "kind": "clipped_linear_on_quantiles", - "lo": float(fit["map"]["lo"]), "hi": float(fit["map"]["hi"]), - "out_lo": MAP_OUT_LO, "out_hi": MAP_OUT_HI, - "normalizer": float(fit["map"]["normalizer"]), - "clip_lo": MAP_CLIP_LO, "clip_hi": MAP_CLIP_HI, - "round_to": MAP_ROUND_TO, - }, - "training": { - "window": [df["entry_time"].iloc[0].isoformat(), - df["entry_time"].iloc[-1].isoformat()], - "spread": spread, - "n_train_trades": int(len(df)), - "n_oos_trades": int(ev.get("n", 0)), - "burn_in_months": burn_in_months, - "purge_bars": purge_bars, - "refit": "calendar_quarter", - "final_fit": "full_window", - "lambda": float(fit["lambda"]), - "git_commit": git_commit(), - "book_sha256": sha256_file(book), - }, - "acceptance": { - **{k: v for k, v in clauses.items()}, - "flat_r": ev.get("flat_r"), "sized_r": ev.get("sized_r"), - "sized_pf": ev.get("sized_pf"), "flat_dd": ev.get("flat_dd"), - "sized_dd": ev.get("sized_dd"), - "sized_h1": ev.get("sized_h1"), "sized_h2": ev.get("sized_h2"), - "flat_h1": ev.get("flat_h1"), "flat_h2": ev.get("flat_h2"), - "real_lift": float(real_lift), - "shuffle_p95_lift": float(np.percentile(shuffle, 95)) if len(shuffle) else None, - "n_shuffle": int(n_shuffle), - "mean_multiplier": ev.get("mean_m"), - }, - } - - -# ══════════════════════════════════════════════════════════════════════ -# Reporting -# ══════════════════════════════════════════════════════════════════════ -def fmt(x, nd=2, width=0) -> str: - if x is None: - return "n/a".rjust(width) - if isinstance(x, float) and not np.isfinite(x): - return ("inf" if x > 0 else "-inf").rjust(width) - s = f"{x:.{nd}f}" if isinstance(x, (int, float, np.floating)) else str(x) - return s.rjust(width) if width else s - - -def print_quarters(q: pd.DataFrame) -> None: - say(f"{'quarter':<9}{'n_tr':>6}{'n_te':>6}{'flat R':>10}{'sized R':>10}" - f"{'mean m':>9}{'lambda':>9}") - for _, row in q.iterrows(): - say(f"{row['quarter']:<9}{int(row['n_train']):>6}{int(row['n_test']):>6}" - f"{fmt(row['flat_r'], 2, 10)}{fmt(row['sized_r'], 2, 10)}" - f"{fmt(row['mean_m'], 3, 9)}" - f"{('n/a' if row['lambda'] is None else fmt(row['lambda'], 0)):>9}") - - -def print_hist(m: np.ndarray) -> None: - h = multiplier_hist(m) - say(f"{'bin':<12}{'count':>8}{'pct':>8}") - for _, row in h.iterrows(): - bar = "#" * int(round(row["pct"] / 2)) - say(f"{row['bin_lo']:.1f}–{row['bin_hi']:.1f}{'':<4}{int(row['count']):>8}" - f"{row['pct']:>7.1f}% {bar}") - - -def print_coef_signs(coefs: pd.DataFrame, label: str) -> None: - """Mean standardised coefficient + sign stability across quarters.""" - if coefs.empty: - return - d = coefs[coefs["feature"] != "_intercept"] - say(f" standardised coefficients across quarters ({label}):") - say(f" {'feature':<24}{'mean':>10}{'min':>10}{'max':>10}{'+q':>5}{'-q':>5} sign-stable") - for name, grp in d.groupby("feature", sort=False): - c = grp["coef_std"].to_numpy(float) - pos, neg = int((c > 0).sum()), int((c < 0).sum()) - stable = "yes" if (pos == 0 or neg == 0) and (pos + neg) > 0 else "no" - say(f" {name:<24}{c.mean():>10.4f}{c.min():>10.4f}{c.max():>10.4f}" - f"{pos:>5}{neg:>5} {stable}") - - -def print_comparison(table: List[Dict]) -> None: - say(f"{'model':<12}{'n':>6}{'flat R':>10}{'sized R':>10}{'lift':>9}" - f"{'PF':>7}{'DD':>8}{'mean m':>8}{'p95 null':>10}{'rank%':>7} pass") - for row in table: - say(f"{row['model']:<12}{row['n']:>6}{fmt(row['flat_r'], 2, 10)}" - f"{fmt(row['sized_r'], 2, 10)}{fmt(row['lift'], 2, 9)}" - f"{fmt(row['sized_pf'], 2, 7)}{fmt(row['sized_dd'], 2, 8)}" - f"{fmt(row['mean_m'], 3, 8)}{fmt(row['shuffle_p95'], 2, 10)}" - f"{fmt(row['rank_pct'], 0, 7)} {'PASS' if row['pass'] else 'FAIL'}") - - -# ══════════════════════════════════════════════════════════════════════ -# main -# ══════════════════════════════════════════════════════════════════════ -def main() -> None: - ap = argparse.ArgumentParser(description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter) - ap.add_argument("--book", required=True, type=Path) - ap.add_argument("--bar-minutes", required=True, type=int) - ap.add_argument("--features", required=True, - help="comma-separated f_* column names for the main model") - ap.add_argument("--model", default="ridge", choices=("ridge", "logistic")) - ap.add_argument("--burn-in-months", type=int, default=12) - ap.add_argument("--purge-bars", type=int, default=300) - ap.add_argument("--n-shuffle", type=int, default=50) - ap.add_argument("--seed", type=int, default=20260905) - ap.add_argument("--skip-lgbm", action="store_true") - ap.add_argument("--out", type=Path, default=None) - ap.add_argument("--write-artifact", type=Path, default=None) - ap.add_argument("--tf", default=None, help="primary TF label for the artifact") - ap.add_argument("--confirm-tfs", default="15min,1h") - ap.add_argument("--spread", type=float, default=0.65, - help="cost the book was produced at (recorded in the artifact)") - args = ap.parse_args() - - if args.write_artifact and not args.tf: - raise SystemExit("--write-artifact requires --tf") - - say("=" * 96) - say("Stage-D stake-sizing walk-forward — RESEARCH ONLY") - say("=" * 96) - say(f"book : {args.book}") - df = load_book(args.book) - say(f"trades : {len(df)} " - f"({df['entry_time'].iloc[0]} → {df['entry_time'].iloc[-1]})") - say(f"bar minutes : {args.bar_minutes} purge = {args.purge_bars} bars = " - f"{args.purge_bars * args.bar_minutes} min " - f"({args.purge_bars * args.bar_minutes / 1440:.2f} d)") - say(f"burn-in : {args.burn_in_months} months " - f"(train-only until {df['entry_time'].iloc[0] + pd.DateOffset(months=args.burn_in_months)})") - say(f"model / seed : {args.model} / {args.seed} shuffles: {args.n_shuffle}") - say(f"winsor / lambda : [{WINSOR_LO}, {WINSOR_HI}] / {list(LAMBDA_GRID)} " - f"CV folds {CV_FOLDS} (time-contiguous)") - say(f"map : m = round_{MAP_ROUND_TO}(clip(norm × (0.5 + clip((z−lo)/(hi−lo),0,1)" - f"), {MAP_CLIP_LO}, {MAP_CLIP_HI})) lo/hi = train q{MAP_Q_LO}/q{MAP_Q_HI}") - say("") - - main_feats = resolve_features(df, [f.strip() for f in args.features.split(",") if f.strip()], - "--features") - say(f"main features ({len(main_feats)}): {', '.join(main_feats)}") - - specs: List[Tuple[str, List[str], str]] = [(args.model, main_feats, args.model)] - for label, feats in (("isbuy", ISBUY_FEATURES), ("exhaustion", EXHAUSTION_FEATURES)): - have = [f for f in feats if f in df.columns] - if len(have) != len(feats): - say(f"NOTE: {label} baseline missing " - f"{', '.join(f for f in feats if f not in df.columns)} — using {len(have)}") - if have: - specs.append((label, have, "ridge")) - use_lgbm = (not args.skip_lgbm) and lgbm_available() - if not args.skip_lgbm and not use_lgbm: - say("lightgbm not installed — upper bound skipped") - if use_lgbm: - all_f = [c for c in df.columns if c.startswith("f_")] - specs.append(("lgbm", all_f, "lgbm")) - say(f"lightgbm upper bound: {len(all_f)} f_* columns") - say("") - - results: Dict[str, Dict] = {} - table: List[Dict] = [] - for label, feats, kind in specs: - say("-" * 96) - say(f"MODEL: {label} ({kind}, {len(feats)} feature(s))") - say("-" * 96) - res = walk_forward(df, feats, kind, args.bar_minutes, args.burn_in_months, - args.purge_bars, args.seed, verbose=True) - if res["skipped"]: - say(f" skipped quarters: {'; '.join(res['skipped'])}") - if res["oos"].empty: - say(" no OOS quarters — nothing to evaluate") - continue - ev = evaluate(res["oos"]) - n_sh = args.n_shuffle if kind != "lgbm" else min(args.n_shuffle, LGBM_MAX_SHUFFLE) - if kind == "lgbm" and n_sh != args.n_shuffle: - say(f" NOTE (protocol deviation, flagged): lgbm shuffle null capped at " - f"{n_sh} repeats (never ships)") - sh = shuffle_null(df, feats, kind, args.bar_minutes, args.burn_in_months, - args.purge_bars, n_sh, args.seed) if n_sh > 0 else np.array([]) - p95 = float(np.percentile(sh, 95)) if len(sh) else float("nan") - rank = float((sh < ev["lift"]).mean() * 100) if len(sh) else float("nan") - cl = acceptance(ev, ev["lift"], p95) - - say(f" OOS quarters : {len(res['quarters'])} " - f"({res['quarters']['quarter'].iloc[0]} → {res['quarters']['quarter'].iloc[-1]}), " - f"{ev['n']} trades") - say(f" flat R : {ev['flat_r']:+.2f} PF {fmt(ev['flat_pf'])} " - f"maxDD {ev['flat_dd']:.2f}") - say(f" sized R : {ev['sized_r']:+.2f} PF {fmt(ev['sized_pf'])} " - f"maxDD {ev['sized_dd']:.2f}") - say(f" lift : {ev['lift']:+.2f} R") - say(f" halves (split {ev['median_time']}): " - f"h1 flat {ev['flat_h1']:+.2f} / sized {ev['sized_h1']:+.2f} (n={ev['n_h1']}) | " - f"h2 flat {ev['flat_h2']:+.2f} / sized {ev['sized_h2']:+.2f} (n={ev['n_h2']})") - say(f" multiplier : mean {ev['mean_m']:.3f} min {ev['min_m']:.2f} " - f"max {ev['max_m']:.2f}") - say(f" shuffle null : n={len(sh)} mean {fmt(float(sh.mean()) if len(sh) else None)} " - f"p95 {fmt(p95)} real-lift percentile rank {fmt(rank, 0)}%") - say(" acceptance:") - for k, v in cl.items(): - if k == "overall": - continue - say(f" {k:<22} {'PASS' if v else 'FAIL'}") - say(f" {'OVERALL':<22} {'PASS' if cl['overall'] else 'FAIL'}") - say(" per-quarter:") - print_quarters(res["quarters"]) - print_coef_signs(res["coefs"], label) - say("") - - results[label] = {"res": res, "ev": ev, "shuffle": sh, "p95": p95, - "rank": rank, "clauses": cl, "features": feats, "kind": kind} - table.append({"model": label, "n": ev["n"], "flat_r": ev["flat_r"], - "sized_r": ev["sized_r"], "lift": ev["lift"], - "sized_pf": ev["sized_pf"], "sized_dd": ev["sized_dd"], - "mean_m": ev["mean_m"], "shuffle_p95": p95, "rank_pct": rank, - "pass": cl["overall"]}) - - if args.model not in results: - raise SystemExit("the main model produced no OOS quarters — check burn-in / " - "book window / MIN_TRAIN") - - say("=" * 96) - say("COMPARISON") - say("=" * 96) - print_comparison(table) - say("") - say(f"OOS multiplier histogram ({args.model}):") - print_hist(results[args.model]["res"]["oos"]["mult"].to_numpy()) - say("") - - main_label = args.model - beats = None - if main_label in results and "isbuy" in results: - beats = results[main_label]["ev"]["lift"] > results["isbuy"]["ev"]["lift"] - say(f"beats isbuy baseline: {'yes' if beats else 'no'} " - f"({results[main_label]['ev']['lift']:+.2f} R vs " - f"{results['isbuy']['ev']['lift']:+.2f} R)") - say(f"OVERALL ACCEPTANCE ({main_label}): " - f"{'PASS' if results[main_label]['clauses']['overall'] else 'FAIL'}") - say("") - - # ── artifact ────────────────────────────────────────────────────── - artifact = None - if args.write_artifact: - say("-" * 96) - say("FINAL FIT (all trades) + ARTIFACT") - say("-" * 96) - fit = final_fit(df, main_feats, args.model, args.seed) - say(f" lambda (CV on full window): {fit['lambda']:g}") - if np.isfinite(fit["grad_norm"]): - say(f" logistic |grad|_inf at convergence: {fit['grad_norm']:.3e}") - say(f" map lo/hi/normaliser: {fit['map']['lo']:.5f} / {fit['map']['hi']:.5f} / " - f"{fit['map']['normalizer']:.5f}") - artifact = build_artifact( - fit, main_feats, args.model, df, results[main_label]["ev"], - results[main_label]["clauses"], results[main_label]["ev"]["lift"], - results[main_label]["shuffle"], args.n_shuffle, args.book, args.tf, - [t.strip() for t in args.confirm_tfs.split(",") if t.strip()], - args.burn_in_months, args.purge_bars, args.spread) - # Self-check: the runtime formula must reproduce the in-sample map exactly. - rows = df[main_feats].to_dict("records") - repro = np.array([predict_multiplier(r, artifact) for r in rows]) - exact = bool(np.array_equal(repro, fit["mult"])) - say(f" predict_multiplier reproduces in-sample multipliers exactly: " - f"{'YES' if exact else 'NO'} (max |diff| " - f"{float(np.max(np.abs(repro - fit['mult']))):.3e})") - if not exact: - raise SystemExit("predict_multiplier does not reproduce the final fit — abort") - args.write_artifact.parent.mkdir(parents=True, exist_ok=True) - args.write_artifact.write_text(json.dumps(artifact, indent=2, default=str)) - say(f" wrote {args.write_artifact}") - say("") - - # ── outputs ─────────────────────────────────────────────────────── - if args.out: - out = args.out - out.mkdir(parents=True, exist_ok=True) - main_res = results[main_label] - main_res["res"]["oos"].to_csv(out / "oos_trades.csv", index=False) - main_res["res"]["quarters"].to_csv(out / "quarters.csv", index=False) - coefs = pd.concat( - [r["res"]["coefs"].assign(model=lbl) for lbl, r in results.items() - if not r["res"]["coefs"].empty], - ignore_index=True) if results else pd.DataFrame() - coefs.to_csv(out / "coefs_by_quarter.csv", index=False) - pd.DataFrame({ - "model": np.repeat([lbl for lbl in results], [len(r["shuffle"]) for r in results.values()]), - "lift": np.concatenate([r["shuffle"] for r in results.values()]) - if results else np.array([]), - }).to_csv(out / "shuffle_lifts.csv", index=False) - multiplier_hist(main_res["res"]["oos"]["mult"].to_numpy()).to_csv( - out / "multiplier_hist.csv", index=False) - payload = { - "book": str(args.book), "book_sha256": sha256_file(args.book), - "git_commit": git_commit(), "bar_minutes": args.bar_minutes, - "model": args.model, "features": main_feats, "seed": args.seed, - "n_shuffle": args.n_shuffle, "burn_in_months": args.burn_in_months, - "purge_bars": args.purge_bars, - "beats_isbuy": beats, - "models": { - lbl: { - "kind": r["kind"], "features": r["features"], - "evaluation": {k: (None if isinstance(v, float) and not np.isfinite(v) - else (str(v) if isinstance(v, pd.Timestamp) else v)) - for k, v in r["ev"].items()}, - "shuffle": {"n": int(len(r["shuffle"])), - "mean": float(r["shuffle"].mean()) if len(r["shuffle"]) else None, - "p95": None if not np.isfinite(r["p95"]) else r["p95"], - "real_lift_percentile": None if not np.isfinite(r["rank"]) - else r["rank"]}, - "acceptance": r["clauses"], - } for lbl, r in results.items() - }, - "artifact": artifact, - } - (out / "results.json").write_text(json.dumps(payload, indent=2, default=str)) - (out / "summary.txt").write_text("\n".join(_LINES) + "\n") - print(f"\nwrote outputs to {out}") - - -if __name__ == "__main__": - main() diff --git a/backtest/research/watch_rule_eval.py b/backtest/research/watch_rule_eval.py deleted file mode 100644 index 67f99fe..0000000 --- a/backtest/research/watch_rule_eval.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Evaluate the violent-move WATCH rule (as shipped in violent_watch.py) bar by bar on history. Analysis tooling only. -Level per bar from: calendar (high-impact USD within 30 min ahead / 30 min after), clock slots, indicator readings. -Reports share of bars per level, burst rate next bar / next hour per level (both halves), and hot-hours per day. - python backtest/research/watch_rule_eval.py PARQUET BAR_MINUTES -""" -import sys -from pathlib import Path -import numpy as np, pandas as pd -ROOT = Path(__file__).resolve().parents[2]; sys.path.insert(0, str(ROOT)); sys.path.insert(0, str(ROOT / "backtest")) -from gpu_backtest import precompute_indicators -from config import TechnicalConfig - - -def wilder_atr(df, period=14): - pc = df["Close"].shift(1) - tr = pd.concat([df["High"] - df["Low"], (df["High"] - pc).abs(), (df["Low"] - pc).abs()], axis=1).max(axis=1) - return tr.ewm(alpha=1 / period, min_periods=period, adjust=False).mean() - - -def main(): - pq, bm = sys.argv[1], int(sys.argv[2]) - px = pd.read_parquet(pq); px = px[(px.index >= pd.Timestamp("2023-08-05", tz="UTC")) & (px.index < pd.Timestamp("2026-09-05", tz="UTC"))] - ic = precompute_indicators(px, TechnicalConfig()) - sh = lambda a: pd.Series(np.asarray(a, dtype=float), index=px.index).shift(1) - rsi, adxs, hist, bbp, kcu, kcl = sh(ic.rsi), sh(ic.adx_slope), sh(ic.macd_hist), sh(ic.bb_position), sh(ic.kc_upper), sh(ic.kc_lower) - ef, em, es, et, adx, atr1 = sh(ic.ema_fast), sh(ic.ema_medium), sh(ic.ema_slow), sh(ic.ema_trend), sh(ic.adx), sh(ic.atr) - c1 = px["Close"].shift(1); hp = hist.shift(1) - atr_prev = wilder_atr(px).shift(1); rng = px["High"] - px["Low"] - burst = (rng >= 3.0 * atr_prev).astype(int); H = max(1, 60 // bm) - next_hour = burst[::-1].rolling(H, min_periods=1).max()[::-1].astype(int) - align = np.sign(c1 - ef) + np.sign(ef - em) + np.sign(em - es) + np.sign(es - et) - regime = np.select([(adx >= 25) & (align > 0), (adx >= 25) & (align < 0), adx >= 25, adxs > 3.0], ["trending_up", "trending_down", "trending", "transitioning"], default="ranging") - atr_pct = atr1.rolling(50).apply(lambda w: (w[-1] > w).mean() * 100, raw=True); extreme = atr_pct > 80 - # readings - bear = ((bbp < 0).astype(int) + (rsi < 30).astype(int) + (c1 < kcl).astype(int) + ((hist < 0) & (hist < hp) & (hp < 0)).astype(int)) - bull = ((bbp > 1).astype(int) + (rsi >= 70).astype(int) + (c1 > kcu).astype(int) + ((hist > 0) & (hist > hp) & (hp > 0)).astype(int)) - neutral = (adxs > 3).astype(int) + extreme.astype(int) + (regime == "transitioning").astype(int) - readings = bear + bull + neutral - # clock (now = bar close time) - ct = px.index + pd.Timedelta(minutes=bm); wd = ct.weekday; hr = ct.hour - clock = ((wd <= 4) & np.isin(hr, [12, 13, 14])) | (hr == 1) | ((wd == 6) & np.isin(hr, [22, 23])) - # calendar - cal = pd.read_parquet(ROOT / "backtest/cache/calendar.parquet"); cal["ts"] = pd.to_datetime(cal.dateline, unit="s", utc=True) - hi = np.sort(cal[(cal.currency == "USD") & (cal.impactName.str.lower() == "high")].ts.values.astype("datetime64[ns]")) - t = ct.values.astype("datetime64[ns]"); nx = np.searchsorted(hi, t) - to_next = np.where(nx < len(hi), (hi[np.minimum(nx, len(hi) - 1)] - t) / np.timedelta64(1, "m"), 1e9) - since = np.where(nx - 1 >= 0, (t - hi[np.maximum(nx - 1, 0)]) / np.timedelta64(1, "m"), 1e9) - calendar = ((to_next > 0) & (to_next <= 30)) | (since <= 30) - # FINAL RULE (2026-09-06, chosen from the variant sweep recorded in sizing_campaign_2026-09.md): - # extreme = price-at-extreme readings only (outside Bollinger, RSI beyond 30/70, outside Keltner) - # hot = calendar | (clock & extreme >= 1) -> ~8.6% of bars, next-bar odds 3-5x normal, ~4 hot hours/day - # watch = clock | extreme >= 2 -> ~2x normal - extreme = ((bbp < 0) | (bbp > 1)).astype(int) + ((rsi < 30) | (rsi >= 70)).astype(int) + ((c1 < kcl) | (c1 > kcu)).astype(int) - level = np.where(calendar | (clock & (extreme >= 1)), "hot", np.where(clock | (extreme >= 2), "watch", "none")) - d = pd.DataFrame({"level": level, "burst": burst.values, "next_hour": next_hour.values, "readings": readings.values, "clock": clock, "calendar": calendar}, index=px.index) - d = d[d.index >= pd.Timestamp("2023-09-05", tz="UTC")] - half = np.where(np.arange(len(d)) < len(d) // 2, 1, 2) - b1, b2 = d.burst[half == 1].mean(), d.burst[half == 2].mean(); h1, h2 = d.next_hour[half == 1].mean(), d.next_hour[half == 2].mean() - print(f"{Path(pq).name}: {len(d)} bars; base next-bar {100*d.burst.mean():.2f}%, next-hour {100*d.next_hour.mean():.1f}%") - rows = [] - for lv in ("none", "watch", "hot"): - m = d.level == lv - rows.append(dict(level=lv, share_of_bars=100 * m.mean(), next_bar_pct=100 * d.burst[m].mean(), lift_h1=d.burst[m & (half == 1)].mean() / b1, lift_h2=d.burst[m & (half == 2)].mean() / b2, - next_hour_pct=100 * d.next_hour[m].mean(), hour_lift_h1=d.next_hour[m & (half == 1)].mean() / h1, hour_lift_h2=d.next_hour[m & (half == 2)].mean() / h2, - share_of_all_bursts=100 * d.burst[m].sum() / d.burst.sum())) - print(pd.DataFrame(rows).round(2).to_string(index=False)) - hot = d[d.level == "hot"] - kinds = pd.Series(np.where(hot.calendar, "calendar", "clock+extreme reading"), index=hot.index) - print("hot bars by cause:", (100 * kinds.value_counts(normalize=True)).round(1).to_dict()) - hot_hours = hot.index.floor("h").unique() - days = pd.Series(hot_hours.date).value_counts() - print(f"distinct HOT hours per calendar day: mean {days.mean():.1f}, median {days.median():.0f}, max {days.max()} (≈ heads-up messages/day before the daily cap)") - hb = d.burst.groupby(d.index.floor("h")).max(); hh = pd.Series(1, index=hot_hours) - print(f"of all hours with a violent bar, the hour was flagged HOT at its start or during: {100*hb[hb==1].index.isin(hot_hours).mean():.1f}%") - - -if __name__ == "__main__": - main() diff --git a/docs/architecture.png b/docs/architecture.png deleted file mode 100644 index 9a70cb02683cf8ea0aad2736cb241a530e5ab414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592401 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 jJPr}BGsiXP#-Jl^ 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�Z0j%-EyYu}qnTV?Ta?IO*^tUD2+S(t^ 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 z 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 **Progress (2026-08-14):** Phase 0 ✅, Phase 1 ✅ (`backtest/research/feed_divergence_2026-08-14.md`), Phase 2 ✅ (`backtest/research/signal_parity_2026-08-14.md`), Phase 3 ✅ (`backtest/research/repin_verification_2026-08-14.md` — re-pin already existed), Phase 4 🔨 tool ready (`scripts/shadow_scan.py`, needs a 2-week run — launch manually per owner decision), Phase 5 owner decisions recorded (dual cost reporting; Tiingo streaming-only; see bottom). -**Context:** Oanda has been the live feed since 2026-07-28. The backtest books were **re-pinned on Oanda bars on 2026-08-04** (`backtest/oanda_*.csv` — 27 books, now the baseline; all TD-era books superseded). Cost reporting is dual: $0.30 retained for cross-book comparability, $0.65 is the realistic headline (measured Oanda round trip $0.65–0.72). Twelve Data was proven signal-incompatible in Phase 1 (~19% of M5 bars disagree on direction; systematic ~$1 bias) — it is NOT a valid candle fallback. - -**Why signals can differ between feeds** (mechanisms to test): - -- Feeds publish different mid prices → tiny OHLC diffs shift every indicator; near a threshold (RSI band, `FB2_EMA_LO` EMA200-proximity band, composite/grade cutoffs, M5 min-score gate) one bar's discrete score flips. -- Gate edge cases turn a tiny price diff into "setup generated" vs "no signal". -- ATR-derived SL/TP/trail levels differ even when the signal is identical. -- The shared 10σ cleaning pass can drop different bars per feed. -- Volume present (Oanda) vs absent (Tiingo FX); real spread (Oanda MBA) vs pair default (Tiingo). -- Known reference point: H4 seeding divergence — same provider, different fetch depth flipped ~2% of indicator signals (composite Δ up to 12.3). Cross-feed diffs act the same way. - ---- - -## Phase 0 — Recent-bar parity smoke test ✅ DONE - -- **Tool:** `scripts/compare_oanda_tiingo.py` (removed 2026-09-06 once Phases 1-2 superseded it; the result is recorded here) -- **Result 2026-08-14:** 10/10 timestamp alignment on M5/M15/H1, Close max |Δ| ≤ $0.175 (≤ 0.004% of price), no directional bias. -- **Verdict:** recent-tail parity confirmed. Does NOT cover historical depth — proceed to Phase 1. - -## Phase 1 — Historical candle divergence study - -**Goal:** quantify raw-data divergence over the full window used for validation, not just the recent tail. - -- [x] Extend the comparison script to use `fetch_range` (paginated, raw bars) for both providers over **≥ 12 months** for M5, M15, H1 (and H4 if in scope). -- [x] Record per TF: - - % of bar timestamps present in both feeds; list of missing/extra bars (gaps, holidays, weekend boundary handling). - - OHLC |Δ| distribution: p50 / p95 / p99 / max, in $ and % of price. - - Count of bars dropped by `validate_and_clean` on each feed (10σ outliers, malformed). - - Bar-close timestamp conventions (alignment, DST behavior around US transitions). -- [x] **Pass criteria (measured on the weekend-filtered bar grid — the aggregator's NY-anchored `_is_forex_weekend` decides which bars exist for signal purposes, so raw timestamp overlap includes coverage-only diffs like Tiingo's Sunday bars and is NOT the criterion):** ≥ 99.5% overlap of *signal-eligible* bar timestamps; Close p95 |Δ| ≤ 0.01% of price; no systematic bias (mean Δ ≈ 0); no unexplained multi-hour gaps unique to one feed. (Raw-overlap result 2026-08-14: 94.6–96.6% vs Tiingo — entirely explained by Tiingo's ~22h/week of flat Sunday bars, which the weekend filter gates out.) -- [x] Write findings to `backtest/research/feed_divergence_.md` with tables and the exact commands used. - -## Phase 2 — Signal-level replay parity - -**Goal:** measure how often candle divergence actually changes a *decision*. - -- [x] Replay bar-by-bar through the real `analyze_from_dataframes` (news off) for both feeds over the same ≥ 12-month window, per TF (M5, M15, H1). Reuse the gpu_backtest replay harness; disable the parquet cache (`--no-cache`) or use separate cache keys per provider. -- [x] Compare per bar: signal direction, composite score, quality grade, gate outcomes (which gate fired), setup presence, strategy label (XAU ATR / XAU_PB / XAU_CP), entry/SL/TP prices. -- [x] Metrics: - - % bars with identical direction+grade. - - Direction flips, grade changes, gate-only changes (setup appears/disappears). - - Distribution of composite Δ on mismatched bars. - - For matching signals: mean/max |Δ| of entry, SL, TP1/TP2 in $ and in ATR fractions. -- [x] **Result (Oanda↔Tiingo):** 98.32% / 98.16% same direction (M15/M5), zero opposite-sign flips; 93.41% / 94.21% same direction+grade+setup. The original ≥97% direction+grade proposal is too strict for benign grade-letter changes and was not met; fallback acceptance is direction ≥98%, zero sign flips, and marginal/boundary-hour-only flips. See `signal_parity_2026-08-14.md`. - -## Phase 3 — Backtest re-pin on the new feed - -**Goal:** a new pinned book on the new provider's bars, evaluated under rule 1 acceptance criteria. - -- [x] **Provider selection:** `gpu_backtest.py` has **no `--provider` flag** — it builds the provider from `data_providers.active` in config.json (`gpu_backtest.py:1753`). A cross-provider run requires flipping that config line. The parquet cache is already keyed per provider (`gpu_backtest.py:984` — `oanda_`-prefixed files vs legacy unprefixed TD files), so TD and Oanda data cannot mix in cache; `--no-cache` is only needed to force a refetch. -- [x] Run the full backtest on new-feed bars, both cost assumptions: - ```bash - python backtest/gpu_backtest.py --pair XAUUSD --days 365 --spread 0.30 --export-csv backtest/repin__m15_030.csv - python backtest/gpu_backtest.py --pair XAUUSD --days 365 --spread 0.65 --export-csv backtest/repin__m15_065.csv - ``` - (repeat for each TF under test; note the `Backend:` log line and provider in the report per `backtest/instructions_for_backtest.txt`). -- [x] Split into train/validation halves; require **positive total R in both halves and PF ≥ 1.3 at realistic cost** (rule 1), with trailing exits and next-open fills untouched. -- [x] Marginal configs additionally pass the **2024-06 → 2025-03 OOS window** (within-year splits alone have approved configs that later failed OOS). -- [x] ~~Compare against the pinned Twelve-Data book trade-by-trade~~ **AMENDED 2026-08-14:** skipped with justification — Phase 1 showed TD bars disagree on direction 19% of the time on M5 with a systematic ~$1 bias, so a TD-pinned book is a different instrument's book and a trade-level diff carries no decision value. Phantom-trade classes remain documented (e.g. the weekend-calendar fix already dropped exactly one live-impossible M5 trade). -- [x] **Deliverable:** re-pinned book + report in `backtest/research/`; update the reference numbers in CLAUDE.md if the book is adopted. Current-HEAD M5 canonical book: `backtest/oanda_m5_12mo_065_nopb_20260814.csv`, +106.82R PF 1.51. - -## Phase 4 — Live shadow comparison - -**Goal:** confirm parity under real fetch depths, caching, and boundary timing — not just history. - -- [ ] Run a shadow scan loop (no orders, no Telegram) for **≥ 2 weeks**: each candle close, scan with both providers, log direction/grade/gates/setup to a side-by-side file or SQLite table. -- [ ] Include at least one weekend transition and one news-heavy day in the window. -- [ ] Track: scan-to-scan agreement rate, feed-lag incidents ("feed lagging — just-closed bar missing"), staleness warnings, spread readings (Oanda real vs Tiingo default). -- [ ] **Acceptance thresholds (baseline = Phase 2 replay parity):** ≥ 98% direction agreement; **zero** opposite-sign (BUY↔SELL) flips; direction flips confined to actionable↔NEUTRAL at marginal composites, clustered only at Friday-close/Sunday-reopen (UTC 22–23) and Asian (03–04) hours; setup-level drift (SL/TP) within the Phase 2 envelope (mean |Δ| ≲ $3, p95 ≲ $17 on M15); every feed-lag/staleness incident explained. -- [ ] H4 caution: live H4 fetches only 380 bars vs unbounded backtest history (known ~2% indicator-signal flip from seeding alone) — keep H4 labeled "unproven" until a dedicated campaign closes this. - -## Phase 5 — Cutover checklist - -- [x] `config.json` `data_providers.active: "oanda"` and `data_providers.streaming: "tiingo"` set deliberately (verified 2026-08-14 — Oanda cannot stream; Tiingo streams). -- [x] Cost model: **dual reporting adopted (owner decision 2026-08-14)** — $0.65 (measured Oanda round trip) is the realistic headline, $0.30 retained for cross-book comparability with TD-era books. ⚠️ **Cost-gate coupling:** `config.py round_trip_cost` (0.30) is NOT just a backtest knob — it feeds the live TP1 spread gate (`min_tp = round_trip_cost × min_tp_cost_multiple`, three sites in `signal_aggregator.py`). Raising it to 0.65 moves the TP1 floor from ~$9 to ~$19.50 and is a rule-1 revalidation event, not a config tweak. `round_trip_cost` stays 0.30. -- [x] QA suite green: `python test_all.py` (381 tests; verified 2026-08-14). -- [ ] Week 1 post-cutover: daily review of `logs/signals.db` rows vs shadow log; alert on grade/direction disagreement beyond the Phase 2 baseline rate. -- [ ] Rollback: revert `data_providers.active`; pinned books of the previous feed remain valid for comparison. ⚠️ Twelve Data is a permanent *registered* fallback but is **signal-incompatible** (Phase 1) — on an Oanda candle outage, stop scanning rather than switching `active` to `twelve_data`; a TD-fed book cannot be compared to the Oanda baseline. -- [x] Docs sync (CLAUDE.md rule): `docs/user_guide.html` backtest numbers reflect the Oanda-pinned books, not TD-era numbers. - -## Open questions — RESOLVED 2026-08-14 (owner decisions) - -- ~~Adopt which spread as canonical~~ → **dual reporting**: $0.65 realistic headline + $0.30 cross-book comparability; `round_trip_cost` stays 0.30 (gate coupling above). -- ~~Tiingo role~~ → **streaming-only**. Tiingo remains registered for the WS tick stream and comparison research, but is not a designated candle fallback; candle fallback is a manual halt-and-decide, never an automatic TD failover. -- H4 seeding campaign (parked since 2026-08-04) → **still needs an owner**; H4 stays "unproven" until then. diff --git a/scripts/feed_divergence_study.py b/scripts/feed_divergence_study.py deleted file mode 100644 index 0488ef8..0000000 --- a/scripts/feed_divergence_study.py +++ /dev/null @@ -1,259 +0,0 @@ -#!/usr/bin/env python3 -""" -Phase 1 — historical candle divergence study (data source change test) -======================================================================= -Fetches the RAW closed-bar series for XAU/USD from two providers over a -multi-month window via the normal provider stack (`fetch_range`, which -paginates under the per-request bar cap and drops the forming candle), -then quantifies how the feeds diverge: - - * coverage: % shared timestamps, feed-only bars, where they cluster - * OHLC |Δ| distribution (mean/median/p90/p95/p99/max, $ and bias) - * |ΔClose| vs mean ATR14 (the scale the signal engine cares about) - * threshold exceedance (how many bars differ by more than X $) - * bar-direction agreement (sign of close−open) - * close-return correlation on consecutive bars - * per-hour and per-month drift - -Both feeds are mid-price (Oanda mid of MBA candles; Tiingo resampled mid; -Twelve Data its own mid). Frames are cached to parquet so re-runs are -instant; pass --no-cache to force a fresh fetch. - -Usage: - venv/bin/python scripts/feed_divergence_study.py --a oanda --b tiingo \ - --tfs M15,H1,H4 --days 365 -""" - -import argparse -import sys -import time -from pathlib import Path - -import numpy as np -import pandas as pd - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from config import PlatformConfig, Timeframe, XAUUSD -from providers import make_data_provider - -REPO = Path(__file__).resolve().parent.parent -CACHE_DIR = REPO / "backtest" / "cache" -RESEARCH_DIR = REPO / "backtest" / "research" - -_TF_LOOKUP = {t.value: t for t in Timeframe} -_TF_LOOKUP.update({ - "M1": Timeframe.M1, "M5": Timeframe.M5, "M15": Timeframe.M15, - "M30": Timeframe.M30, "H1": Timeframe.H1, "H4": Timeframe.H4, - "D1": Timeframe.D1, "W1": Timeframe.W1, -}) - - -def wilder_atr(df: pd.DataFrame, period: int = 14) -> pd.Series: - hl = df["High"] - df["Low"] - hc = (df["High"] - df["Close"].shift(1)).abs() - lc = (df["Low"] - df["Close"].shift(1)).abs() - tr = pd.concat([hl, hc, lc], axis=1).max(axis=1) - return tr.ewm(alpha=1.0 / period, adjust=False).mean() - - -def fmt_stats(name: str, s: pd.Series) -> str: - a = s.abs() - return (f" {name:<6} mean ${a.mean():.3f} med ${a.median():.3f} " - f"p90 ${a.quantile(0.90):.3f} p95 ${a.quantile(0.95):.3f} " - f"p99 ${a.quantile(0.99):.3f} max ${a.max():.2f} " - f"bias {s.mean():+.4f}") - - -def cache_path(name: str, tf: Timeframe, start: pd.Timestamp, - end: pd.Timestamp) -> Path: - return (CACHE_DIR / - f"{name}_XAU_USD_{tf.value}_{start:%Y%m%d}_{end:%Y%m%d}.parquet") - - -def load_or_fetch(provider, name: str, tf: Timeframe, start, end, - no_cache: bool): - cp = cache_path(name, tf, start, end) - if not no_cache and cp.exists(): - df = pd.read_parquet(cp) - print(f" [{name}] loaded {len(df):,} bars from cache " - f"{cp.name}") - return df - t0 = time.time() - print(f" [{name}] fetching {tf.value} {start.date()} → {end.date()} ...") - df = provider.fetch_range(XAUUSD, tf, start, end) - print(f" [{name}] fetched {len(df):,} bars in {time.time() - t0:.1f}s") - df.to_parquet(cp) - print(f" [{name}] cached → {cp.name}") - return df - - -def compare(tf: Timeframe, a_name: str, b_name: str, a: pd.DataFrame, - b: pd.DataFrame): - print("\n" + "=" * 80) - print(f"{tf.value} — {a_name.upper()} vs {b_name.upper()}, XAU/USD") - print("=" * 80) - - common = a.index.intersection(b.index) - a_only = a.index.difference(b.index) - b_only = b.index.difference(a.index) - - print(f"\nCOVERAGE") - print(f" {a_name} bars : {len(a):>8,} head {a.index[0]} tail {a.index[-1]}") - print(f" {b_name} bars : {len(b):>8,} head {b.index[0]} tail {b.index[-1]}") - print(f" shared : {len(common):>8,} " - f"({100 * len(common) / max(len(a.index.union(b.index)), 1):.2f}% of union)") - print(f" {a_name}-only : {len(a_only):>8,} " - f"({100 * len(a_only) / max(len(a), 1):.2f}% of {a_name})") - print(f" {b_name}-only : {len(b_only):>8,} " - f"({100 * len(b_only) / max(len(b), 1):.2f}% of {b_name})") - - if len(common) == 0: - print(" !! no shared timestamps — feeds on different bar grids") - return - - for label, idx in ((f"{a_name}-only", a_only), - (f"{b_name}-only", b_only)): - if not len(idx): - continue - by_date = pd.Series(1, index=idx).groupby(idx.date).sum() - top = by_date.sort_values(ascending=False).head(6) - print(f" {label} clusters on: " - + ", ".join(f"{d} ({n})" for d, n in top.items())) - - x = a.loc[common] - y = b.loc[common] - - atr = wilder_atr(x).dropna() - mean_price = x["Close"].mean() - print(f"\nSCALE REFERENCES ({a_name} feed)") - print(f" mean close : ${mean_price:,.2f}") - print(f" mean bar range: ${(x['High'] - x['Low']).mean():.3f}") - print(f" mean ATR14 : ${atr.mean():.3f} median ${atr.median():.3f}") - - print(f"\nPER-BAR DIFFS ({a_name} − {b_name}, $)") - diffs = {} - for col in ("Open", "High", "Low", "Close"): - d = x[col] - y[col] - diffs[col] = d - print(fmt_stats(col, d)) - - dclose = diffs["Close"].abs() - print(f"\n |ΔClose| as % of mean ATR14 : " - f"mean {100 * dclose.mean() / atr.mean():.1f}% " - f"p95 {100 * dclose.quantile(0.95) / atr.mean():.1f}%") - - print(f"\nTHRESHOLD EXCEEDANCE (|ΔClose|)") - for thr in (0.10, 0.30, 0.65, 1.00, 2.00, 5.00): - pct = 100 * (dclose > thr).mean() - print(f" > ${thr:<5.2f}: {pct:6.2f}% of bars ({(dclose > thr).sum():,})") - - # direction agreement - a_dir = np.sign(x["Close"] - x["Open"]) - b_dir = np.sign(y["Close"] - y["Open"]) - both_nonflat = (a_dir != 0) & (b_dir != 0) - dir_agree = 100 * (a_dir[both_nonflat] == b_dir[both_nonflat]).mean() - print(f"\nAGREEMENT") - print(f" bar direction (sign of close−open) agree: {dir_agree:.2f}%" - f" (n={both_nonflat.sum():,})") - - step = pd.Series(common, index=common).diff().median() - a_ret = x["Close"].pct_change() - b_ret = y["Close"].pct_change() - step_ok = pd.Series(common, index=common).diff().le(step + pd.Timedelta(seconds=1)) - corr = a_ret[step_ok].corr(b_ret[step_ok]) - print(f" close-return correlation (consecutive bars): {corr:.5f}") - - # by-hour - hours = common.hour - rows = [] - for h in range(24): - m = hours == h - if not m.any(): - continue - rows.append({"hour_utc": h, "bars": int(m.sum()), - "mean_abs_dclose": dclose[m].mean(), - "p95_abs_dclose": dclose[m].quantile(0.95)}) - by_hour = pd.DataFrame(rows) - print(f"\nBY UTC HOUR (mean |ΔClose|, $)") - print(by_hour.to_string(index=False, - float_format=lambda v: f"{v:.3f}")) - - print(f"\nBY MONTH (mean |ΔClose|, $)") - months = dclose.groupby(common.tz_localize(None).to_period("M")).mean() - for p, v in months.items(): - print(f" {p}: {v:.3f}") - - return { - "tf": tf.value, "a": a_name, "b": b_name, - "a_bars": len(a), "b_bars": len(b), "common": len(common), - "a_only": len(a_only), "b_only": len(b_only), - "dir_agree_pct": round(dir_agree, 3), - "ret_corr": round(corr, 5), - "mean_abs_dclose": dclose.mean(), - "p95_abs_dclose": dclose.quantile(0.95), - "max_abs_dclose": dclose.max(), - "dclose_pct_atr_mean": 100 * dclose.mean() / atr.mean(), - } - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("--a", required=True) - ap.add_argument("--b", required=True) - ap.add_argument("--tfs", default="M15,H1,H4", - help="comma-separated timeframe values (default M15,H1,H4)") - ap.add_argument("--days", type=int, default=365) - ap.add_argument("--end", default=None, help="UTC end date (default now)") - ap.add_argument("--no-cache", action="store_true") - args = ap.parse_args() - - tfs = [] - for s in args.tfs.split(","): - s = s.strip() - tf = _TF_LOOKUP.get(s) - if tf is None: - sys.exit(f"unknown timeframe '{s}'; use one of " - f"{sorted(_TF_LOOKUP)}") - tfs.append(tf) - - end = pd.Timestamp(args.end, tz="UTC") if args.end \ - else pd.Timestamp.now(tz="UTC") - start = end - pd.Timedelta(days=args.days) - - cfg = PlatformConfig() - pa = make_data_provider(cfg, args.a) - pb = make_data_provider(cfg, args.b) - - summary = [] - for tf in tfs: - print(f"\n{'─' * 80}\nWINDOW {start.date()} → {end.date()} " - f"({args.days} days), {tf.value}") - try: - a = load_or_fetch(pa, args.a, tf, start, end, args.no_cache) - except Exception as e: - print(f" !! {args.a} {tf.value} fetch failed: {e}") - continue - try: - b = load_or_fetch(pb, args.b, tf, start, end, args.no_cache) - except Exception as e: - print(f" !! {args.b} {tf.value} fetch failed: {e}") - continue - r = compare(tf, args.a, args.b, a, b) - if r: - summary.append(r) - - print("\n" + "=" * 80) - print("SUMMARY TABLE") - print("=" * 80) - sdf = pd.DataFrame(summary) - print(sdf.to_string(index=False, - float_format=lambda v: f"{v:.4f}")) - out = RESEARCH_DIR / f"feed_divergence_{args.a}_vs_{args.b}.csv" - if len(sdf): - sdf.to_csv(out, index=False, float_format="%.6f") - print(f"\nSummary written to {out}") - - -if __name__ == "__main__": - main() diff --git a/scripts/signal_parity_study.py b/scripts/signal_parity_study.py deleted file mode 100644 index c7dd7da..0000000 --- a/scripts/signal_parity_study.py +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env python3 -""" -Phase 2 — signal-level replay parity (data source change test) -=============================================================== -Replays the REAL decision core (`SignalAggregator.analyze_from_dataframes`, -news off, use_news=False) over the same window for two providers and -compares the *decisions* bar-by-bar: direction, composite/final score, -quality grade, gate/setup presence, strategy tag, and entry/SL/TP levels. - -This turns the Phase-1 price-diff stats into flip rates. Feeds are read -from the Phase-1 parquet cache (scripts/feed_divergence_study.py writes -them); pass --no-cache-fetch only if you want to fetch fresh via -fetch_range first. - -Slicing matches gpu_backtest.py exactly: decision at close of bar `pos`, -each TF sliced to bars fully closed by that decision time, primary at the -shared grid, so the two feeds are compared on identical timestamps. - -Usage: - venv/bin/python scripts/signal_parity_study.py --a oanda --b tiingo \ - --tf M15 --stride 8 --days 365 -""" - -import argparse -import sys -import time -from pathlib import Path - -import numpy as np -import pandas as pd - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from config import Timeframe, XAUUSD -from pair_signals.xauusd import make_config -from signal_aggregator import SignalAggregator - -REPO = Path(__file__).resolve().parent.parent -CACHE_DIR = REPO / "backtest" / "cache" -RESEARCH_DIR = REPO / "backtest" / "research" - -BAR_SECONDS = { - Timeframe.M1: 60, Timeframe.M5: 300, Timeframe.M15: 900, - Timeframe.M30: 1800, Timeframe.H1: 3600, Timeframe.H4: 14400, - Timeframe.D1: 86400, Timeframe.W1: 604800, -} -_TF_LOOKUP = {t.value: t for t in Timeframe} -_TF_LOOKUP.update({"M1": Timeframe.M1, "M5": Timeframe.M5, - "M15": Timeframe.M15, "M30": Timeframe.M30, - "H1": Timeframe.H1, "H4": Timeframe.H4, - "D1": Timeframe.D1, "W1": Timeframe.W1}) -_CONFIRMS = { - Timeframe.M5: [Timeframe.M15, Timeframe.H1], - Timeframe.M15: [Timeframe.M5, Timeframe.H1], - Timeframe.H1: [Timeframe.M15, Timeframe.H4], - Timeframe.H4: [Timeframe.H1, Timeframe.D1], -} - - -def load_cached(name: str, tf: Timeframe, start: pd.Timestamp, - end: pd.Timestamp) -> pd.DataFrame: - cp = CACHE_DIR / f"{name}_XAU_USD_{tf.value}_{start:%Y%m%d}_{end:%Y%m%d}.parquet" - if not cp.exists(): - sys.exit(f"missing cache {cp}; run scripts/feed_divergence_study.py " - f"--a oanda --b {name} --tfs {tf.value} --days ... first") - return pd.read_parquet(cp) - - -def tag_of(report) -> str: - first_bull = report.bullish_reasons[0] if report.bullish_reasons else "" - first_bear = report.bearish_reasons[0] if report.bearish_reasons else "" - if "XAU PULLBACK" in first_bull or "XAU PULLBACK" in first_bear: - return "XAU_PB" - if "XAU CHART PATTERN" in first_bull or "XAU CHART PATTERN" in first_bear: - return "XAU_CP" - if "XAU STRATEGY" in first_bull: - return "XAU" - return "GENERIC" - - -def decide(agg, dfs, tss, stride, warmup) -> list: - """Replay decisions over the shared grid, returning one row per bar.""" - primary = dfs[agg.config.primary_timeframe] - dur = pd.Timedelta(seconds=BAR_SECONDS[agg.config.primary_timeframe]) - - # positions of sampled bars in the primary frame - primary_pos = primary.index.get_indexer(tss) - rows = [] - for i in range(0, len(tss), stride): - ts = tss[i] - pos = int(primary_pos[i]) - if pos < warmup: - continue - slices = {} - for tf, full in dfs.items(): - cutoff = ts # decision_time = ts + dur; bars closed by ts - cut = int(full.index.searchsorted(cutoff, side="right")) - if cut <= 0: - continue - slices[tf] = full.iloc[:cut] - if agg.config.primary_timeframe not in slices: - continue - r = agg.analyze_from_dataframes(XAUUSD, slices, use_news=False) - ts_setup = r.trade_setup - rows.append({ - "ts": ts, - "direction": r.final_signal.value, - "final_score": r.final_score, - "primary_score": r.primary_score, - "grade": r.signal_quality, - "has_setup": ts_setup is not None, - "tag": tag_of(r) if ts_setup else "", - "entry": ts_setup.entry_price if ts_setup else np.nan, - "sl": ts_setup.stop_loss if ts_setup else np.nan, - "tp1": ts_setup.take_profit_1 if ts_setup else np.nan, - "tp2": ts_setup.take_profit_2 if ts_setup else np.nan, - }) - return rows - - -def main(): - ap = argparse.ArgumentParser() - ap.add_argument("--a", required=True) - ap.add_argument("--b", required=True) - ap.add_argument("--tf", default="M15") - ap.add_argument("--stride", type=int, default=1, - help="sample every Nth shared bar (default 1)") - ap.add_argument("--days", type=int, default=365) - ap.add_argument("--end", default=None) - ap.add_argument("--warmup", type=int, default=300) - args = ap.parse_args() - - tf = _TF_LOOKUP.get(args.tf) - if tf is None: - sys.exit(f"unknown tf {args.tf}") - confirms = _CONFIRMS[tf] - tfs = [tf] + confirms - - end = pd.Timestamp(args.end, tz="UTC") if args.end \ - else pd.Timestamp.now(tz="UTC") - start = end - pd.Timedelta(days=args.days) - - cfg = make_config(tf, confirms) - agg = SignalAggregator(cfg) - - a_dfs, b_dfs = {}, {} - for t in tfs: - a_dfs[t] = load_cached(args.a, t, start, end) - b_dfs[t] = load_cached(args.b, t, start, end) - - # shared grid = primary timestamps present in both feeds - shared = a_dfs[tf].index.intersection(b_dfs[tf].index) - - t0 = time.time() - print(f"replaying {len(shared)} shared {tf.value} bars " - f"(stride {args.stride} → ~{len(shared)//args.stride}) on {args.a}...") - a_rows = decide(agg, a_dfs, shared, args.stride, args.warmup) - print(f" {args.a}: {len(a_rows)} decisions in {time.time()-t0:.1f}s") - t0 = time.time() - b_rows = decide(agg, b_dfs, shared, args.stride, args.warmup) - print(f" {args.b}: {len(b_rows)} decisions in {time.time()-t0:.1f}s") - - A = pd.DataFrame(a_rows).set_index("ts") - B = pd.DataFrame(b_rows).set_index("ts") - common = A.index.intersection(B.index) - A, B = A.loc[common], B.loc[common] - n = len(common) - - print(f"\n{'=' * 78}") - print(f"SIGNAL-LEVEL PARITY — {tf.value} — {args.a} vs {args.b} " - f"({n:,} bars)") - print("=" * 78) - - def pct(x): return f"{100 * x:.2f}%" - - same_dir = (A["direction"] == B["direction"]) - same_grade = (A["grade"] == B["grade"]) - same_setup = (A["has_setup"] == B["has_setup"]) - same_all = same_dir & same_grade & same_setup - - print(f"\nIDENTITY") - print(f" same direction : {pct(same_dir.mean())}") - print(f" same grade : {pct(same_grade.mean())}") - print(f" same setup presence : {pct(same_setup.mean())}") - print(f" same dir+grade+setup : {pct(same_all.mean())}") - - both_sig = (A["direction"] != 0) & (B["direction"] != 0) - flips = both_sig & (A["direction"] != B["direction"]) - opp = flips & (A["direction"] == -B["direction"]) - print(f"\nDIRECTION") - print(f" bars both actionable : {both_sig.sum():,} " - f"({pct(both_sig.mean())})") - print(f" direction flips : {flips.sum():,} " - f"({pct(flips.sum()/max(both_sig.sum(),1))} of actionable)") - print(f" opposite-sign flips : {opp.sum():,}") - - grade_a = set(A.loc[A["has_setup"], "grade"]) - print(f"\nGRADE (of {args.a} setups, grades seen: {sorted(grade_a)})") - changed = A.loc[both_sig, "grade"] != B.loc[both_sig, "grade"] - print(f" grade changed on actionable bars: " - f"{changed.sum():,} ({pct(changed.mean())})") - - # score deltas on shared bars - ds = (A["final_score"] - B["final_score"]).abs() - dp = (A["primary_score"] - B["primary_score"]).abs() - print(f"\nSCORE Δ ({args.a} − {args.b})") - print(f" final_score mean {ds.mean():6.2f} p95 {ds.quantile(.95):6.2f} " - f"max {ds.max():6.2f}") - print(f" primary_score mean {dp.mean():6.2f} p95 {dp.quantile(.95):6.2f} " - f"max {dp.max():6.2f}") - - # setup price diffs on bars where BOTH generated a setup - both_setup = A["has_setup"] & B["has_setup"] - if both_setup.any(): - print(f"\nSETUP LEVELS (both-setup bars: {both_setup.sum():,})") - for col, label in (("entry", "entry"), ("sl", "SL"), ("tp1", "TP1"), - ("tp2", "TP2")): - d = (A.loc[both_setup, col] - B.loc[both_setup, col]).abs() - print(f" {label:<6} mean ${d.mean():6.3f} p95 ${d.quantile(.95):7.3f} " - f"max ${d.max():7.2f}") - - # tag disagreement on both-setup bars - if both_setup.any(): - same_tag = (A.loc[both_setup, "tag"] == B.loc[both_setup, "tag"]) - print(f" same strategy tag : {pct(same_tag.mean())}") - - # where do flips cluster (hour)? - flip_hours = A.loc[flips].index.hour.value_counts().sort_index() - if len(flip_hours): - print(f"\nFLIPS BY UTC HOUR") - for h, c in flip_hours.items(): - print(f" {h:02d}: {c}") - - out = { - "tf": tf.value, "a": args.a, "b": args.b, "bars": n, - "same_dir": same_dir.mean(), "same_grade": same_grade.mean(), - "same_setup": same_setup.mean(), "same_all": same_all.mean(), - "flip_rate_actionable": flips.sum() / max(both_sig.sum(), 1), - "mean_abs_final_score_delta": ds.mean(), - "mean_abs_primary_score_delta": dp.mean(), - } - print(f"\n{out}") - - -if __name__ == "__main__": - main()