项目状态
已完成
项目类型
策略研究
起始时间
May 1, 2025 → Jun 20, 2025
项目描述
量化复现中证指数编制规则,成功预测沪深300成分股调入调出,预测准确率达 70%;在回测中实现预测驱动交易单笔收益约6%,公告驱动交易单笔收益约3%,验证该事件驱动策略的可行性;
负责人
所属板块
指数成分股事件驱动策略(股票)研究
学习收获
Index-Component-Stock-Inclusion-Exclusion-Strategy
Yuyang-Yao75Updated Dec 9, 2025
notion image
notion image
notion image
 
💡

S(Situation)

指数基金(尤其是沪深 300)在每半年进行成分股调整时,通常会出现显著的“调入前上涨、调出前下跌”现象。其核心原因在于:大量被动型基金需要严格复制指数成分及权重。当指数编制方公布最新的调入与调出名单后,相关基金会集中进行调仓,导致对目标股票的大规模买入或卖出,从而在短期内对股价形成可观且方向一致的价格推动效应。但:
  1. 官方成分股调整并未提供明确的可复现的规则实现;
  1. 市面上缺乏自动化、高精度、可批量回溯的成分股预测工具;
  1. 很多研究对“调入调出策略”的回测只是手工拼 Excel,没有系统化验证;
  1. 不同数据文件(A 股全样本、沪深 300 样本、历史成分股、市值序列等)的格式不一致,人工处理成本极高;
  1. 回测逻辑涉及“公告日 N / 生效日 M”等细粒度事件驱动逻辑,普通量化框架难以直接复现。
团队希望构建一套可全自动化运行的预测工具 + 事件驱动回测框架,用于:
  • 高精度预测成分股未来调入调出名单
  • 回测调仓策略
  • 做参数优化 / 权重方案生成
  • 对标券商报告进行独立验证
而现有工具(Wind / iFind / 聚宽)都无法提供可复现的指数编制规则级别的预测模型
💡

T(Target)

成分股预测模块
  • 完整量化中证指数编制规则:
    • ST/退市过滤
    • 上市时间/停牌天数限制
    • 全 A 打分(市值 + 成交额,按新股 / 存量股分组)
    • 240/360 缓冲区逻辑
    • “优先调入 / 优先调出”标签自动生成
  • 构建可批量运行的预测框架:
    • 输入:任意调仓基准日期
    • 输出:预测的调入/调出名单 + 官方名单对比 + 命中率统计
策略回测,配料
  • 构建事件驱动回测引擎:
    • 支持公告日前 N 日买入
    • 支持生效日前 M 日卖出
    • 支持等权 / 总市值 / 流通市值 权重
  • 输出:
    • 回测区间净值
    • 最大回撤 / 夏普比率 / 年化收益
    • 回测细节合并表
工程目标
  • 所有数据自动拉取 / 自动缓存(节省 iFind 请求)
  • 所有结果自动写入 Excel
  • 所有关键图表自动可视化(热力图、箱线图、敏感性分析)
  • 可在任意年份区间重复回测,无需额外人工处理
💡

A(Action)

数据层:iFinD 接口封装 + 本地缓存

  • 编写统一的数据获取模块,对 iFinDPy 的调用做了一层封装:
    • 支持按日期批量拉取 全 A 股沪深 300 成分股 的市值、成交额、停牌天数、上市时间等字段;
    • 针对 iFinD 返回值做了缺失值处理字段一致性校验(如代码字段统一为 XXXXXX.SZ/SH)。
  • 为避免每次研究都重新下载,我在脚本中设计了“下载 → 处理 → 缓存”的流程:
    • 原始数据保存为 download_stock_dataYYYYMMDD.csv
    • 处理后数据保存为 a_stock_YYYYMMDD处理数据.xlsxhs300_YYYYMMDD.xlsx 等;
    • 脚本运行时优先读取本地缓存,缓存缺失时再调用 iFinD,显著减少接口调用次数。

2️⃣ 指数规则量化:成分股预测代码实现

沪深300成分股预测.py 中,我把中证指数公司对沪深 300 的编制规则拆解成一系列可执行的步骤,并尽量用 向量化 / 分组排序 的方式实现:
  • 样本空间构建
    • 通过布尔过滤剔除 ST / *ST 股票;
    • 根据上市时间过滤新股(上市时间不足指定月数的剔除);
    • 使用停牌天数字段过滤掉长期停牌的股票。
  • 流动性与规模打分
    • 以市值和成交额为基础,使用 rank / quantile 对全 A 股打分;
    • 为防止极端值影响,采用分位数截断 + 标准化打分的方式,生成一个综合评分列。
  • 缓冲区与成分股维护逻辑
    • 将股票分为“现有成分股”和“非成分股”两类,分别按规则设置不同的排名阈值;
    • 对现有成分股:
      • 若排名仍在前 360 名 → 暂缓剔除(缓冲区)
    • 对非成分股:
      • 若进入前 240 名 → 视为“优先纳入”候选;
    • 用代码动态维持“总数=300”的约束:
      • 先保留满足缓冲条件的旧成分股;
      • 再从候选池里按得分排序依次填满剩余席位。
  • 预测结果评估与导出
    • 使用 merge 与官方成分股名单对比,标记“预测命中 / 漏选 / 误选”;
    • 自动统计预测命中率,并将结果写入 预测结果_YYYY_MM.xlsx,方便后续复盘。
整个过程在代码层面做到规则清晰、条件分支可追踪,便于后续切换到其他指数(如中证 500)时复用。

3️⃣ 事件驱动回测引擎:指数成分调整策略回测

指数成分股调整策略回测.py 中,我实现了一个围绕“调入 / 调出事件”的回测框架:
  • 事件日与建仓日逻辑
    • 参数化公告日相对偏移 和生效日相对偏移 ,通过交易日序列计算实际买入/卖出日期;
    • 支持多组 组合用于参数敏感性分析(比如公告日后第 1 天买入、指数生效日前 4 天卖出)。
  • 权重计算模块(等权 / 总市值 / 流通市值)
    • 读取自建的 000300.SH成分股市值_YYYYMM-YYYYMM.xlsx
    • 编写函数根据不同权重方式计算目标权重向量,并转换为可执行手数(考虑最小交易单位、现金约束等);
    • 独立提供 成分股权重计算.py 作为“只生成权重、不回测”的脚本,方便实盘或模拟盘调用。
  • 净值与绩效指标计算
    • 用 pandas 逐日模拟持仓与现金余额,记录组合净值;
    • 同时读取沪深 300 指数净值序列,生成“策略 vs 指数”的对比曲线;
    • 在代码中封装了常用绩效指标计算函数:
      • 年化收益率、年化波动率、夏普比率、最大回撤、卡玛比率等;
    • 输出结果保存为 000300.SH_backtest_...xlsx 和对应的 strategy_vs_index 图。

4️⃣ 参数优化与结果可视化

  • 在回测脚本中加入简单网格搜索:遍历多组 与权重方式组合,批量运行回测,汇总结果到 参数优化结果汇总.xlsx
  • 使用 matplotlib / pandas 绘制:
    • 年化收益率 / 夏普 / 回撤 / 卡玛的热力图(N-M 为坐标);
    • 不同权重方式的箱线图敏感性曲线,直观比较参数对收益分布的影响;
  • 通过统一的文件命名规则,让每个参数组合的结果文件和图表能够被脚本自动识别、复盘。
💡

R(Result)

从代码与工程效果上,这个项目最后达到了预期目标,优化后的策略单次开仓平均收益可达6.02%(预测驱动)/3.13%(公告驱动):
  • 可复现性
    • 预测模块能稳定给出与官方结果高度一致的沪深 300 成分调整列表,并在 Excel 中标记命中情况,方便逐期检查;
    • 通过把文字规则“翻译”为可执行代码,团队后续要研究其他指数时,有了一套可复用的模板。
  • 回测与研究效率
    • 一套脚本即可完成“数据获取 → 成分预测 → 调仓回测 → 参数优化 → 图表输出”的完整研究闭环,大幅减少手工处理与 Excel 拼接;
    • 通过本地缓存,重复研究时基本无需再调用 iFinD,提升了迭代速度。
  • 策略理解与沟通
    • 通过统一的性能指标和可视化图表,方便向非技术同事展示“围绕成分股调整的事件策略”在不同参数下的表现,形成了一个可直接用于汇报与论文写作的代码基础。
💡

可改进

  • 预测层面
    • 目前成分股预测完全基于公开编制细则做规则化实现,尚未引入机器学习模型。从任务属性来看,这是一个“规则存在但未完全公开”的二分类问题(调入 / 不调入),如果结合历史调仓结果与更丰富的横截面特征,构建如梯度提升树、随机森林或简单神经网络等模型,有望在规则预测基础上进一步提高命中率与稳定性。
  • 回测层面
    • 现有回测框架主要验证策略在理论层面的有效性,并未严格纳入最小交易单位、买入金额整数约束、冲击成本等实盘限制,因此策略收益与实际可交易收益之间可能存在一定偏差。但从结果来看,核心结论——“调入调出事件具备一定可交易价值”——在忽略这些摩擦成本的前提下已得到验证。
  • 策略层面
    • 当前仅针对“围绕调入调出事件构建的简单持有策略”进行了测试。结合已有研究(如国泰君安相关研报)的结论,如果将预测出的调入/调出名单作为股票池,再叠加基本面或量价因子做二次弱筛选,有机会在控制回撤的前提下进一步提升策略收益与风险调整后表现,这也是后续可以拓展的方向。
Loading...
务醒
务醒
慢慢搭一座知识楼📖
小红书
统计
文章数:
1
公告
type
Notice
status
Published
date
Jul 2, 2021
slug
#
summary
类型为Notice的文章将被显示为公告
tags
category
icon
password
comment
🎉务醒‘s Blog 已经上线🎉
-- 感谢您的支持 ---