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

qmt 如何获取 ETF 申赎清单 (IOPV) 并执行一键申赎交易?(附 Python 完整代码)

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

问题描述

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

Title: qmt ETF 一级市场申赎套利策略开发指南

Question: qmt 如何获取 ETF 申赎清单 (IOPV) 并执行一键申赎交易?

解决方案

qmt 如何获取 ETF 申赎清单 (IOPV) 并执行一键申赎交易?

在 QMT(迅投/国信)平台上开发 ETF 一级市场申赎与二级市场套利策略时,核心步骤包括获取 ETF 申赎清单(PCF 文件)、获取基金份额参考净值(IOPV),以及通过交易 API 进行一键申赎或成分股组合下单。


一、核心 API 接口说明

1. 获取 ETF 申赎清单及成分股:get_etf_info(stockcode)

  • 用法:传入 ETF 基金代码(如 '510050.SH'),返回包含现金差额、最小申赎单位、成分股明细及替代标记等信息的字典。
  • 关键字段navPerCU(最小申赎单位净值)、stocks(成分股列表,含成分股代码、数量及 ReplaceFlag 替代标记)。

2. 获取 ETF 参考净值:get_etf_iopv(stockcode)

  • 用法:传入 ETF 代码,返回当前的 IOPV 实时参考净值。

3. ETF 申赎与组合交易下单:passorder(...)

  • 申购/赎回操作类型
    • opType = 60:ETF 申购
    • opType = 61:ETF 赎回
  • 下单方式 (orderType)
    • 1101:单股/单基金按单位/手数下单
    • 2101:组合交易(对一揽子成分股按篮子设定数量下单)

二、ETF 一键申赎与 IOPV 套利策略 Python 源码示例

以下策略展示了如何在 QMT 中获取 510050.SH 的申赎清单与 IOPV,并根据折溢价触发申购或赎回逻辑:

#coding:gbk
import time

def init(ContextInfo):
    ContextInfo.etf_code = '510050.SH'      # ETF 基金代码
    ContextInfo.account = '6000000058'      # 资金账号
    ContextInfo.set_account(ContextInfo.account)
    ContextInfo.set_universe([ContextInfo.etf_code])

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    etf_code = ContextInfo.etf_code
    
    # 1. 获取 ETF 申赎清单信息
    etf_info = get_etf_info(etf_code)
    if not etf_info:
        print("获取 ETF 申赎清单失败")
        return
    
    # 2. 获取实时 IOPV 净值与二级市场最新价
    iopv = get_etf_iopv(etf_code)
    full_tick = ContextInfo.get_full_tick([etf_code])
    market_price = full_tick[etf_code]['lastPrice']
    
    print(f"ETF 代码: {etf_code} | 二级市场现价: {market_price} | IOPV 净值: {iopv}")
    
    # 3. 溢价套利逻辑:当二级市场价格明显高于 IOPV 净值时,买入成分股并申购 ETF
    # (注:实际套利需考虑申赎费率、现金替代及买卖滑点成本)
    threshold = 0.005  # 溢价阈值 0.5%
    if market_price > iopv * (1 + threshold):
        print("触发溢价套利,执行 ETF 申购,单位: 1 份 (90万股/篮子)")
        
        # 使用 passorder 执行 ETF 申购(opType=60, orderType=1101)
        passorder(60, 1101, ContextInfo.account, etf_code, 5, -1, 1, ContextInfo)
    
    # 4. 折价套利逻辑:当二级市场价格明显低于 IOPV 净值时,赎回 ETF 换回成分股
    elif market_price < iopv * (1 - threshold):
        print("触发折价套利,执行 ETF 赎回,单位: 1 份")
        
        # 使用 passorder 执行 ETF 赎回(opType=61, orderType=1101)
        passorder(61, 1101, ContextInfo.account, etf_code, 5, -1, 1, ContextInfo)

三、常见问题与注意事项

  1. 数据准备:盘前需确保客户端通过【数据管理】补充了当日最新的 ETF 申赎清单及成分股数据。
  2. 最小申赎单位:申购和赎回必须是 ETF 要求的最小申购赎回单位(如 90 万份/100 万份)的整倍数,单笔数量 volume=1 代表 1 个申赎单位(CU)。
  3. 成分股现金替代:处理成分股交易时,应重点关注申赎清单中各股票的 ReplaceFlag(0:禁止替代, 1:允许替代, 2:必须替代),防止因成分股停牌导致套利交易失败。