RISK_REWARD_RATIO_HIGH: High risk/reward ratio for stress tests (2.0)
PNL_STD: Standard deviation for PnL generation (0.02)
PNL_DUR_VOL_SCALE: Duration-based volatility scaling factor (0.001)
- EPS_BASE: Base epsilon for near-zero checks (1e-10)
"""
BASE_FACTOR: float = 90.0
RISK_REWARD_RATIO_HIGH: float = 2.0
PNL_STD: float = 0.02
PNL_DUR_VOL_SCALE: float = 0.001
- EPS_BASE: float = 1e-10
@dataclass(frozen=True)
from typing import Any, Dict, List, Sequence, Tuple
+import numpy as np
+
from reward_space_analysis import (
_get_exit_factor,
_get_pnl_factor,
observed_exit_factor = _get_exit_factor(
base_factor, context.pnl, pnl_factor_hl, duration_ratio, params
)
- eps_base = 1e-8
- observed_half_life_factor = observed_exit_factor / (base_factor * max(pnl_factor_hl, eps_base))
+ observed_half_life_factor = observed_exit_factor / (
+ base_factor * max(pnl_factor_hl, np.finfo(float).eps)
+ )
expected_half_life_factor = 2 ** (-duration_ratio / params["exit_half_life"])
test_case.assertAlmostEqual(
observed_half_life_factor,
places=10,
msg="PnL invariant violation: total PnL != sum of exit PnL",
)
- non_zero_pnl_actions = set(np.unique(df[df["pnl"].abs() > self.EPS_BASE]["action"]))
+ non_zero_pnl_actions = set(np.unique(df[df["pnl"].abs() > np.finfo(float).eps]["action"]))
expected_exit_actions = {2.0, 4.0}
self.assertTrue(
non_zero_pnl_actions.issubset(expected_exit_actions),
f"Non-exit actions have PnL: {non_zero_pnl_actions - expected_exit_actions}",
)
- invalid_combinations = df[(df["pnl"].abs() <= self.EPS_BASE) & (df["reward_exit"] != 0)]
+ invalid_combinations = df[
+ (df["pnl"].abs() <= np.finfo(float).eps) & (df["reward_exit"] != 0)
+ ]
self.assertEqual(len(invalid_combinations), 0)
def test_exit_factor_comprehensive(self):
# Exit factor constants
MIN_EXIT_POWER_TAU = EXIT_FACTOR.MIN_POWER_TAU
- # Test-specific constants (not in constants.py)
+ # Test-specific constants
PBRS_TERMINAL_PROB = 0.08
PBRS_SWEEP_ITER = 120
- EPS_BASE = TOLERANCE.IDENTITY_STRICT # Alias for backward compatibility
JS_DISTANCE_UPPER_BOUND = math.sqrt(math.log(2.0))
def make_ctx(