3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT(迅投/国信)平台上开发 ETF 一级市场申赎与二级市场套利策略时,核心步骤包括获取 ETF 申赎清单(PCF 文件)、获取基金份额参考净值(IOPV),以及通过交易 API 进行一键申赎或成分股组合下单。
get_etf_info(stockcode)'510050.SH'),返回包含现金差额、最小申赎单位、成分股明细及替代标记等信息的字典。navPerCU(最小申赎单位净值)、stocks(成分股列表,含成分股代码、数量及 ReplaceFlag 替代标记)。get_etf_iopv(stockcode)passorder(...)opType = 60:ETF 申购opType = 61:ETF 赎回orderType):
1101:单股/单基金按单位/手数下单2101:组合交易(对一揽子成分股按篮子设定数量下单)以下策略展示了如何在 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)
volume=1 代表 1 个申赎单位(CU)。ReplaceFlag(0:禁止替代, 1:允许替代, 2:必须替代),防止因成分股停牌导致套利交易失败。