Repository navigation
v0.5.2 回测提速 + JSON 严格化
v0.5.2 — 回测提速 + JSON 严格化
上一版修好了账,这一版让工具好用:参数网格从"几分钟没反应"变成秒级,
面板的网格结果不再静默卡住。
提速:参数网格从几分钟到 23 秒
回测器原来每个交易日都线性扫一遍 K 线找当天收盘(days × bars × 变体数),
参数网格一轮 32 个变体 × 250 天 × 4 只票,代价是几百万次无谓扫描。
改法:
- 每只票建一次
{day: close}价格索引,查询 O(1) - 规则判定需要的"截至某日的收盘序列"用二分切点定位后切片(O(log n + k))
- 基准买入持有同样走索引
效果:Pi 上 32 变体 × 250 日 × 4 票 = 23 秒(原来好几分钟)。
面板默认用 120 日(更快),要 250 日用 CLI。
修:面板参数网格静默卡住
真机上点"参数网格",页面永远停在"搜索中…",控制台报
SyntaxError: Unexpected token 'I', ... "_factor": Infinity。
原因:profit_factor 在"没有亏损单"时是 float('inf'),json.dumps 写成
Infinity —— 这不是合法 JSON,浏览器的 response.json() 直接抛异常,
整块功能连报错都没有。
两处都改了:
- 源头:
profit_factor无亏损时用None(表示"无亏损"),不再是无穷 - 加了一层安全网:
paper_trading/utils/jsonx.py的safe()递归把
NaN / ±Infinity 换成null;面板与 CLI 的所有 JSON 出口都过一遍,
并用allow_nan=False卡死(漏了就直接报错,不静默吐非法 JSON)
新增 tests/test_json_safety.py 锁定。
面板小修
- 撤销条件单后给出明确回执(之前状态栏还留着上一条错误信息)
- 网格结果附注"另有 N 组几乎不触发已剔除"
- 回测的"注意"只提示配置/数据级问题(没有 symbol 的那类),逐笔跳过原因不刷屏
验证
129 个离线单测全绿。Pi 真机验证:面板回测、参数网格、挂条件单、撤销条件单、
非法代码 fail-closed,浏览器端全部走通,控制台无报错。
兼容性
无 schema 变更、无配置项变更。