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>
Add defensive checks to FeaturePreprocessor::normalize():
- Return 0.0 with warning log for NaN/Inf input values
- Clamp z-score output to [-10, 10] to prevent extreme values
- Add 4 unit tests covering NaN, Inf, -Inf, and extreme value clamping
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the TODO for spawning a background Redis health-check task
with an architectural decision comment. Local AtomicBool provides
immediate process-level protection; Redis monitoring is deferred to
multi-service deployment with a clear implementation roadmap.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move position fetching before VaR calculation in both get_va_r and
get_risk_metrics so the portfolio notional is computed from real
position data (sum of |quantity * avg_price|) instead of the fake
confidence_level * 1_000_000.0 placeholder. Falls back to 100_000.0
when the portfolio is empty.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces hardcoded zeros in AssetAllocation with real position data
queried from agent_orders. Adds fetch_current_positions() helper that
derives net quantity per symbol (buy - sell) and reuses it in both
allocate_portfolio and rebalance_portfolio to eliminate SQL duplication.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add load_from_safetensors() to DQNAgent for weight loading via VarMap
- Update RealDQNModel::from_checkpoint to try safetensors first, fall back to JSON
- Replace std::mem::forget(prediction_shutdown_tx) with proper Vec-based storage
that sends shutdown signal and drops senders during graceful shutdown
- Wire order_manager.get_open_orders() into emergency_stop response so callers
see which orders were active when the kill switch engaged
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hardcoded position_size: 1000.0 with actual position quantities
from fetch_positions(). Compute contribution_pct as marginal VaR ratio
(symbol_var / portfolio_var * 100) instead of naive equal-weight split.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 7 hardcoded 0.0 values with real calculations:
- target_quantity from last close price
- portfolio_volatility from log return stddev * sqrt(252)
- portfolio_sharpe from weighted returns / portfolio vol
- var_95 parametric VaR
- max_drawdown_estimate from vol approximation
- rebalance_delta as target - current (0 until positions available)
- per-asset volatility from price bars (was hardcoded 0.15)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tasks 8-14 production hardening batch:
- Populate Order/Position/Execution proto messages from JSON payload in event
stream converters instead of returning None (Task 9)
- Compute max_drawdown from cumulative PnL samples in A/B testing pipeline
instead of hardcoded 0.0 (Task 11)
- Document feature pipeline integration blockers with detailed roadmap
comments in state.rs and trading.rs (Task 8)
- Document realized PnL gap: TradingPosition lacks the field, repository
has async method incompatible with Iterator::map (Task 10)
- Document ML order quantity gap in api_gateway proxy: MlOrderResponse
proto lacks quantity field (Task 12)
- Document per-symbol weight tracking roadmap in ensemble_coordinator (Task 13)
- Document OHLCV bar pipeline upgrade roadmap in state.rs (Task 14)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4 tests validating the 51-dim feature extraction pipeline:
- DBN data loading (graceful skip if file absent)
- Synthetic bars: dimension check (51-dim), no NaN/Inf
- Value range bounds (-100 to 100)
- Streaming vs batch consistency (element-wise 1e-10 tolerance)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove 520 lines of ndarray-based placeholder code that never performed real
gradient descent. Production training uses Candle-based trainers in ml::trainers/.
Deleted: SimpleNeuralNetwork, TrainingPipeline, NetworkConfig, ActivationType,
TrainingMetrics, NetworkInterface, MockNetwork, and 9 associated tests.
Kept: DeviceCapabilities, TrainingConfig, sub-module re-exports.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sequential build plan for 5 model integrations (TGGN, TLOB, KAN,
xLSTM, Diffusion) with TDD, worktree isolation, and full trait
implementations (UnifiedTrainable + ParameterSpace + hyperopt).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace load_and_split_data() mock that generated 2000 synthetic samples
with an error-returning stub directing users to ml_training_service.
The binary retains its real infrastructure (TFTTrainer, CLI, checkpoint
storage, progress callbacks) — only the fake data generation is removed.
-120 lines of mock data, +16 lines error stub with documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Approved design for expanding the ensemble with KAN, xLSTM, and
Diffusion architectures plus bringing TGGN/TLOB to full integration.
Sequential build order, no god classes, modular decomposition.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix leftover conflict markers from rebase onto main. Align as_str()
with main's semantics (general-purpose model names), add separate
s3_prefix() for S3 storage paths, and fix to_db_string() to preserve
per-variant database values.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extend checkpoint_roundtrip.rs with 4 new tests for sequence-buffered models:
- TFT adapter deterministic inference: verifies same adapter produces
identical direction/confidence on repeated calls with stable buffer
- TFT quantile metadata: confirms quantiles are absent during buffering
phase and present (with correct count) after buffer fills
- Mamba2 adapter deterministic inference: same pattern as TFT, verifies
direction/confidence stability and correct model name ("MAMBA-2")
- Mamba2 CheckpointManager roundtrip: saves/loads via Checkpointable
trait on Mamba2SSM, verifies metadata tags and hyperparameters
All 10 tests (6 existing DQN/PPO + 4 new TFT/Mamba2) pass consistently.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bridge the ML crate's parking_lot::RwLock-based CircuitBreaker to the
shared CircuitBreakerTrait from common. Maps synchronous methods
(allow_request, record_success, etc.) to the async trait interface and
converts CircuitState variants to common::CircuitBreakerState.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Define an async trait that abstracts the circuit breaker state machine
(Closed -> Open -> HalfOpen) so different implementations can be used
polymorphically. Implement the trait for the existing tokio::Mutex-based
CircuitBreaker struct by delegating to its existing async methods.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove 8 warning prints (tracing::warn! and eprintln!) from Default impls
in config.rs. These fired on every test run and default construction,
creating noise. The migration notice in the module-level comment remains
as documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove unused aliased re-exports from common/src/lib.rs:
- BarEventFromMarketData, MarketDataEventFromMarketData,
OrderBookEventFromMarketData, QuoteEventFromMarketData,
TradeEventFromMarketData (all unused, conflicted with types:: exports)
- ResilienceCircuitBreaker (unused alias for resilience::CircuitBreaker
struct, conflicted with traits::CircuitBreaker trait)
- Also removes BarInterval and NewsEvent root re-exports (unused from
root, accessible via common::market_data::*)
Users should import market_data types via common::market_data::* and
the resilience CircuitBreaker struct via common::resilience::CircuitBreaker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Consolidate 4 separate ModelType enum definitions (ml 15 variants,
model_loader 7, campaign 2, job_spawner 4) into a single canonical
definition in common/src/model_types.rs with the union of all variants
and all methods (file_extension, as_str, to_db_string, weight, from_str,
Display).
- ml/src/lib.rs: replace 15-variant enum with re-export
- model_loader/src/lib.rs: replace 7-variant enum with re-export,
update PascalCase names (Dqn->DQN, Tft->TFT, etc)
- ml/hyperopt/campaign.rs: replace 2-variant enum with re-export
- services/ml_training_service/job_spawner.rs: replace 4-variant enum
with re-export, MAMBA2->MAMBA
- Remove orphan impl ToString in ml/observability/metrics.rs (Display
now provided by canonical type)
- Update backtesting_service and model_loader tests for new names
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ml crate had a stub ErrorCategory with only 1 variant (System).
Replace it with a re-export of the canonical 24-variant ErrorCategory
from common::error. Also rename the unused ErrorCategory in
data/src/providers/common.rs to ProviderErrorCategory to avoid
name collision.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move identical TLS type definitions from 4 service crates into
common/src/tls.rs, eliminating ~435 lines of duplicated code.
Each service retains its own TlsConfig struct and validation logic
(async vs sync, delegated vs monolithic) while sharing the type
definitions. Services re-export the types for backward compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Deduplicate four identical OrderType enums (Market/LimitMaker/IoC) into a
single definition at ml/src/common/action.rs with all methods from all copies
(transaction_cost, cost_bps, cost_decimal, from_index, Display). Original
locations now re-export via `pub use crate::common::action::OrderType`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add 6 integration tests that verify model weights survive a full
checkpoint cycle (serialize -> save to disk -> load -> predict):
- DQN raw Q-network weight roundtrip via safetensors
- DQN adapter roundtrip via DqnInferenceAdapter::from_checkpoint
- DQN CheckpointManager + Checkpointable trait flow
- PPO actor/critic checkpoint roundtrip with exact output comparison
- PPO inference after checkpoint load (probability validation)
- PPO adapter deterministic prediction verification
Fix a bug in DQN::load_from_safetensors where inserting new Var
objects into the VarMap HashMap left the Linear layers pointing at
stale data. The fix uses VarMap::load() which correctly updates
existing Vars in-place via Var::set(), preserving the shared
Arc<RwLock<Storage>> between VarMap entries and Linear layer tensors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1: ML pipeline verification (checkpoint roundtrip, feature extraction)
Phase 2: Service production logic (hardcoded values, stub responses)
Phases 3-5: Backtesting, ML crate TODOs, infrastructure/security/cleanup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>