feat(config/scripts): GREEN config wiring + S6 recompute tooling

prod/configs/green.yml:
- asset_bucket_ban_set: [4] (B4 banned at selector level)
- s6_size_table: inline bootstrap multipliers (B0→0.4, B1→0.3, B3→2.0,
  B5→0.5, B6→1.5) matching CRITICAL_ASSET_PICKING S6 scenario
- esof_sizing_table: FAV→1.2, MILD_POS→0.6, UNKNOWN→0.25,
  MILD_NEG→0.0, UNFAV→0.0
- use_int_leverage: true (1x fixed pending winrate analysis)
- s6_table_path: pointer to generated YAML (recompute updates this)
BLUE (blue.yml) carries none of these keys → BLUE math unchanged.

prod/configs/green_s6_table.yml: bootstrap stub with frontmatter
(generated_at, source_branch, n_trades). Regenerated by recompute script.

prod/scripts/recompute_s6_coefficients.py:
  Queries trade_events, maps assets to KMeans buckets, derives per-bucket
  sizing mults. Variance guard: >20% net-PnL move flags bucket in
  dolphin.s6_recompute_log for manual review before promote.

prod/s6_recompute_flow.py:
  Prefect flow wrapping the recompute script. Cadence via
  S6_RECOMPUTE_INTERVAL_DAYS env (default 30). Kill-switch:
  S6_RECOMPUTE_DISABLED=1.

prod/scripts/analyze_leverage_winrate.py:
  Read-only walk of CH trade_events; bins trades by leverage_raw,
  emits per-bin WR/net-PnL/avg-MAE. Output informs the int-leverage
  rounding rule choice (Option 1 round-half-up vs Option 2 banker's round
  vs stay-at-1x). Does not auto-apply a rule change.

Plan refs: Tasks 3, 8, 10.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hjnormey
2026-04-22 06:08:08 +02:00
parent 48dcf3fe13
commit 36d263eb91
6 changed files with 762 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
# GREEN S6 bucket sizing table
# ────────────────────────────────────────────────────────────────────────────
# Auto-generated by prod/scripts/recompute_s6_coefficients.py.
# Bucket → per-entry notional multiplier applied at the orchestrator single-site
# (`nautilus_dolphin/nautilus_dolphin/nautilus/esf_alpha_orchestrator.py`).
#
# Semantics:
# value == 1.0 → no-op (same as BLUE)
# value < 1.0 → size down (fractional)
# value > 1.0 → size up (leaned-into bucket)
# absent bucket → 1.0 (no-op)
# value == 0.0 → prefer banning via `asset_bucket_ban_set` in green.yml
# (selector-ban reroutes to next-ranked asset;
# sizer 0× would waste the slot)
#
# Regeneration cadence: env S6_RECOMPUTE_INTERVAL_DAYS (default 30).
# If any bucket's net-PnL moves > ~20% between runs, the recompute flow flags
# the change in CH `dolphin.s6_recompute_log` for manual review before apply.
# ────────────────────────────────────────────────────────────────────────────
meta:
generated_at: "2026-04-21T00:00:00Z" # replaced on each recompute
source_branch: "exp/green-s6-esof-aem-shadow-2026-04-21"
n_trades: 0 # populated by recompute script
note: "Bootstrap stub — regenerate with prod/scripts/recompute_s6_coefficients.py before staging"
# Bucket → multiplier. B4 excluded (banned at selector). B2 omitted (= 1.0 no-op).
# Seeded from the S6 scenario in prod/docs/CRITICAL_ASSET_PICKING_BRACKETS_VS._ROI_WR_AT_TRADES.md.
buckets:
0: 0.40
1: 0.30
3: 2.00
5: 0.50
6: 1.50