fix(types): v1.20.2 修复 v1.20.1 引入的 CI mypy 失败

v1.20.1 把 BacktestResult.performance 扩大为 dict[str, float | str]
(为塞 diagnostic_warning 字符串),破坏 6 处下游消费方类型契约,
CI mypy job 转红。重构为更干净的设计:

- 诊断信息走独立的 BacktestResult.diagnostic 字段(performance.py
  PerformanceAnalyzer.diagnostic 属性 → engine 透出 → to_dict 含该字段
  → CLI 显示),performance 字典回归 dict[str, float](保留别名键)。
- optimizer.py 补 npt.NDArray 标注,消除 3 个既有 ndarray type-arg 错误。

测试:932 passed;mypy backtest/+portfolio/ 零错误;ruff 全绿。
This commit is contained in:
GitHub
2026-07-09 20:34:23 +08:00
parent eb51770608
commit a67e5588d0
8 changed files with 48 additions and 33 deletions
+4 -4
View File
@@ -233,9 +233,9 @@ def test_empty_equity_curve() -> None:
# 数值指标应为 0
numeric_metrics = {k: v for k, v in metrics.items() if isinstance(v, int | float)}
assert all(v == 0 for v in numeric_metrics.values())
# issue #22:数据不全时给出诊断提示,而非静默全 0
assert "diagnostic_warning" in metrics
assert isinstance(metrics["diagnostic_warning"], str)
# issue #22:数据不全时给出诊断提示analyzer.diagnostic,而非静默全 0
assert analyzer.diagnostic is not None
assert isinstance(analyzer.diagnostic, str)
def test_single_point_equity_curve() -> None:
@@ -249,7 +249,7 @@ def test_single_point_equity_curve() -> None:
# 数值指标应为 0(需要至少 2 个点才能计算收益率)
numeric_metrics = {k: v for k, v in metrics.items() if isinstance(v, int | float)}
assert all(v == 0 for v in numeric_metrics.values())
assert "diagnostic_warning" in metrics
assert analyzer.diagnostic is not None
def test_profit_factor() -> None: