worklog

2026-02-21(一):成分股调度表 — csi500_components_schedule.csv

这张表记录了中证500指数从 2015 年至今每个时间段的成分股名单,是计算”市场广度”(breadth)的关键依据——要知道每天应该统计哪 500 只股票。


一、为什么需要这张表

中证500指数的成分股不是固定的,每半年调整一次(6 月和 12 月),偶尔还有临时调整。在做历史回测时,不能拿今天的成分股名单去算 2019 年的广度,必须用当时实际有效的名单。

这张表就是用来查”某一天应该用哪 500 只股票”的。


二、记录逻辑

表里的”取样日期”(asof_date)按以下规则生成:

规则 说明
每月 1 日 每个月固定记录一次
6 月/12 月第三周周一 中证500 每半年的定期调整日(第二周周五收盘后生效)

对于每个取样日期,系统查找该日期之前最近一次实际的成分股发布记录,用那份名单。这样做的好处是不用考虑节假日顺延的问题——真正的成分股名单总是落在之前某个实际的发布日。


三、5 个字段

字段 含义 示例
index_code 指数代码 000905.SH(固定)
trade_date 实际成分发布日(Tushare 返回的) 20241213
con_code 成分股代码 000001.SZ
weight 该成分股在指数中的权重(%) 0.35
asof_date 取样日期(我们指定的) 20250101

trade_date 和 asof_date 的区别

这是最容易搞混的两个字段:

比如查 asof_date = 20250101(2025 年 1 月 1 日),系统会找到之前最近的发布日 trade_date = 20241213(2024 年 12 月 13 日),返回那天的成分股名单。


四、数据统计

项目 数值
取样日期数(asof_date) 156 个
实际发布日数(trade_date) 134 个
最早取样日期 2015-01-01
每个时间点的成分股数 500 只
理论总记录数 156 × 500 = 78,000 行
实际总记录数 77,999 行

为什么少了 1 行

600270.SH(外运发展)在 2018 年 12 月 28 日的成分股发布日当天退市。按规则 asof_date >= delist_date 时该股票不能出现在成分里,所以 2019-01-01 这期的名单剔除了它。

为什么发布日数 < 取样日期数

因为成分股不是每个月都调整。相邻的几个月可能共用同一份发布日期的名单——比如 2025 年 1 月、2 月、3 月的成分股可能都来自 2024 年 12 月的那次调整。


五、怎么使用这张表

查询某个交易日的成分股:

  1. 在 asof_date 里找到 <= 目标日期的最大值
  2. 取该 asof_date 对应的所有 con_code

这样就能得到目标日期当时实际有效的成分股列表,不会误用未来数据。