公司行动是上市公司对股东做的存量调整:分红、送股、转增、配股、拆细、合并。对投资者来说它表现为"某天早上打开 App,持仓数量变了、成本变了、或者多了一笔现金"。对系统来说,它是唯一一类不由客户交易驱动、却批量改写所有持仓的业务——全市场持有某只股票的客户在同一天晚上被同一个文件改写账目。
四个关键日期
公司行动的流程由四个日期锚定,记混它们是公司行动模块最常见的需求理解错误:
- 股权登记日(R 日):这天收盘后,中国结算生成的持有人名册就是权益分配的依据。R 日收盘持有才算数,盘中买入当天拿到、盘中卖出当天失去。
- 除权除息日(R+1,通常是次一交易日):从这天起,买入的人不再享有本次权益,股价做除权除息处理,涨跌停基准价换成除权参考价。R 日买入 R+1 卖出照样拿分红——权利和持仓已经在 R 日晚脱钩。
- 红利发放日 / 红股上市日:现金红利和红股实际到账的日子,可以和除权日不同(红股通常 R+1 到账,现金红利可能晚几天)。
- 派发比例:10 派 X 元(每 10 股派 X 元现金,含税)、10 送 Y(利润送股)、10 转 Z(资本公积转增)。送和转对持仓的数学效果一样(数量增加),税务处理不同——送股要按面值计税,转增不计税,这个差异在税务核算篇有用,清算层可以合并处理。
系统设计的关键认知:权利在 R 日收盘时刻定格,兑现分批次完成。所以公司行动清算必然是"登记日锁定名单 → 除权日改价 → 发放日发钱发股"的多阶段批任务,不是一个原子操作。
除权除息参考价:昨收为什么要被改写
除权日早上,行情软件里的"昨收"不再是真正的昨收,而是除权除息参考价。推导逻辑是"股东财富在除权前后不变":除权前持有 1 股值 $P_0$;除权后变成 $1 + s + t$ 股($s$ 送股比例、$t$ 转增比例),外加每股现金红利 $d$(若还有配股,加上配股价 $P_a$ 和配股比例 $n$,配股要额外出钱)。令前后财富相等:
$$ P_0 = P_{\text{ex}} \cdot (1 + s + t + n) + d - P_a \cdot n $$
解出除权参考价:
$$ P_{\text{ex}} = \frac{P_0 - d + P_a \cdot n}{1 + s + t + n} $$
最常见的纯分红送股场景($P_a \cdot n = 0$)就是"(昨收 − 每股红利)÷(1 + 送转比例)"。例:昨收 20 元,10 派 2 送 3,则 $d=0.2$,$s=0.3$,参考价 $= (20 - 0.2) / 1.3 = 15.2307... \approx 15.23$ 元(四舍五入到 0.01)。
这个参考价的系统落点有三个:行情系统的"昨收"字段要在除权日开盘前被替换;涨跌停基准价换成参考价(价格规则那篇说的"基准价来源"字段就是为它准备的);客户成本价同步摊薄,保证"浮动盈亏"不因除权而跳空。
持仓批量变更:系统实现的三块
1. 登记数据驱动。 公司行动的权威数据源是中国结算下发的权益登记文件(哪些账户、持有多少、派发比例),不是上市公司公告。券商清算系统按文件逐账户计算:红股数 = R 日持仓 × 送转比例,红利额 = R 日持仓 ÷ 10 × 派现额。这就解释了为什么券商从不在 R 日盘中动持仓——名单要等收盘后的文件。
2. 零碎股处理。 送转会产生零碎股:1001 股 10 送 3 得 300.3 股红股,0.3 股怎么办?规则是登记公司按小数点后尾数从大到小排序凑整派发(尾数相同则摇号),直到送完为止——散户层面的处理实际是"四舍五入+运气"。券商系统要预留实际到账数量 ≠ 理论计算数量的调整通道,以红股到账文件为准二次修正。直接按理论值入账的系统,每月都要手工修零碎股差异。
3. 联动字段同步。 除权批处理改的不是一个字段而是一组:持仓数量(加红股)、成本价(摊薄)、参考昨收(换参考价)、冻结中的在途数量(R 日买入未交收的部分同样享有权利,在途量也要乘比例)、两融账户的融券负债(欠券数量同比例增加,两融篇提过的"负债繁殖")。漏掉任何一处,次日对账就不平。这套联动清单是除权任务的核心资产,建议落成显式的任务编排而不是散落在各模块里各自消费公司行动文件。
现金红利的税务尾巴
现金红利不是发完就结束。差异化计税规则下,红利税在卖出时按持股期限补扣:持股 1 个月内卖出补扣 20%,1 个月至 1 年补扣 10%,超过 1 年免征。系统含义是:每批持仓都要记录取得时间(精确到每一笔红股/红利的来源批次),卖出时按先进先出匹配持股期限计算补扣税额。券商账户系统的持仓批次表(lot 表)有一大半就是为这个功能存在的——另一个用处是核算卖出成本。
为什么叫"入门"
这篇只覆盖了"红利、红股"这一支。公司行动还有配股(要客户掏钱行权,发行篇讲)、拆细与合并(港股常见,比例可以是任意小数)、要约收购、私有化退市等长尾场景,每种都有独立的资金/持仓变更模式。系统设计的正确姿势是把公司行动抽象成"权益登记 + 数量调整 + 价格调整 + 资金收付"四个原语的组合,新场景来了配参数而不是写新代码。等公司行动清算那篇(第四章第 12 条)会回到这个抽象,讲登记数据驱动的批量任务怎么编排。
回到开头的问题:持仓数量为什么会变?因为股权是活的——上市公司对它的每一次调整,都会通过登记文件穿透到每一个持有人的账上。客户看到的是"多了一股",系统做的是"一场覆盖全市场持有人的批量变更"。