股票改名换代码后,历史行情怎样按有效期连接而不串票
代码不是永远不变的证券身份。相同文字可能在不同日期属于不同证券,同一证券也可能先后使用多个代码。历史行情应以“代码加有效时间”找到唯一证券ID,只有恰好匹配一条才放行;没有匹配是空档,多于一条是冲突。本篇交付三证券别名区间、七条报价连接与连续样本台账,不计算代码转换中的持仓权益。
三证券与有效区间怎样构造
构造证券S1、S2、S3,观察日为2026年10月1日至7日,表中的日用一到七缩写。所有有效区间采用含起日、不含止日,即起点小于等于观察日且观察日小于终点。价格单位元,每个报价只表示一次教学观察;代码AAA、BBB、CCC都是占位,不是真实市场代码。
完整构造输入如下。时间和状态按本篇约定解释,JSON中的null代表未知而非零:
{
"alias_columns": [
"映射",
"别名",
"证券ID",
"含起日",
"不含止日"
],
"aliases": [
[
"A1",
"AAA",
"S1",
1,
4
],
[
"A2",
"BBB",
"S1",
4,
8
],
[
"A3",
"AAA",
"S2",
4,
8
],
[
"A4",
"CCC",
"S3",
1,
3
],
[
"A5",
"CCC",
"S3",
4,
8
],
[
"A6",
"BBB",
"S2",
6,
7
]
],
"calendar": "构造2026-10-01至07",
"quote_columns": [
"事件",
"别名",
"日",
"价"
],
"quotes": [
[
"E1",
"AAA",
2,
10
],
[
"E2",
"BBB",
4,
11
],
[
"E3",
"AAA",
5,
20
],
[
"E4",
"CCC",
3,
30
],
[
"E5",
"BBB",
6,
12
],
[
"E6",
"CCC",
5,
31
],
[
"E7",
"BBB",
7,
13
]
]
}
S1在第4日从AAA改用BBB;AAA从第4日起改属于S2。S3使用CCC,但第3日人为留下一个空档。A6又把第6日BBB指向S2,与S1映射重叠,作为冲突反例。A1至A6是映射记录身份,不能直接当作证券ID,否则每次改名会人为拆成新的证券。
区间闭合侧必须由主表契约固定。第4日AAA只匹配S2而非S1,第4日BBB匹配S1;如果把旧区间终点也包含,会在转换日同时匹配两个身份。我们不从现实改名公告推断任何有效日,所有区间都是构造输入,目的在于检验连接算法能否拒绝故意注入的空档和重叠。
报价逐行连接结果怎样读
| 事件 | 价 | 候选映射 | 别名 | 日 | 状态 | 证券ID |
|---|---|---|---|---|---|---|
| E1 | 10 | A1 | AAA | 2 | 放行 | S1 |
| E2 | 11 | A2 | BBB | 4 | 放行 | S1 |
| E3 | 20 | A3 | AAA | 5 | 放行 | S2 |
| E4 | 30 | 无 | CCC | 3 | 空档 | — |
| E5 | 12 | A2,A6 | BBB | 6 | 重叠冲突 | — |
| E6 | 31 | A5 | CCC | 5 | 放行 | S3 |
| E7 | 13 | A2 | BBB | 7 | 放行 | S1 |
E1的AAA在第2日连接S1;E2的BBB在第4日也连接S1,因此代码变了但证券观察保持连续。E3的AAA在第5日应属于S2,价格二十,不能与E1的十元直接拼成S1价格翻倍。看似同一个代码字符串,经济对象已经不同,简单按代码分组会制造虚假价格跳变。
E4的CCC第3日没有任何覆盖,返回空档。E5第6日BBB同时命中A2、A6,返回重叠冲突,不任取最新一条。E7在第7日只命中A2,因为A6不含终点7,说明半开区间可以明确解决边界。每行保留候选映射,便于追溯究竟哪两条主表记录造成冲突。
不能先按代码取主表首行再合并日期,也不能在连接扩张后简单drop_duplicates。前者会把不同时期的身份混用,后者可能删除真正需要研究的报价,并且让剩余身份取决于文件排序。正确产物应同时包含已放行、空档与冲突,不能只交干净的价格序列。
区间审计怎样区分观察空档与主表空档
下表穷举三个代码在第1至7日的覆盖次数,列出不等于一的格子:
| 别名 | 匹配数 | 日 | 状态 |
|---|---|---|---|
| BBB | 0 | 1 | 空档 |
| BBB | 0 | 2 | 空档 |
| BBB | 0 | 3 | 空档 |
| BBB | 2 | 6 | 重叠冲突 |
| CCC | 0 | 3 | 空档 |
AAA在观察范围内没有覆盖异常;BBB在第1至3日未启用,属于主表没有覆盖,但本例这些日子没有BBB报价,所以并不自动构成行情错误。CCC第3日空档却恰好出现E4,需要阻断。主表空档与实际报价落入空档应分别计数,不能把未启用代码的所有早期日期都叫缺失行情。
第6日BBB覆盖数二,是实际连接冲突的根源。若两个区间都指向同一证券ID,也不宜直接忽略,因为可能仍有来源、交易场所或字段版本冲突。可以在取得证据后合并等价主表记录,但应记录合并依据;本文不预设重复映射一定只是无害拷贝。
按证券ID核对连续样本
| 事件 | 别名种数 | 行数 | 证券ID |
|---|---|---|---|
| E1,E2,E7 | 2 | 3 | S1 |
| E3 | 1 | 1 | S2 |
| E6 | 1 | 1 | S3 |
S1保留E1、E2、E7,共三条且横跨两个别名;S2保留E3;S3保留E6。E4和E5仍在原始台账内,但不进入唯一身份序列。七条原始报价等于五条放行加两条待核,数量闭合。连续样本的“连续”指身份一致,不意味着每天都有行情,也不证明价格已复权。
若把冲突E5自动归S1,S1会多一条没有唯一证据支持的记录;若归S2,又改变另一证券历史。表中缺失证券ID不能通过前向填充补成上一条身份,因为身份更替不等于价格延用。主表有效期是连接条件,应先解决,再计算任何相邻收益或滚动特征。
忽略有效期的错误结果与修复条件
| 事件 | 忽略有效期首条证券ID | 正确证券ID |
|---|---|---|
| E1 | S1 | S1 |
| E2 | S1 | S1 |
| E3 | S1 | S2 |
| E4 | S3 | — |
| E5 | S1 | — |
| E6 | S3 | S3 |
| E7 | S1 | S1 |
错误算法对每个代码拿首次出现的主表身份。它会把E3的AAA仍归S1,也把E4与E5硬塞进一个身份;即使某些结果碰巧正确,算法也没有完成唯一性判断。不能因为总报价数仍是七就宣布行数守恒证明身份正确,守恒仅是必要检查,逐行候选数量才给出关键证据。
条件变化可以由主表确认:若源方撤回A6,第6日BBB仅剩A2,E5变为唯一S1;若源方补出CCC第3日的有效区间,E4才有机会放行。两种变化分别解决重叠与空档,不能用“全部向后填”一个动作代替。更正后应重跑受到有效期影响的所有报价,不能只改当前页面显示的名称。
若实际数据涉及同名不同场所,应把交易场所纳入别名键;若标的是不同股份类别,也应分别设置稳定ID。证券身份连续不自动等于数量连续,合股、拆股、换股另有单位和权利账,不能把这里的同ID映射当作一比一权益转换凭证。
原始方法与使用范围
pandas merge文档的validate支持连接基数核验;merge_asof文档说明方向连接。读取范围为相应参数区,核对日2026年10月24日。库不会替你确认现实证券主表,向后找到最近生效记录后仍需检查终止时间,不能省略区间右端。
实际执行先审核主表区间,再按代码和事件日枚举候选,最后以稳定ID排列已放行报价。保留映射版本、有效起止、候选记录及拒绝状态,源方日后修订时才能重新定位影响范围。本模型只覆盖七个指定日期和给定三证券,不提供真实代码库,也不判断股票改名的法律或交易安排。
数据六项自查母文用于检查总体数据健康。样本分割基础工具只辅助理解训练与检验样本的划分;本篇专门的逐行审计由教学表和标准库脚本完成,工具没有内置这些检查。相关核对可继续阅读行情向后匹配过期报价、行情时区夏令时对齐。
道积君编辑组,AI辅助编写与核算。本文为构造教学样本,公开脚本只使用Python标准库,默认在脚本同目录生成UTF-8、LF换行的JSON;不依赖pandas、网络或仓库。没有实测第三方框架或实际交易系统,不据此推断真实收益、成交或数据源可靠性。
复算资料
本篇编号DJ4-049。下载Python复算脚本(文本)与构造输入输出JSON,按编号核对本篇。脚本改存为.py后可用Python标准库运行,数据不是实际用户记录。