3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行 ETF(交易型开放式指数基金)的一级市场申赎套利或二级市场交易时,获取最新的 ETF 申赎清单(PCF 文件) 以及 成分股构成与比例 是至关重要的。QMT 平台提供了专门的内置函数 get_etf_info,可以帮助量化交易者快速获取这些底层数据。
get_etf_info(stockcode)
stockcode (string):ETF 基金代码,格式为 代码.市场,例如 "510050.SH"(华夏上证50ETF)。| 字段名 | 含义 | 单位/说明 |
|---|---|---|
etfCode |
ETF 基金代码 | 如 "510050" |
prCode |
基金申赎代码 | 申购赎回专用的代码 |
cashBalance |
现金差额 | 单位:元 |
maxCashRatio |
现金替代比例上限 | 比例值 |
reportUnit |
最小申购、赎回单位 | 单位:份 |
navPerCU |
最小申赎单位净值 | 单位:元 |
nav |
基金份额净值 | 单位:元 |
enableCreation |
是否允许申购 | 1:是,0:否 |
enableRedemption |
是否允许赎回 | 1:是,0:否 |
stocks |
成分股列表 | 包含各成分股代码、名称、数量及替代标记的列表 |
在 stocks 列表中,每个成分股包含以下关键字段:
componentCode:成分股代码componentName:成分股名称componentVolume:成分股数量ReplaceFlag:替代标记(48:禁止替代,49:允许替代,50:必须替代,51:替补替代)ReplaceRatio:溢价比率ReplaceBalance:替代金额以下是一个完整的 QMT 策略示例,展示如何在 handlebar 中调用 get_etf_info 获取上证50ETF(510050.SH)的申赎清单,并循环打印其前 5 只成分股的名称、数量和现金替代标志。
#encoding:gbk
def init(ContextInfo):
# 设定需要监控的 ETF 基金
ContextInfo.etf_code = '510050.SH'
print("ETF 申赎清单获取策略初始化成功")
def handlebar(ContextInfo):
# 仅在最后一根 Bar 运行以获取最新实时数据
if not ContextInfo.is_last_bar():
return
etf_code = ContextInfo.etf_code
try:
# 调用 get_etf_info 接口
etf_data = get_etf_info(etf_code)
if etf_data:
# 获取最新时间戳的数据
latest_time = list(etf_data.keys())[0]
info = etf_data[latest_time]
print(f"=== ETF: {info['name']} ({etf_code}) 申赎信息 ===")
print(f"基金份额净值 (NAV): {info['nav']} 元")
print(f"最小申赎单位 (CU): {info['reportUnit']} 份")
print(f"最小申赎单位净值: {info['navPerCU']} 元")
print(f"现金差额 (Cash Balance): {info['cashBalance']} 元")
print(f"是否允许申购: {'是' if info['enableCreation'] == 1 else '否'}")
print(f"是否允许赎回: {'是' if info['enableRedemption'] == 1 else '否'}")
# 获取成分股列表
components = info.get('stocks', [])
print(f"\n成分股总数: {len(components)} 只。前5只成分股明细:")
for stock in components[:5]:
replace_flag_map = {48: "禁止替代", 49: "允许替代", 50: "必须替代", 51: "替补替代"}
flag_desc = replace_flag_map.get(stock['ReplaceFlag'], "未知")
print(f" 代码: {stock['componentCode']} | 名称: {stock['componentName']} "
f"| 数量: {stock['componentVolume']} 股 | 替代标记: {flag_desc}")
else:
print(f"未能获取到 {etf_code} 的 ETF 申赎清单数据,请检查历史数据是否补充完整。")
except Exception as e:
print(f"获取 ETF 数据时发生异常: {str(e)}")
get_etf_info 依赖本地下载的 ETF 申赎清单数据。在使用前,请务必通过 QMT 客户端的 “数据管理” -> “补充数据” 功能,下载对应 ETF 基金的历史及当日申赎清单数据。get_etf_iopv(stockcode) 接口,从而实现高频的 ETF 折溢价套利监控。