问题描述
如何获取一只ETF的实时IOPV和它的成分股列表?
解决方案
在 QMT 中,获取 ETF 的实时 IOPV(基金份额参考净值)和成分股列表(通常包含在 ETF 申赎清单数据中)主要使用以下两个 API 函数:
get_etf_iopv(stockcode): 用于获取 ETF 的实时 IOPV。get_etf_info(stockcode): 用于获取 ETF 的申赎清单详细数据,其中包含成分股列表。
以下是具体的代码示例和说明:
策略代码示例
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置需要查询的ETF代码,例如:华夏上证50ETF
ContextInfo.etf_code = '510050.SH'
def handlebar(ContextInfo):
# 1. 获取实时 IOPV
# 注意:IOPV 通常在交易时间段内实时更新
iopv = get_etf_iopv(ContextInfo.etf_code)
print(f"ETF代码: {ContextInfo.etf_code}, 当前IOPV: {iopv}")
# 2. 获取 ETF 申赎清单及成分股
# 该函数返回一个字典,包含了现金差额、最小申赎单位等信息,以及成分股列表
etf_info = get_etf_info(ContextInfo.etf_code)
if etf_info:
# 获取成分股列表,键名为 'stocks'
stock_list = etf_info.get('stocks', [])
print(f"成分股数量: {len(stock_list)}")
print(f"前5只成分股: {stock_list[:5]}") # 打印前5个作为示例
# 也可以获取其他信息,例如现金差额
cash_balance = etf_info.get('cashBalance')
print(f"现金差额: {cash_balance}")
else:
print("未获取到ETF申赎清单数据")
函数详细说明
1. get_etf_iopv(stockcode)
- 参数:
stockcode(字符串),例如'510050.SH'。 - 返回: 一个数值 (float),表示当前的 IOPV 价格。
2. get_etf_info(stockcode)
- 参数:
stockcode(字符串),例如'510050.SH'。 - 返回: 一个字典 (dict),包含 ETF 申赎清单的详细信息。
- 关键键值:
stocks: 成分股列表 (List),包含成分股的代码。cashBalance: 现金差额。nav: 基金份额净值。creationLimit: 申购上限。redemptionLimit: 赎回上限。reportUnit: 最小申购、赎回单位。
注意:请确保在“数据管理”中补充了相关的 ETF 数据,以保证回测或运行时能获取到正确的信息。在实盘模式下,这些数据通常由行情服务器实时推送。