Commit Graph

449 Commits

Author SHA1 Message Date
jgrusewski
86fda69bfd feat(ml): add walk-forward evaluation binary with financial metrics
Loads trained DQN/PPO checkpoints, runs greedy inference on walk-forward
test windows, computes Sharpe ratio, max drawdown, win rate, profit factor,
and total return per fold. Outputs a JSON evaluation report with aggregate
metrics and sanity checks (beats-random, action diversity, fold consistency).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 19:09:06 +01:00
jgrusewski
7d9f1c6e17 feat(ml): add walk-forward training binary for DQN/PPO
Add ml/examples/train_baseline.rs that trains DQN and PPO models using
expanding walk-forward windows on real Databento OHLCV data.

Features:
- CLI args via clap (--model, --epochs, --batch-size, --data-dir, etc.)
- Recursive .dbn.zst file discovery and OHLCV bar loading
- 51-dim feature extraction via extract_ml_features()
- Walk-forward window generation with NormStats per fold
- DQN training loop with epsilon-greedy, experience replay, early stopping
- PPO training loop with GAE, trajectory collection, early stopping
- PnL-based reward (BUY/SELL/HOLD)
- Safetensors checkpoint saving per fold
- NormStats JSON export for evaluation reproducibility

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 18:59:56 +01:00
jgrusewski
62ec6557dc feat(ml): add hyperopt runner for DQN/PPO on real market data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 18:51:51 +01:00
jgrusewski
73063d6cac feat(ml): add walk-forward evaluation framework with normalization
Implements expanding-window walk-forward cross-validation for time-series
ML models, preventing lookahead bias by always evaluating on unseen future
data. Includes z-score NormStats computed from training splits only.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 18:47:13 +01:00
jgrusewski
6befda18a5 feat(ml): add quarterly download binary for futures baseline
Adds `ml/examples/download_baseline.rs` that downloads 730 days of
Databento OHLCV-1m data in quarterly chunks for 4 CME futures symbols.

Features:
- Reads universe config from TOML (symbols, date range, dataset)
- Splits date range into calendar-quarter chunks (~90 days each)
- Resume support: skips existing non-empty files
- Uses `get_range_to_file` for streaming writes to .dbn.zst
- Dry-run mode with cost estimate ($0.12/symbol/day)
- Confirmation prompt (skippable with --yes)
- Per-file progress with timing and byte counts
- Failure-tolerant: logs errors and continues

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 18:33:26 +01:00
jgrusewski
6d43f8d8d2 feat(ml): add TLOB inference adapter for ensemble
Sequence-buffered adapter with 3-layer MLP projection
(flat_dim -> hidden -> hidden/2 -> 1). Ring buffer collects
seq_len feature vectors, returns neutral prediction until full,
then flattens and projects through the MLP with sigmoid output
mapping to direction [-1,1] and confidence [0,1].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:51:06 +01:00
jgrusewski
7c4341600d feat(ml): add KAN inference adapter for ensemble
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:51:06 +01:00
jgrusewski
3a403669b7 feat(ml): add TGGN inference adapter for ensemble
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:51:06 +01:00
jgrusewski
236e1665cf fix(ml): address code review findings
- Remove panic!() calls from test_futures_baseline_micro_mapping,
  use map()+Some() pattern consistent with rest of test suite
- Make DatasetSpec::from_universe() accept a name parameter instead
  of hardcoding "futures-baseline"
- Add doc comment to UniverseConfigMeta explaining dead_code fields

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:17:58 +01:00
jgrusewski
323b77c820 feat(ml): add manifest generation test — builds cache manifest from on-disk DBN files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:05:10 +01:00
jgrusewski
9d8622f410 feat: add futures-baseline universe config (TOML)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 14:57:48 +01:00
jgrusewski
6d844c009a feat(ml): add AssetUniverse::from_config() for TOML config loading
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 14:50:40 +01:00
jgrusewski
8ce2d53d21 feat(ml): add trading_symbol field to UniverseAsset for micro contract mapping
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 14:41:22 +01:00
jgrusewski
3a60f303e3 refactor(ml): unify AssetClass — re-export from asset_selection
Remove duplicate AssetClass enum from data_pipeline module and replace
with a re-export from asset_selection, which is now the canonical
location. This ensures data_pipeline::AssetClass and
asset_selection::AssetClass are the same type, enabling direct
comparison and preventing subtle type mismatch bugs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 14:36:36 +01:00
jgrusewski
d4f4f72a50 Merge branch 'feature/operational-maturity'
# Conflicts:
#	ml/src/lib.rs
2026-02-23 14:20:23 +01:00
jgrusewski
81ae71c88e feat(ml): export data_pipeline and asset_selection types in prelude
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:40:50 +01:00
jgrusewski
1b7f72a0d2 feat(ml,trading): add gate optimizer, model registry, and P&L attribution
Gate optimizer adjusts conviction gate thresholds based on win-rate per
confidence bucket with cooldown and kill switch safety rails. Model
registry provides lifecycle management (Candidate → Staging → Production
→ Archived) with InMemoryModelRegistry for testing. P&L attribution
decomposes realized trade P&L into per-model contributions using signal
alignment.

24 new tests across 3 modules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:39:22 +01:00
jgrusewski
1cc5a79365 feat(ml): add ActiveSetSelector for top-N asset selection by composite score
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:34:37 +01:00
jgrusewski
b94caf6d65 feat(ml): add PredictabilityScorer with rolling ML accuracy tracking
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:29:13 +01:00
jgrusewski
d2fe4c4e98 feat(ml): add asset_selection module with AssetUniverse config types
Introduces the asset_selection module with AssetClass enum (Equity/ETF/Future),
UniverseAsset struct, and AssetUniverse with filtering, lookup, and a us_starter()
preset of 7 highly liquid US assets. Includes scorer/selector placeholder stubs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:23:42 +01:00
jgrusewski
d623fb100c feat(ensemble): add autonomous weight optimizer with EMA Sharpe and safety rails
Adjusts model weights based on rolling Sharpe ratios with:
- EMA smoothing (alpha=0.1)
- Bounds: [0.05, 0.40] per model
- Max step: 0.03 per cycle
- 24h cooldown, 7-day grace period for new models
- Kill switch freeze/unfreeze
8 tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:18:53 +01:00
jgrusewski
766e16e724 feat(ml): add PreparedDataset with batch iterators for training
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:17:54 +01:00
jgrusewski
1b43d80db7 feat(ml): add DatasetManager for orchestrating data preparation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:12:33 +01:00
jgrusewski
aa67929ebc feat(ml): add cache manifest for tracking downloaded training data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:05:52 +01:00
jgrusewski
ce8fd2b97e feat(ensemble): wire conviction gates into EnsembleCoordinator::predict()
Adds optional ConvictionGateEvaluator field to EnsembleCoordinator.
When configured, predict() evaluates all 7 gates before returning.
If any gate rejects, returns HOLD with rejection metadata.
Includes quorum ratio, trading session, and regime volatility helpers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 13:03:26 +01:00
jgrusewski
5bc56eb9c8 feat(ml): add data_pipeline module with DatasetSpec and DatasetMode types
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 12:54:36 +01:00
jgrusewski
948b2d8992 feat(ensemble): add 7-gate conviction system with evaluator and 15 tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 12:41:55 +01:00
jgrusewski
abf4baf30e docs: add operational maturity system design (3 pillars)
7-gate conviction system, autonomous feedback loop with kill switch,
and Rust-native model registry — backed by PostgreSQL + QuestDB.
Resolve merge conflicts in hyperopt/adapters/mod.rs and enhanced_ml.rs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 12:02:52 +01:00
jgrusewski
4ab6975c38 fix(ml): wire activation_multiplier, cache GPU detection, fix stale comments
- Scale model_memory_mb by activation_multiplier in resolve_batch_size()
  so TFT (2.5x) gets proportionally smaller batches than DQN (1.0x)
- Add cached_capabilities() with OnceLock to avoid spawning nvidia-smi
  on every call to CampaignConfig::dqn_default/ppo_default/PpoTrainer::new
- Add PartialEq to GpuCapabilities and simplify serde roundtrip test
- Update stale "RTX 3050 Ti" and "Exceeds GPU limit (230)" comments
  to reflect dynamic detection
- Document Auto variant silent CPU fallback behavior (no callers affected)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:49:22 +01:00
jgrusewski
fd2221e50e feat(ml): export GPU types in prelude
Add DeviceConfig and GpuCapabilities re-exports to ml::prelude so
downstream crates can import GPU management types via a single
`use ml::prelude::*` statement.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:41:10 +01:00
jgrusewski
6425eb150b feat(ml): use dynamic GPU detection for hyperopt campaign batch sizes
Replace hardcoded max_batch_size: 230 in CampaignConfig::dqn_default()
and ppo_default() with dynamic GPU detection via GpuCapabilities::detect()
and resolve_batch_size(). Update test to no longer assert <= 230.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:40:27 +01:00
jgrusewski
0409ad38a0 feat(ml): replace hardcoded batch_size 230 with dynamic GPU detection in PPO trainer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:35:26 +01:00
jgrusewski
c0751eb61b refactor(ml): use DeviceConfig::Auto in ensemble adapters
Replace Device::cuda_if_available(0).unwrap_or(Device::Cpu) with
DeviceConfig::Auto.resolve().unwrap_or(Device::Cpu) in DQN, PPO, TFT,
and Mamba2 ensemble inference adapters so device selection goes through
the centralized GPU detection module.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:30:17 +01:00
jgrusewski
aac8142284 feat(ml): NaN gradient detection with auto-halt during training
Add check_gradients_finite() to gradient_utils.rs that detects NaN/Inf
in GradStore before optimizer step. Uses efficient sum_all approach
where any NaN element produces a NaN sum. Includes 3 unit tests
(finite pass, NaN detected, empty vars pass).

DQN and PPO training loops already wired via gradient_accumulation
module's check_gradients_finite (all 6 paths: standard policy/value,
remainder policy/value, LSTM policy/value).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:30:01 +01:00
jgrusewski
6ffa38cc04 feat(ml): NaN gradient detection with auto-halt during training
Add check_gradients_finite() utility that scans GradStore for NaN/Inf
values. Wire into DQN (after gradient accumulation, before optimizer step)
and PPO (both MLP and LSTM training paths, after backward pass).

Prevents silent model corruption from exploding gradients or numerical
instability — training halts immediately with a descriptive error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:26:49 +01:00
jgrusewski
d25f076f2a refactor(ml): use canonical DeviceConfig from gpu module in Liquid CfC
Replace local DeviceConfig enum definition in liquid/candle_cfc.rs with
a re-export from the central crate::gpu::DeviceConfig, eliminating
duplication while preserving all existing API and tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:25:31 +01:00
jgrusewski
12642d371a feat(ml): add GpuCapabilities for hardware detection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:15:52 +01:00
jgrusewski
985b0f73d6 feat(ml): add gpu module with DeviceConfig enum
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:11:20 +01:00
jgrusewski
dcc6661fa8 feat(ml): ensemble-level hyperopt with joint model weight optimization
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:38:49 +01:00
jgrusewski
18e00fff12 feat(trading_agent): correlation matrix support in Markowitz allocation
Add optional correlation matrix parameter to mean-variance optimization.
When provided, builds full covariance matrix (Sigma[i][j] = corr[i][j] *
vol_i * vol_j) instead of diagonal-only. Existing API unchanged — callers
pass None by default. New allocate_with_correlations() public method for
correlated optimization. Five new tests: identity-matches-diagonal,
correlated-differs-from-diagonal, invalid dimensions, non-square matrix,
and non-MeanVariance delegation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:33:14 +01:00
jgrusewski
10032ca13f feat(ml): SHA-256 checksum validation for model checkpoint integrity
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:23:51 +01:00
jgrusewski
15c0fb5397 merge: pull liquid CfC v2 and codebase deduplication from main into production-hardening 2026-02-23 10:09:25 +01:00
jgrusewski
2e4b0c9455 fix(ml): per-model circuit breakers in ensemble — filter NaN/Inf, clamp confidence
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:06:53 +01:00
jgrusewski
e36698ef14 fix(ml): GPU OOM detection with automatic CPU fallback in inference engine
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:06:40 +01:00
jgrusewski
cc623af5fa fix(ml): replace std::process::exit with Result propagation in temporal_guard tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:46:05 +01:00
jgrusewski
b88fd62af2 feat(ml): add Diffusion model (DDPM/DDIM) for price path generation
- NoiseScheduler: precomputed cosine/linear alpha_bar schedules
- Denoiser: FC network with sinusoidal time embedding + SiLU + residual
- DDIMSampler: deterministic fast sampling (10 steps from 1000 timesteps)
- DiffusionTrainableAdapter: UnifiedTrainable for unified training pipeline
- Hyperopt adapter with ParameterSpace (9 params, batch ≤64 for 4GB GPU)
- ModelType::Diffusion registered in common + coordinator
- 41 tests passing (config=3, noise=7, denoiser=4, sampler=5, trainable=12, hyperopt=7)
- OOM-safe: FC denoiser instead of U-Net, small hidden dims, conservative defaults

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:32:44 +01:00
jgrusewski
83054548b8 feat(ml): add xLSTM architecture (sLSTM + mLSTM blocks, network, trainable, hyperopt)
- sLSTM: exponential gating for long-range memory retention
- mLSTM: matrix memory with multi-head attention for higher capacity
- XLSTMBlock: pre-LayerNorm + residual connections
- XLSTMNetwork: stacked blocks with configurable sLSTM/mLSTM ratio
- UnifiedTrainable adapter for unified training pipeline
- Hyperopt adapter with ParameterSpace (9 params)
- ModelType::XLSTM registered in common + coordinator
- 45 tests passing (38 architecture + 7 hyperopt)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:13:35 +01:00
jgrusewski
a51fe0d30d Merge feat/production-hardening: resolve 53 TODOs across 5 phases
Phase 1: ML pipeline verification (checkpoint roundtrip tests, feature pipeline tests, DQN VarMap bug fix, deleted 585 lines dead code)
Phase 2: Service production logic (real portfolio metrics, VaR positions, proto population, safetensors loading, shutdown handling)
Phase 3: Backtesting & data (equity curve, DBN metadata, progress callbacks, cross-symbol validation, event filtering)
Phase 4: ML crate TODOs (statrs t-distribution, quantization savings, safetensors header, microstructure features, 45-action masking, confidence EMA, AttentionMask)
Phase 5: Infrastructure/cleanup (TLS/OCSP docs, compliance roadmap, metrics docs, regime features, execution roadmap, auth #[ignore], chaos docs)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 09:04:43 +01:00
jgrusewski
4eacd4e22f feat(ml): add KAN architecture + TLOB/KAN trainable/hyperopt adapters
Phase 2-3 of ensemble expansion:
- KAN (Kolmogorov-Arnold Network): B-spline basis, layer, network, trainable adapter
- TLOB UnifiedTrainable adapter with 3D input support (batch, seq, features)
- Hyperopt adapters for both KAN and TLOB (ParameterSpace + metrics)
- ModelType::KAN variant registered in common, coordinator, lib.rs
- 44 new tests, all passing, zero warnings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 01:32:25 +01:00
jgrusewski
d777d714b2 feat(liquid): wire Liquid CfC into trading service and gRPC trainer
Closes the integration gap between Liquid CfC and DQN/PPO by adding:
- LiquidTrainer with gRPC progress callbacks, early stopping, and
  checkpoint management (ml/src/trainers/liquid.rs)
- LiquidModel wrapper in enhanced_ml.rs for hot-loading from safetensors
- Ensemble weight rebalance: DQN 0.25, PPO 0.25, TFT 0.20, Mamba2 0.15,
  Liquid-CfC 0.15

Verified: 81 liquid unit tests + 3 integration tests + 211 trading_service
tests pass, 0 compile errors across workspace.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 01:14:33 +01:00