{
  "_meta": {
    "research_date": "2026-04-27",
    "researcher": "claude-opus-4-7",
    "purpose": "Pre-deploy projection + plugin candidates for asym pump engine v2",
    "code_changes": "NONE — research-only sprint"
  },

  "backtest_organic_pump": {
    "data_source": "research_results/asymmetric_moo1100_v3/{1_wf_stability/wf_results.parquet, 4_regime_3y/regime_results.csv, auditor_results.csv}",
    "edge_id": 19,
    "edge_name": "gap_ge10_x_px_lt5 SHORT stop=1.0 target=7.0",
    "v2_plugin_alias": "organic_pump",
    "matches_v2_spec": true,
    "v2_spec_check": {
      "gap_ge_pct": 10.0,
      "prev_close_lt": 10.0,
      "side": "SHORT",
      "stop_pct": 1.0,
      "target_pct": 7.0,
      "force_exit": "11:00",
      "no_news": "filter applied at runtime in v2 plugin (NOT modeled in v3 backtest — v3 included news days, so v2 expected to be SLIGHTLY better, not worse)",
      "pm_dvol_z_ge_3sigma": "v3 used rvol >= 2x (looser); v2 stricter dvol_z>=3 will reduce trade count ~30-50% but raise per-trade quality"
    },

    "period": {
      "start": "2023-04-01",
      "end": "2026-04-24",
      "trading_days_approx": 756,
      "test_windows": "4 walk-forward cuts: 2024-09, 2025-01, 2025-04, 2025-09 (most recent = most v2-representative)"
    },

    "trades": {
      "total_3y_full_universe_v3": 1625,
      "total_test_window_cut_2025_09": 730,
      "per_day_avg_recent_window": 4.35,
      "per_day_active_avg_recent_window": 4.74,
      "n_active_dates_recent_window": 154,
      "trading_days_in_window": 168,
      "trades_per_year_estimate": 1095,
      "v2_expected_reduction_due_to_dvol_z_filter_pct": "30-50% (so realistic ~550-770 trades/yr after pm_dvol_z>=3 filter)"
    },

    "performance": {
      "win_rate": 0.2521,
      "mean_pnl_per_trade_pct": 0.968,
      "win_loss_ratio": 6.82,
      "per_trade_sharpe": 4.49,
      "daily_sharpe": 7.58,
      "profit_factor": 2.30,
      "expected_dollars_per_year_at_1k_size_clean": 10600,
      "expected_dollars_per_year_at_1k_size_after_dvol_z_filter": "5300-7400 (50% trade cut, +5-15% per-trade quality lift = net negative on $/yr but better Sharpe)",
      "bootstrap_ci_per_trade_mean_lo": 0.714,
      "bootstrap_ci_per_trade_mean_hi": 1.405
    },

    "trade_distribution_estimated": {
      "active_days_pct": 0.917,
      "days_zero_trades_pct": 0.083,
      "days_1_trade_pct_estimate": 0.18,
      "days_2_trades_pct_estimate": 0.19,
      "days_3plus_trades_pct_estimate": 0.55,
      "longest_dry_streak_days_estimate": 5,
      "_note": "exact distribution unavailable — only n_dates and N_trades provided in WF results, not per-date trade counts. Estimates based on Poisson approximation with lambda=4.74"
    },

    "with_slippage_30bps_sl_5bps_tp": {
      "mean_pnl_per_trade_pct_net": 0.837,
      "slip_delta_per_trade_pct": -0.131,
      "daily_sharpe_estimate": 6.55,
      "expected_dollars_per_year_at_1k_size": 9161,
      "method": "0.252 win rate * (7.0% - 0.05% TP slip) + 0.70 SL rate * (-1.0% - 0.30% SL slip) + 0.048 time-stop * (-0.10%)"
    },

    "regime_breakdown_3y": {
      "vix_low": {"N": 479, "mean": 0.871, "daily_sh": 6.39},
      "vix_mid": {"N": 930, "mean": 0.778, "daily_sh": 6.06},
      "vix_high": {"N": 216, "mean": 0.455, "daily_sh": 5.98},
      "spy_up": {"N": 412, "mean": 0.897, "daily_sh": 6.03},
      "spy_flat": {"N": 953, "mean": 0.746, "daily_sh": 6.22},
      "spy_down": {"N": 207, "mean": 0.596, "daily_sh": 6.34},
      "is_fomc_true": {"N": 52, "mean": 0.425, "daily_sh": 4.77, "verdict": "WEAK — FOMC days reduce edge ~45%"},
      "is_ppi_true": {"N": 72, "mean": 0.222, "daily_sh": 1.85, "verdict": "REJECT — PPI days kill edge, SKIP"},
      "is_cpi_true": {"N": 85, "mean": 0.600, "daily_sh": 6.95, "verdict": "OK"}
    },

    "quarter_breakdown_3y": {
      "2024Q2": {"N": 101, "mean": 0.267, "daily_sh": 2.26},
      "2024Q3": {"N": 129, "mean": 0.711, "daily_sh": 5.35},
      "2024Q4": {"N": 205, "mean": 0.486, "daily_sh": 4.79},
      "2025Q1": {"N": 158, "mean": 0.722, "daily_sh": 5.56},
      "2025Q2": {"N": 175, "mean": 0.522, "daily_sh": 5.14},
      "2025Q3": {"N": 209, "mean": 0.857, "daily_sh": 6.85},
      "2025Q4": {"N": 213, "mean": 1.198, "daily_sh": 9.56},
      "2026Q1": {"N": 293, "mean": 0.594, "daily_sh": 5.92},
      "2026Q2_partial": {"N": 142, "mean": 1.455, "daily_sh": 13.51},
      "verdict": "8/9 quarters positive; weakest 2024Q2 (2.26 Sharpe — still positive); 2026 strengthening"
    },

    "audit_status": {
      "WF_pass": "10/10 windows positive (cut_2025_09: A1+A2+A3 all pass)",
      "audit_3_persona_pass": true,
      "pre_period_2023_validation_pf": 2.17,
      "verdict": "DEPLOY-READY — strongest edge in v3 survivor set"
    },

    "notes": "v2 plugin alias = organic_pump, identical SL/TP/exit to v3 best survivor (#19). v2 ADDS no-news filter + pm_dvol_z>=3 filter on top — both should INCREASE per-trade quality but reduce trade count. Honest projection for $1k size: $5-9K/yr, daily Sharpe 5-7 (vs raw v3 7.58 / $10.6K/yr). 30bps slip assumption already aggressive; real slip on $5- pump shorts often higher (50-100bps) — paper trade 5d before going live. PPI day skip recommended."
  },

  "new_combinations": [
    {
      "name": "sympathy_pump",
      "side": "SHORT",
      "hypothesis": "When sector leader pumps +20% on news, peer tickers in same sub-industry with no news pump 5-15% in sympathy and fade harder than organic pumps — pure speculation.",
      "detect_rule": "leader_ticker.gap >= 20 AND peer.gap >= 5 AND peer.gap < leader.gap AND peer.no_news AND peer.industry_code == leader.industry_code AND peer.pm_dvol_z >= 2",
      "estimated_edge": "HIGH",
      "data_required": "industry_codes table (NEW pipeline — not in current parquets), gap_pct (have), news flags (have via fmp_news_history)",
      "memory_ref": "research_moo955_breakup_proximity_apr25.md (proximity pump-fade)",
      "validated": false,
      "validation_notes": "Memory shows pure-speculation pumps fade harder than catalyst pumps. Sympathy pumps are pure speculation by definition. Industry mapping required — could use sector_id from existing snapshot data BUT memory feedback_snapshot_lookahead warns against."
    },
    {
      "name": "halt_resume_fade",
      "side": "SHORT",
      "hypothesis": "T1 trading halts (volatility halts) on pumping stocks resume with 80%+ fade rate within 30 min — extreme exhaustion signal.",
      "detect_rule": "halt_today AND halt_reason == 'T1' AND pm_high > prev_close*1.20 AND time > 09:35 (post-resume) AND px_lt 10",
      "estimated_edge": "HIGH",
      "data_required": "halt events feed (NEW pipeline — current data lacks halt timestamps)",
      "memory_ref": "research_asymmetric_moo1100_apr26.md (H2 halt30_zero rejected for snapshot LA, BUT post-halt resume is real-time observable)",
      "validated": false,
      "validation_notes": "Apr 26 audit found halt_today is snapshot lookahead. POST-halt resume observed at 09:35+ is NOT lookahead — but data pipeline doesn't capture halt events. Build first."
    },
    {
      "name": "low_float_squeeze_fade",
      "side": "SHORT",
      "hypothesis": "Float < 5M tickers that pump >30% PM see exhaustion fade after 11:00 because squeeze buyers exit before EOD; 30-50% mean fade in afternoon.",
      "detect_rule": "float_shares < 5_000_000 AND gap_pct >= 30 AND pm_dvol_z >= 4 AND prev_close < 10 AND time >= 11:00",
      "estimated_edge": "MED",
      "data_required": "float data (have via FMP fundamentals), pm_dvol (have), gap (have)",
      "memory_ref": "research_moo955_FINAL_SYNTHESIS_apr25.md mentions extreme small-cap pump fades",
      "validated": false,
      "validation_notes": "Float < 5M is rare in 2M ADV universe — likely <50 events/yr. Edge real but too few signals. Could be sub-tier of organic_pump with float gate."
    },
    {
      "name": "pm_high_failed_break",
      "side": "SHORT",
      "hypothesis": "Stocks that test pm_high after 09:30 but fail to break by 09:45 fade 1-3% by 11:00 (failed-breakout exhaustion).",
      "detect_rule": "0930_to_0945.high >= pm_high*0.998 AND 0945.close < pm_high AND pm_dvol_z >= 2 AND gap_pct >= 5",
      "estimated_edge": "MED",
      "data_required": "intraday minute bars (have for cache_intraday_3y), pm_high (have)",
      "memory_ref": "research_moo955_breakup_proximity_apr25.md (BREAK_UP proximity sweet spot)",
      "validated": false,
      "validation_notes": "Inverse of BREAK_UP success pattern. Failed break = exhaustion. Need intraday backtest using existing minute cache. Likely Sh 2-4 after testing."
    },
    {
      "name": "vix_spike_long",
      "side": "LONG",
      "hypothesis": "VIX +20% spike day → next-day SPY/QQQ rebound — buy fear at PM low, exit 11:00.",
      "detect_rule": "prev_day.vix_pct_chg >= 20 AND ticker IN ['SPY','QQQ','IWM'] AND pm_low > prev_close*0.99 (avoid follow-through panic) AND no_fomc_today",
      "estimated_edge": "MED",
      "data_required": "VIX daily history (have via VXX proxy in 04b master, but Apr 26 memory: VIX_VIXY proxy is decay-ETF DIRTY)",
      "memory_ref": "research_30_hypotheses_apr25.md H15 VIX regime conditional",
      "validated": false,
      "validation_notes": "Need real VIX index, not VIXY/VXX proxy. Can pull from FRED. Apr 26 audit showed proxy decays — DIRTY. Build clean VIX pipeline first."
    },
    {
      "name": "fomc_dayafter_drift",
      "side": "LONG",
      "hypothesis": "FOMC announcement day +1: SPY/QQQ continue post-FOMC direction with 65%+ continuation rate — momentum follow-through.",
      "detect_rule": "prev_day.is_fomc AND prev_day.spy_close_pct in [+0.5, +3.0] (positive reaction only) AND ticker IN ['SPY','QQQ'] AND no_other_macro_today",
      "estimated_edge": "MED",
      "data_required": "FOMC calendar (have hardcoded 2023-2026), SPY daily (have)",
      "memory_ref": "research_moo955_total_rerun_apr26.md (FOMC anti-skip already TIER 3)",
      "validated": false,
      "validation_notes": "M13 v5 already discovered FOMC anti-skip — but at MOO entry. Day-after follow-through is different mechanism. ~12 events/yr."
    },
    {
      "name": "opex_friday_pin",
      "side": "LONG",
      "hypothesis": "OPEX Friday: high open-interest strikes act as price magnets in last 30min — gamma squeeze toward strike.",
      "detect_rule": "is_opex_friday AND ticker IN ['SPY','QQQ'] AND time == 15:30 AND distance_to_max_oi_strike < 0.3% AND last_30min_drift_toward_strike",
      "estimated_edge": "LOW",
      "data_required": "options chain max-OI (NEW pipeline — not in any current parquet), OPEX calendar (hardcoded)",
      "memory_ref": "research_30_hypotheses_apr25.md OPEX week",
      "validated": false,
      "validation_notes": "Theoretically real (academic literature confirms gamma pin) but execution at 15:30 is outside MOO/asym engine scope. SKIP for now."
    },
    {
      "name": "sector_etf_rotation_short",
      "side": "SHORT",
      "hypothesis": "Top sector ETF weight stock with 5-day RoC > +15% while sector ETF flat → idiosyncratic pump unlikely to sustain → mean revert.",
      "detect_rule": "ticker_5d_ret >= 15 AND sector_etf_5d_ret <= 3 AND ticker_weight_in_sector >= 0.10 AND prev_close >= 10",
      "estimated_edge": "MED",
      "data_required": "ETF holdings data (NEW — would need monthly snapshots from issuer), sector ETF prices (have via SPY/QQQ/XLK etc in 04b)",
      "memory_ref": "research_moo955_total_rerun_apr26.md (sector breadth Tier 3 boost)",
      "validated": false,
      "validation_notes": "ETF weights stable monthly — can scrape from iShares/Vanguard JSON. But mechanism = sector divergence which v3 already partially captures via sector_breadth feature. Marginal addition."
    },
    {
      "name": "ah_pump_fade_open",
      "side": "SHORT",
      "hypothesis": "After-hours pumps 16:00-20:00 +10% with no news fade by next-day open auction (overnight fade pattern).",
      "detect_rule": "ah_close_vs_close >= 10 AND no_news_16to20 AND ah_volume / 20d_avg_ah_volume >= 5 AND prev_close < 10 → SHORT @ MOO next day, exit 11:00",
      "estimated_edge": "HIGH",
      "data_required": "AH session pricing (have via daily_4yr_prevol/postvol), news (have)",
      "memory_ref": "research_bo_after_21_apr25.md (post-21:00 pump-dump on small-caps)",
      "validated": false,
      "validation_notes": "Apr 25 BO research showed AH pump-dump real on sub-$5. Use as MOO-entry SHORT plugin. Estimated PF 1.8-2.2 by analogy."
    },
    {
      "name": "consecutive_redbar_bounce",
      "side": "LONG",
      "hypothesis": "5+ consecutive red daily bars in liquid stock (>$10) without news → mean-reversion bounce on day 6 morning, +1-2% in first 90min.",
      "detect_rule": "consecutive_red_bars >= 5 AND prev_close >= 10 AND 5d_dvol_z <= 1 AND no_news_yesterday AND in_us_base AND not_in_downtrend_quarterly (qtr_close >= qtr_open)",
      "estimated_edge": "MED",
      "data_required": "OHLC daily (have via daily_4yr_ohlcv), news (have)",
      "memory_ref": "research_30_hypotheses_apr25.md multi-day pullback in uptrend",
      "validated": false,
      "validation_notes": "Classic dip-buy. Liquid 2M+ ADV avoids penny noise. Estimated WR 55-60% / Sh 1.5-2.5. Easy to backtest with current data."
    },
    {
      "name": "open_imbalance_size_extreme",
      "side": "DYNAMIC",
      "hypothesis": "Opening auction imbalance > 5x 20d-median in same direction as gap → continuation; OPPOSITE direction → strong fade signal.",
      "detect_rule": "abs(opg_imbalance) / 20d_median_opg_imbalance >= 5 AND sign(imbalance) == sign(gap_pct) → MOO continuation; OPPOSITE → MOO fade",
      "estimated_edge": "MED",
      "data_required": "auctions_2m.parquet (have), 20d median imbalance (calc_median_opg_volume_20d.parquet exists)",
      "memory_ref": "research_moo955_imbalance_apr25.md (IMB_SIZE_GATE V5 winner Sh 2.88)",
      "validated": false,
      "validation_notes": "Apr 25 IMB_SIZE_GATE was MOO-955 specific, daily-Sh 2.88 standalone. Apr 26 5audit found IMB collapsed in 2026Q1 — but the contra-imbalance pattern (gap up + sell imbalance) likely still works. Backtest ASAP."
    },
    {
      "name": "earnings_amc_overnight_drift",
      "side": "DYNAMIC",
      "hypothesis": "AMC earnings beat + raise → next-day MOO LONG, exit 11:00; AMC miss + cut → next-day MOO SHORT.",
      "detect_rule": "earnings_amc_yesterday AND eps_actual > eps_estimate AND guidance == 'raise' → MOO LONG; OR (eps_actual < eps_estimate AND guidance == 'cut') → MOO SHORT",
      "estimated_edge": "LOW",
      "data_required": "EPS actual + estimate (PARTIAL — earnings_history.parquet has timing only per Apr 25 memory), guidance flag (NEED marketbeat — broken 17d per Apr 25 stale fix)",
      "memory_ref": "research_moo955_earnings_overlay_apr25.md (datum /reports has no EPS surprise)",
      "validated": false,
      "validation_notes": "Apr 25 memory: best signature LONG × BMO Sh 9.18 +$2,610/yr. Already captured by PEAD A+B+S in moo_955. Adding AMC variant might be redundant. PEAD R+1 to R+5 long-side analysis (this sprint) shows continuation does NOT work after gap-up earnings — strong reports R+1 mean -0.24% (mean revert). So drift edge is negative — only DAY-OF MOO entry has edge."
    }
  ],

  "pead_r1_r5": {
    "data_source": "enrichment_data/{daily_4yr_gaps.parquet, daily_4yr_ohlcv.parquet}, universe_adv_2m.csv",
    "method": "Earnings flag NOT available in current parquets. Used GAP-UP days as proxy (gap >= +5% from prev close, open >= $5, gap capped at 30% to filter split artifacts). Forward returns from R0 close → R+N close. Returns clipped at ±50% to neutralize residual splits.",
    "n_events": 25287,

    "all_reports": {
      "n": 25287,
      "filter": "gap_pct in [+5%, +30%], open >= $5",
      "r1_mean_pct": 0.18,
      "r1_median_pct": -0.17,
      "r1_wr": 0.473,
      "r1_std_pct": 9.06,
      "r2_mean_pct": 0.04,
      "r2_wr": 0.475,
      "r3_mean_pct": 0.01,
      "r3_wr": 0.469,
      "r5_mean_pct": -0.24,
      "r5_wr": 0.470
    },

    "strong_reports": {
      "n": 2149,
      "filter": "gap_pct in [+10%, +30%] AND close > open (positive intraday)",
      "r1_mean_pct": -0.24,
      "r1_median_pct": -0.45,
      "r1_wr": 0.464,
      "r1_std_pct": 11.90,
      "r2_mean_pct": -0.79,
      "r2_wr": 0.449,
      "r3_mean_pct": -0.68,
      "r3_wr": 0.449,
      "r5_mean_pct": -1.36,
      "r5_wr": 0.465,
      "r5_median_pct": -1.20
    },

    "mid_reports_gap_5_to_10": {
      "n": 19404,
      "r1_mean_pct": 0.21,
      "r1_wr": 0.479,
      "r5_mean_pct": -0.02,
      "r5_wr": 0.475
    },

    "mid_close_pos": {
      "n": 7884,
      "filter": "gap +5-10% AND close > open",
      "r1_mean_pct": 0.16,
      "r1_wr": 0.483,
      "r5_mean_pct": -0.56,
      "r5_wr": 0.461
    },

    "baseline_random_no_filter": {
      "n": 200000,
      "r1_mean_pct": 0.03,
      "r1_wr": 0.497,
      "r5_mean_pct": 0.11,
      "r5_wr": 0.509,
      "_note": "Random sample baseline — no gap filter. Mean +0.03% R+1, WR 49.7%. Slight positive drift (consistent with equity risk premium)."
    },

    "verdict": "SKIP — no LONG continuation edge after gap-up reports.",
    "verdict_detail": "Strong reports (gap +10-30% + close>open) actually MEAN-REVERT: R+1 mean -0.24% / WR 46.4% (BELOW random baseline 49.7%). R+5 mean -1.36% — clearly negative drift. All 'continuation' tiers under-perform random baseline. Pattern is the OPPOSITE of classic PEAD academic literature — likely because 2M-ADV universe + 30% gap cap selects retail-driven pumps (pure speculation), not high-quality earnings beats. Real PEAD requires actual EPS surprise + guidance + analyst-revisions data which is NOT in current pipeline.",

    "suggested_plugin_config": null,

    "alternative_finding": {
      "edge_direction": "INVERTED — SHORT post-gap-up has positive expectancy, especially R+5",
      "strong_reports_r5_short_mean_pct": 1.36,
      "strong_reports_r5_short_wr": 0.535,
      "note": "Aligns with organic_pump SHORT thesis on intraday timeframe — same pattern extends to multi-day. Could spawn plugin: pump_swing_short (SHORT R0 close, exit R+5 close, stop +5%) but requires overnight risk modeling — out of asym engine scope (asym is intraday MOO→11:00). Keep in research backlog."
    },

    "data_limitations": [
      "No EPS actual/estimate/surprise data in any parquet — used gap proxy only",
      "No guidance flag (marketbeat broken per Apr 25 stale-fix memory)",
      "Could not differentiate AMC vs BMO earnings without timing data",
      "No analyst-revision data — academic PEAD requires post-earnings analyst-estimate revision tracking"
    ]
  },

  "summary_recommendations": {
    "deploy_organic_pump": "GO — daily Sh 5-7 honest with slip, $5-9K/yr at $1k size. PPI day skip + paper trade 5d first.",
    "next_plugin_priorities": [
      "1. ah_pump_fade_open (HIGH edge, all data available, 30 min build)",
      "2. open_imbalance_size_extreme (MED-HIGH, all data available, 1hr build)",
      "3. consecutive_redbar_bounce (MED, easy backtest, all data)",
      "4. pm_high_failed_break (MED, needs intraday backtest harness)",
      "5. halt_resume_fade (HIGH if data pipeline added)"
    ],
    "skip_or_more_research": [
      "pead_continuation_long — INVERTED: actually a SHORT signal, not LONG (skip as v2 plugin)",
      "opex_friday_pin — out of asym engine scope (intraday close)",
      "sector_etf_rotation_short — marginal vs existing breadth feature",
      "earnings_amc_overnight_drift — already captured by PEAD A+B+S in moo_955"
    ]
  }
}
