feat(analysis,campaign,registry,cli): bootstrap net R through the process pipeline
The OOS bootstrap conduit RMetrics.trade_rs becomes net_trade_rs and carries the COST-NETTED per-trade R (r − cost_in_r, trade order). Every conduit consumer is thereby net-when-costed: the monte-carlo pooled-OOS and per-survivor bootstraps, the walk-forward oos_r pooling, and the deflation null-max — which previously compared a net observed statistic against a gross-resampled null whenever a costed campaign selected on net_expectancy_r. An uncosted run is bit-identical (empty cost stream ⇒ cost 0.0 per trade), so every existing golden pin stays green. Design: one conduit, no knob — an explicit net: knob would let a costed campaign silently produce a gross headline again (the exact misreading of the issue's evidence). Per-member RMetrics scalar fields stay gross; net_expectancy_r keeps its meaning. Wire shape unchanged (serde(skip)). The net series is materialized as a separate expression in summarize_r; the pinned-float expressions (net_sum, the SQN pair, the lockstep r_metrics_from_rs copies) keep their tokens verbatim. Fork decisions and rationales: issue #259 comments. New coverage, both hostless over the synthetic SYMA archive: a costed campaign twin shifts the pooled-OOS bootstrap (sweep→gate→wf→mc) and every per-survivor bootstrap (sweep→mc) below its gross sibling, with the trade population unchanged; a unit test pins the conduit as the cost-netted series with the empty-stream degeneracy. Existing conduit tests renamed with the field. Verified: full workspace suite green (71 result blocks), clippy clean, zero bare trade_rs tokens remain, ledger conduit prose updated in place. closes #259
This commit is contained in:
@@ -1564,11 +1564,13 @@ boundary is test-pinned on both sides), plus three new static guards
|
||||
(unanimous #200 triage): nothing flows out of them; filtering stays the gate's monopoly.
|
||||
`std::monte_carlo` bootstraps the stage's *incoming R-evidence* with one semantics,
|
||||
input-shaped by position — after a walk_forward, ONE `r_bootstrap` over the wf family's
|
||||
pooled per-window OOS `trade_rs` in roll order (`PooledOos`); after sweep/gates, one
|
||||
`r_bootstrap` per surviving member's fresh in-memory series (`PerSurvivor`, ordinals into
|
||||
the population family; a zero-trade member records the engine's defined all-zero
|
||||
degenerate) — seeded from the campaign doc's `seed` (C1; `trade_rs` is `#[serde(skip)]`,
|
||||
so annotators run in-executor or not at all). `std::generalize` executes at **campaign
|
||||
pooled per-window OOS `net_trade_rs` in roll order (`PooledOos`; #259 materialized this
|
||||
conduit as the cost-netted per-trade series `r − cost_in_r`, equal to the gross series
|
||||
bit-for-bit when no cost model is bound); after sweep/gates, one `r_bootstrap` per
|
||||
surviving member's fresh in-memory series (`PerSurvivor`, ordinals into the population
|
||||
family; a zero-trade member records the engine's defined all-zero degenerate) — seeded
|
||||
from the campaign doc's `seed` (C1; `net_trade_rs` is `#[serde(skip)]`, so annotators run
|
||||
in-executor or not at all). `std::generalize` executes at **campaign
|
||||
scope**: after all cells, per (strategy, window) the per-cell *nominees* (last wf
|
||||
window's OOS report, else the sweep winner; none on gate truncation) across instruments
|
||||
feed the shipped `generalization()` when ≥ 2 exist — divergent per-instrument winners
|
||||
|
||||
Reference in New Issue
Block a user