Remove use_double_dqn, use_dueling, use_per, use_branching,
use_distributional, use_noisy_nets, use_huber_loss, and use_cql
from DQNConfig, DQNHyperparameters, and DqnParams structs.
These features are always enabled (Rainbow DQN standard). The boolean
flags were dead code — every constructor set them to true, and the
only code paths that set them to false were in tests that disabled
features for simplicity. With the fields removed, the features are
unconditionally active, eliminating ~490 lines of dead configuration.
Key changes:
- Struct field declarations removed from 3 core config structs
- Conditional branches (if use_X { ... } else { ... }) simplified:
dueling/branching/PER network creation is now unconditional
- Checkpoint metadata hardcodes "true" for backward compatibility
- Hyperopt search space index 11 (use_branching) fixed at 1.0
- TOML/YAML config files cleaned of removed fields
- Tests that toggled these flags updated or rewritten
45 files changed, -487 net lines. Zero new test failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
334 lines
7.6 KiB
YAML
334 lines
7.6 KiB
YAML
# Hyperparameter Tuning Configuration for Foxhunt ML Models
|
|
# Defines search spaces for Optuna optimization
|
|
|
|
# Global tuning settings
|
|
global:
|
|
optimization_direction: maximize # maximize sharpe_ratio
|
|
pruning_enabled: true
|
|
median_pruner:
|
|
n_startup_trials: 5 # No pruning for first 5 trials (establish baseline)
|
|
n_warmup_steps: 10 # Wait 10 epochs before starting to prune
|
|
interval_steps: 5 # Check for pruning every 5 epochs
|
|
sampler: TPE # Tree-structured Parzen Estimator
|
|
|
|
# Model-specific search spaces
|
|
models:
|
|
TLOB:
|
|
epochs:
|
|
type: int
|
|
low: 10
|
|
high: 100
|
|
step: 10
|
|
learning_rate:
|
|
type: float
|
|
low: 0.00001
|
|
high: 0.01
|
|
log: true
|
|
batch_size:
|
|
type: categorical
|
|
choices: [32, 64, 128, 256]
|
|
sequence_length:
|
|
type: categorical
|
|
choices: [50, 100, 200]
|
|
hidden_dim:
|
|
type: categorical
|
|
choices: [64, 128, 256, 512]
|
|
num_heads:
|
|
type: categorical
|
|
choices: [4, 8, 16]
|
|
num_layers:
|
|
type: int
|
|
low: 2
|
|
high: 8
|
|
step: 1
|
|
dropout_rate:
|
|
type: float
|
|
low: 0.0
|
|
high: 0.5
|
|
step: 0.05
|
|
use_positional_encoding:
|
|
type: categorical
|
|
choices: [true, false]
|
|
|
|
MAMBA_2:
|
|
epochs:
|
|
type: int
|
|
low: 30
|
|
high: 100
|
|
step: 10
|
|
learning_rate:
|
|
type: categorical
|
|
choices: [0.00001, 0.0001, 0.001] # Conservative range for state-space models
|
|
batch_size:
|
|
type: categorical
|
|
choices: [16, 32, 64] # Memory-intensive due to state propagation (4GB VRAM constraint)
|
|
hidden_dim:
|
|
type: categorical
|
|
choices: [128, 256, 512] # d_model in MAMBA-2 architecture
|
|
state_size:
|
|
type: categorical
|
|
choices: [8, 16, 32] # d_state: Critical for state-space dynamics
|
|
num_layers:
|
|
type: categorical
|
|
choices: [2, 4, 8] # Layer depth affects memory and expressiveness
|
|
expansion_factor:
|
|
type: categorical
|
|
choices: [2, 4] # expand: Controls inner dimension (d_inner = expand * d_model)
|
|
dropout:
|
|
type: float
|
|
low: 0.0
|
|
high: 0.3
|
|
step: 0.05
|
|
# State-space specific parameters
|
|
dt_min:
|
|
type: float
|
|
low: 0.0001
|
|
high: 0.01
|
|
log: true # Time-step minimum for discrete-time dynamics
|
|
dt_max:
|
|
type: float
|
|
low: 0.01
|
|
high: 1.0
|
|
log: true # Time-step maximum
|
|
# Architecture toggles
|
|
use_ssd:
|
|
type: categorical
|
|
choices: [true, false] # Structured State Duality
|
|
use_selective_state:
|
|
type: categorical
|
|
choices: [true, false] # Selective state mechanism
|
|
hardware_aware:
|
|
type: categorical
|
|
choices: [true, false] # Hardware-aware optimizations (RTX 3050 Ti)
|
|
# Training parameters
|
|
grad_clip:
|
|
type: float
|
|
low: 0.5
|
|
high: 2.0
|
|
step: 0.25 # Gradient clipping for state-space stability
|
|
weight_decay:
|
|
type: float
|
|
low: 0.0001
|
|
high: 0.01
|
|
log: true
|
|
warmup_steps:
|
|
type: int
|
|
low: 100
|
|
high: 2000
|
|
step: 100
|
|
|
|
DQN:
|
|
epochs:
|
|
type: int
|
|
low: 50
|
|
high: 500
|
|
step: 50
|
|
learning_rate:
|
|
type: float
|
|
low: 0.00001
|
|
high: 0.01
|
|
log: true
|
|
batch_size:
|
|
type: categorical
|
|
choices: [32, 64, 128, 256]
|
|
replay_buffer_size:
|
|
type: categorical
|
|
choices: [10000, 50000, 100000, 500000]
|
|
epsilon_start:
|
|
type: float
|
|
low: 0.9
|
|
high: 1.0
|
|
step: 0.05
|
|
epsilon_end:
|
|
type: float
|
|
low: 0.01
|
|
high: 0.1
|
|
step: 0.01
|
|
epsilon_decay_steps:
|
|
type: int
|
|
low: 1000
|
|
high: 10000
|
|
step: 1000
|
|
gamma:
|
|
type: float
|
|
low: 0.9
|
|
high: 0.999
|
|
step: 0.01
|
|
target_update_frequency:
|
|
type: int
|
|
low: 100
|
|
high: 1000
|
|
step: 100
|
|
use_prioritized_replay:
|
|
type: categorical
|
|
choices: [true, false]
|
|
|
|
PPO:
|
|
epochs:
|
|
type: int
|
|
low: 50
|
|
high: 500
|
|
step: 50
|
|
learning_rate:
|
|
type: float
|
|
low: 0.00001
|
|
high: 0.01
|
|
log: true
|
|
batch_size:
|
|
type: categorical
|
|
choices: [64, 128, 256, 512]
|
|
clip_ratio:
|
|
type: float
|
|
low: 0.1
|
|
high: 0.3
|
|
step: 0.05
|
|
value_loss_coef:
|
|
type: float
|
|
low: 0.1
|
|
high: 1.0
|
|
step: 0.1
|
|
entropy_coef:
|
|
type: float
|
|
low: 0.0
|
|
high: 0.1
|
|
step: 0.01
|
|
rollout_steps:
|
|
type: int
|
|
low: 128
|
|
high: 2048
|
|
step: 128
|
|
minibatch_size:
|
|
type: categorical
|
|
choices: [32, 64, 128, 256]
|
|
gae_lambda:
|
|
type: float
|
|
low: 0.9
|
|
high: 0.99
|
|
step: 0.01
|
|
|
|
LIQUID:
|
|
epochs:
|
|
type: int
|
|
low: 20
|
|
high: 100
|
|
step: 10
|
|
learning_rate:
|
|
type: categorical
|
|
choices: [0.0001, 0.001, 0.01] # 3 learning rate options for fast convergence
|
|
batch_size:
|
|
type: categorical
|
|
choices: [32, 64, 128] # 3 batch size options
|
|
hidden_dim:
|
|
type: categorical
|
|
choices: [64, 128, 256] # 3 hidden dimension options for LTC/CfC cells
|
|
# ODE Integration Parameters (Critical for continuous-time dynamics)
|
|
ode_steps:
|
|
type: categorical
|
|
choices: [3, 5, 10, 20] # Number of integration steps per forward pass
|
|
solver_type:
|
|
type: categorical
|
|
choices: ["Euler", "RK4", "Adaptive"] # ODE solver selection
|
|
# Sparsity and Network Structure
|
|
sparsity_level:
|
|
type: categorical
|
|
choices: [0.5, 0.7, 0.9] # Connection sparsity (0.9 = 90% connections pruned)
|
|
num_layers:
|
|
type: categorical
|
|
choices: [1, 2, 3] # Depth of liquid network
|
|
# Time Constant Parameters (tau)
|
|
time_constant_tau:
|
|
type: categorical
|
|
choices: [0.01, 0.1, 1.0] # Base time constant for ODE dynamics
|
|
tau_min:
|
|
type: float
|
|
low: 0.001
|
|
high: 0.05
|
|
log: true
|
|
tau_max:
|
|
type: float
|
|
low: 0.5
|
|
high: 5.0
|
|
log: true
|
|
use_adaptive_tau:
|
|
type: categorical
|
|
choices: [true, false] # Enable/disable volatility-aware tau adaptation
|
|
# Activation Functions
|
|
activation:
|
|
type: categorical
|
|
choices: ["Tanh", "Sigmoid", "ReLU"] # Cell activation function
|
|
output_activation:
|
|
type: categorical
|
|
choices: ["Linear", "Tanh", "Sigmoid"] # Output layer activation
|
|
# Regularization
|
|
dropout_rate:
|
|
type: float
|
|
low: 0.0
|
|
high: 0.3
|
|
step: 0.05
|
|
l2_regularization:
|
|
type: float
|
|
low: 0.00001
|
|
high: 0.001
|
|
log: true
|
|
# Network Type
|
|
network_type:
|
|
type: categorical
|
|
choices: ["LTC", "CfC", "Mixed"] # Liquid Time-constant, Closed-form Continuous-time, or Mixed
|
|
# Market Regime Adaptation
|
|
market_regime_adaptation:
|
|
type: categorical
|
|
choices: [true, false] # Enable regime-aware time step adaptation
|
|
# Early Stopping
|
|
early_stopping_patience:
|
|
type: int
|
|
low: 5
|
|
high: 20
|
|
step: 5
|
|
# Default time step (dt) for ODE integration
|
|
default_dt:
|
|
type: float
|
|
low: 0.001
|
|
high: 0.1
|
|
log: true
|
|
|
|
TFT:
|
|
epochs:
|
|
type: int
|
|
low: 10
|
|
high: 100
|
|
step: 10
|
|
learning_rate:
|
|
type: float
|
|
low: 0.00001
|
|
high: 0.01
|
|
log: true
|
|
batch_size:
|
|
type: categorical
|
|
choices: [32, 64, 128, 256]
|
|
hidden_dim:
|
|
type: categorical
|
|
choices: [64, 128, 256, 512]
|
|
num_heads:
|
|
type: categorical
|
|
choices: [4, 8, 16]
|
|
num_layers:
|
|
type: int
|
|
low: 2
|
|
high: 8
|
|
step: 1
|
|
lookback_window:
|
|
type: int
|
|
low: 10
|
|
high: 100
|
|
step: 10
|
|
forecast_horizon:
|
|
type: int
|
|
low: 1
|
|
high: 20
|
|
step: 1
|
|
dropout_rate:
|
|
type: float
|
|
low: 0.0
|
|
high: 0.5
|
|
step: 0.05
|