问题描述
解决方案
在 QMT 量化交易平台中,获取某只股票在特定指数中权重比例的专用函数是 ContextInfo.get_weight_in_index。
以下是该函数的详细用法说明及代码示例。
1. 函数说明
函数名: ContextInfo.get_weight_in_index(indexcode, stockcode)
参数:
indexcode(string): 指数代码,格式为'代码.市场',例如沪深300指数为'000300.SH'。stockcode(string): 股票代码,格式为'代码.市场',例如贵州茅台为'600051.SH'。
返回值:
number: 返回该股票在指数中的绝对权重数值。- 注意单位:返回值的单位是 百分比 (%)。例如,如果返回
1.6134,表示权重为1.6134%,而不是0.016134。
2. 代码示例
以下是一个完整的策略示例,展示如何在 handlebar 函数中获取并打印“贵州茅台”在“沪深300”指数中的权重。
# -*- coding: gbk -*-
def init(ContextInfo):
# 初始化函数,这里不需要特别设置,但必须存在
pass
def handlebar(ContextInfo):
# 获取当前K线的位置
index = ContextInfo.barpos
# 获取当前K线的时间戳(方便调试查看日期)
timetag = ContextInfo.get_bar_timetag(index)
date_str = timetag_to_datetime(timetag, '%Y-%m-%d')
# 设定指数代码(沪深300)和股票代码(贵州茅台)
index_code = '000300.SH'
stock_code = '600051.SH'
# 调用接口获取权重
# 注意:此函数获取的是当前回测时间点或实盘时间点的权重
weight = ContextInfo.get_weight_in_index(index_code, stock_code)
# 打印结果
# 如果是最后一根K线,打印出来避免历史数据刷屏
if ContextInfo.is_last_bar():
print(f"日期: {date_str}, 股票: {stock_code}, 指数: {index_code}, 权重: {weight}%")
3. 注意事项
- 数据依赖:该函数依赖于基础数据,请确保在客户端的【数据管理】中下载了对应指数和股票的行情及基础数据。
- 时间敏感性:在回测模式下,该函数会返回回测时间点当时的历史权重;在实盘模式下,返回最新的权重。
- 不在指数内的情况:如果查询的股票当前不在该指数成分股内,通常会返回 0 或极小值。
Q&A
Q: ContextInfo.get_weight_in_index 返回的数值需要自己乘以 100 吗?
A: 不需要。该接口直接返回百分比数值。例如返回 5.0 即代表权重为 5%,而不是 500%。
Q: 这个函数支持自定义板块吗?
A: 不支持。该函数主要针对交易所发布的标准指数(如沪深300、上证50等)。如果需要获取自定义板块的成分股,请使用 ContextInfo.get_stock_list_in_sector,但自定义板块通常没有官方定义的“权重”概念(除非是等权)。
Q: 如何获取整个指数所有成分股的权重列表?
A: QMT 没有直接返回所有成分股权重字典的单一函数。通常的做法是:先使用 ContextInfo.get_sector(index_code) 获取指数的所有成分股列表,然后遍历该列表,对每一只股票调用 ContextInfo.get_weight_in_index 来构建权重字典。