Phase E.2 Task 17. Loads stacker_threshold_controller.cubin at smoke
startup, initialises ISV[544] (TRADE_RATE_TARGET) to 0.08 (CLI flag
--trade-rate-target, never reset), allocates a 3-float Wiener state
buffer for slot 545's Pearl A+D state.
Invokes the controller at every episode end with:
rollout_trade_count = count of non-Wait actions in the episode
rollout_total_decisions = actions_host.len() (= ep_len)
rollout_realized_sharpe = ep_terminal_R / RANDOM_BASELINE_STD
(per-rollout analog of the rvr metric;
lets the Kelly-atten controller respond
to in-policy performance vs the baseline
noise floor)
CLI args added:
--trade-rate-target default 0.08 (8% per-step trade rate target)
--k-threshold default 0.01
--k-atten default 0.005
--target-sharpe default 0.5
--wiener-alpha-floor default 0.4
--ctl-alpha-meta default 0.1
Periodic log line extended:
ep ... | KC q/H/rvr/ΔQ ... | CTL thresh=... obs=... atten=...
Final JSON adds:
final_stacker_threshold
final_trade_rate_observed_ema
final_stacker_kelly_attenuation
trade_rate_target
Smoke run (H=600, 1000 episodes) verifies the controller is alive:
ISV[543] STACKER_THRESHOLD: 0.000 → 0.5000 (saturated at ceiling)
ISV[545] TRADE_RATE_OBSERVED_EMA: 0.000 → 0.712
ISV[546] STACKER_KELLY_ATTENUATION:0.000 → 0.100 (hit floor)
Verdict: PASS — rvr=+1.043σ (unchanged from Task 12b PASS, expected
since smoke doesn't yet CONSUME slots 543/546).
Tuning notes (calibration for production, not bugs):
• Threshold saturating at 0.5 → policy trades ~85% (target 8%, off by
10×). Either re-calibrate target_trade_rate from realistic backtest
behaviour, or raise the clamp ceiling. Current ε-greedy with low
threshold-consumption gate produces high trade rate.
• Kelly atten hit floor (0.1) because rollout_sharpe (~-0.004) is far
below target_sharpe=0.5. The target needs to match the rollout
metric's scale, OR the metric should be time-normalised. The
current ep_terminal_R / baseline_std proxy is meaningful but its
scale doesn't match a typical annualised Sharpe target.
These tuning items don't gate Milestone E.2 — the producer-side
controller is correctly driving the ISV slots; *consuming* those slots
(threshold gate on alpha signal, Kelly-cap multiplier) is Phase E.3
work (alpha + execution composition).
Phase E.2 Tasks 16 + 17 close-out: kernel + launcher + GPU smoke test
+ wired into smoke binary + initialisation + verified end-to-end. Tasks
19-22 (NoisyNet) are gated on Task 12 FAIL, which we passed — skipped.
Task 18 (alpha-trust ablation, ~9-18 hours compute) deferred to a
dedicated session if needed.
100 lines
2.6 KiB
JSON
100 lines
2.6 KiB
JSON
{
|
|
"action_entropy_ema": 1.9570317268371582,
|
|
"all_pass": true,
|
|
"alpha_m": 0.8999999761581421,
|
|
"early_q_movement_ema": 0.12511339783668518,
|
|
"eps_end": 0.05000000074505806,
|
|
"eps_start": 0.5,
|
|
"final_stacker_kelly_attenuation": 0.10000000149011612,
|
|
"final_stacker_threshold": 0.5,
|
|
"final_trade_rate_observed_ema": 0.711693525314331,
|
|
"gamma": 0.9900000095367432,
|
|
"grad_clip": 1.0,
|
|
"horizon": 600,
|
|
"kc_log": [
|
|
{
|
|
"early_mvmt": 0.022276392206549644,
|
|
"entropy": 2.0100932121276855,
|
|
"episode": 100,
|
|
"q_spread": 16.85750389099121,
|
|
"rvr": 1.0427366495132446
|
|
},
|
|
{
|
|
"early_mvmt": 0.0334387831389904,
|
|
"entropy": 2.00576114654541,
|
|
"episode": 200,
|
|
"q_spread": 18.60127067565918,
|
|
"rvr": 1.0427367687225342
|
|
},
|
|
{
|
|
"early_mvmt": 0.046235110610723495,
|
|
"entropy": 2.0008304119110107,
|
|
"episode": 300,
|
|
"q_spread": 29.530759811401367,
|
|
"rvr": 1.0427361726760864
|
|
},
|
|
{
|
|
"early_mvmt": 0.05913778021931648,
|
|
"entropy": 1.9954335689544678,
|
|
"episode": 400,
|
|
"q_spread": 17.126867294311523,
|
|
"rvr": 1.0427309274673462
|
|
},
|
|
{
|
|
"early_mvmt": 0.07171963155269623,
|
|
"entropy": 1.9893970489501953,
|
|
"episode": 500,
|
|
"q_spread": 17.392959594726562,
|
|
"rvr": 1.0427260398864746
|
|
},
|
|
{
|
|
"early_mvmt": 0.08374495804309845,
|
|
"entropy": 1.9831516742706299,
|
|
"episode": 600,
|
|
"q_spread": 15.180435180664062,
|
|
"rvr": 1.0427193641662598
|
|
},
|
|
{
|
|
"early_mvmt": 0.0951075330376625,
|
|
"entropy": 1.9764565229415894,
|
|
"episode": 700,
|
|
"q_spread": 18.398340225219727,
|
|
"rvr": 1.042712688446045
|
|
},
|
|
{
|
|
"early_mvmt": 0.10574351996183395,
|
|
"entropy": 1.9698795080184937,
|
|
"episode": 800,
|
|
"q_spread": 19.092670440673828,
|
|
"rvr": 1.0426955223083496
|
|
},
|
|
{
|
|
"early_mvmt": 0.1157108023762703,
|
|
"entropy": 1.9635075330734253,
|
|
"episode": 900,
|
|
"q_spread": 12.077985763549805,
|
|
"rvr": 1.0426815748214722
|
|
},
|
|
{
|
|
"early_mvmt": 0.12511339783668518,
|
|
"entropy": 1.9570317268371582,
|
|
"episode": 1000,
|
|
"q_spread": 10.57870864868164,
|
|
"rvr": 1.0426677465438843
|
|
}
|
|
],
|
|
"lr": 0.00009999999747378752,
|
|
"n_episodes": 1000,
|
|
"pass_early": true,
|
|
"pass_entropy": true,
|
|
"pass_q_spread": true,
|
|
"pass_rvr": true,
|
|
"phase": "E.1 Task 12",
|
|
"q_init_norm": 2.5735182762145996,
|
|
"q_spread_ema": 10.57870864868164,
|
|
"return_vs_random_ema": 1.0426677465438843,
|
|
"reward_scale": 1000.0,
|
|
"target_update_every": 10,
|
|
"tau": 0.029999999329447746,
|
|
"trade_rate_target": 0.07999999821186066
|
|
} |