{
  "run_date": "2026-03-22T00:44:43.404343",
  "methodology": {
    "split": "60/40 time-ordered IS/OOS",
    "fomc_excluded": true,
    "trace_corruption_excluded": "2025-10-27 to 2026-02-17",
    "n_permutations": 1000,
    "rng_seed": 42,
    "ic_method": "Spearman rank correlation",
    "wr_test": "one-tailed permutation (observed >= shuffled)",
    "ic_test": "two-tailed permutation (|observed| >= |shuffled|)"
  },
  "signals": {
    "A1": {
      "signal": "A1: MM SKEW",
      "what": "IC of (MM gamma skew at 10AM: above_spot vs below_spot) vs 3H ES return. Claimed IC=-0.620 (contrarian: more gamma above spot \u2192 market falls). Sign=-1 (we use -skew as the signal so positive IC = contrarian works).",
      "n_oos": 134,
      "signal_metric": -0.04086464187426591,
      "null_baseline": -0.0017588311275770682,
      "p_value": 0.624,
      "is_metric": "IC=-0.0790",
      "oos_metric": "IC=-0.0409, WR=47.8%",
      "is_ic": -0.07897366946569886,
      "oos_ic": -0.04086464187426591,
      "oos_wr": 0.47761194029850745,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.038109027591432955,
      "down_months": 0.54,
      "verdict": "FAILS"
    },
    "A2": {
      "signal": "A2: GAMMA CONTRARIAN",
      "what": "IC of (total gamma at 10AM, all participants) vs 3H ES return. High gamma \u2192 expect fade/reversal. Signal = -total_gamma (contrarian). Claimed IC=-0.088.",
      "n_oos": 134,
      "signal_metric": 0.048691440905087674,
      "null_baseline": -0.002832871772557686,
      "p_value": 0.562,
      "is_metric": "IC=0.0599",
      "oos_metric": "IC=0.0487, WR=46.3%",
      "is_ic": 0.059856860057865086,
      "oos_ic": 0.048691440905087674,
      "oos_wr": 0.4626865671641791,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.011165419152777412,
      "down_months": 0.42,
      "verdict": "FAILS"
    },
    "A3": {
      "signal": "A3: GAMMA TILT (MM pct_above > 0.75)",
      "what": "Win rate when MM gamma tilt > 75% (more gamma above spot) \u2192 bullish 3H. Claimed WR 62-84% at various thresholds, morning only.",
      "n_oos": 35,
      "signal_metric": 0.6571428571428571,
      "null_baseline": 0.5749142857142857,
      "p_value": 0.182,
      "is_metric": "WR=55.3% (N=47)",
      "oos_metric": "WR=65.7% (N=35)",
      "down_months": 0.5555555555555556,
      "threshold_scan_oos": {
        "thr=0.55": "WR=63.8% N=47",
        "thr=0.6": "WR=65.9% N=44",
        "thr=0.65": "WR=70.0% N=40",
        "thr=0.7": "WR=66.7% N=36",
        "thr=0.75": "WR=65.7% N=35",
        "thr=0.8": "WR=61.3% N=31",
        "thr=0.85": "WR=58.6% N=29"
      },
      "verdict": "FAILS"
    },
    "A4": {
      "signal": "A4: FADE RETAIL (Customer Gamma Skew)",
      "what": "IC of (-cust_skew) vs 3H ES return. Fade customers: if cust_skew > 0 (customers long gamma above spot), expect negative return. Claimed IC=-0.126. PREVIOUSLY FLAGGED DEAD (IC=+0.024 on clean data). Verifying here.",
      "n_oos": 134,
      "signal_metric": -0.0049842352029658915,
      "null_baseline": 0.0004724307144392044,
      "p_value": 0.954,
      "is_metric": "IC=0.0296",
      "oos_metric": "IC=-0.0050, WR=50.7%",
      "is_ic": 0.029581523758841682,
      "oos_ic": -0.0049842352029658915,
      "oos_wr": 0.5074626865671642,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.03456575896180757,
      "down_months": 0.48,
      "verdict": "FAILS"
    },
    "A5": {
      "signal": "A5: CUM MM (Cumulative MM Gamma Direction)",
      "what": "IC of (MM total gamma at 10AM) vs 3H ES return. Positive MM gamma \u2192 market bullish (or contrarian?). Claimed IC=+0.120.",
      "n_oos": 134,
      "signal_metric": -0.021728477572651925,
      "null_baseline": -0.0037611039552940804,
      "p_value": 0.799,
      "is_metric": "IC=-0.0436",
      "oos_metric": "IC=-0.0217, WR=56.7%",
      "is_ic": -0.043567839195979896,
      "oos_ic": -0.021728477572651925,
      "oos_wr": 0.5671641791044776,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.02183936162332797,
      "down_months": 0.58,
      "verdict": "FAILS"
    },
    "A6": {
      "signal": "A6: INST FLOW DOMINANCE (firm+bd+mm gamma / retail gamma)",
      "what": "IC of (institutional gamma dominance ratio at 10AM) vs 3H ES return. High inst dominance \u2192 bullish. Claimed WR=71.6%, IC=+0.174. Note: proxy uses TRACE gamma ratio, not DTE-based classification.",
      "n_oos": 134,
      "signal_metric": -0.02561381764589785,
      "null_baseline": 0.007011569984132416,
      "p_value": 0.76,
      "is_metric": "IC=-0.0024",
      "oos_metric": "IC=-0.0256, WR=56.7%",
      "is_ic": -0.002402923709456373,
      "oos_ic": -0.02561381764589785,
      "oos_wr": 0.5671641791044776,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.023210893936441476,
      "down_months": 0.64,
      "verdict": "FAILS"
    },
    "A7": {
      "signal": "A7: MM GAMMA ASYMMETRY (mm_gamma above / total_mm)",
      "what": "IC of (mm_above / |mm_total|) vs 3H ES return. More MM gamma above spot \u2192 bearish (contrarian). Sign=-1. Claimed OOS IC=+0.133, Sharpe=1.78.",
      "n_oos": 134,
      "signal_metric": -0.0039052904715681075,
      "null_baseline": -0.003631349058406367,
      "p_value": 0.959,
      "is_metric": "IC=-0.0433",
      "oos_metric": "IC=-0.0039, WR=44.0%",
      "is_ic": -0.043337901629358924,
      "oos_ic": -0.0039052904715681075,
      "oos_wr": 0.44029850746268656,
      "is_n": 199,
      "oos_n": 134,
      "gap_pp": 0.039432611157790814,
      "down_months": 0.44,
      "verdict": "FAILS"
    },
    "B1": {
      "signal": "B1: VIX RATIO MOMENTUM (VIX9D/VIX drops fast \u2192 long ES)",
      "what": "VIX9D/VIX ratio declining quickly \u2192 long ES next hour. Claimed 64% WR hourly, N=571.",
      "n_oos": 17,
      "signal_metric": "N/A \u2014 insufficient intraday VIX history",
      "null_baseline": "N/A",
      "p_value": null,
      "is_metric": "N/A",
      "oos_metric": "N/A",
      "down_months": "N/A",
      "verdict": "INSUFFICIENT DATA (vix_intraday_log.csv has only 17 trading days)",
      "note": "vix_intraday_log.csv only covers 17 days starting 2026-03-04. Need multi-year intraday VIX data. Cannot test without proper data source."
    },
    "B2": {
      "signal": "B2: CALM VIX + DXY RISING",
      "what": "WR when VIX_930 < 18 AND DXY daily return > 0 \u2192 long ES day. Claimed 67% WR, N=149. NOTE: using daily DXY (not hourly) as proxy.",
      "n_oos": 63,
      "signal_metric": 0.38095238095238093,
      "null_baseline": 0.5094920634920634,
      "p_value": 0.996,
      "is_metric": "WR=44.2% (N=95)",
      "oos_metric": "WR=38.1% (N=63)",
      "down_months": 0.2972972972972973,
      "verdict": "FAILS",
      "caveat": "Using daily DXY returns instead of 1H DXY \u2014 may miss intraday signal"
    },
    "B3": {
      "signal": "B3: DXY UP + ES RESILIENT",
      "what": "WR when DXY daily return > 0 \u2192 ES positive day. Claimed 67% WR, N=48. NOTE: using daily resolution, not intraday 'ES resilient' filter.",
      "n_oos": 96,
      "signal_metric": 0.4479166666666667,
      "null_baseline": 0.5030833333333333,
      "p_value": 0.964,
      "is_metric": "WR=49.0% (N=151), IC=-0.1232",
      "oos_metric": "WR=44.8% (N=96), IC=-0.1137",
      "down_months": 0.39344262295081966,
      "verdict": "FAILS",
      "caveat": "B3 requires intraday DXY to properly capture 'ES resilient' filter \u2014 daily data is an approximation"
    },
    "C1": {
      "signal": "C1: FACTORMINER F080 (daily signal)",
      "what": "IC of F080 normalized signal vs next-day ES return. Claimed IC=0.260, Sharpe=2.12, N=267.",
      "n_oos": 114,
      "signal_metric": 0.06722828618294488,
      "null_baseline": 0.0020125554363014117,
      "p_value": 0.506,
      "is_metric": "IC=0.0314, N=170",
      "oos_metric": "IC=0.0672, Sharpe=1.33, N=114",
      "f080_z_oos_ic": 0.06722828618294488,
      "f080_z_p": 0.49,
      "down_months": 0.4,
      "verdict": "FAILS"
    },
    "C2": {
      "signal": "C2: FACTORMINER F042",
      "what": "F042 signal vs next-day ES return. Claimed IC=0.109, Sharpe=1.62, N=267.",
      "n_oos": 0,
      "signal_metric": "N/A",
      "null_baseline": "N/A",
      "p_value": null,
      "is_metric": "N/A",
      "oos_metric": "N/A",
      "down_months": "N/A",
      "verdict": "INSUFFICIENT DATA",
      "note": "No factorminer-f042-daily.csv file exists in data/. Cannot test without source data."
    },
    "C3": {
      "signal": "C3: P/C OI RATIO CONTRARIAN",
      "what": "Extreme P/C OI ratio \u2192 contrarian next day. Claimed Sharpe=1.42, N=86.",
      "n_oos": 0,
      "signal_metric": "N/A",
      "null_baseline": "N/A",
      "p_value": null,
      "is_metric": "N/A",
      "oos_metric": "N/A",
      "down_months": "N/A",
      "verdict": "INSUFFICIENT DATA",
      "note": "No P/C OI ratio data file found in data/. Files checked: []"
    },
    "C4": {
      "signal": "C4: MAX PAIN PINNING",
      "what": "Price pins near max pain strike",
      "n_oos": 0,
      "signal_metric": "N/A",
      "null_baseline": "N/A",
      "p_value": null,
      "is_metric": "N/A",
      "oos_metric": "N/A",
      "down_months": "N/A",
      "verdict": "INSUFFICIENT DATA \u2014 boolean index did not match indexed array along axis 0; size of axis is 318 but size of corresponding boolean axis is 213"
    },
    "D1": {
      "signal": "D1: MONDAY LONG (buy open, sell close)",
      "what": "WR of Monday RTH day return > 0. Claimed 69% WR, N=72.",
      "n_oos": 64,
      "signal_metric": 0.640625,
      "null_baseline": 0.50778125,
      "p_value": 0.009,
      "is_metric": "WR=63.4% N=93",
      "oos_metric": "WR=64.1% N=64",
      "all_days_wr": {
        "Monday": "WR=63.7% N=157",
        "Tuesday": "WR=53.2% N=158",
        "Wednesday": "WR=51.1% N=135",
        "Thursday": "WR=45.2% N=155",
        "Friday": "WR=56.2% N=144"
      },
      "monday_by_year": {
        "2023": {
          "wr": 0.8095238095238095,
          "n": 42
        },
        "2024": {
          "wr": 0.5,
          "n": 52
        },
        "2025": {
          "wr": 0.6153846153846154,
          "n": 52
        },
        "2026": {
          "wr": 0.7272727272727273,
          "n": 11
        }
      },
      "down_months": 0.5789473684210527,
      "verdict": "SURVIVES"
    },
    "D2": {
      "signal": "D2: 2-DAY REVERSAL (2 down days \u2192 buy next day)",
      "what": "WR when previous 2 days both negative \u2192 next day positive. Claimed Sharpe=2.13. Inverse test: 2 up days \u2192 sell (should also work if reversal is real).",
      "n_oos": 64,
      "signal_metric": 0.46875,
      "null_baseline": 0.50596875,
      "p_value": 0.781,
      "is_metric": "WR=64.5% N=76",
      "oos_metric": "WR=46.9% N=64",
      "inverse_test_2up_short": "WR_short=54.9% N=71 p=0.8650 (WR_long=45.1%)",
      "down_months": 0.4318181818181818,
      "verdict": "FAILS",
      "note": "If reversal is real, 2-up \u2192 sell should ALSO work. Check inverse_test."
    },
    "E1": {
      "signal": "E1: ORB BREAK THRESHOLD ANALYSIS",
      "what": "Analysis of OR15/OR30 range distributions and break threshold adequacy. Rule 20: WR% must always state threshold, horizon, null baseline. If effective break threshold < 7pts, flag ORB tree as potentially contaminated.",
      "n_total": 744,
      "or15_range_median_pts": 12.25,
      "or15_range_mean_pts": 14.901209677419354,
      "or15_range_p25": 9.0,
      "or15_range_p75": 17.75,
      "or30_range_median_pts": 16.5,
      "pct_or15_range_below_7pts": 0.09274193548387097,
      "pct_or15_range_below_10pts": 0.31451612903225806,
      "double_break_pct": 0.6075268817204301,
      "clean_break_pct": 0.3924731182795699,
      "n_oos": 296,
      "signal_metric": "N/A (analysis only)",
      "null_baseline": "N/A",
      "p_value": null,
      "is_metric": "N/A",
      "oos_metric": "N/A",
      "down_months": "N/A",
      "verdict": "FLAG: 9% of OR15 ranges are below 7pts \u2014 on these days, a 1-tick move outside the range counts as a 'break'. ORB decision tree break_direction_correct WR may be inflated on narrow-range days. Median OR15 range = 12.2pts (safe), but narrow days contaminate the distribution.",
      "note": "The 'break' in the ORB tree appears to be any move outside the OR, not a threshold-gated break. On days where OR < 7pts, the signal is noise."
    },
    "E2": {
      "signal": "E2: GEX DIRECTION (gex_tier=DEEP_NEG predicts ORB break direction)",
      "what": "WR when gex_tier=DEEP_NEG that the ORB15 break direction is correct (or15_break_direction_correct=True). Claimed 68% WR. Testing if DEEP_NEG predicts direction vs just volatility.",
      "n_oos": 44,
      "signal_metric": 0.6818181818181818,
      "null_baseline": 0.5544545454545455,
      "p_value": 0.053,
      "is_metric": "WR=55.8% N=52",
      "oos_metric": "WR=68.2% N=44",
      "all_tiers_wr_oos": {
        "LOW_POS": "WR=52.3% N=44",
        "NEG": "WR=52.5% N=40",
        "MID_POS": "WR=56.5% N=69",
        "HIGH_POS": "WR=51.4% N=70",
        "DEEP_NEG": "WR=68.2% N=44",
        "EXTREME_POS": "WR=48.3% N=29"
      },
      "deep_neg_avg_range_pts": 33.35227272727273,
      "other_tiers_avg_range_pts": 17.099206349206348,
      "down_months": 0.6538461538461539,
      "verdict": "MARGINAL (p<0.10)",
      "note": "DEEP_NEG avg OR15 range=33.4pts vs others=17.1pts \u2014 if DEEP_NEG has wider ranges, it may just predict volatility not direction."
    },
    "E3": {
      "signal": "E3: BUY_PCT BEAR_WEAK (or15_buypct_cat)",
      "what": "WR when or15_buypct_cat=BEAR_WEAK that the day return is negative. Claimed 80% WR, N=15 OOS. LABELED HYPOTHESIS.",
      "n_oos": 15,
      "signal_metric": 0.6666666666666666,
      "null_baseline": 0.47420000000000007,
      "p_value": 0.111,
      "is_metric": "WR=58.8% N=34",
      "oos_metric": "WR=66.7% N=15",
      "avg_bear_weak_day_ret_oos": -0.4764321188533289,
      "down_months": 1.0,
      "verdict": "HYPOTHESIS (N too small \u2014 N=15 OOS)",
      "note": "N=15 OOS is below minimum threshold for verdict. Avg day return on BEAR_WEAK OOS: -0.48%."
    },
    "F1": {
      "signal": "F1: BUY PRESSURE (buy_pct_30m at 10AM, from ES 1-min)",
      "what": "IC of buy_pct at 30-min mark (9:30-10:00) vs 3H forward return (10AM-1PM). Also: WR when buy_pct > P80 (51.24%). These are the core signals in the buy_pressure_service.py.",
      "n_oos": 300,
      "signal_metric": 0.1249427771165479,
      "null_baseline": -0.00041878083924529473,
      "p_value": 0.036,
      "is_metric": "IC=0.0003, WR_hi=51.0% N=104",
      "oos_metric": "IC=0.1249, WR_hi=64.4% N=59 p=0.0350",
      "high_buypct_wr_oos": 0.6440677966101694,
      "high_buypct_p": 0.035,
      "high_buypct_n": 59,
      "rvol_30m_ic_oos": 0.039025784297955744,
      "rvol_30m_p": 0.511,
      "down_months": 0.6,
      "verdict": "SURVIVES"
    }
  }
}