🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 获取估值数据中的 PE 和 PB 为什么全是 NaN?应该怎么正确获取?

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

问题描述

ptrade 财务 API:get_fundamentals 获取 valuation PE/PB 返回 NaN 解决方案
ptrade 获取估值数据中的PE和PB为什么全是NaN,应该怎么正确获取?

解决方案

在 ptrade 量化交易平台中,使用 get_fundamentals 接口获取 valuation(估值数据)表中的 pe_ttmpb 等字段时,如果返回结果全是 NaN,通常是因为日期(date)参数未正确设置在非交易日/盘中未更新时进行了查询

1. 为什么会返回 NaN?

  • 场景一:未传入 date 参数(默认取当天)
    在回测中,如果不传 date,默认会获取 context.blotter.current_dt 交易日收盘后更新的数据,这在盘中或未收盘时会因为数据未更新而返回 NaN。在交易和研究环境中,如果盘中数据未更新,同样会返回 NaN
  • 场景二:传入的 date 为非交易日
    在回测和交易中,如果传入的 date 刚好是周末或法定节假日等非交易日,系统无法匹配到当天的收盘估值,就会返回 NaN

2. 解决方案与正确获取方法

为了规避 NaN 问题,建议显式传入 date 参数,并将其设置为“上一个交易日”的日期。这样可以确保获取到最新且完整的已收盘估值数据。

正确的 Python 代码示例:

def initialize(context):
    g.security = ['600570.SS', '000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 1. 获取上一个交易日的日期(避免非交易日或盘中未更新导致 NaN)
    last_trade_day = get_trading_day(-1)
    # 转换为 YYYY-MM-DD 格式字符串
    query_date = last_trade_day.strftime('%Y-%m-%d')
    
    # 2. 调用 get_fundamentals 获取估值数据
    # 注意:查询 valuation 表不支持 start_year, end_year, report_types 等参数
    try:
        df = get_fundamentals(
            security=g.security,
            table='valuation',
            fields=['pb', 'pe_ttm', 'pe_dynamic', 'turnover_rate'],
            date=query_date
        )
        
        if df is not None and not df.empty:
            log.info(f"成功获取 {query_date} 的估值数据:\n{df}")
            
            # 读取具体股票的 PE/PB 值
            for stock in g.security:
                if stock in df.index:
                    pb_val = df.loc[stock, 'pb']
                    pe_val = df.loc[stock, 'pe_ttm']
                    log.info(f"股票: {stock}, PB: {pb_val}, PE(TTM): {pe_val}")
        else:
            log.warning(f"{query_date} 获取的数据为空")
            
    except Exception as e:
        log.error(f"获取财务数据异常: {e}")

3. 核心注意事项

  1. 换手率与股息率格式valuation 表中的换手率(turnover_rate)和滚动股息率(dividend_ratio)字段,数据源返回的是带 % 的字符串(例如 "20%"),在进行数值计算前,需要自行使用 float(val.replace('%', '')) / 100 转换为浮点数。
  2. 流控限制get_fundamentals 接口有流量限制,每秒不得调用超过 100 次,单次最大调用量是 500 条数据。在多股多字段查询时,请合理控制调用频率。