Smoke and localdev profiles previously used data_source = "ohlcv", divergent from production (mbp10). Mismatch silently produced cache-key collisions in the SHA256 hash path: smoke fxcache could not be loaded by production-shape training without an explicit override. Local-dev fxcache regen also required remembering to pass --data-source ohlcv to match. Globalize mbp10 as the default everywhere it isn't deliberately overridden: - config/training/dqn-smoketest.toml: data_source = "mbp10" - config/training/dqn-localdev.toml: data_source = "mbp10" - training_profile.rs: doc Default → "mbp10" - trainers/dqn/config.rs: Default impl → "mbp10" - hyperopt/adapters/dqn.rs: default → "mbp10" - examples/precompute_features.rs: doc updated - fxcache.rs / feature_cache.rs: discover_and_load + cache-key tests use "mbp10" arguments - docs/dqn-wire-up-audit.md: new entry per Invariant 7 Documentation strings retained "ohlcv" only where they document the two available choices (config.rs:946, training_profile.rs:83). Local fxcache regenerated to v6 mbp10: test_data/feature-cache/13c0b086a975cc7e2384377a2cd0e97738c9410292fcfecb5807c29bf885cb48.fxcache (175874 bars, 55 MB, OFI_DIM=32). Stale v5 ohlcv fxcache untracked from git index (already gitignored post-79578bbaf). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
129 lines
3.2 KiB
TOML
129 lines
3.2 KiB
TOML
# DQN Local Dev Profile — extended training on RTX 3050 (4GB VRAM)
|
||
# Larger buffer + more episodes than smoketest for meaningful convergence.
|
||
# gpu_n_episodes=auto × gpu_timesteps=200 (auto-scaled from VRAM)
|
||
# buffer_size=50K → fills over ~4 epochs, reducing memorization
|
||
|
||
[training]
|
||
epochs = 200
|
||
batch_size = 64
|
||
learning_rate = 0.0001
|
||
gamma = 0.95
|
||
weight_decay = 0.0001
|
||
adam_epsilon = 1e-8
|
||
warmup_steps = 0
|
||
hidden_dim_base = 64
|
||
reward_scale = 1.0
|
||
huber_delta = 1.0
|
||
lr_decay_type = 2
|
||
lr_min = 0.00001
|
||
# Data source: "mbp10" — matches production (MBP-10 imbalance bars)
|
||
data_source = "mbp10"
|
||
# OFI feature enrichment from MBP-10 order book data (8 features: OFI L1/L5, depth imbalance, VPIN, Kyle's lambda, bid/ask slope, trade imbalance)
|
||
mbp10_data_dir = "test_data/futures-baseline-mbp10"
|
||
trades_data_dir = "test_data/futures-baseline-trades"
|
||
|
||
[distributional]
|
||
num_atoms = 52
|
||
|
||
[exploration]
|
||
epsilon_start = 0.3
|
||
epsilon_end = 0.02
|
||
epsilon_decay = 0.85
|
||
noisy_sigma_init = 0.3
|
||
entropy_coefficient = 0.001
|
||
count_bonus_coefficient = 0.1
|
||
q_gap_threshold = 0.05
|
||
|
||
[replay_buffer]
|
||
buffer_size = 50000
|
||
min_replay_size = 500
|
||
regime_replay_decay = 0.3
|
||
|
||
[early_stopping]
|
||
enabled = true
|
||
patience = 20
|
||
min_epochs_before_stopping = 80
|
||
|
||
[experience]
|
||
gpu_timesteps_per_episode = 200
|
||
gpu_n_episodes = 128
|
||
|
||
[experience.fill_simulation]
|
||
ioc_fill_prob = 0.85
|
||
limit_fill_min = 0.30
|
||
limit_fill_max = 0.80
|
||
tx_cost_multiplier = 0.18 # IBKR ES: 0.18 bps = $4.50/contract RT
|
||
spread_cost_frac = 0.50
|
||
spread_capture_frac = 0.50
|
||
|
||
[risk]
|
||
max_leverage = 5.0
|
||
max_position = 2.0 # legacy fallback; ignored when max_leverage is set and reference price is available
|
||
loss_aversion = 1.0
|
||
q_clip_min = -50.0
|
||
q_clip_max = 50.0
|
||
|
||
[advanced]
|
||
n_steps = 5
|
||
tau = 0.005
|
||
c51_warmup_epochs = 5
|
||
her_ratio = 0.2
|
||
cql_alpha = 1.0
|
||
curiosity_weight = 0.1
|
||
iqn_lambda = 0.25
|
||
spectral_norm_sigma_max = 1.5
|
||
spectral_decoupling_lambda = 0.01
|
||
gradient_clip_norm = 1.0
|
||
|
||
[generalization]
|
||
shrink_perturb_interval = 20
|
||
shrink_perturb_alpha = 0.85
|
||
shrink_perturb_sigma = 0.01
|
||
adversarial_dd_threshold = 0.005
|
||
adversarial_epochs_trigger = 5
|
||
anti_lr_good_mult = 3.0
|
||
anti_lr_bad_mult = 0.3
|
||
anti_lr_sharpe_threshold = 0.3
|
||
feature_mask_fraction = 0.3
|
||
feature_noise_scale = 0.1
|
||
causal_weight = 0.1
|
||
causal_intervention_interval = 10
|
||
adversarial_warmup_epochs = 50
|
||
adversarial_checkpoint_interval = 50
|
||
bottleneck_dim = 16
|
||
stochastic_depth_prob = 0.2
|
||
asymmetric_dd_weight = 0.5
|
||
time_reversal_mod = 5
|
||
regret_blend = 0.3
|
||
trade_clustering_penalty = 0.05
|
||
ensemble_disagreement_penalty = 0.3
|
||
mixup_alpha = 0.2
|
||
# Core family intensity scalars for hyperopt (1.0 = neutral, range [0.0, 2.0])
|
||
learning_intensity = 1.0
|
||
exploration_intensity = 1.0
|
||
replay_intensity = 1.0
|
||
architecture_intensity = 1.0
|
||
risk_intensity = 1.0
|
||
# Generalization family intensity scalars for hyperopt (1.0 = neutral, range [0.0, 2.0])
|
||
adversarial_intensity = 1.0
|
||
regularization_intensity = 1.0
|
||
augmentation_intensity = 1.0
|
||
loss_shaping_intensity = 1.0
|
||
ensemble_intensity = 1.0
|
||
causal_intensity = 1.0
|
||
|
||
[reward]
|
||
# v8 comprehensive training overhaul
|
||
popart_enabled = true
|
||
micro_reward_scale = 0.01
|
||
td_lambda = 0.9
|
||
max_trace_length = 7
|
||
hindsight_fraction = 0.1
|
||
hindsight_lookahead = 10
|
||
loss_aversion = 1.0
|
||
q_gap_threshold = 0.1
|
||
w_dd = 1.0
|
||
dd_threshold = 0.02
|
||
cea_weight = 0.3
|
||
b3_size = 3
|