3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,使用 get_fundamentals 接口获取 valuation(估值数据)表中的 pe_ttm、pb 等字段时,如果返回结果全是 NaN,通常是因为日期(date)参数未正确设置或在非交易日/盘中未更新时进行了查询。
date 参数(默认取当天)date,默认会获取 context.blotter.current_dt 交易日收盘后更新的数据,这在盘中或未收盘时会因为数据未更新而返回 NaN。在交易和研究环境中,如果盘中数据未更新,同样会返回 NaN。date 为非交易日date 刚好是周末或法定节假日等非交易日,系统无法匹配到当天的收盘估值,就会返回 NaN。为了规避 NaN 问题,建议显式传入 date 参数,并将其设置为“上一个交易日”的日期。这样可以确保获取到最新且完整的已收盘估值数据。
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}")
valuation 表中的换手率(turnover_rate)和滚动股息率(dividend_ratio)字段,数据源返回的是带 % 的字符串(例如 "20%"),在进行数值计算前,需要自行使用 float(val.replace('%', '')) / 100 转换为浮点数。get_fundamentals 接口有流量限制,每秒不得调用超过 100 次,单次最大调用量是 500 条数据。在多股多字段查询时,请合理控制调用频率。