halo 的技术博客

返回

散户的「捡便宜幻觉」#

A股配股(Rights Issue)是上市公司向原股东按持股比例发售新股,发行价通常比现价低20%~40%。消息一出,不少散户的反应是:「配股价打七折,简直是送钱,参与!」

这个直觉有部分正确,但遗漏了一个关键事实:不参与配股的股东,财富被真实稀释了。

配股不是「给你一个打折买股票的机会」——它是一个零和的财富再分配:参与配股的股东拿现金换新增股份,除权后持股数量增加但每股价格下调,总市值不变;不参与的股东,持股数量不变但每股权益被摊薄,财富缩水。

这不是市场情绪,这是数学。


除权价的会计恒等式#

A股配股的除权公式是:

Pex=Pcum+kPsub1+kP_{ex} = \frac{P_{cum} + k \cdot P_{sub}}{1 + k}

其中 PcumP_{cum} 是股权登记日前收盘价(公告日收盘价),PsubP_{sub} 是配股价,kk 是配股比例(如10配3则 k=0.3k=0.3)。

这个公式来自加权平均:原股东原有1股、价值 PcumP_{cum},新认购 kk 股、每股 PsubP_{sub},合并后总价值不变、共有 1+k1+k 股,故每股价值为上式。

往返恒等式验证(浮点精度):

p_ann_check = (1.0 + k) * p_ex - k * p_sub  # 反推
err = (p_ann_check - p_ann).abs()
# 最大误差: 7.1e-15  < 1e-8 ✓
python

除权公式往返恒等式验证


不参与股东的损失率:不是折价率,不是配股比例#

直觉误区有两种:

  1. 误以为损失率 = 折价率:配股价打七折,损失30%
  2. 误以为损失率 = 配股比例:10配3,损失30%

两者都错。正确推导:

Pex=Pann+kPann(1d)1+k=Pann1+k(1d)1+kP_{ex} = \frac{P_{ann} + k \cdot P_{ann}(1-d)}{1+k} = P_{ann} \cdot \frac{1 + k(1-d)}{1+k}

损失率(不参与股东的财富缩水比例):

损失率=PannPexPann=kd1+k\text{损失率} = \frac{P_{ann} - P_{ex}}{P_{ann}} = \frac{k \cdot d}{1+k}

这是一个完全不同的量。当 k=0.3,d=0.3k=0.3, d=0.3 时:

损失率=0.3×0.31.3=6.9%\text{损失率} = \frac{0.3 \times 0.3}{1.3} = 6.9\%

不是30%,是6.9%。 差了近4倍。

不参与股东的损失率热力图

模拟数据中151次配股事件验证:

参数数值
配股比例 k=0.30k=0.30、折价率 d=0.30d=0.30 时真实损失率6.9%
配股比例 k=0.20k=0.20、折价率 d=0.40d=0.40 时真实损失率6.7%
配股比例 k=0.35k=0.35、折价率 d=0.40d=0.40 时真实损失率10.4%
所有事件平均损失率5.92%

模拟设计:12年、151次配股事件#

数据生成:

  • 300只股票,12年共3024个交易日
  • 真实价格收益:年化波动率28%,年化漂移4%,市值因子+个股特异性
  • 配股事件:每只股票每年约4.5%概率触发,共151次
  • 配股比例 k{0.15,0.20,0.25,0.30}k \in \{0.15, 0.20, 0.25, 0.30\},折价率 d[20%,40%]d \in [20\%, 40\%],均匀分布

核心检验:

# 除权价公式验证
p_ex = (p_ann + k * p_sub) / (1 + k)
p_ann_back = (1 + k) * p_ex - k * p_sub  # 往返恒等
# 误差 < 1e-8 ✓

# 损失率理论 vs 实际
theory_loss = k * d / (1 + k)
actual_loss = (p_ann - p_ex) / p_ann
# 误差 ~ 0 ✓(数值精度内)
python

公告日→登记日的价格漂移:可交易吗?#

理论上,配股公告后,价格应该逐步向除权价漂移——因为参与者知道除权后价格会机械下调。

如果漂移是可预测的,在公告日后做空,到登记日前平仓,理论上可以捕获这个跌幅。

模拟结果(151次事件):

指标数值
平均累计收益+1.79%
t值2.96(「显著」)
负收益占比45.7%

t值看起来「显著」,但这可能是个假象。

置换检验(200次打乱)揭露真相:

  • 真实漂移 t值 = 2.96
  • 置换分布均值 = 1.01,标准差 = 0.95
  • 95分位 = 2.61
  • 真实t超过95分位的占比 = 2.0%

真实漂移落在置换分布内,95分位(2.61)< 真实t(2.96),但超过比例仅2%,统计上不稳健。这说明:漂移主要由市场波动主导,无法可靠交易。

安慰剂对照(非随机日期):

  • 随机日期对照:t = 0.85(不显著)
  • 真实漂移 t = 2.96(看似显著但落入置换分布)

置换检验与安慰剂对照

结论:公告日→登记日的价格漂移不可交易。 真实漂移与随机日期的对照几乎相等(+1.79% vs +0.56%),差距来自随机波动。散户试图「提前做空等除权」的策略,在成本前基本是负期望。


Bug 复盘:把配股价当除权价#

这是配股计算中最常见的错误——不仅散户会犯,部分量化系统也踩过这个坑。

错误实现(Bug版):

# 错误:把配股价 P_sub 当成除权价
bug_loss = (p_ann - p_sub) / p_ann
# 结果:损失率 = 折价率 d = 30%(完全错误)
python

正确实现:

# 正确:配股价 + 原股东权益 → 加权平均
p_ex = (p_ann + k * p_sub) / (1 + k)
correct_loss = (p_ann - p_ex) / p_ann
# 结果:损失率 = k*d/(1+k) = 6.9%
python

数字对比(20次配股事件均值):

版本平均损失率
错误版本(误以配股价为除权价)29.86%
正确版本6.04%
错误版本高估程度+394%

错误版本的逻辑漏洞在于:混淆了「配股增发」和「股价暴跌」。配股价是新股认购价,除权价是加权平均后的每股权益,两者相差甚远(除权价远高于配股价)。

修复方法:严格使用标准公式 Pex=(Pann+kPsub)/(1+k)P_{ex} = (P_{ann} + k \cdot P_{sub})/(1+k),在任何涉及配股除权的计算中,不要单独使用 PsubP_{sub} 作为参考价格。


配股后长期表现:融资信号效应#

配股公告本身可能传递管理层信号:「我们认为当前股价高估了,可以以折扣价募资。」

模拟结果(139次有效长期事件):

期限配股组超额收益对照组超额收益差异
60日-1.00%(t=-1.04)
120日+0.10%(t=+0.08)
252日-0.93%(t=-0.47)+3.32%(t=+1.60)-4.24pct

配股后1年,配股组跑输市场3.32个百分点。这个差异在统计上不显著(t=-0.47),但在方向上一致:配股公司在长期表现偏弱。

按折价率分组:

  • 高折价组(d > 中位数31.2%):252日超额 -1.83%
  • 低折价组(d ≤ 中位数):252日超额 -0.04%
  • 差异:-1.79pct

折价越大,负超额越明显。这与「高折价=管理层认为估值偏高」的融资信号假说一致。

配股后长期表现与信号效应


结论:三个骨感事实#

1. 配股不是「打折买股票」,是不参与的隐形税 真实损失率 = k×d/(1+k)k \times d / (1+k),而非折价率 dd。折价越大、参与率越高的配股,对不参与者的伤害越大(且不参与者的损失恰好等于参与者的「额外筹码价值」)。

2. 试图靠做空漂移获利是负期望 公告日→登记日漂移的t值虽然「表面显著」,但落在置换分布之内,与随机日期对照组几乎无差别。扣除交易成本后,预期收益为负。

3. 配股后长期弱势信号存在,但统计上不稳健 高折价配股公司在未来1年表现偏弱约4个百分点,但t值不显著(t=-0.47)。如果这个效应真实存在,容量极小(每年A股配股事件仅百余次)且信息难以提前获取。


诚实边界#

  1. 模拟并非真实A股数据:价格序列由随机游走生成,真实A股配股公告前后存在显著的信息效应和机构行为,价格漂移模式可能更复杂。模拟中的151次事件分布是参数化的,不代表历史真实频率。

  2. 长期超额收益的统计功效不足:139个有效事件在252日窗口上自由度较低,t值不显著(t=-0.47),无法拒绝「效应为零」的零假设。真实市场中的融资信号效应需要更长历史和更多样本才能确认。

  3. 成本未完全建模:模拟未计入A股特有的印花税(卖出0.1%)、冲击成本、滑点。配股事件多发生在中小市值股票,流动性冲击成本可能进一步侵蚀任何表面上的漂移收益。

配股折价效应:稀释、除权与「必须参与」的隐形税
https://blog.halo26812.eu.org/blog/rights-issue-discount-effect
Author halo
Published at 2026年7月31日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨