fix(architectural): include bar formation params in fxcache key + actually USE imbalance bars
## The bug (audit 2026-05-09) `crates/ml/src/feature_cache.rs:calculate_dbn_cache_key_full` hashed only `(symbol, data_source, dbn_filenames+sizes)` — NOT `imbalance_bar_threshold` or `imbalance_bar_ewma_alpha`. Combined with `precompute_features.rs:346` unconditionally calling `build_volume_bars` regardless of `data_source`, this meant: 1. 14 audited production runs (Apr 11–May 8) all collided on the same fxcache key (`a3f933aa...` / `c07c960a...`) regardless of TOML `imbalance_bar_threshold` value 2. The imbalance-bar code path was reachable only via fxcache MISS, which never happens in production because `ensure-fxcache` always populates first 3. Every "tuning" of `imbalance_bar_threshold` across 16+ SP runs was a silent no-op — the system was actually running volume bars at DEFAULT_VOLUME_BAR_SIZE (100 contracts/bar) ## The fix (this commit) **Part A — cache key includes bar formation params:** - `calculate_dbn_cache_key_full` signature: 5 args → 7 args. Two new f64 params hashed via `to_le_bytes()`. - 4 callers updated atomically (per `feedback_no_partial_refactor`). - 2 new unit tests (`test_cache_key_includes_bar_threshold`, `test_cache_key_includes_bar_alpha`) pin the contract. **Part B — precompute_features actually USES data_source:** - New CLI args `--imbalance-bar-threshold` (default 0.5) and `--imbalance-bar-ewma-alpha` (default 0.1) on both train_baseline_rl and precompute_features. - `precompute_features.rs:346` now branches: when `data_source == "mbp10"` AND `mbp10_data_dir.is_some()`, calls `mbp10_to_imbalance_bars` instead of `build_volume_bars`. **Argo plumbing:** - `train-template.yaml` + `train-multi-seed-template.yaml`: new workflow parameters threaded into BOTH precompute and trainer invocations so both compute the same fxcache key. - `scripts/argo-train.sh`: new CLI flags for ad-hoc overrides. - ensure-fxcache regen path: removed `rm -f /feature-cache/*.fxcache` (with bar-params now in key, parallel experiments coexist). ## Effects going forward - Tuning `imbalance_bar_threshold` actually changes bar density - Configuring `data_source = "mbp10"` actually produces imbalance bars - Multiple parallel experiments at different thresholds coexist on PVC - `dqn-production.toml: imbalance_bar_threshold = 0.5` no longer ignored Default values match prior production behavior → existing wgdc7-equivalent runs reproduce, just with a *new* fxcache key (the old volume-bar cache file is still on disk but won't be hit; harmless, can GC manually). Audit-doc: `docs/dqn-wire-up-audit.md` updated with full context. Tests: 5/5 feature_cache tests pass, full workspace + examples compile clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,8 @@ FOLDS=1
|
||||
DRY_RUN=false
|
||||
TAG=""
|
||||
PROFILE=false
|
||||
IMBALANCE_BAR_THRESHOLD=""
|
||||
IMBALANCE_BAR_EWMA_ALPHA=""
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
@@ -54,6 +56,11 @@ Options:
|
||||
--multi-seed <n> Run N seeds in parallel (default: 1, fans out via DAG when >1)
|
||||
--folds <k> Walk-forward fold count (default: 1, fans out via DAG when >1)
|
||||
--tag <t> Label workflow with foxhunt-tag=<t> for log aggregation
|
||||
--imbalance-bar-threshold <f> Override imbalance bar threshold (default: 0.5)
|
||||
MUST match between precompute_features and trainer.
|
||||
--imbalance-bar-ewma-alpha <f> Override imbalance bar EWMA alpha (default: 0.1).
|
||||
α=1.0 disables adaptation (this codebase's reversed
|
||||
convention). MUST match between precompute and trainer.
|
||||
--profile Wrap training under nsys (NVIDIA Nsight Systems) and
|
||||
upload .nsys-rep artefacts to MinIO bucket
|
||||
foxhunt-training-artifacts/profiles/<sha>/. Forces the
|
||||
@@ -91,6 +98,8 @@ while [[ $# -gt 0 ]]; do
|
||||
--folds) FOLDS="$2"; shift 2 ;;
|
||||
--tag) TAG="$2"; shift 2 ;;
|
||||
--profile) PROFILE=true; shift ;;
|
||||
--imbalance-bar-threshold) IMBALANCE_BAR_THRESHOLD="$2"; shift 2 ;;
|
||||
--imbalance-bar-ewma-alpha) IMBALANCE_BAR_EWMA_ALPHA="$2"; shift 2 ;;
|
||||
--dry-run) DRY_RUN=true; shift ;;
|
||||
-h|--help) usage ;;
|
||||
*) echo "Unknown option: $1"; usage ;;
|
||||
@@ -147,6 +156,8 @@ if [[ "$USE_MULTI_SEED" == "false" ]]; then
|
||||
[[ -n "$SYMBOL" ]] && CMD="$CMD -p symbol=$SYMBOL"
|
||||
[[ -n "$CAPITAL" ]] && CMD="$CMD -p initial-capital=$CAPITAL"
|
||||
[[ "$SANITIZER" != "none" ]] && CMD="$CMD -p sanitizer=$SANITIZER"
|
||||
[[ -n "$IMBALANCE_BAR_THRESHOLD" ]] && CMD="$CMD -p imbalance-bar-threshold=$IMBALANCE_BAR_THRESHOLD"
|
||||
[[ -n "$IMBALANCE_BAR_EWMA_ALPHA" ]] && CMD="$CMD -p imbalance-bar-ewma-alpha=$IMBALANCE_BAR_EWMA_ALPHA"
|
||||
|
||||
$BASELINE && CMD="$CMD -p hyperopt-trials=0"
|
||||
$WATCH && CMD="$CMD --watch"
|
||||
@@ -278,6 +289,8 @@ CMD="$CMD -p profile=$PROFILE"
|
||||
[[ -n "$SYMBOL" ]] && CMD="$CMD -p symbol=$SYMBOL"
|
||||
[[ -n "$CAPITAL" ]] && CMD="$CMD -p initial-capital=$CAPITAL"
|
||||
[[ -n "$TAG" ]] && CMD="$CMD --labels foxhunt-tag=$TAG"
|
||||
[[ -n "$IMBALANCE_BAR_THRESHOLD" ]] && CMD="$CMD -p imbalance-bar-threshold=$IMBALANCE_BAR_THRESHOLD"
|
||||
[[ -n "$IMBALANCE_BAR_EWMA_ALPHA" ]] && CMD="$CMD -p imbalance-bar-ewma-alpha=$IMBALANCE_BAR_EWMA_ALPHA"
|
||||
[[ "$SANITIZER" != "none" ]] && CMD="$CMD -p sanitizer=$SANITIZER"
|
||||
|
||||
$BASELINE && CMD="$CMD -p hyperopt-trials=0"
|
||||
|
||||
Reference in New Issue
Block a user