搭建诚实的流程
在这个综合项目中,你要从原始价格一路搭建出一个月度股票模型直到给出结论,每一步的选择都是为了不自欺。你把日收盘价变成月末价格,构造三个只用过去信息的特征(动量、上月收益和波动率)以及一个向前看三个月的标签,并在每个月内部对特征和标签做标准化,使模型学的是给股票排序,而不是择时。然后把时间切成带清洗和禁运的滚动前向折,在每一折的过去数据上拟合一个 scikit-learn 的 Ridge 模型,用信息系数给每个测试月打分,最后逐个打乱特征,看看模型真正用到了哪一个。
ICₜ=ρ(rank(pₜ), rank(yₜ)), train: j<a-H-e, Iⱼ=IC-ICⱼ
真实数据说了什么在 2000 年以来历史完整的 54 只股票上,用 3 个月标签和 3 个月禁运的月度模型,在 10 个滚动前向块中测试 257 个月。平均信息系数为 0.033,t 统计量为 2.45,56% 的月份为正。在每个测试月内部打乱波动率会消除全部信号(重要性 0.033),而打乱动量或上月收益则毫无影响(约 -0.003)。这个模型只依赖一个特征。同一面板上的随机森林样本内得 0.102,滚动前向测试中为 -0.008;ridge 惩罚也不起作用:从 α=0.01 到 10⁴,IC 都是 0.033。去掉禁运只使 IC 变化 0.0001,因为三个月标签的重叠很小。
- 在每个月内部排序:在月内标准化特征和标签,让模型给股票排序。
- 清洗、禁运,然后打分:只在每折的过去数据上拟合,并用 IC 给每个测试月打分。
- 问问模型用了什么:置换检验能显示信号来自一个特征还是多个。
需要记住的简化样本只包含在整个期间都存活的大公司,存在幸存者偏差,信号可能被高估。这里没有交易成本、没有组合构建,只有一个线性模型。IC 为 0.033 是统计结果而不是策略,而且全部由一个特征承载,这是需要谨慎的理由。
实验:评分内容
- 月末价格10 分
- 特征与标签面板20 分
- 在每个月内部标准化10 分
- 标签去均值5 分
- 带清洗的滚动前向折15 分
- 某个月的秩相关5 分
- 逐月给 Ridge 模型打分15 分
- 模型用了哪个特征10 分
- 完整的研究10 分