问题描述
解决方案
根据提供的 PTrade API 文档,获取 ETF 净值相关信息主要使用 get_etf_info 接口。
需要特别注意的是,根据文档说明,get_etf_info 返回的数据中,nav_pre 代表的是 T-1 日(前一交易日) 的基金单位净值,而非盘中实时的 IOPV(基金份额参考净值)。文档中并未明确列出获取毫秒级实时 IOPV 的直接字段,但您可以通过该接口获取参考净值,并通过 get_snapshot 获取实时市场价格。
以下是获取 ETF 净值信息及实时行情的策略代码示例:
策略代码
def initialize(context):
# 设置我们要操作的 ETF 代码,例如:华夏上证50ETF (510050.SS)
g.security = '510050.SS'
set_universe(g.security)
# 设置定时任务,在盘中运行查看信息
# 注意:get_etf_info 仅在股票交易模块可用
run_daily(context, check_etf_values, time='10:00')
def check_etf_values(context):
# 1. 获取 ETF 的基础信息 (包含 T-1 日净值)
# 该接口仅支持 PTrade 客户端可用、仅在股票交易模块可用
etf_info_dict = get_etf_info(g.security)
if etf_info_dict:
# 获取具体 ETF 的信息字典
info = etf_info_dict.get(g.security)
if info:
# nav_pre: T-1 日基金单位净值
nav_pre = info.get('nav_pre')
# nav_percu: T-1 日申购基准单位净值
nav_percu = info.get('nav_percu')
# publish: 是否需要发布 IOPV (1为需要,0为不需要)
publish_status = info.get('publish')
log.info("========== ETF 信息 ==========")
log.info("代码: %s" % g.security)
log.info("T-1日单位净值 (nav_pre): %s" % nav_pre)
log.info("T-1日申购基准单位净值 (nav_percu): %s" % nav_percu)
log.info("是否发布IOPV: %s" % publish_status)
# 2. 获取 ETF 的实时市场行情快照
snapshot = get_snapshot(g.security)
if snapshot:
# last_px: 最新成交价
current_price = snapshot[g.security].get('last_px')
log.info("========== 实时行情 ==========")
log.info("当前市场价格: %s" % current_price)
# 如果获取到了净值,可以计算简单的溢价率 (基于 T-1 净值参考)
if etf_info_dict and info and nav_pre > 0:
premium_rate = (current_price - nav_pre) / nav_pre * 100
log.info("相对于昨收净值的溢价率: %.2f%%" % premium_rate)
def handle_data(context, data):
# 盘中每个 tick 或分钟也会运行此函数
pass
关键说明
- 接口限制:
get_etf_info仅在 股票交易模块(实盘或模拟交易)中可用,回测模块可能无法获取完整数据或返回空值。 - 数据时效性:
nav_pre:是 T-1 日 的基金单位净值。nav_percu:是 T-1 日 的申购基准单位净值。get_snapshot中的last_px:是 实时 的二级市场撮合交易价格。
- IOPV 获取:虽然
get_etf_info返回的字典中包含publish字段(指示是否发布 IOPV),但文档中get_snapshot的返回字段列表里并未包含名为iopv的直接字段。在标准 API 文档范围内,建议使用nav_pre作为基础参考,或联系券商确认是否有扩展的 Level-2 数据接口提供实时 IOPV 推送。
Q&A
Q: 为什么 get_etf_info 在回测中报错或返回空?
A: 根据文档说明,get_etf_info 函数仅支持 PTrade 客户端可用、仅在 股票交易模块 可用。在回测环境中不支持此接口。
Q: 如何判断 ETF 是否处于溢价状态?
A: 通常通过 (实时价格 - 实时IOPV) / 实时IOPV 计算。由于 API 文档未提供直接的实时 IOPV 字段,您可以使用 (实时价格 - T-1日净值) / T-1日净值 进行粗略估算,或者如果您的策略涉及一篮子股票,可以通过 get_etf_stock_list 获取成分股并结合实时行情自行计算估算 IOPV(但这需要复杂的计算逻辑)。
Q: get_snapshot 能获取到 ETF 的哪些实时数据?
A: 可以获取到最新的成交价 (last_px)、买卖五档盘口 (bid_grp, offer_grp)、成交量 (business_amount)、换手率 (turnover_ratio) 等常规行情数据。