← 返回文章库

股票改名换代码后,历史行情怎样按有效期连接而不串票

2026-10-24 · L5

代码不是永远不变的证券身份。相同文字可能在不同日期属于不同证券,同一证券也可能先后使用多个代码。历史行情应以“代码加有效时间”找到唯一证券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
E110A1AAA2放行S1
E211A2BBB4放行S1
E320A3AAA5放行S2
E430无CCC3空档—
E512A2,A6BBB6重叠冲突—
E631A5CCC5放行S3
E713A2BBB7放行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日的覆盖次数,列出不等于一的格子:

别名匹配数日状态
BBB01空档
BBB02空档
BBB03空档
BBB26重叠冲突
CCC03空档

AAA在观察范围内没有覆盖异常;BBB在第1至3日未启用,属于主表没有覆盖,但本例这些日子没有BBB报价,所以并不自动构成行情错误。CCC第3日空档却恰好出现E4,需要阻断。主表空档与实际报价落入空档应分别计数,不能把未启用代码的所有早期日期都叫缺失行情。

第6日BBB覆盖数二,是实际连接冲突的根源。若两个区间都指向同一证券ID,也不宜直接忽略,因为可能仍有来源、交易场所或字段版本冲突。可以在取得证据后合并等价主表记录,但应记录合并依据;本文不预设重复映射一定只是无害拷贝。

按证券ID核对连续样本

事件别名种数行数证券ID
E1,E2,E723S1
E311S2
E611S3

S1保留E1、E2、E7,共三条且横跨两个别名;S2保留E3;S3保留E6。E4和E5仍在原始台账内,但不进入唯一身份序列。七条原始报价等于五条放行加两条待核,数量闭合。连续样本的“连续”指身份一致,不意味着每天都有行情,也不证明价格已复权。

若把冲突E5自动归S1,S1会多一条没有唯一证据支持的记录;若归S2,又改变另一证券历史。表中缺失证券ID不能通过前向填充补成上一条身份,因为身份更替不等于价格延用。主表有效期是连接条件,应先解决,再计算任何相邻收益或滚动特征。

忽略有效期的错误结果与修复条件

事件忽略有效期首条证券ID正确证券ID
E1S1S1
E2S1S1
E3S1S2
E4S3—
E5S1—
E6S3S3
E7S1S1

错误算法对每个代码拿首次出现的主表身份。它会把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标准库运行,数据不是实际用户记录。

这个页面有问题?

提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。