问题描述
解决方案
在聚宽(JoinQuant)平台中,获取上个月底的沪深300指数成分股列表,主要分为两步:
- 计算日期:通过 Python 的
datetime模块计算出上个月的最后一天。 - 获取数据:使用
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: 查询日期。如果不填,在回测中默认为当前回测日期,在研究中默认为今天。传入上个月底的日期即可获取当时的历史成分股,避免未来函数。