halo 的技术博客

返回

股票在除息日开盘前,交易所会把参考价机械下调股息金额 D。如果价格真的跌满 D,持有过除息日就是零和游戏。但实证文献反复发现:开盘调整比例 α = (前收 − 除息日开盘) / D 系统性小于 1——价格跌掉的比股息少,留下一块看得见的缺口。

股息捕获(dividend capture)策略就是冲着这块缺口来的:登记日收盘买入,除息日开盘卖出,拿走股息,赌价格跌不满。

400 只股票、10 年、4000 个除息事件的模拟给出的答案分三句话:缺口是真的(α=0.866,t=-21.4,每事件 23.9bp);缴 20% 股息税的人吃不到(含税 -20.6bp,t=-20.0);免税的人也只能在 2000 万规模以下吃到

除息日价格路径与 α 分布

左图是 4000 个事件的平均路径:价格指数在除息日跳降约 1.9%,但全收益指数(加回股息)在同一天出现小幅上跳——这就是 α<1 的直观形态,跌掉的比发出来的少。右图是 α 的分布,均值 0.866,对”α=1 完全调整”的 t 检验为 -21.4

一、机制设定:缺口从哪来#

模拟里 α<1 不是随手设的,而是按 Elton–Gruber 税收客群假说的横截面结构写入的:股息率越高的票,越吸引低税率投资者持有,边际投资者税负越轻,α 越接近 1

# 股息率:对数正态,中位数约 2%
y = np.clip(rng.lognormal(np.log(0.02), 0.5, E), 0.004, 0.07)

# 税收客群效应:α 随股息率排名单调上移
y_rank = pd.Series(y).rank(pct=True).values
alpha = np.clip(0.78 + 0.18 * y_rank + 0.04 * rng.standard_normal(E), 0.55, 1.10)

# 捕获需求买盘:除息前 4 天推高 15% 股息金额,除息后反转 75%
runup = 0.15 * y
w_up = np.array([0.15, 0.25, 0.30, 0.30])   # 分配到 -4 ~ -1 日
w_dn = np.array([0.45, 0.30, 0.15, 0.10])   # 反转分配到 0 ~ +3 日
python

除息日开盘价严格按 P_cum × (1 − α×y) 加隔夜噪音生成,注入的真实 α 均值 0.871,事后用开盘价估出 0.866——估计器能还原参数,这是后面所有检验的前提。

二、主结果:同一个缺口,四种吃法,命运完全不同#

def strat_t0(tax=0.0, cost_bp=0.0):
    """经典捕获:登记日收盘买入,除息日开盘卖出"""
    return (open_ex - P_cum) / P_cum + (1 - tax) * y - 2 * cost_bp / 1e4

def strat_frontrun(cost_bp=0.0):
    """吃流不吃息:-5 日收盘买入,-1 日收盘卖出,不碰除息日"""
    return (P[:, 7] - P[:, 3]) / P[:, 3] - 2 * cost_bp / 1e4
python
进出场时点每事件毛收益t 值胜率
T0:登记日收盘买 → 除息日开盘卖(免税)+23.9bp24.764.1%
同上,缴 20% 股息税-20.6bp-20.037.7%
持有到除息日收盘卖(免税)+9.8bp3.452.7%
持有到 +3 日收盘(免税)-8.4bp-1.548.0%
前置吃流:-5 日买 → -1 日卖+39.8bp7.153.1%

三个观察:

第一,税是生死线。 免税 +23.9bp 和含税 -20.6bp 之间差的正好是 0.2×y ≈ 44.5bp 的股息税。缺口 y×(1−α) 平均只有 23.9bp,税要收走 44.5bp——缺口本来就是按边际投资者的税负定价的,你的税率高于边际投资者,这买卖对你就是负的。A 股持股一个月以内股息税 20%,捕获交易者恰好落在最高档。

第二,多持有一天都在漏钱。 从开盘卖换到收盘卖,收益从 23.9bp 掉到 9.8bp;持到 +3 日直接变 -8.4bp。原因是除息前的捕获买盘在除息后反转,持有越久吃的反转越多。

第三,收益最高的玩法根本不碰除息日。 前置吃流赚的是捕获资金自己推出来的 run-up(注入量 0.15×y ≈ 33bp,样本实现 39.8bp,差异在噪音范围内),没有股息税、没有除息日跳空风险。讽刺的是:对着股息缺口建模半天,最可交易的信号是”别人要来捕获”本身

三、三个对照:缺口是税收定价,不是引擎伪影#

安慰剂对照与客群效应识别

对照一:零税纯净市场。 把 α 强制生成在 1 附近、去掉买盘,重跑同一套估计:α 均值 1.006(t=0.94,接受完全调整),免税捕获 -0.76bp(t=-0.80)。没有税收摩擦时缺口消失,引擎不会自己造出捕获收益。

对照二:伪除息日安慰剂。 把 day -6(买盘开始前的普通日)假装成除息日,用同一个公式测:伪 α 均值 0.021,伪捕获 -0.30bp(t=-0.11)。缺口只出现在真实除息日,不是任何”隔夜价格惯性”之类的日历杂讯。

对照三:置换检验。 股息率与估计 α 的 Spearman 相关为 0.131;把 α 在事件间随机置换 1000 次,置换分布的 97.5 分位只有 0.031,p < 0.001。客群结构(高股息 → 高 α)是数据里真实存在的横截面关系,不是噪音。

四、横截面:股息率越高,含税捕获亏得越狠#

客群效应有个反直觉的推论。直觉上”高股息票缺口的绝对金额大,肉多”;实际上高股息票的 α 更接近 1,缺口占股息的比例更小,而股息税是按全额股息收的:

股息率分组组均股息率α免税捕获含 20% 税捕获
Q11.0%0.786+20.7bp+0.6bp
Q21.5%0.835+24.8bp-5.6bp
Q32.0%0.870+25.7bp-14.0bp
Q42.6%0.901+25.0bp-26.6bp
Q54.0%0.940+23.4bp-57.4bp

横截面分组与逐年稳定性

免税捕获在五个组里几乎是平的(20.7 ~ 25.7bp)——股息率翻四倍,缺口基本不变,因为 α 同步上移抵消了。但含税捕获从 Q1 的勉强打平一路恶化到 Q5 的 -57.4bp。散户最爱冲着”高股息大肉”去捕获,恰好选中了含税口径下最亏的那一组。

逐年看(免税、单边成本 10bp):10 年里 9 年为正,总体每事件 3.9bp(t=4.05),最差年份 -1.1bp。方向稳定,但薄得可怜。

五、bug 复盘:用收盘价测 α,缺口被吃掉 59%#

第一版代码里 α 的估计式写的是:

alpha_hat = (P_cum - P_close_ex) / D     # bug:用除息日收盘价
python

跑出来 α = 0.942,缺口只剩 9.8bp——结论差点写成”调整基本完全,捕获无肉可吃”。

问题在于除息日收盘价里混进了盘中的 run-up 反转:捕获买盘推高的 0.15×y 里有 75% 要在除息后吐回,其中 45% 落在除息日盘中。这段下跌跟股息调整毫无关系,但会被收盘价估计器算进”跌幅”,把 α 系统性推高约 0.75×0.45×0.15 ≈ 0.051 个单位。

alpha_open  = (P_cum - open_ex) / D    # 正确:0.866,缺口 23.9bp
alpha_close = (P_cum - P[:, 8]) / D    # bug:  0.942,缺口  9.8bp(低估 58.9%)
python

注意一个细节:bug 版缺口 9.8bp 恰好等于”持有到收盘卖”策略的收益。这不是巧合——用收盘价测 α,等价于假设你持仓到收盘,把盘中反转全吃进去。这类 bug 不报错、不产生 NaN、数值还在合理区间,唯一的破绽是它与”开盘卖”策略的实际 PnL 对不上。估计量和交易执行必须用同一个时点的价格,否则测出来的是另一个策略

六、成本与容量:免税也只有 12bp 的容错#

单边成本免税 T0含税 T0前置吃流
0bp+23.9bp-20.6bp+39.8bp
5bp+13.9bp-30.6bp+29.8bp
10bp+3.9bp-40.6bp+19.8bp
15bp-6.1bp-50.6bp+9.8bp
20bp-16.1bp-60.6bp-0.2bp
30bp-36.1bp-80.6bp-20.2bp

成本敏感性与容量墙

免税 T0 的单边盈亏平衡成本是 12.0bp,前置吃流是 19.9bp。含税 T0 没有盈亏平衡点——它在零成本时就是负的。

容量更残酷。除息事件在日历上高度聚集(模拟中 55% 的事件挤在 50 个交易日里,对应 A 股 6-7 月分红季),单事件持仓周期只有一夜,冲击成本按平方根律双边计:

策略规模年化净收益成交完成率冲击成本年换手
500 万+2.07%100%7.5bp32 倍
2000 万-0.31%100%14.9bp32 倍
5000 万-1.25%76.2%19.7bp24 倍
2 亿-0.50%27.8%21.3bp8.9 倍
10 亿-0.13%6.8%21.6bp2.2 倍

容量墙在 500 万到 2000 万之间——不是”亿”是”千万”。原因有两个:毛缺口只有 23.9bp,任何冲击都是致命的;而且策略要求在除息日开盘一次性卖出全部头寸,参与率约束下规模稍大就买不进、卖不出。年换手 32 倍意味着 23.9bp 的缺口要被 64 次单边执行反复碾压。即使做到 500 万规模的满配,年化也只有 2.07%——这个收益率配 32 倍换手,任何一个环节的执行滑坡都会把它变成负数

七、总结#

统计层面成立。 α=0.866(t=-21.4),缺口 23.9bp/事件,10 年里 9 年为正。除息日价格确实跌不满股息,这个现象本身非常稳健。

识别层面成立。 零税对照下 α 回到 1.006、捕获归零;伪除息日安慰剂归零(t=-0.11);股息率与 α 的客群关系通过置换检验(p<0.001)。缺口的大小和结构都指向同一个来源:它是边际投资者税负的市场定价,不是免费的钱

交易层面基本不成立。 含税捕获者从第一笔交易起就是负的(-20.6bp),且股息率越高亏得越多(Q5 组 -57.4bp);免税捕获者的盈亏平衡成本只有 12bp、容量不足 2000 万;持有超过开盘一刻的每一天都在吃 run-up 反转。整个结构里唯一有正期望且容错较高的,是提前潜伏、在登记日收盘前离场的”吃流不吃息”(39.8bp,t=7.1,盈亏平衡 19.9bp)——而它赚的不是股息缺口,是其他捕获者的冲击成本。

一句话回答标题:缺口存在,但它是税的影子。你的税率和成本低于边际投资者,才轮得到你吃;对绝大多数人,更现实的用法是反过来——分红季别去挤除息日前后那几天,那里的价格里含着别人的税单


局限与偏差#

这是结构模拟不是历史回测。 α 的水平(0.78~0.96)和客群斜率是按 Elton–Gruber 类文献的量级外生设定的,run-up 幅度(15% 股息金额)与反转比例(75%)同样是假设。模拟能回答”给定机制,能否交易”,不能回答”真实市场的 α 今天是多少”——后者需要逐笔的除息日开盘数据和分红明细。

税制被简化成单一税率。 现实中 A 股按持有期分档(≤1 月 20%、1 月~1 年 10%、>1 年免税)且红利税在卖出时补扣,机构、险资、沪深港通各有不同待遇。“持有满一个月再卖”的变体会把股息税降到 10%,但也把持仓期拉长到吃满整段 run-up 反转加一个月的市场风险,本文未建模这条路径。

冲击成本模型在分红季偏乐观。 平方根律系数取常态市场,而除息日前后本来就聚集着捕获资金和融券对手盘,真实冲击大概率高于估计。500 万~2000 万的容量应读作上界。

未建模融券与衍生品对冲。 现实中的机构捕获通常配合期货或个股期权对冲隔夜风险,对冲成本(基差、期权隐含波动率在除息日前的抬升)会进一步压缩缺口;期权做市商对股息的定价本身就接近完全调整,这条路的缺口比现货更薄。

股息捕获策略:除权日前后的价格调整能不能吃到
https://blog.halo26812.eu.org/blog/dividend-capture-strategy
Author halo
Published at 2026年7月31日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨