Files
foxhunt/config/ml/alpha_dqn_h600_smoke_e2.json
jgrusewski 91383507fc feat(alpha): wire stacker-threshold controller into smoke rollout-end
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.
2026-05-15 17:35:35 +02:00

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
}