Add reaction_close salvage variant to PeerSympathy engine
Add peer_sympathy_entry_timing_policy ("next_open"|"reaction_close") and
peer_sympathy_leader_filing_time_buckets to StrategyEngineConfig. The
reaction_close variant enters peers at peer's T 16:00 ET close on the
SAME trading day as the leader's print, addressing the v1 hypothesis
failure where T+1 gap had already absorbed the news overnight.
Lookahead defenses tightened for the new branch: cutoff is T 16:00 ET
(_bar_close_timestamp(decision_date)) instead of T+1 09:30 ET; bucket
allow-list excludes AMC filings (which under PEAD's reaction_date=T+1
convention pass the timestamp check but defeat same-session sympathy).
LeaderPrint now carries filing_time_bucket from the runner.
Runner: split _schedule_peer_sympathy_candidates into two phases.
reaction_close fires BEFORE _select_candidates_for_date(date) and emits
into _scheduled_add_ons[date]; next_open keeps the existing tail-of-loop
position emitting into _scheduled_delayed_entries[next_date].
v2 backtest (1052 trading days, midlarge-liquid-long-v1 snapshot):
trades 256→120, return -52.9%→-2.4%, MDD 61.6%→24.5%, SQS 19.6→30.2.
Sample sympathy plays: GOOGL on META +7.7%, AVGO on COHR +6.3%,
SLB on HAL +5.5%, GE on HWM +5.1%. Profit factor 0.977 (one tweak
from breakeven). Verdict: VIABLE BUT WEAK — salvage hypothesis
empirically validated, near breakeven, not promoted yet.
35/35 peer_sympathy unit tests pass (29 pre-existing + 6 new for
reaction_close path).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
main
parent
2a8e9c526e
commit
68102f1b3a
@ -0,0 +1,89 @@
|
||||
{
|
||||
"experiment_name": "peer_sympathy_poc_v2_reaction_close",
|
||||
"dataset_snapshot_id": "midlarge-liquid-long-v1_bucketfix_full_audit_canonical_ftb_fix_v2",
|
||||
"description": "PeerSympathy salvage variant: enter peers at peer's reaction_close on T (same trading day as the leader's print) instead of T+1 next_open. Hypothesis: peers move in the SAME intraday session as the leader (NVDA prints BMO -> AVGO/AMD rally same day's market hours), not on T+1 gap which already absorbed the news overnight. Filing-time bucket allow-list restricts to BMO + regular_hours leader prints; AMC filings are excluded because their reaction_date = T+1 means peer's reaction_close on T+1 is already ~20 trading hours after the news, defeating the same-session sympathy thesis. All other parameters identical to v1 baseline.",
|
||||
"base_config": "configs/backtest/return_max_long_v1.json",
|
||||
"overrides": {
|
||||
"signal": {
|
||||
"scoring_model": "return_max_long_v13e",
|
||||
"score_threshold": 0.0,
|
||||
"max_candidates_per_day": 18,
|
||||
"a_tier_score_threshold": 0.99
|
||||
},
|
||||
"risk": {
|
||||
"per_trade_risk_pct": 0.65,
|
||||
"per_trade_risk_pct_a_tier": 0.65,
|
||||
"max_daily_new_risk_pct": 50,
|
||||
"max_positions": 30,
|
||||
"max_positions_per_sector": 30,
|
||||
"max_position_value_pct": 25,
|
||||
"max_adv_fraction": 0.3,
|
||||
"macro_regime_neutral_size_scaler": 1,
|
||||
"macro_regime_risk_off_size_scaler": 1,
|
||||
"veto_unknown_direction": false,
|
||||
"veto_bearish_direction": false,
|
||||
"macro_regime_risk_off_a_tier_only": false,
|
||||
"stop_atr_multiplier": 1.75,
|
||||
"allow_budget_downsizing": true,
|
||||
"cash_parking_preset": null,
|
||||
"fixed_capital_sizing": false
|
||||
},
|
||||
"execution": {
|
||||
"trailing_warmup_days": 7,
|
||||
"max_holding_days": 3,
|
||||
"early_failure_no_progress_days": 1,
|
||||
"early_failure_no_progress_r": 0.0,
|
||||
"early_failure_no_progress_fraction": 0,
|
||||
"lookback_entry_enabled": false
|
||||
},
|
||||
"event_type_profiles": {
|
||||
"peer_sympathy": {
|
||||
"enabled": true,
|
||||
"direction_filter": "any",
|
||||
"max_holding_days_override": 3
|
||||
}
|
||||
},
|
||||
"idle_alpha_sleeve_preset": null,
|
||||
"form4_capture_sleeve_preset": null,
|
||||
"ownership_capture_sleeve_preset": null,
|
||||
"risk_off_alpha_sleeve_preset": null,
|
||||
"dividend_capture_sleeve_preset": null
|
||||
},
|
||||
"strategy_engines": [
|
||||
{
|
||||
"engine_id": "peer_sympathy_long_reaction_close",
|
||||
"event_types": ["peer_sympathy"],
|
||||
"timing_class": "same_day",
|
||||
"direction": "long_only",
|
||||
"entry_timing_policy": "reaction_close",
|
||||
"engine_risk_budget_pct": 1.0,
|
||||
"score_threshold_override": 0.0,
|
||||
"max_holding_days": 3,
|
||||
"peer_sympathy_enabled": true,
|
||||
"peer_sympathy_entry_timing_policy": "reaction_close",
|
||||
"peer_sympathy_leader_filing_time_buckets": ["pre_market", "regular_hours"],
|
||||
"peer_sympathy_leader_event_types": [
|
||||
"earnings_release",
|
||||
"guidance_update",
|
||||
"material_contract"
|
||||
],
|
||||
"peer_sympathy_leader_reaction_min": 0.05,
|
||||
"peer_sympathy_correlation_min": 0.55,
|
||||
"peer_sympathy_correlation_window_start": 65,
|
||||
"peer_sympathy_correlation_window_end_skip": 5,
|
||||
"peer_sympathy_top_n_peers": 2,
|
||||
"peer_sympathy_blackout_days_to_peer_event": 3,
|
||||
"peer_sympathy_stop_pct": 0.035,
|
||||
"peer_sympathy_target_pct": 0.06,
|
||||
"peer_sympathy_max_holding_days": 3,
|
||||
"leader_follower_min_days_to_event": 3,
|
||||
"enabled": true
|
||||
}
|
||||
],
|
||||
"tags": ["peer_sympathy", "sympathy_rally", "poc", "salvage_v2", "reaction_close"],
|
||||
"version_family": "peer_sympathy",
|
||||
"status": "draft",
|
||||
"changelog": "v2 salvage variant of peer_sympathy_poc_v1: same-day reaction_close entry on T (peer's 16:00 ET close) instead of T+1 next_open, restricted to BMO + regular_hours leader filings. Tests this hypothesis: peers move in the SAME session as the leader's print, not on T+1 gap which already absorbed the news overnight.",
|
||||
"parent": "peer_sympathy_poc_v1",
|
||||
"performance_summary": null
|
||||
}
|
||||
Loading…
Reference in New Issue