🚀 AI 一键生成 ptrade 策略代码

ptrade 平台 get_fundamentals 查询 roic 为什么返回 nan?

ptrade | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

get_fundamentals(g.stock_list, 'profit_ability', 'roic', context.previous_date)返回nan。

/

解决方案

在 ptrade 量化平台中,调用 get_fundamentals 获取财务数据时返回 nan(Not a Number)是一个常见现象。针对您查询 profit_ability(盈利能力表)中的 roic(投入资本回报率)返回 nan 的情况,主要有以下几个原因及相应的解决方法:

一、 返回 nan 的常见原因

  1. 财报尚未发布或数据缺失
    根据 ptrade API 文档,当使用 date 模式查询时,如果不指定 report_types,系统默认返回离查询日期最近季度的数据。如果该季度的数据尚未公布,或者数据源中该字段本身缺失,系统会用 NAN 填充。
  2. 特殊行业股票(如金融股)
    银行、券商、保险等金融类上市公司的财务报表结构与一般工商企业不同,通常不计算或不适用 roic(投入资本回报率)指标,因此查询这些股票时会返回 nan
  3. 新股或次新股
    如果股票池中包含刚上市不久的新股,可能在 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_blocksget_industry_stocks 检查它们是否属于金融行业。如果是,建议在选股阶段(如 set_universe)就将金融股剔除。

3. 尝试扩大查询范围或更改查询模式

如果您想确认某只股票是否曾经有过 roic 数据,可以尝试使用 start_yearend_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 值参与后续的数学运算导致策略报错或下单逻辑报错。