Parameter Schema
Pool-owned parameter definitions with default values, Optuna search ranges, and metadata. Provides a single source of truth for parameter configuration that replaces scattered definitions across run_fingerprint defaults and ad-hoc initialisation code.
Parameter schema utilities for pool-owned parameter definitions.
This module provides the infrastructure for pools to declare their own parameters
— including default values, Optuna search ranges, and metadata — in a single
location (the pool class’s PARAM_SCHEMA dict). This eliminates the need for
scattered parameter definitions across run_fingerprint_defaults, separate
optuna_settings dicts, and ad-hoc initialization code.
The schema system supports a three-level priority for parameter resolution:
initial_values_dict(user-provided at runtime — highest priority)run_fingerprint(experiment configuration)PARAM_SCHEMAdefault (pool class definition — lowest priority)
Key classes:
OptunaRange: Defines search bounds and scale for hyperparameter tuning.ParamSpec: Full specification for a single parameter (default, tuning range, transform, trainability).COMMON_PARAM_SCHEMA: Shared parameter definitions used across multiple pool types.
Key functions:
get_param_value(): Resolves a parameter value through the priority chain.get_optuna_range(): Retrieves tuning ranges with optional run_fingerprint overrides.sample_in_range(): Maps [0, 1] samples to parameter ranges (for ensemble init).
Example usage in a pool class:
class MomentumPool(TFMMBasePool):
PARAM_SCHEMA = {
"memory_length": ParamSpec(
initial=10.0,
optuna=OptunaRange(low=1, high=200, log_scale=True),
),
"k_per_day": ParamSpec(
initial=20,
optuna=OptunaRange(low=0.1, high=1000, log_scale=True),
),
}
- class OptunaRange(low, high, log_scale=False, scalar=False)[source]
Bases:
objectDefines the search range for Optuna hyperparameter optimization.
- log_scale
Whether to use log scale for sampling (useful for parameters that span multiple orders of magnitude)
- Type:
- class ParamSpec(initial, optuna=None, transform=None, description='', trainable=True)[source]
Bases:
objectSpecification for a single pool parameter.
- Parameters:
- initial
Default initial value. Can be a scalar (applied to all assets) or a list (per-asset values).
- optuna
Search range for Optuna optimization. If None, parameter is not tuned.
- Type:
Optional[OptunaRange]
- COMMON_PARAM_SCHEMA = {'initial_weights_logits': ParamSpec(initial=1.0, optuna=OptunaRange(low=-10, high=10, log_scale=False, scalar=False), transform=None, description='Logit-space initial portfolio weights', trainable=False)}
Parameter definitions shared across multiple pool types.
Pool classes can merge this into their own
PARAM_SCHEMAto inherit common defaults without duplication. Currently contains:initial_weights_logits: Logit-space initial portfolio weights. These are passed through softmax to produce the initial weight vector. Typically not trained (optimized via Optuna instead), since gradient descent on initial weights is poorly conditioned.
- get_param_value(param_name, schema, initial_values_dict, run_fingerprint)[source]
Get parameter value with priority: initial_values_dict > run_fingerprint > schema.
- Parameters:
- Returns:
The parameter value to use
- Return type:
Any
- get_optuna_range(param_name, schema, run_fingerprint=None)[source]
Get Optuna search range for a parameter.
- Parameters:
- Returns:
The Optuna range, or None if parameter shouldn’t be tuned
- Return type:
Optional[OptunaRange]
- sample_in_range(samples, optuna_range)[source]
Map [0, 1] samples to parameter range.
- Parameters:
samples (np.ndarray) – Samples in [0, 1] range
optuna_range (OptunaRange) – The parameter’s valid range
- Returns:
Samples mapped to [low, high] (or log-space if log_scale=True)
- Return type:
np.ndarray