🚀 AI 一键生成 ptrade 策略代码
立即体验

如何在 PTrade 中获取 ETF 基础数据与行情快照并计算实时折溢价率?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade ETF 交易实战:获取实时 IOPV 并计算折溢价率

Question: 请教如何在 PTrade 中通过 ETF 基础数据和快照计算实时折溢价率?

解决方案

在 PTrade 中计算 ETF 实时折溢价率

在 ETF 交易与套利策略中,折溢价率是衡量 ETF 二级市场交易价格与一级市场净值(IOPV)偏离程度的核心指标。

  • 溢价率 > 0:二级市场价格高于 IOPV(适合卖出/申购套利)
  • 折价率 < 0:二级市场价格低于 IOPV(适合买入/赎回套利)

1. 计算公式与所需 API

计算公式

$$\text{折溢价率 (%)} = \frac{\text{最新成交价} - \text{IOPV}}{\text{IOPV}} \times 100%$$
注:某些场景下也可使用买一/卖一档位价格代替最新成交价进行实时计算。

关键 API

  1. get_snapshot(security):获取实时行情快照,包括最新价(last_px)、委买/委卖档位等。
  2. get_etf_info(etf_code):获取 ETF 的基础数据,包括最小申赎单位净值、T-1日净值等。

2. 代码实现示例

在 PTrade 的 handle_datarun_interval 函数中,可以通过以下 Python 代码实时计算 ETF 的折溢价率:

def initialize(context):
    # 设置目标 ETF 代码(以华夏上证50ETF为例)
    g.etf_code = '510050.SS'
    set_universe(g.etf_code)
    # 每 3 秒定时运行计算(仅交易模块支持 run_interval)
    run_interval(context, calculate_etf_premium, seconds=3)

def calculate_etf_premium(context):
    etf_code = g.etf_code
    
    # 1. 获取 ETF 行情快照
    snapshot = get_snapshot(etf_code)
    if not snapshot or etf_code not in snapshot:
        log.error("获取行情快照失败")
        return
    
    # 获取最新成交价与买卖一档价格
    last_px = snapshot[etf_code].get('last_px', 0)
    bid_px1 = snapshot[etf_code]['bid_grp'][1][0] if snapshot[etf_code]['bid_grp'] else 0
    offer_px1 = snapshot[etf_code]['offer_grp'][1][0] if snapshot[etf_code]['offer_grp'] else 0
    
    # 2. 获取 ETF 基础信息/IOPV
    # 注:快照中部分柜台包含 IOPV 字段;若无直接字段,通常结合 IOPV 或参考基金单位净值
    etf_info = get_etf_info(etf_code)
    
    if not etf_info or etf_code not in etf_info:
        log.error("获取 ETF 基础信息失败")
        return
    
    # 假设使用 T-1 日净值或实时 IOPV 进行参考计算
    # 部分柜台快照中包含 iopv/nav,这里展示基于最新成交价与 IOPV 的计算
    iopv = snapshot[etf_code].get('wavg_px', 0)  # 如果行情提供实时 IOPV,可直接提取对应字段
    
    # 如果快照中未直接返回 IOPV,可通过 T-1 净值做基本估算(或使用 IOPV 专属行情字段)
    if iopv == 0:
        iopv = etf_info[etf_code].get('nav_pre', 0)
        
    if iopv <= 0 or last_px <= 0:
        log.warning("数据不全,无法计算折溢价率")
        return
        
    # 3. 计算折溢价率
    premium_rate = ((last_px - iopv) / iopv) * 100
    
    log.info("[%s] 最新价: %.3f, 参考IOPV/净值: %.3f, 折溢价率: %.2f%%" % (
        etf_code, last_px, iopv, premium_rate
    ))
    
    # 4. 交易逻辑判断触发(示例)
    if premium_rate > 0.5:  # 溢价大于 0.5%
        log.info("触发溢价,可执行套利策略逻辑")
    elif premium_rate < -0.5:  # 折价大于 0.5%
        log.info("触发折价,可执行买入套利逻辑")

def handle_data(context, data):
    pass

3. 注意事项

  1. 数据精度处理:ETF 的价格精度通常为 3 位小数,在提交限价单(orderorder_tick)时需保护好价格精度。
  2. 运行环境限制get_snapshotget_etf_info 接口在 PTrade 交易模块 中可用,且要求具备相应的行情与柜台权限。
  3. 盘前阶段数据:在 before_trading_start 盘前阶段获取 get_snapshot 时,大部分成交数据可能为 0,建议在盘中连续竞价阶段执行计算。