客户放在券商的保证金是有利息的(按银行活期利率,惯例按季结息)。客户的余额每天都在变——今天转入 10 万,明天买股花了 6 万,后天卖出回款 8 万。这笔利息该怎么算?直觉方案是"逐笔资金算利息再求和",银行体系几百年前的答案更优雅:积数法。这篇推导它的原理,讲清为什么它既精确又便宜。
利息的数学本质:余额对时间的积分
一段时间内余额变动 $n$ 次,第 $i$ 段余额 $B_i$ 维持了 $d_i$ 天,日利率 $r$,那么利息的精确定义是:
$$ I = r \sum_{i=1}^{n} B_i \cdot d_i $$
注意求和号里的东西:$\sum B_i d_i$ 是余额关于时间的离散积分——余额-时间曲线下方的面积。金融上管它叫积数(accumulated product),单位是"元·天"。积数法就是:平时不急着算利息,只维护积数这一个累加量;结息日到了,一把乘上日利率出利息。
这个拆解的工程意义在于把问题分成了两半:"钱在账上待了多久"(积数,逐日维护,与利率无关)和"利率是多少"(结息时的参数)。两半解耦之后,利率调整、结息周期变化都不用回头改历史数据——历史数据只有一个积分面积,乘什么利率是结息当天的事。
增量维护:为什么积数便宜
如果每个结息日都回头遍历一个季度的全部流水去重算积分,几十万账户 × 几十天 × 若干笔流水,是实打实的批量负担。积数法的精妙之处是积数可以增量维护,而且增量点不在"每天",在"每次余额变动":
$$ A_{new} = A_{old} + B_{prev} \times (\text{当前日期} - \text{上次变动日期}) $$
含义:余额每次变动时,把"上一段余额 × 它维持的天数"补进积数,然后记下新余额和变动日期。余额不变的日子,积数什么都不用做——因为那段面积会在下一次变动时一次性补进去。
增量维护把计息的成本从 $O(\text{天数} \times \text{账户数})$ 降到 $O(\text{变动次数})$。一个季度内余额纹丝不动的睡眠户,积数维护成本是零——这正是"为什么按日积数而不是逐笔"的答案:逐笔法要为每一笔资金单独跟踪起止日再两两配对,账户间无法共享计算;积数法把全账户的计算统一成一个累加器,批量、增量、可校验。
实务上还有一个更省事的选择:每天日切时跑一个"日积数累加"任务,对所有账户执行 $A \mathrel{+}= B_{current}$(即把当天余额计入积数,$d=1$)。这等价于逐日积分,成本是全表扫一遍,但实现简单到不会错,而且天然处理了"余额没变也要计这一天"的问题。变动触发法和逐日累加法数学上等价,选哪个看批量窗口的宽裕程度;关键约束只有一个——取余额的时点必须固定(通常是日切后的时点余额),时点漂移一天,全市场的利息都会差出一个可审计的量。
分段利率:积数解耦的回报
活期利率会调整。假设季度中间央行调了利率,调整日前的天数按旧利率、之后按新利率。因为积数与利率解耦,处理方式是积数分段:
$$ I = r_1 A_1 + r_2 A_2, \quad A = A_1 + A_2 $$
利率生效日那天,把积数"封段":$A_1$ 定格,从该日起重新累 $A_2$。账户上要多存一个"当前段积数"和"历史段积数合计"。这就是解耦的直接回报——如果当初把利息逐日记成了钱,利率调整就要回溯重算每一天的利息再轧差;积数法只需要在生效日多做一次封段动作。
结息:积数变现的时刻
结息是积数唯一的"变现"点,规则要点:
- 结息周期:银行活期惯例是季度结息,结息日为季末月 20 日(3/20、6/20、9/20、12/20),券商客户保证金沿用这个口径。销户、转托管时要做即时结息——不管是不是结息日,把截至当天的积数变现付给客户。
- 计息范围:注意冻结资金照常计息(钱还在账户上,只是被占用),但在途资金、已划出到银行的资金不计。计息基数是"当前余额"这个口径,不是可用余额。
- 入科目:结息产生的利息对客户是收入,对券商是费用——利息支出一进一出,复式记账那篇的分录模板里"结息"是独立业务类型:借"应付客户利息",贷"客户资金存款"。
- 年利率换算:行业惯例年利率除以 360 得日利率(银行惯例),不是 365。这个 360 看似细节,全市场保证金规模下 360/365 的差别是真金白银,参数表里必须显式配置并留痕,不能拍脑袋写死。
$$ I_{结息} = A_{季度积数} \times \frac{r_{年}}{360} $$
结息执行要满足两个工程属性:幂等(重复跑结息任务不能重复付息,靠"已结息到日期"水位线控制,结息处理 $A$ 后清零积数并推进水位线)和原子(利息入账和客户余额更新同事务,分批提交时每批一个事务,失败从断点账户继续)。
反向积数:负债侧的对称结构
积数法不只用于客户的利息收入,也用于券商对客户的收费——融资利率的利息计提是同一个机制的镜像:融资余额逐日累计积数,按约定利率(如 8.35%/360)逐日计提或到期一次收取。两融那篇说过负债是"活的"数据,这里补上它的计算内核:活的部分就是每天自动增长的积数。
甚至券商向中登缴的结算备付金,中登给券商的利息也是积数法——同一个算法出现在法人和客户两个层级。写计息模块时把"积数账户"抽象成通用组件(余额、当前积数、上次变动日、分段表、水位线),客户利息、融资利息、备付金利息三个业务共用一套内核,只配不同的利率表和结息周期,是对的架构。
积数法是一个"用积分思维降成本"的典型案例:把"逐笔配对算利息"这个随业务量平方增长的问题,变成"维护一个累加器"这个随变动线性增长的问题。理解了它,再看银行核心、券商核心里的所有"计提类"任务,全都是同一个形状的变体。