138 lines
6.7 KiB
JSON
138 lines
6.7 KiB
JSON
{
| |||
"manifest_id": "R2-H-MANIFEST-v0.1.0-frozen",
| |||
"experiment": "R2-H",
| |||
"title": "HORIZON-BOUNDARY EXPERIMENT — formal design freeze manifest",
| |||
"status": "DESIGN FROZEN — EXECUTION NOT AUTHORIZED",
| |||
"freeze_date": "2026-08-26",
| |||
"branch": "main",
| |||
"anchor_commit": "67be79aa75ae98eace7c67b74c93797f4327d51a",
| |||
"anchor_commit_message": "research: finalize R1-R robustness synthesis",
| |||
"protocol": {
| |||
"path": "results/R2-H/R2_H_PROTOCOL.md",
| |||
"version": "r2-h-v0.1.0-frozen",
| |||
"sha256": "422d66d68bdaff71e94a2f3f3dbd853d8315f6a36c18776ccdecd1a6517165ac"
| |||
},
| |||
"configuration": {
| |||
"base_grid": "M1",
| |||
"atr_period": 20,
| |||
"atr_implementation": "R1-compatible M1 close-only deterministic close-change-based ATR proxy (NOT Wilder ATR); src/forecasting/target.py rolling_atr with high/low absent",
| |||
"arima_fit_window": 300,
| |||
"sax_fit_window": 24,
| |||
"drift_lookback": 40,
| |||
"primary_model": "Drift",
| |||
"secondary_models": ["ARIMA(1,0,0)", "SAX", "Hybrid"],
| |||
"secondary_models_role": "robustness/diagnostic only; never selected as best; cannot establish boundary claim"
| |||
},
| |||
"source_dataset": {
| |||
"path": "results/R1_real_data/XAUUSDc_M1_raw.json",
| |||
"symbol": "XAUUSDc",
| |||
"timeframe": "M1",
| |||
"n_bars": 397558,
| |||
"first_bar": "2025.06.02 01:00:00",
| |||
"last_bar": "2026.08.24 15:19:00",
| |||
"source_hash_raw_json_sha256": "5472357e67f70f7d1bfef8f9de67fcce91ee6f26208072d7a6766b06c158ee6e",
| |||
"hash_verification": "fresh SHA-256 computed in R2-H freeze session; not reused from R1-R",
| |||
"r1_close_only_hash_not_reused": "80e4b52b0df0c6e348ce2002348279eee9f6e8a61c3109efe82fe475ed3cbc19"
| |||
},
| |||
"horizon_definitions": {
| |||
"definition": "tau_H(o) = [P(t_end) - P(o)] / ATR20(o); t_end = first valid M1 bar timestamp >= timestamp(o) + H minutes; elapsed-time horizon, not bar count",
| |||
"H0_15min": {"role": "in-study R1-R control", "fwer_family": false},
| |||
"H1_60min": {"role": "primary", "fwer_family": true},
| |||
"H2_240min": {"role": "primary", "fwer_family": true},
| |||
"H9_960min": {"role": "diagnostic-only", "fwer_family": false, "note": "never enters FWER family, never determines success/failure, not a boundary, no adaptive promotion"}
| |||
},
| |||
"origin_selection": {
| |||
"rule": "candidates: M1 bar o in [2000, n) with resolvable elapsed endpoint; gap rule: any inter-bar delta > 5 min within (o, t_end] excludes origin; spacing: 2 x H elapsed minutes between accepted origins; no overlap; no cap; no human-selected origins; no model-dependent selection",
| |||
"warmup": 2000,
| |||
"spacing_mult": 2,
| |||
"gap_tolerance_minutes": 5,
| |||
"short_horizon_cap": "none",
| |||
"generator": "scripts/run_r2h_origins.py",
| |||
"generator_python": "3.14.6",
| |||
"generator_gap_exclusions": {
| |||
"H015": {"gap": 4370, "no_endpoint": 15},
| |||
"H060": {"gap": 17423, "no_endpoint": 60},
| |||
"H240": {"gap": 69623, "no_endpoint": 240}
| |||
},
| |||
"two_run_byte_identity": "PASS — both runs identical ordering, LF newlines, contents, SHA-256; verified with fc /b"
| |||
},
| |||
"origin_lists": {
| |||
"H015": {
| |||
"path": "results/R2-H/origins_H015.csv",
| |||
"horizon_minutes": 15,
| |||
"n_origins": 13193,
| |||
"sha256": "fb5a36e93c8f9c7b0fee638d35d551778f1a27cbc50e0727556cf6a1d8c5c7df"
| |||
},
| |||
"H060": {
| |||
"path": "results/R2-H/origins_H060.csv",
| |||
"horizon_minutes": 60,
| |||
"n_origins": 3169,
| |||
"sha256": "e7b5132c321f5350ec1e231d49d68dbc29468cdf9ee6a5014a2764aaf36eb9af"
| |||
},
| |||
"H240": {
| |||
"path": "results/R2-H/origins_H240.csv",
| |||
"horizon_minutes": 240,
| |||
"n_origins": 863,
| |||
"sha256": "3ad65e94f46731e65b8d40cf2b7746a6c0bd2eafe43216178d9e6e6c6ebcb910"
| |||
}
| |||
},
| |||
"statistical_params": {
| |||
"bootstrap_method": "Moving Block Bootstrap (MBB)",
| |||
"block_length_B": 60,
| |||
"block_length_unit": "M1 observations",
| |||
"bootstrap_repetitions": 10000,
| |||
"seed": 20260826,
| |||
"confidence_level": 0.95,
| |||
"ci_type": "percentile [2.5%, 97.5%]",
| |||
"effective_sample_size_formula": "n_eff = floor(n_usable / B)",
| |||
"n_eff_expected": {"H015": 219, "H060": 52, "H240": 14},
| |||
"expected_power": {"H015": "high usable-origin count", "H060": "moderate effective sample", "H240": "low effective sample"},
| |||
"power_note": "H240 must not be claimed to match H15 power; underpowered horizons are classified INCONCLUSIVE"
| |||
},
| |||
"fwer": {
| |||
"family": [60, 240],
| |||
"alpha_familywise": 0.05,
| |||
"control_horizon": "H0=15 outside family (in-study replication only, no independent claim)",
| |||
"method": "joint cross-horizon block bootstrap preserving chronological and cross-horizon dependence; max-statistic under re-centered global null; per-horizon interpretation only after global gate rejection",
| |||
"prohibited": ["independent per-horizon z-max approximation", "horizon shopping", "post-hoc multiplicity changes"]
| |||
},
| |||
"cost_params": {
| |||
"headline_round_trip_bps": 7.57,
| |||
"median_tick_spread_bps": 1.57,
| |||
"commission_bps": 6.00,
| |||
"status": "PRE-REGISTERED GLOBAL CONSTANT",
| |||
"formula": "cost_atr(o) = (7.57 / 10000) * close(o) / ATR20(o)",
| |||
"applied_to": "every origin, every primary horizon, identically",
| |||
"prohibited": ["future-looking spreads", "post-origin tick spreads", "cost tuning after results"],
| |||
"sensitivity": {"0.5x": "descriptive only", "2x": "descriptive only", "primary_decision_impact": "none"}
| |||
},
| |||
"primary_metrics": [
| |||
"direction accuracy (dependence-aware 95% CI)",
| |||
"mean gross return in ATR units (dependence-aware 95% CI)",
| |||
"mean net return in ATR units (dependence-aware 95% CI)",
| |||
"time-normalized / holding-period economic return"
| |||
],
| |||
"secondary_metrics": [
| |||
"MASE", "gross/cost ratio", "cost/range ratio", "trade coverage",
| |||
"number of origins", "effective sample size", "turnover/trade frequency",
| |||
"annualized or time-normalized economics", "EARLY/MIDDLE/LATE descriptive"
| |||
],
| |||
"no_lookahead_gates": {
| |||
"gates": ["F1 feature", "F2 target", "F3 ATR", "F4 SAX window", "F5 training boundary", "F6 normalization", "F7 horizon endpoint", "F8 cost", "F9 tick-derived"],
| |||
"classification": ["OBSERVED", "INFERRED", "UNKNOWN", "DECISION"],
| |||
"mutation_testing": "every primary horizon (15/60/240); >=3 origins per horizon",
| |||
"failure_classification": "INVALID / HARD STOP",
| |||
"defect_001": "SAX z-normalization invariant preserved; regression = HARD STOP"
| |||
},
| |||
"generated_design_artifacts": {
| |||
"protocol": "results/R2-H/R2_H_PROTOCOL.md",
| |||
"manifest": "results/R2-H/R2_H_MANIFEST.json",
| |||
"origin_lists": [
| |||
"results/R2-H/origins_H015.csv",
| |||
"results/R2-H/origins_H060.csv",
| |||
"results/R2-H/origins_H240.csv"
| |||
],
| |||
"generator": "scripts/run_r2h_origins.py"
| |||
},
| |||
"note": "Design freeze only. No forecasting model executed, no performance computed, no prediction/evidence artifact produced. Execution requires a separate explicit EXECUTION AUTHORIZATION gate."
| |||
}
|