Alpaca 券商金额十进制精度与取整规则
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/alpaca-broker-money-precision-zcg3。
技能介绍
先说清楚问题有多贵
金融 bug 是沉默的。Alpaca 的 wire format 里,价格、数量、名义金额都是 JSON 字符串(如 "190.2345"),这个设计是有意的——绕开 JSON 二进制浮点带来的精度损失。但你的代码里几乎一定会有人随手写 float(amount) 或 Number(amount),一次算账出错,可能要等到对账时才被发现。
核心规则只有一条:凡是会动钱的路径,数字永远不许以 IEEE-754 float 的形式存在。
技能如何帮你兜住这个坑
技能是一份 opinionated 的清单,语言无关,重点覆盖三层:
- 解析与序列化:字符串金额必须解析成十进制类型——Python 用
decimal.Decimal,TS/JS 用decimal.js或字符串算术,Go 用shopspring/decimal,Java 用BigDecimal。序列化回字符串,禁止float()/Number()进入 money path。 - 发送前显式取整:现金金额通常只收 2 位小数,碎股 qty/notional 最多 9 位。超额精度可能被拒或被对方静默取整。规则是调用 API 之前就显式取整,且明确选 rounding mode——往外转钱一律 truncate(向下取整,如
floor(amount * 100) / 100),不能继承语言默认的浮点格式化行为。每步中间运算后都要重新取整。 - 存储与审计:数据库用定点小数列(如
DECIMAL(20, 8)),同时原样保存 Alpaca 返回的原始字符串,即使为了 API 调用截断到 2 位,也把完整精度留着,对账时才能对得上。显式维护 currency 列。
注意点与边界
- 端点不一致:并非所有 Alpaca 端点都返回字符串——比如 bar OHLC 这类行情数据可能是 JSON number。展示/分析用 float 可以接受,动钱和存储不行。先确认你碰的字段属于哪一类。
- 碎股下单:
qty与notional二选一,不能同时传;不要拿自己抓的价格反推 qty 再传,直接传 notional 让 Alpaca 算 fill,否则引入漂移。 - 多币种盲区:大部分 Broker/trading 流是 USD,但 funding wallet 支持 USD/EUR/JPY 等,还有 FX 费用。碰 funding 时永远不要假设 USD。
建议前置阅读 alpaca-broker-integration 技能;下单规则见 alpaca-broker-trading-orders,journal/转账见 alpaca-broker-journals 与 alpaca-broker-funding-transfers,对账见 alpaca-broker-reconciliation-idempotency。
使用场景
- 在对接 Alpaca API 处理订单成交回报时,需将返回的字符串金额解析为十进制存入数据库,防止浮点精度丢失导致对账失败。
- 开发碎股交易模块时,需要计算并发送带有小数位的 notional 或 qty,且必须在调用接口前显式向下取整到规定的小数位数。
- 设计 Broker 系统的财务数据库表结构时,需决定金额字段的精度与类型,并保留 Alpaca 返回的原始字符串以供后续审计。
- 在实现多币种资金提现功能时,需要处理汇率换算和跨币种金额,确保所有 FX 计算均使用十进制而非浮点数。
适合人员
- 券商或交易系统的后端工程师,正在接入 Alpaca Broker API,希望避免因浮点精度导致的资金计算错误和财务对账事故。
- 量化交易平台的全栈开发者,负责设计碎股交易与资金流水模块,需要确保数据库存储和 API 交互时的金额精度合规。
- 金融科技公司的技术架构师,正在制定财务系统的数据存储规范与 API 调用指南,要求团队统一使用十进制处理资金流。