🚀 AI 一键生成 joinquant 策略代码

如何用 JoinQuant API 获取沪深300在任意日期的成分股?

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

问题描述

如何获取上个月底的沪深300指数成分股列表?

解决方案

在聚宽(JoinQuant)平台中,获取上个月底的沪深300指数成分股列表,主要分为两步:

  1. 计算日期:通过 Python 的 datetime 模块计算出上个月的最后一天。
  2. 获取数据:使用 get_index_stocks 函数传入计算出的日期和沪深300的代码(000300.XSHG)。

以下是具体的代码实现,分为研究环境回测环境两种场景:

场景一:在研究环境(Notebook)中获取

在研究环境中,通常是基于当前自然日来推算上个月底。

import datetime

# 1. 获取今天的日期
today = datetime.date.today()

# 2. 获取本月的第一天
first_day_of_this_month = datetime.date(today.year, today.month, 1)

# 3. 本月第一天减去一天,即为上个月的最后一天
last_day_of_prev_month = first_day_of_this_month - datetime.timedelta(days=1)

print(f"上个月底的日期是: {last_day_of_prev_month}")

# 4. 获取该日期的沪深300成分股
# '000300.XSHG' 是沪深300的代码
stocks = get_index_stocks('000300.XSHG', date=last_day_of_prev_month)

# 打印前5只股票查看
print(f"成分股数量: {len(stocks)}")
print(stocks[:5])

场景二:在回测策略中获取

在回测中,时间是流动的,需要使用 context.current_dt 来获取策略当前的逻辑时间,然后推算当时的上个月底。

# -*- coding: utf-8 -*-
import datetime

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 每天开盘前运行
    run_daily(before_market_open, time='09:00')

def before_market_open(context):
    # 1. 获取策略当前的日期 (.date() 将 datetime 转为 date 对象)
    current_date = context.current_dt.date()
    
    # 2. 获取本月的第一天
    first_day_of_this_month = datetime.date(current_date.year, current_date.month, 1)
    
    # 3. 减去一天得到上个月月底
    last_day_of_prev_month = first_day_of_this_month - datetime.timedelta(days=1)
    
    # 4. 获取上个月底的沪深300成分股
    stocks = get_index_stocks('000300.XSHG', date=last_day_of_prev_month)
    
    # 打印日志查看
    log.info(f"当前回测日期: {current_date}")
    log.info(f"获取成分股的基准日期(上月底): {last_day_of_prev_month}")
    log.info(f"成分股数量: {len(stocks)}")

关键函数说明

  • get_index_stocks(index_symbol, date=None):
    • index_symbol: 指数代码,沪深300为 '000300.XSHG'
    • date: 查询日期。如果不填,在回测中默认为当前回测日期,在研究中默认为今天。传入上个月底的日期即可获取当时的历史成分股,避免未来函数。