51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
"""Tests for the single-command GTL research matrix."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from scripts import run_gtl_tuning_matrix as matrix
|
|
|
|
|
|
def test_matrix_is_single_variable_and_has_unique_names():
|
|
assert len(matrix.GTL_TUNING_ARMS) == 20
|
|
assert matrix.GTL_TUNING_ARMS[0]["name"] == "control"
|
|
names = [arm["name"] for arm in matrix.GTL_TUNING_ARMS]
|
|
assert len(names) == len(set(names))
|
|
|
|
for arm in matrix.GTL_TUNING_ARMS[1:]:
|
|
config = matrix._arm_config(arm)
|
|
changed = [
|
|
key
|
|
for key, value in matrix.BASE_CONFIG.items()
|
|
if config[key] != value
|
|
]
|
|
assert len(changed) == 1, arm["name"]
|
|
|
|
|
|
def _compact_result(*, sharpe: float, drawdown: float, trades: int, robust_r: float) -> dict:
|
|
return {
|
|
"full_book": {
|
|
"sharpe": sharpe,
|
|
"max_drawdown_pct": drawdown,
|
|
"trades": trades,
|
|
},
|
|
"holdout": {
|
|
"train": {"sharpe": sharpe},
|
|
"test": {"sharpe": sharpe},
|
|
},
|
|
"qualified_net_avg_r_ex_top5": robust_r,
|
|
}
|
|
|
|
|
|
def test_screen_requires_every_pre_registered_guardrail():
|
|
control = _compact_result(sharpe=2.0, drawdown=20.0, trades=100, robust_r=0.1)
|
|
passing = _compact_result(sharpe=2.1, drawdown=19.0, trades=90, robust_r=0.05)
|
|
failing = _compact_result(sharpe=2.1, drawdown=19.0, trades=79, robust_r=0.05)
|
|
|
|
passed = matrix._screen_arm(passing, control)
|
|
failed = matrix._screen_arm(failing, control)
|
|
|
|
assert passed["advances"] is True
|
|
assert passed["passed"] == passed["total"] == 6
|
|
assert failed["advances"] is False
|
|
assert failed["checks"]["retains_80pct_trades"] is False
|