客户反馈通过get_fundamentals函数获取到的valuation表数据都为nan?
/
问题描述
解决方案
在 ptrade 量化平台中,使用 get_fundamentals 函数查询 valuation(估值数据表)时返回 NaN,通常是由以下几个原因导致的。根据 ptrade API 文档的规范,我们可以通过调整参数来解决这个问题。
常见原因分析
-
盘中数据未更新(未传入 date 参数)
- 现象:在交易或研究模块中,如果不传入
date参数,系统默认获取当天的估值数据。如果在盘中时间(收盘前)调用,由于当天的估值数据尚未生成,系统会返回NaN。 - 回测环境:回测中默认获取
context.blotter.current_dt交易日收盘后更新的数据,这可能会产生未来函数。
- 现象:在交易或研究模块中,如果不传入
-
查询日期为非交易日
- 现象:如果传入的
date是周末或节假日等非交易日,在回测和交易环境中,系统会直接返回NaN(研究环境中会自动往前取最近一个交易日)。
- 现象:如果传入的
-
使用了不支持的参数
- 现象:
valuation表仅支持按天查询模式。如果传入了start_year、end_year、report_types、date_type或merge_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)。