🚀 AI 一键生成 qmt 策略代码

QMT API 教程:如何获取个股在指数中的绝对权重?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

如何获取某只股票在指数里的权重比例?

解决方案

在 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. 注意事项

  1. 数据依赖:该函数依赖于基础数据,请确保在客户端的【数据管理】中下载了对应指数和股票的行情及基础数据。
  2. 时间敏感性:在回测模式下,该函数会返回回测时间点当时的历史权重;在实盘模式下,返回最新的权重。
  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 来构建权重字典。