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

qmt 平台如何获取 ETF 申赎清单及成分股数据?(附 Python 源码)

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

问题描述

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

Title: qmt ETF 交易:如何获取 ETF 申赎清单与成分股比例?

Question: qmt 如何用 get_etf_info 获取 ETF 申赎清单及成分股数据?

解决方案

qmt 平台如何获取 ETF 申赎清单及成分股数据?

在进行 ETF(交易型开放式指数基金)的一级市场申赎套利或二级市场交易时,获取最新的 ETF 申赎清单(PCF 文件) 以及 成分股构成与比例 是至关重要的。QMT 平台提供了专门的内置函数 get_etf_info,可以帮助量化交易者快速获取这些底层数据。


1. get_etf_info 函数 API 详解

1.1 接口定义

get_etf_info(stockcode)

  • 参数
    • stockcode (string):ETF 基金代码,格式为 代码.市场,例如 "510050.SH"(华夏上证50ETF)。
  • 返回值
    • 返回一个字典(dict),键值为时间戳(timetag),对应的值是另一个包含 ETF 申赎清单及成分股详细信息的字典(valuedict)。

1.2 返回字典核心字段说明

字段名 含义 单位/说明
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:替代金额

2. Python 策略源码示例

以下是一个完整的 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)}")

3. 常见问题与注意事项

  1. 数据补充get_etf_info 依赖本地下载的 ETF 申赎清单数据。在使用前,请务必通过 QMT 客户端的 “数据管理” -> “补充数据” 功能,下载对应 ETF 基金的历史及当日申赎清单数据。
  2. IOPV 估值:如果需要获取 ETF 的基金份额参考净值(实时估值),可以配合使用 get_etf_iopv(stockcode) 接口,从而实现高频的 ETF 折溢价套利监控。