🚀 AI 一键生成 ptrade 策略代码

PTrade API 技巧:如何获取 ETF 的实时 IOPV 与折溢价?

ptrade | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

如何获取 ETF 的实时 IOPV 净值?

解决方案

根据提供的 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

关键说明

  1. 接口限制get_etf_info 仅在 股票交易模块(实盘或模拟交易)中可用,回测模块可能无法获取完整数据或返回空值。
  2. 数据时效性
    • nav_pre:是 T-1 日 的基金单位净值。
    • nav_percu:是 T-1 日 的申购基准单位净值。
    • get_snapshot 中的 last_px:是 实时 的二级市场撮合交易价格。
  3. 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) 等常规行情数据。