3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化平台中,调用 get_fundamentals 获取财务数据时返回 nan(Not a Number)是一个常见现象。针对您查询 profit_ability(盈利能力表)中的 roic(投入资本回报率)返回 nan 的情况,主要有以下几个原因及相应的解决方法:
nan 的常见原因date 模式查询时,如果不指定 report_types,系统默认返回离查询日期最近季度的数据。如果该季度的数据尚未公布,或者数据源中该字段本身缺失,系统会用 NAN 填充。roic(投入资本回报率)指标,因此查询这些股票时会返回 nan。context.previous_date 这个时间点之前,还没有完整的公开财务报表数据。在量化策略中,获取财务数据后,最稳妥的做法是使用 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)
如果您发现某几只股票始终返回 nan,可以使用 get_stock_blocks 或 get_industry_stocks 检查它们是否属于金融行业。如果是,建议在选股阶段(如 set_universe)就将金融股剔除。
如果您想确认某只股票是否曾经有过 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 值参与后续的数学运算导致策略报错或下单逻辑报错。