股票每天有几百行,gap=5为什么不一定隔开五天
股票日期面板里,gap=5一般意味着隔开五行样本,只有在一行恰好代表一个等间隔交易日时,才等于隔开五个交易日。要隔离完整日期,先在唯一日期序列上切分,再把日期集合转换回所有股票行索引。本例交付转换前后清单,避免把“没有随机打乱”误认为“整日没有串入”。
三只股票的十五日不齐全面板
构造十五个连续实验交易日,A每天出现,B在日期编号为三的倍数时缺失,C在偶数日缺失。缺失仅表示此演示没有该行,不推断停牌或退市。按日期升序、股票字母升序排列,一共三十三行。行索引从零开始,日期编号从一开始;两个起点刻意写清,避免把日期十误读成索引十。
测试集预先冻结为第十三至十五日的全部股票,共七行。我们比较两种前置隔离:行法从第一个测试行之前拿掉五行;日期法从第一个测试日期之前拿掉五个唯一日期。表里train、gap、test表示三类归属,同一日出现两种归属时就说明它被切开。
| 实验日 | 股票 | 零基行索引 | 行gap5归属 | 日期gap5归属 |
|---|---|---|---|---|
| 1 | [A, B, C] | [0, 1, 2] | [train, train, train] | [train, train, train] |
| 2 | [A, B] | [3, 4] | [train, train] | [train, train] |
| 3 | [A, C] | [5, 6] | [train, train] | [train, train] |
| 4 | [A, B] | [7, 8] | [train, train] | [train, train] |
| 5 | [A, B, C] | [9, 10, 11] | [train, train, train] | [train, train, train] |
| 6 | [A] | [12] | [train] | [train] |
| 7 | [A, B, C] | [13, 14, 15] | [train, train, train] | [train, train, train] |
| 8 | [A, B] | [16, 17] | [train, train] | [gap, gap] |
| 9 | [A, C] | [18, 19] | [train, train] | [gap, gap] |
| 10 | [A, B] | [20, 21] | [train, gap] | [gap, gap] |
| 11 | [A, B, C] | [22, 23, 24] | [gap, gap, gap] | [gap, gap, gap] |
| 12 | [A] | [25] | [gap] | [gap] |
| 13 | [A, B, C] | [26, 27, 28] | [test, test, test] | [test, test, test] |
| 14 | [A, B] | [29, 30] | [test, test] | [test, test] |
| 15 | [A, C] | [31, 32] | [test, test] | [test, test] |
先切唯一日期,再还原行号
唯一日期数组是第一日至第十五日。测试日期取最后三天,日期隔离带取第八至十二日,训练日期保留第一至七日。随后遍历原始行,只要这行日期在某个集合中,就把该行索引加入相应数组。因为条件只看日期,同一天不论有几只股票,都不可能被不同集合拆开。这就是索引转换器,输出不能只是一串日期标签。
本例date_indices函数返回所有满足日期成员条件的行号,不删除原行、不重新编号,因而能够直接对照原面板。实际数据可能未排序,应先保存原始行标识,再明确排序后的切分索引与原始索引映射。若直接把唯一日期数组产生的位置当成股票行位置使用,会取到错误股票,这比少隔几天更难发现。
| 方法 | 训练行索引 | 隔离行索引 | 测试行索引 | 训练行数 | 训练日期数 | 训练末日 | 中间完整日期数 |
|---|---|---|---|---|---|---|---|
| row_gap5 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] | [21, 22, 23, 24, 25] | [26, 27, 28, 29, 30, 31, 32] | 21 | 10 | 10 | 2 |
| date_gap5 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] | [16, 17, 18, 19, 20, 21, 22, 23, 24, 25] | [26, 27, 28, 29, 30, 31, 32] | 16 | 7 | 7 | 5 |
五行到底隔开多少天
行法训练索引零至二十,隔离二十一至二十五,测试二十六至三十二。第十日的A处在训练,B处在隔离,因此日期已被拆开。虽然隔离数组里碰到了第十、十一、十二日三个日期,训练最后仍含第十日,所以训练末日与测试首日之间只有第十一、十二两个完整交易日。不能把“隔离数组涉及三天”写成“隔开了三天”。
日期法训练索引零至十五,隔离十六至二十五,测试仍是二十六至三十二。训练末日为第七日,完整隔离第八至十二日共五天;隔离所需行数变成十行。训练减少五行并非算法浪费,而是同一隔离定义在不等宽面板上的自然结果。三个数组两两不交且合起来覆盖三十三行,是最基本的身份守恒检查。
条件若改成每天三只股票都齐全,五行仍不是五天,至多覆盖两个日期且很可能拆开边界。只有把每日信息先聚合成一条记录,库的样本计数才可能对应日期计数。聚合改变了模型输入,不应为了迎合splitter而随便平均股票标签;正确做法通常是在日期上生成切分,再映射到原始样本。
缺失日期和跨市场数据怎样处理
唯一日期应来自哪份日历,必须事先说明。本例所有十五日都至少有A,因此从面板提取唯一日与实验日历一致。如果某天三只股票全部没有记录,从数据里提取唯一日期会跳过它;按五个观测日隔离和按交易所五个开市日隔离将不再相同。生产系统应保留目标日历、缺失整日与非交易日的区别,不能把空白当成休市。
跨市场面板还要固定时区和信息截止时点。两个市场各自叫周一收盘,可能不是同一可得时刻;按字符串日期整日分组并不足以保证时间顺序。本页的转换器只处理已经统一的日期键,不推断跨市场可得性。股票代码变化、重复行和多次盘中记录也应在切分之前显式处理,否则同一天的权重可能被重复记录放大。
如果外层测试涉及第十三至十五日,内层调参也必须在各自训练前缀上重新生成日期切分,不能把全局行号简单平移后套用。每次输出训练日期最值、隔离完整日期清单及测试日期清单,便于检查某一折的股票缺失是否改变了边界。整日隔离只阻止一种横截面串味,还不能证明标签未来窗口不重叠。
如何给转换器做最小人工核对
先挑本表第十日,它有两个股票索引,行法两者归属不同,日期法两者都是隔离。再挑第七日,它有三只股票,日期法全部训练;最后挑测试第十三日,三只股票全部测试。检查完这些边界,再将每日索引数量相加,训练十六行、隔离十行、测试七行应回到三十三行。若股票数量发生变化,期望行数需要从输入重算,不能把当前答案写死在断言里。
记录数可以说明计算负担,唯一日期数才接近时间上的观测单位;即便有七个训练日期,也不代表七次独立实验。共同市场冲击、相邻标签和长期状态都会带来依赖。不能拿数百只股票乘以日期数,就直接把标准误除以更大的平方根。拆分设计与推断设计需要分别核对。
TimeSeriesSplit官方文档明确gap剔除的是样本,且其可比时间跨度要求等间隔样本;本文把该接口限制落实到面板索引。文档不提供股票日历,也不承诺按groups自动整日切分。这里的三十三行是自行构造,转换结果只验证日期成员关系,不是运行第三方库后的策略成绩。
日期集合转换为什么需要保留原身份
在原表插入一个缺失行或调整股票排序后,所有后续行号都可能移动,但日期归属应保持不变。核对转换器时可以把同日股票顺序反转,再按日期取集合,确认训练、隔离和测试仍包含相同记录身份。行号本身只是定位方式,日期加股票才是本例的记录键;真实数据还可能需要交易时段等字段。索引变化不应被误读成研究样本变化,更不能把旧索引缓存直接应用到已经换版的新面板。
继续核对研究流程时,可回到时序交叉验证母题;遇到相邻任务,再分别查看不等长标签purge清除、预处理参数训练区间审计。本文的滚动验证工具链接仅作基础流程说明,新增审计和统计计算由本页独立表格与模型交付。
道积君编辑组,AI辅助编写与核算。本文为构造教学实验,来源说明方法,数字由明示输入计算,不代表真实策略、收益预测或统计审定。
复算资料
本篇编号DJ4-057。下载Python复算脚本(文本)与构造输入输出JSON,按编号核对本篇。脚本改存为.py后可用Python标准库运行,数据不是实际用户记录。