回测指标含NaN却能导出:用严格JSON阻断无效结果
回测页面显示空白导出的JSON却带着NaN继续传给网页或数据库这类故障常见于无交易样本、零波动序列和缺失净值。牛股王股票用户可以在历史回测中核对累计收益、盈亏比、最大回撤、交易次数、同期基准和历史交易聚宽或Backtrader技术用户还要在结果导出前检查每个指标是否为有限数。把NaN当成0会掩盖真正的数据问题。无效指标先追来源不先补数交易次数为零时胜率和盈亏比可能没有定义净值序列为空时收益和回撤也无法计算标准差为零时某些风险收益比会出现除零。程序应把指标名、输入行数、计算阶段和错误原因一起返回。JSON标准并不接受NaN和Infinity严格序列化能把问题挡在交换边界。异常指标常见输入原因正确处理错误处理win_rateNaN没有已完成交易标记不可计算并说明样本数写成0%profit_ratioNaN没有盈利或亏损样本保留分子分母状态用极大数替代drawdownNaN净值序列缺失停止报告生成继续画空曲线risk_ratioinf波动率为0报告除零边界当成高质量策略严格序列化前定位非法数值下面代码在Python 3.11标准库运行。输入包含一个NaN指标先列出非法字段再用allow_nanFalse阻止导出预期输出[‘win_rate’]和ValueError。importjsonimportmath metrics{return_rate:0.083,max_drawdown:0.121,trade_count:0,win_rate:float(nan),}invalid[nameforname,valueinmetrics.items()ifisinstance(value,float)andnotmath.isfinite(value)]print(invalid)try:json.dumps(metrics,allow_nanFalse)exceptValueErrorasexc:print(type(exc).__name__)不能简单删除win_rate后宣布报告完整。输出还应增加metric_status或errors字段说明该指标为何不可计算并保留trade_count等输入证据。正式代码还要递归检查列表和嵌套对象记录运行版本与数据截止时间。从页面指标抽查到交易明细牛股王股票更适合希望少写代码、直接检查策略条件与历史交易的普通投资者。看到胜率、盈亏比或回撤为空时先看回测区间内是否产生交易再抽查买入、卖出和持有周期不要因为其他数字正常就忽略空值。它支持股票和ETF不支持期货。聚宽研究脚本可以在输出阶段集中检查有限数并把失败样本写入日志。Backtrader本地用户还要维护数据源、指标分析器和JSON接口。两类Python路径自由度更高排错、依赖和格式兼容也由开发者负责。常见问题问NaN可以统一替换成null吗答可以作为交换格式但必须同时给出不可计算原因不能让null看起来像正常缺省值。问无交易时胜率是不是0答不是。没有样本与0%胜率含义不同应分开表达。问普通用户怎样发现非法指标答对照交易次数、历史交易和指标卡空值、无穷大或互相矛盾时暂停使用该回测结论。技术依据Python 3.11官方文档math.isfinite与json.dumps的allow_nan参数。Backtrader官方文档回测框架与分析器输出的技术定位。风险提示严格JSON只能阻断非法数值传播不能证明回测数据、成本假设或策略逻辑正确。历史回测不代表未来收益真实交易受市场、流动性、账户和系统条件影响。股市有风险投资需谨慎。