Isolate legacy range-expansion factor
This commit is contained in:
@@ -763,6 +763,8 @@ def test_sr_research_variant_is_explicit_and_validated(monkeypatch):
|
||||
"production_control",
|
||||
"legacy_range_grid_touch",
|
||||
"legacy_range_grid_neutral",
|
||||
"production_range504",
|
||||
"rewrite_range504_legacy_primary",
|
||||
):
|
||||
monkeypatch.setenv("BACKTEST_SR_VARIANT", variant)
|
||||
assert bt._sr_research_variant() == variant
|
||||
@@ -771,6 +773,29 @@ def test_sr_research_variant_is_explicit_and_validated(monkeypatch):
|
||||
bt._sr_research_variant()
|
||||
|
||||
|
||||
def test_range_factor_detector_mapping_is_explicit():
|
||||
assert bt._sr_detector_variant("production_range504") == "production_control"
|
||||
assert bt._sr_detector_variant("rewrite_range504_legacy_primary") == "rewrite"
|
||||
assert bt._sr_detector_variant("soft_zones_legacy_primary") == "soft_zones"
|
||||
|
||||
|
||||
def test_range_504_log_uses_only_the_bounded_window():
|
||||
highs = [1_000.0, *([100.0] * bt.RANGE_FACTOR_LOOKBACK)]
|
||||
lows = [10.0, *([50.0] * bt.RANGE_FACTOR_LOOKBACK)]
|
||||
assert bt._range_504_log(highs, lows) == pytest.approx(math.log(2.0))
|
||||
|
||||
|
||||
def test_range_factor_gate_is_research_arm_only():
|
||||
below = bt.RANGE_FACTOR_MIN_LOG - 0.01
|
||||
assert not bt._range_factor_allows("production_range504", below)
|
||||
assert not bt._range_factor_allows("rewrite_range504_legacy_primary", below)
|
||||
assert bt._range_factor_allows(
|
||||
"production_range504",
|
||||
bt.RANGE_FACTOR_MIN_LOG,
|
||||
)
|
||||
assert bt._range_factor_allows("production_control", below)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("variant", "neutral_strength"),
|
||||
[
|
||||
@@ -863,6 +888,9 @@ def test_replay_ticker_candidates_carry_gate_fields():
|
||||
for c in cands:
|
||||
assert c.get("action") is not None
|
||||
assert "risk_level" in c
|
||||
assert c["range_504_log"] >= 0.0
|
||||
assert c["range_504_ratio"] >= 1.0
|
||||
assert isinstance(c["range_factor_pass"], bool)
|
||||
|
||||
|
||||
async def _seed_oscillating_ticker(session, symbol: str, n: int = 160) -> None:
|
||||
|
||||
Reference in New Issue
Block a user