自动股票研究怎么拦住算错的结果:拆分提取、核算与合流检查
自动股票研究需要真正可以执行的放行门槛。提取分支与计算分支输出结构化字段,按原始来源身份合流,检查身份、口径和算式后才允许发布。还要故意注入看似合理的错误,观察程序是否确实阻断。两名Agent在文字中重复同一个PE,既不能证明输入被核对,也不能证明重新算过。
本文交付三只虚构A股风格证券的完整合流程序,不只讨论计算与写作分离原则。下载例会实际生成接受和阻断结果,注入错误倍数与错误财年,修复后再次回放。全程是本地合成流程,不启用Vibe调度、不运行模型,不声称CoTrading已经提供这些自动核算模块。
准备已核实来源行和稳定身份
先取得经过审核的年度预测EPS表格行,以及单独提供的带日期价格。来源行需包含证券、目标财年、报告行标识、币种、稀释口径和价格日期。真实文件还应保留报告引用和原位置,本例用紧凑合成字段代替。row-1只在某公司报告内有意义,不能当全球唯一ID;AAA和BBB都有row-1是正常情况。
合成合同为2027财年、人民币稀释EPS、2026年10月26日价格。IAS 33官方概览说明EPS口径需要明确,不能据此声称它提供了券商预测。本例手工核定表格单元格,不证明脚本能自动读任意PDF,也不保证能自动识别调整后盈利与法定盈利之间的全部差别。
完整匹配键为证券、财年、来源行;另外保留证券加来源行作为原始锚点。第二层身份用于发现同一来源被错误标上别的年度:程序看到CCC的row-1仍对应原始2027行,却在提取分支变成2028,就能判错年,而不是把它当一个无关新增行,让原来的2027行悄悄消失。
两分支应提供不同性质的证据
提取分支读取已给单元格,输出报告EPS、报告PE和来源身份。计算分支另从已核原始EPS与外供价格计算价格除EPS,不读取报告PE来计算。这样报告倍数出错时,重算结果仍由价格和核实EPS决定。独立的是公式证据,不是让两段文字或两个模型对同一个结果投票。
这种独立性也有清楚边界:两分支仍共享已审核原始EPS,若共同源本身单位或年度就错,算术一致不能发现一切共因错误。因此必须保留来源核对与口径检查,不能只凭两个分支数字相同就宣称财务事实正确。第二个模型照抄第一分支声称的倍数,无论表达多有信心,都没有新增计算独立性。
Python Decimal用于比较,价格、EPS和支持的PE字段要求有限正数,NaN和正负无穷必须拒绝。报告PE与计算PE容差预先设为0.01倍,只处理有限展示精度带来的差异,不能为错年、错币种或利润口径不一致开脱。身份不匹配时,即使残差为零也不能通过。
按原行完整合流,不只取能匹配的交集
先验证共同身份schema和每个分支所需数字键,再按证券限定的来源行建立索引。一个分支内相同原始身份出现两次就拒绝,本例要求每个已审核原行唯一,不能依赖最后写入覆盖。不同证券相同短行号各自合法,不会互相冲突。来源重复与数字相同是不同问题,不能因为巧合相等就忽略来源基数。
针对每一条原始来源都生成一个核验结果,缺分支为missing_branch,出现未知来源身份则停止合流。任一分支年度与原始行不符就是year_mismatch;年度通过后还要核对币种、稀释口径和价格日期,再比较提取EPS与核实EPS、报告PE与独立PE。只做inner join会漏掉缺失行,不能作为完整任务验收。
if key(extracted) != key(source) or key(calculated) != key(source):
reasons.append("year_mismatch")
elif abs(reported_pe - computed_pe) > D("0.01"):
reasons.append("arithmetic_mismatch")
上面摘录两个核心判断,完整程序另含schema、缺行、口径和有限数检查。核验行保留原始身份、状态与原因,只要有任何问题,accepted_pe就是空。这样诊断可以展示错误在哪里,却不会把有问题的报告数字意外放进“可发布估值”字段。下游只能消费接受字段,不能忽略状态直接取原报告值。
先建立可通过的干净主例
AAA价格24、EPS1.2、报告PE20;BBB价格30、EPS1.5、报告PE20;CCC价格18、EPS1、报告PE18。计算分支独立得到20、20、18,三个原始锚点均对应2027年和相同口径,基线因此三行全部accepted。先断言正常输入可以通过,才能说明门槛有选择性,而不是无条件拒绝所有结果。
保存干净基线、来源fixture和代码版本,再运行变异输入。若只保留最终成功结果,审阅者无法判断系统是否真的会拦住错误。反过来,只有错误被阻断、没有正常控制,也不能证明完整任务能交付有效结果。两者共同形成可复查证据,说明检查既能接受正确结果,也能识别指定失败机制。
下载完整示例。使用Python 3.12+、标准库和合成数据,运行python R555.py。输出干净、注错、修复和缺分支四组结果。Python JSON文档支持结构交换,金融含义与身份检查由程序另外实现,不能把合法JSON误认为已核实数据。
实际注入算术和错年两种错误
第一处只把BBB提取到的报告PE从20改为21,价格30和核实EPS1.5不动,重算仍20。合流返回arithmetic_mismatch,接受PE为空,AAA继续通过。不能因一行错误擦掉其他正确行,也不能因为报告看起来可信就让21进入摘要。阻断必须发生在可发布字段生成处,不只是文字里附一句“建议核对”。
第二处只把CCC提取财年改成2028,原始来源与计算仍为2027。即使数字恰好完全一致,也返回year_mismatch。这是身份错配,不能取两分支平均、让模型猜哪个年份合理,或者直接丢掉未匹配行。原始来源锚点决定要核对谁,数值投票无法修复错年,更不能重新贴标签后假装没有错误。
将两个变异分支列表反向排列,输出仍应按原始来源顺序、保持相同状态,程序对此有断言。它还检验缺少一行、重复原始身份和报告倍数非有限值,覆盖对齐、基数和数字三类边界。这些检查让结果不依赖偶然输入排列,也能防止“少算一家公司”被成功状态掩盖。
修复后回放,说明发布边界
从已核fixture重新提取并独立重算,修复结果必须与干净基线完全一致。保留失败运行,不能用修复版覆盖掉历史证据。最终答案正确只说明修复后正确,不能证明系统当时会拦住坏结果;变异运行才直接展示阻断行为。真实修订应保存错误来源、修复字段和新运行标识,便于追查。
下游发布只使用accepted字段,同时带合同和覆盖范围。本例发布边界只是本地数据结构,不是外部发送报告。真实自动化还需要持久运行ID、源文件存储、授权和经过审核的发布政策,本文未启用这些产品能力。原始行、预测年、价格日或EPS口径改变时,相关分支与合流都必须重跑,不能把旧计算借给新提取结果。
每条预期来源最终都应得到明确答复:估值接受,或者估值被阻断并附具体原因及下一步。阻断行仍算已记录的任务结果,但不算已核准估值。汇总时分别报告处理覆盖与接受覆盖,避免“三行都有结果”被误写成“三家公司估值均可用”。结构化合流的目的正是让这些区别可以由程序执行,而不依赖读者猜测文字措辞。
复查容差、单位与覆盖统计
容差0.01的单位是PE倍数,不是百分比。若报告只展示整数倍,应该先另定符合该展示精度的政策,而不是在看到21与20不符后临时扩大阈值。当前fixture报告有足够精度,1倍差异明确被阻断。价格和EPS同币种才能相除,原始来源也必须经审核,合流内部一致并不能证明源表没有把元与分混用。
遇到来源范围变化时,应先更新原始锚点集合,再确认两分支完整覆盖。不能因为计算分支只返回两家公司,就把三行源表缩成两行再宣称全部通过;这会让缺失逃离验收。程序以原表逐行输出,正是为了让漏行可见。增加一条合法公司行后,相同本地row-1仍不冲突,因为身份始终包含证券。
人工处理阻断时,分别针对原因补证据:算术差需查公式或报告数,错年需查目标期间,缺分支需恢复对应步骤。不能把所有阻断都交给写作模型改措辞。修复后的接受值仍必须重新经过完整合流,才能防止“已人工看过”成为跳过检查的通用理由。
常见问题
两个模型回答一样足够吗?
不够。计算分支必须真正从核实输入重新算,不能依赖被核对的声称结果。
错年但PE一致可以通过吗?
不能,身份与口径匹配先于算术接受。