🚀 AI 一键生成 ptrade 策略代码

ptrade 接口 get_fundamentals 查询 valuation 表返回 NaN 怎么办?

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

问题描述

客户反馈通过get_fundamentals函数获取到的valuation表数据都为nan?

/

解决方案

在 ptrade 量化平台中,使用 get_fundamentals 函数查询 valuation(估值数据表)时返回 NaN,通常是由以下几个原因导致的。根据 ptrade API 文档的规范,我们可以通过调整参数来解决这个问题。

常见原因分析

  1. 盘中数据未更新(未传入 date 参数)

    • 现象:在交易或研究模块中,如果不传入 date 参数,系统默认获取当天的估值数据。如果在盘中时间(收盘前)调用,由于当天的估值数据尚未生成,系统会返回 NaN
    • 回测环境:回测中默认获取 context.blotter.current_dt 交易日收盘后更新的数据,这可能会产生未来函数
  2. 查询日期为非交易日

    • 现象:如果传入的 date 是周末或节假日等非交易日,在回测和交易环境中,系统会直接返回 NaN(研究环境中会自动往前取最近一个交易日)。
  3. 使用了不支持的参数

    • 现象valuation仅支持按天查询模式。如果传入了 start_yearend_yearreport_typesdate_typemerge_type 等参数,会导致查询失效。

标准解决方案

为了稳定获取估值数据并避免未来函数,强烈建议在查询 valuation 表时,显式传入上一个交易日的日期作为 date 参数

Python 代码示例

以下是在 ptrade 策略中正确获取估值数据的代码示例:

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

def handle_data(context, data):
    # 获取上一个交易日的日期,格式化为 YYYYMMDD
    # context.previous_date 是 datetime.date 对象
    pre_date = context.previous_date.strftime('%Y%m%d')
    
    # 正确调用:显式传入上一个交易日,避免盘中查当天数据返回 NaN
    val_data = get_fundamentals(
        security=g.security, 
        table='valuation', 
        fields=['total_value', 'pe_dynamic', 'pb', 'turnover_rate'], 
        date=pre_date
    )
    
    log.info(f"获取到的估值数据:\n{val_data}")

额外注意事项

  • 数据格式转换valuation 表中的 turnover_rate(换手率)和 dividend_ratio(滚动股息率)返回的是带 % 的字符串(例如 '4.20%')。在策略中进行数值计算前,需要自行将其转换为 float 格式(如 0.042)。