跳到正文

研究指南

股票数据准备

两个行情源价格不同:逐日对账后选定可用序列

两个股票行情来源不一致,先判断它们是否描述同一观测。证券、交易时段、时区、价格基础和单位对齐后,才能比较数值。随后按字段容差检查,保留两边原行引用,选择有依据来源或隔离未解决日期。把不兼容或原因不明价格平均,不叫对账,只是制造第三个没有来源的数。

本文对两张合成日收盘与成交量表实际执行选源,输出标准序列和独立差异表,不判断某家供应商永久正确,也不证明CoTrading已有对应界面。样例仅核对声明字段;完整OHLC数据需要扩展到每个必需字段及行情关系,不应把收盘一致当作整份文件已经通过。

比较文件前先声明目标观测

目标为虚构股票AAA,价格CNY,原始价,常规交易时段观测,成交量单位股,日键按固定UTC+08:00约定。这些选择写进对账配置,不能从哪家表看起来更完整反推。真实多市场数据需要分别配置,不用单一固定时区处理所有市场。

Investor.gov收盘价说明指出常规收盘和盘后惯例可能造成来源差异。它首先是语义不匹配,不是随机数值误差。Alpha Vantage文档也区分复权和延长交易时段参数。实际文件里的close列究竟是什么,应查对应导出约定,不能靠列名默认。

真实文件先映射目标字段,同时保留原文件名、来源行号和原始字符串,标识按文本、价格按明确数值类型解析。建立字典前拒绝重复来源键,否则后行覆盖会把冲突悄悄删掉。本例从唯一合成映射开始,不声称兼容任意文件导入,也不把模拟数据说成已经下载的真实行情。

先把时间戳归到正确日期

Python datetime参考区分有时区与无时区对象。时间戳要求显式时区,再转为声明市场约定,最后构造日键。UTC日期与本地交易日可能不同,直接按未转换字符串合并,会制造本不存在的缺配或错配。

def session_date(value):
    stamp = datetime.fromisoformat(value)
    if stamp.tzinfo is None:
        raise ValueError("timezone_required")
    return stamp.astimezone(timezone(timedelta(hours=8))).date().isoformat()

脚本检查19日A本地时间与B等价UTC时间落到同日,还验证UTC时刻跨到下一本地日期。固定偏移样例没有实现美股夏令时日历,也不判断时间戳是否属于合法交易时段;真实系统要另供适用时区和市场日历。时间能转换,不代表那条观测必然是目标收盘。

语义不匹配先分流

只有证券、币种、常规时段和原始价均匹配的行,进入数值对比。因盘后或复权排除的行保留原因,不称为未解释坏价格。本政策允许只剩一个相容来源时选它,但明确单源标签。若真实任务要求双源确认,则应改为阻断,并另存政策版本,不能临时改变。

日期A收盘/量B观测决定
10月19日10/100010.005/1000,相容容差内选A
10月20日11/100011.3,盘后选相容A
10月21日12/10006,复权价选原始A
10月22日13/100013.5/1000,相容隔离收盘冲突
10月23日14/100014/900,相容隔离成交量冲突
10月26日缺失15/1000,相容单源选B

日期是给定合成观测,不是下载的市场日历。真实包还需核上市区间和预期交易日。A在26日缺行不能单凭此表就断言接口失败,应保留真实请求范围与响应状态。覆盖问题和数值问题分别记录,才能知道下一次该补拉还是查冲突。

每个字段用自己的容差

价格绝对容差0.01 CNY,成交量容差零股。19日差0.005在价格容差内;22日差0.5超出;23日价格相同但成交量差100,整行暂不放行,不混成A价格配B成交量的无记录组合。对账完成后选一个原始来源值,仍需保留选择依据。

differences = [field for field, tolerance in
               [("close", D("0.01")), ("volume", D("0"))]
               if abs(D(first[field])-D(second[field])) > tolerance]
if differences:
    audit[day] = "unresolved:" + "+".join(differences)
    continue

Python Decimal参考支持价格与容差的显式十进制计算。容差是发布精度政策,不是真实经济价格的估计区间。不要看到难解释日期后,临时扩大容差清除异常;保留原差异以及后来批准的容差修订。成交量是否允许供应商精度差别,也应事先声明。

完整K线需把开盘、最高、最低及其他必需字段一起比较,选定后再核最高最低包络关系与单位。只通过close不能认证OHLCV。可选字段未确认定义时,不进入接受约定;若下游策略依赖它,就必须扩大对账范围,而不是用默认值补齐列数。

查看实际生成的序列

下载完整示例。使用Python 3.12+、标准库与合成表,运行python R532.py。作者文件为docs/growth/research/round-5/examples/R532.py。

实际输出选择19、20、21日A收盘10、11、12及26日B收盘15,接受量均1000。审计表22日为unresolved:close,23日为unresolved:volume,都不进入标准序列。断言核对日期集合、回退日期选源,以及两个未解冲突均被挡住,不只是检查输出有没有数字。

A优先于B只在语义与冲突检查后生效,不让A的22日13自动成为权威。19日容差内选A原值10,而不是发明10与10.005的平均。单源回退也比双源一致少一道佐证,应保留标签。不同接受理由不能在最终表里都缩成一个无法区分的成功状态。

未解分歧保留,不平滑处理

22日价格冲突是主要反例:两行都描述请求观测,却超过容差,没有进一步证据就隔离日期、保留两边原值。不平均13与13.5,也不按哪条收益路径更好看选择。后续可以查交易所原始记录、供应商更正或请求参数,但不能把猜测直接写成已解决原因。

23日量冲突则是不同机制。收盘相同不代表流动性计算正确,整行隔离避免拼接来源。若以后更正解除冲突,记录新依据,再重跑该日选源。重新放行后也应让使用旧缺口或旧量的下游任务知道输入版本改变,而不是只覆盖当前文件。

盘后与复权不匹配需要取得匹配导出,或按单源政策保留相容值,不能与数值离群一概归为供应商错误。只有把差异分类,下一步才具体:换时段、换价格基础、补取缺行,或调查同口径冲突。一个泛化的“来源不一致”标签无法指导这些操作。

交付可用序列及其覆盖边界

包中保存两原表、归一规则、目标约定、字段容差、逐日结果、选源理由和隔离日期,来源加日期键能回到具体原行。输入日期并集对账到接受或暂扣结果,并把产生缺口告知下游。保留原始值而不是只存差额,审阅者才可以独立重算。

四日接受加两日隔离,不是完整六日历史。不要为了图表连续就插值;下游若要求全覆盖,对账任务仍未完成,直到冲突解决或有明确替代被接受。可用部分可以交付,但应同时交付其缺口,而不是把部分序列改名成最新完整行情。

来源更正、时段设置变化、公司行动口径或容差修订后重新打开对账,保留旧选择版本供已有研究复现。最终是有支持值与未解边界的可检查选源操作,不是永久证明某家供应商永远正确,也不是重讲计算与AI解释分离原则。每条接受与隔离都能追溯,后续计算才知道自己使用了什么。

每个选定值都要追到原行

来源名加日期应能找到保留输入,包括原时间戳、价格基础和取得版本。来源更正时,旧行保留,建立新修订,不原地更新已经发布选源背后的证据。早先研究才能重现真正用过的数,而不是重新执行就读到后来更正值。修订关系与当前有效版本可以并存,不能只留下最后一份文件。

审阅时覆盖容差内日期、语义不匹配、每种未解字段冲突。它们分别验证有佐证的来源优先、单相容来源使用与暂扣。只有明显价格差异的测试,无法证明成交量或时段定义真的参与输出。对照表需要在这些分支都能解释接受或拒绝理由,而不是由作者口头补充未记录的选择。

导出标准序列时同时导出覆盖与来源。下游只读价格,容易忽略缺口原因或回退日期较弱的支持,应在计算开始前接受声明的部分覆盖。对账表不是允许补造缺K线或忽略隔离日期的通行证。若下游不同意单源政策,就继续阻断相应日期,而不是丢标签后按完整历史使用。

新增第三个来源时,也不要简单多数投票覆盖现有冲突。先判断来源是否独立、是否采用同一观测定义,再设计扩展选源规则。本文只验证双源政策,复杂化后的合流需要新的反例与验收,不能从两个来源可对账推导任意数量都已可靠解决。

常见问题

平均冲突价格能降低噪声吗?

它生成没有来源的新观测,应先解释含义和差异原因。

收盘一致就能认证整根行情吗?

不能,量冲突说明每个必需字段及其单位都需核对。

相关阅读