精确数字并不等于正确投资:单位、舍入与残差的数值核设计

一个基金研究 Agent 算出 2.06 元,可能完全符合算术规则,却不适合当作投资建议:份额来自昨天,净值来自今天;不同币种被相加;费用已经体现在净值里,却又扣了一次。

因此,金融 Agent 不需要一位"万能数学裁判",而需要严格区分两类责任:精确数值运算(Numeric) 保证给定十进制数值、单位和舍入政策下的确定性结果;确定性投资计算等领域模块 选择公式、判断输入和分母是否适用,并决定业务结果的资格。本文围绕一条金额计算讲解 Numeric 的接口和实现边界。所有例子为合成输入;局部数值测试不代表金融研究质量已经获得认证。

一、输入必须保留计算以前的意义

图 1:从原值到解释,数值核不应补造领域前提。

图中关系(文字对照):

  • 来源数据与原始精度 → 领域 Owner 选择对象/时点/方法。
  • 领域 Owner 选择对象/时点/方法 → 单位/尺度/运算绑定明确?。
  • 单位/尺度/运算绑定明确? → 若否,局部拒绝并标明原因。
  • 单位/尺度/运算绑定明确? → 若是,A33 精确数值运算。
  • A33 精确数值运算 → 返回 exact/rounded/residual。
  • 返回 exact/rounded/residual → 领域 Owner 检查业务约束。
  • 领域 Owner 检查业务约束 → Result 保存身份和适用限制。
  • Result 保存身份和适用限制 → 模型解释与原 Publication 交付。

二进制浮点不能准确表达所有十进制小数,超过安全整数范围时甚至可能在解析阶段丢掉原始数字。把普通 number 最后格式化为两位小数,不能修复计算前已经发生的精度损失。

因此,输入采用十进制字符串,且把舍入政策显式传入:

json 复制代码
{
  "quantity": { "value": "137", "unit": "CNY" },
  "factor": { "value": "0.015", "unit": "ratio" },
  "rounding": { "scale": 2, "mode": "half-toward-positive-infinity" }
}

这不是说 1.5% 是任何真实基金的合法费率;选择费率属于金融领域。

二、精度、单位、尺度与方法是四个问题

  • 数值表示:示例:2.055、1e-400;最终责任:Numeric 保留十进制精度与比较结果。
  • 单位:示例:CNY、USD、shares:fund-A;最终责任:来源/领域声明;Numeric 拒绝不兼容运算。
  • 比例尺度:示例:0.25 ratio、25 percent;最终责任:领域按版本化合同显式换算,不按数值大小猜测。
  • 方法与分母:示例:收益率、费用、份额估值;最终责任:领域 Owner 选择,Numeric 不决策。
  • 结算/展示精度:示例:两位小数、货币量子;最终责任:领域指定政策,Numeric 执行。

相同单位可以直接加减,CNY 与 USD 不应该被默认相加。份额乘同对象单位净值须由调用方声明维度:shares:fund-A × CNY/share:fund-A → CNY。Numeric 不推断基金对象,不查询实时汇率,也不保证来源数据新鲜。

百分点尤其容易出现尺度误判:0.02 decimal-difference 可按相应合同解释为 2 pp,但已经记录为 2 percentage-points 的源值不得再次乘 100。

三、舍入是一种规则,不是视觉格式化

137 × 0.015 = 2.055 CNY。采用显式两位小数和已声明的 tie 政策:

json 复制代码
{
  "exact": { "value": "2.055", "unit": "CNY" },
  "rounded": { "value": "2.06", "unit": "CNY" },
  "roundingResidual": { "value": "0.005", "unit": "CNY" }
}

此处残差定义为 rounded − exact ,所以是正 0.005;它不是"计算错了"。负数更能检验政策:既有精确数值核采用 half-toward-positive-infinity,负向半分边界 −10.075 → −10.07,不是 −10.08。它符合明确的 tie 规则,但不是所有金融产品统一使用的舍入方法。

先计算、按领域政策结算、最后格式化,与"每一步先四舍五入再继续"通常不等价。

四、精确比较不能被展示层吞掉

1.00 CNY 与 0.999 CNY 在两位小数界面中可能都显示为 1.00,但前者仍严格大于后者,精确差额是 0.001。非常小的正十进制数(如 1e-400)也不能因为转换成普通 number 而被判等于零。

"现金不得为负"是领域规则;Numeric 只保证对选定同单位数值的比较。允许哪种容差、违反时应拒绝哪项交易假设,都由原业务 Owner 决定。

五、残差还可能揭示不可行约束

图 2:不要用自然语言解释掩盖严格约束彼此冲突。

图中关系(文字对照):

  • 领域指定目标和约束 → A33 精确运算和比较。
  • A33 精确运算和比较 → 守恒与约束都成立?。
  • 守恒与约束都成立? → 若是,保留确定性结果。
  • 守恒与约束都成立? → 若否,返回差额和受影响字段。
  • 返回差额和受影响字段 → 领域有合法容差或调整政策?。
  • 领域有合法容差或调整政策? → 若是,原领域局部调整后复算。
  • 领域有合法容差或调整政策? → 若否,报告不可行或缺条件。
  • 保留确定性结果 → 模型解释不替代领域批准。
  • 原领域局部调整后复算 → 模型解释不替代领域批准。
  • 报告不可行或缺条件 → 模型解释不替代领域批准。

假设某个合成配置要求三个权重严格 等于 0.333,同时总和严格等于 1。精确相加为 0.999,差额 0.001。这不是浮点误差,也不是把三个权重展示成 33.3% 就能解决。

由哪个资产桶吸收差额、是否允许现金权重变化、容差多大,必须由投资领域决定。Numeric 只返回可复算的值;严格约束相互矛盾时,应保留局部不可行结论,而不是生成看似守恒的组合。

两个对照案例也说明了相同问题:已知价格但未知持仓日期,乘法精确仍不代表当前估值合格;假设费用可复算不等于实际扣款已经发生,净值已包含费用时不能再次默认扣减。

六、没有必要建立全局金融数学经理

有些领域计算适合精确金额,有些统计计算(例如协方差估算)可以在声明样本和误差后使用浮点。将全部指标塞进 Numeric Manager,会迫使一个模块理解收益口径、产品条款、货币、来源身份和交易许可,接口复杂度反而变高。

  • 精确数值运算(Numeric):应当拥有:精确运算、单位匹配、舍入与残差;不应当拥有:投资公式选择与来源认证。
  • 隔离分析:应当拥有:沙箱、输入绑定和真实脚本执行;不应当拥有:执行成功即金融正确。
  • 确定性投资计算:应当拥有:金额、配置与领域约束;不应当拥有:全局 Run / Publication 否决。
  • 研究结果与引用管理:应当拥有:结果身份、依赖和回读;不应当拥有:重新计算原业务结果。
  • 正文发布与内容准备:应当拥有:正文版本和交付;不应当拥有:统一金融语义裁判。

一个职责集中的数值模块,用简洁接口把重复的精度规则封在内部,让调用方复用;领域规则留在各自模块,变化时只需修改对应位置。没必要再添加只负责转发方法的包装层。

七、怎样验证,而不夸大结论

最小回归集应该包括:137 × 0.015 的 exact/rounded/residual、负数 tie、CNY/USD 加法拒绝、同基金份额×净值的显式绑定、错基金绑定拒绝、1.00 与 0.999 的精确比较、极小非零值,以及目标权重不可行案例。

固定字符串和期望输出可以证明这些局部机制,但不能据此宣称真实基金收益口径、投资建议、交易或所有历史数字都已经正确。

结语

Numeric 的强保证不是"所有 Agent 数字都正确",而是:给定合法十进制输入、单位绑定和舍入政策,运算可复算,残差可解释,非法操作被局部拒绝。 金融领域继续负责方法、依据、适用性与授权,精确数学才不会越权成为投资真值。

延伸阅读:金融数字的时点、口径与复算 · Python 算过了,投研报告为什么还会错 · 模型会理解,代码才授权。

原文与交流

阅读原文与完整配图 · ETF Agent 工程文集(欢迎 Star)。

相关推荐
hpoenixf38 分钟前
Agent 收到控制指令后,为什么不能立刻执行?持久控制事件的交接边界
agent
hpoenixf40 分钟前
每天一份个性化研究,为什么不是重复执行一个 Prompt?
agent
hpoenixf41 分钟前
Skill 不只是一个 SKILL.md:Agent 如何把研究方法变成可调用的能力
agent
hpoenixf1 小时前
断线不是崩溃:为什么 Agent 不必恢复原来的执行图?
agent
hpoenixf2 小时前
自定义专家,不应该只是一个 Prompt 输入框
agent
hpoenixf2 小时前
Agent 究竟花了多少资源:为什么请求数、Token 和 Credits 不是一回事
agent
奈落246 小时前
AI辅助的另一面:从2026年国际AI安全报告的“故障”清单到国内专家的可靠性短板,自主行动的Agent为什么更难及时干预
人工智能·安全·agent·本地部署·ai 办公
时早玖沐14 小时前
放弃 QQ 官方机器人:用 SnowLuma + AstrBot 自建 QQ 机器人
docker·开源·agent
nujnewnehc14 小时前
给记事软件加上 mcp
agent·mcp