mirror of
https://ghfast.top/https://github.com/aeroxw/easy_tdx_max.git
synced 2026-09-12 15:44:18 +08:00
fix: 一键寻优所有策略补齐 35 个新策略预设网格(STRATEGY_PRESETS 19→54,网格点 174→328)+ 注册表↔预设一致性回归测试
This commit is contained in:
@@ -166,3 +166,52 @@ class TestParamGridOptimizer:
|
||||
)
|
||||
with pytest.raises(KeyError):
|
||||
opt.run()
|
||||
|
||||
|
||||
class TestStrategyPresets:
|
||||
"""预设网格与策略注册表的一致性。
|
||||
|
||||
「一键寻优所有策略」只遍历 STRATEGY_PRESETS(backtest.py optimize-all),
|
||||
未登记的策略会被静默跳过——v1.30.2 曾因此只寻优 19/54 个策略。
|
||||
这里双向锁定:每个已注册策略必须有预设,且网格合法。
|
||||
"""
|
||||
|
||||
def test_every_registered_strategy_has_preset(self) -> None:
|
||||
"""注册表与 STRATEGY_PRESETS 键集一一对应(双向:不多不少)。"""
|
||||
from easy_tdx.backtest.strategies import (
|
||||
builtin, # noqa: F401 # 触发注册
|
||||
get_registry,
|
||||
)
|
||||
from easy_tdx.backtest.strategies.presets import STRATEGY_PRESETS
|
||||
|
||||
names = set(get_registry().names())
|
||||
missing = names - set(STRATEGY_PRESETS)
|
||||
extra = set(STRATEGY_PRESETS) - names
|
||||
assert not missing, f"这些策略无预设网格,会被一键寻优静默跳过: {sorted(missing)}"
|
||||
assert not extra, f"这些预设指向未注册的策略: {sorted(extra)}"
|
||||
|
||||
def test_preset_values_within_param_bounds(self) -> None:
|
||||
"""预设取值必须在参数 schema 边界内(否则寻优端点 422)。"""
|
||||
from easy_tdx.backtest.strategies import (
|
||||
builtin, # noqa: F401 # 触发注册
|
||||
get_registry,
|
||||
)
|
||||
from easy_tdx.backtest.strategies.presets import STRATEGY_PRESETS
|
||||
|
||||
registry = get_registry()
|
||||
for name, grid in STRATEGY_PRESETS.items():
|
||||
params = {p.name: p for p in registry.get(name).params}
|
||||
for pname, values in grid.items():
|
||||
assert pname in params, f"{name}: 预设参数 {pname} 不在 schema 中"
|
||||
for v in values:
|
||||
params[pname].validate(v) # 越界抛 ValueError
|
||||
|
||||
def test_preset_grid_size_within_limit(self) -> None:
|
||||
"""单策略笛卡尔积 ≤ 200(ParamGridOptimizer.MAX_GRID_POINTS)。"""
|
||||
import math
|
||||
|
||||
from easy_tdx.backtest.strategies.presets import STRATEGY_PRESETS
|
||||
|
||||
for name, grid in STRATEGY_PRESETS.items():
|
||||
size = math.prod(len(v) for v in grid.values()) if grid else 1
|
||||
assert size <= 200, f"{name}: 预设网格 {size} 点超上限"
|
||||
|
||||
Reference in New Issue
Block a user