问题描述
/
解决方案
在 ptrade 量化平台中,调用 get_fundamentals 获取财务数据时返回 nan(Not a Number)是一个常见现象。针对您查询 profit_ability(盈利能力表)中的 roic(投入资本回报率)返回 nan 的情况,主要有以下几个原因及相应的解决方法:
一、 返回 nan 的常见原因
- 财报尚未发布或数据缺失
根据 ptrade API 文档,当使用date模式查询时,如果不指定report_types,系统默认返回离查询日期最近季度的数据。如果该季度的数据尚未公布,或者数据源中该字段本身缺失,系统会用NAN填充。 - 特殊行业股票(如金融股)
银行、券商、保险等金融类上市公司的财务报表结构与一般工商企业不同,通常不计算或不适用roic(投入资本回报率)指标,因此查询这些股票时会返回nan。 - 新股或次新股
如果股票池中包含刚上市不久的新股,可能在context.previous_date这个时间点之前,还没有完整的公开财务报表数据。
二、 解决方案与排查步骤
1. 在策略中进行数据清洗(推荐)
在量化策略中,获取财务数据后,最稳妥的做法是使用 pandas 提供的方法对 nan 值进行清洗,例如剔除包含 nan 的股票,或者用特定值填充。
def handle_data(context, data):
# 获取 ROIC 数据
df_roic = get_fundamentals(g.stock_list, 'profit_ability', 'roic', context.previous_date)
if df_roic is not None and not df_roic.empty:
# 方法A:剔除 ROIC 为 nan 的股票
df_valid = df_roic.dropna(subset=['roic'])
valid_stocks = df_valid.index.tolist()
log.info(f"有效 ROIC 股票数量: {len(valid_stocks)}")
# 方法B:将 nan 填充为 0(视策略逻辑而定)
# df_filled = df_roic.fillna(0)
2. 检查特定股票是否属于金融行业
如果您发现某几只股票始终返回 nan,可以使用 get_stock_blocks 或 get_industry_stocks 检查它们是否属于金融行业。如果是,建议在选股阶段(如 set_universe)就将金融股剔除。
3. 尝试扩大查询范围或更改查询模式
如果您想确认某只股票是否曾经有过 roic 数据,可以尝试使用 start_year 和 end_year 模式查询历史年度数据:
# 查询某只股票过去几年的年报 ROIC
roic_history = get_fundamentals('600570.SS', 'profit_ability', 'roic', start_year='2020', end_year='2022', report_types='4')
log.info(roic_history)
三、 总结
返回 nan 是财务数据处理中的正常情况。在编写 ptrade 策略时,务必在获取 get_fundamentals 数据后加入 dropna() 或 fillna() 等异常处理机制,以防止 nan 值参与后续的数学运算导致策略报错或下单逻辑报错。