🚀 AI 一键生成 joinquant 策略代码

JoinQuant 平台如何查询指数的历史成分股权重?

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

问题描述

如何查询沪深300指数在去年的成分股权重分布?

解决方案

在聚宽(JoinQuant)平台中,查询指数成分股及其权重分布主要使用 get_index_weights 函数。

该函数可以获取指定日期(通常每月更新一次)的指数成分股权重信息。

以下是在聚宽研究环境中查询沪深300指数在去年(以2023年为例)某个特定日期(如年底)权重分布的代码示例。

代码实现

# -*- coding: utf-8 -*-
from jqdata import *
import pandas as pd

# 设定查询参数
# 沪深300指数代码
index_code = '000300.XSHG'
# 设定查询日期,例如去年的最后一个交易日(此处以2023年12月29日为例)
# 您可以根据需要修改为去年的任意日期
query_date = '2023-12-29'

# 调用API获取权重数据
# 注意:指数权重数据通常每月更新一次
weights_df = get_index_weights(index_id=index_code, date=query_date)

# 打印结果信息
print(f"查询日期: {query_date}")
print(f"指数代码: {index_code}")
print("-" * 30)

if weights_df is not None and not weights_df.empty:
    # 按权重从大到小排序
    weights_df = weights_df.sort_values(by='weight', ascending=False)
    
    print(f"共查询到 {len(weights_df)} 只成分股。")
    print("权重最高的前10只成分股如下:")
    print(weights_df.head(10))
    
    # 如果需要查看所有数据,可以直接打印 weights_df
    # print(weights_df)
else:
    print("未查询到对应日期的权重数据,请检查日期是否为交易日或数据是否已更新。")

函数说明

get_index_weights(index_id, date=None)

  • 参数
    • index_id: (必选) 指数代码,沪深300为 '000300.XSHG'
    • date: (可选) 查询日期,格式为 'YYYY-MM-DD'。如果不填,在回测中默认为当前回测日期,在研究中默认为最新日期。
  • 返回值
    • 返回一个 pandas.DataFrame,包含以下列:
      • code: 股票代码(Index)
      • display_name: 股票名称
      • date: 权重对应的日期
      • weight: 权重值(%)

注意事项

  1. 更新频率:指数成分股权重通常每月更新一次,一般在月底或月初。如果您查询的日期没有具体数据,系统通常会返回距离该日期最近的一次更新数据。
  2. 数据范围:该函数支持查询历史日期的权重,因此您可以将 query_date 修改为去年的任意时间点来观察变化。
  3. 环境:上述代码主要用于研究环境(Notebook)。如果在回测策略中使用,逻辑相同,但通常不需要手动指定 date(默认跟随回测时间),或者为了避免未来函数,应确保查询日期不晚于回测当前的 context.current_dt

Q&A

Q: 如果我想获取沪深300去年的所有成分股代码列表(不包含权重),应该用哪个函数?
A: 可以使用 get_index_stocks(index_symbol='000300.XSHG', date='2023-12-29'),它返回一个包含股票代码的列表。

Q: get_index_weights 返回的权重单位是什么?
A: 返回的 weight 字段单位是百分比(%)。例如,如果某只股票的 weight 为 1.5,代表其在指数中的权重为 1.5%。

Q: 为什么查询某些日期的权重数据时,返回的日期不是我输入的日期?
A: 因为指数权重不是每天更新的(通常按月)。如果查询日期当天没有发布新的权重数据,API 会返回距离查询日期最近的已有权重数据,并显示该数据的实际日期。