隔夜收益异象:用收盘到开盘的跳变预测次日方向
股市有个反直觉的事实:几乎所有长期收益都发生在「隔夜」(昨收→今开),而「日内」(今开→今收)几乎不赚钱甚至略亏。Berkman-Jacobsen-Lee(2012)「Stocks Go Up by Night」和 Liu-Luo-Zhang(2019)把这件事坐实。本文用合成面板证明:①指数层面隔夜年化 +10.9% vs 日内 −1.4%;②隔夜跳变与同日日内收益横截面 rank-IC = −0.32(反转);③按隔夜跳变做十档,同日日内收益从 D1 +0.87% 单调滑到 D10 −0.86%(t≈341)。附完整 Python 与六类真实陷阱(中阶)。
你有没有想过一个问题:股市的钱,到底是在白天交易时段赚的,还是晚上闭市时赚的?
直觉告诉你当然是白天——毕竟价格跳动、成交、博弈都发生在 9:30 到 15:00。但一堆论文(Berkman, Jacobsen & Lee 2012 的 “Stocks Go Up by Night”;Liu, Luo & Zhang 2019)用美股数据给出反直觉结论:长期来看,几乎所有收益都发生在「隔夜」(close→open),而「日内」(open→close)几乎不赚钱,甚至略亏。
更妙的是,这个异象还能变成可交易的信号:某只股票今天隔夜跳得越凶(尤其向上),今天日内越倾向于反向——也就是「隔夜承载情绪/过度反应,日内被信息交易者纠正」。这篇文章把这件事从指数层面、横截面层面、可交易层面三层跑通,并附上完整 Python。
一、收益的两段:隔夜 vs 日内#
任意一天的对数收益都能干净拆成两段:
- 隔夜:收盘后到第二天开盘前。这段时间你无法交易,但信息(财报、宏观、海外)在累积,散户在「想了一晚上」后开盘挂单。实证上隔夜有正漂移 + 高波动——它是收益的发动机。
- 日内:开盘到收盘的真实博弈。对指数而言,这段的漂移≈0 甚至略负——信息在开盘就被部分price-in,剩下的是零和博弈。
我们用一个 20 年、252 交易日/年的合成指数把这件事演示出来:隔夜给正漂移 μ=0.00045、波动 σ=0.0065;日内给轻微负漂移 μ=−0.00010、波动 σ=0.0072。
import numpy as np
rng = np.random.default_rng(20260717)
YEARS, DAYS_Y, DAYS = 20, 252, 20 * 252
mu_on, sd_on = 0.00045, 0.0065 # 隔夜: 正漂移
mu_intra, sd_intra = -0.00010, 0.0072 # 日内: 略负漂移
ret_on = rng.normal(mu_on, sd_on, DAYS) # 隔夜收益序列
ret_intra= rng.normal(mu_intra, sd_intra, DAYS) # 日内收益序列
ret_tot = ret_on + ret_intra
eq_on = np.cumprod(1 + ret_on)
eq_intra = np.cumprod(1 + ret_intra)
eq_tot = np.cumprod(1 + ret_tot)
ann_on = eq_on[-1] ** (1/YEARS) - 1 # 隔夜年化
ann_intra = eq_intra[-1] ** (1/YEARS) - 1 # 日内年化
ann_tot = eq_tot[-1] ** (1/YEARS) - 1 # 总年化python跑出来:隔夜年化 +10.85%,日内年化 −1.39%,总年化 +9.32%。也就是说,如果把「隔夜」和「日内」分开投资,长期赚钱的几乎全是隔夜那段,日内那段在拖后腿。


二、为什么是隔夜?一个微观结构故事#
隔夜高波动 + 正漂移,背后是两类参与者的时间错配:
- 散户主导盘前/盘后情绪:收盘后散户有整晚消化新闻、在论坛讨论、开盘挂单,情绪化追涨杀跌集中在开盘跳空。这种跳空富含过度反应噪声。
- 信息交易者主导日内:机构、套利者、做市商在盘中用真实信息纠正定错的价格,把隔夜的过度反应往回拉。
所以隔夜像是「投票机」,日内像是「称重机」。这引出一个极关键的可交易推论:如果隔夜跳变主要是过度反应,那么——
隔夜跳得越狠(尤其向上),同日日内越可能反向(均值回归)。
三、横截面:隔夜跳变预测日内方向(rank-IC)#
我们把上面的机制搬到横截面面板:300 只股票 × 5040 交易日。每只股票有两个隐藏成分:
- S(散户情绪,放在隔夜):一阶自回归 ,取 ——负自相关,隔夜涨多了下个日内回吐,这是反转的来源。
- I(信息,放在日内):一阶自回归 ,取 ——强正自相关,信息缓慢释放、日内延续。
隔夜收益 = S + 噪声;日内收益 = I − 0.45·S + 噪声(反转项与 S 负相关)。
N, DAYS = 300, 20 * 252
phiS, phiI = -0.55, 0.85
sigS, sigI = 0.013, 0.009
innov_S = sigS * np.sqrt(1 - phiS**2)
innov_I = sigI * np.sqrt(1 - phiI**2)
S = np.zeros((N, DAYS)); I = np.zeros((N, DAYS))
S[:, 0] = rng.normal(0, sigS, N); I[:, 0] = rng.normal(0, sigI, N)
for d in range(1, DAYS):
S[:, d] = phiS * S[:, d-1] + rng.normal(0, innov_S, N)
I[:, d] = phiI * I[:, d-1] + rng.normal(0, innov_I, N)
ret_on = S + rng.normal(0, 0.008, (N, DAYS))
ret_intra = I - 0.45 * S + rng.normal(0, 0.010, (N, DAYS))
from scipy.stats import rankdata
def rank_ic(x, y):
return np.corrcoef(rankdata(x, axis=0).ravel(), rankdata(y, axis=0).ravel())[0, 1]
ic_same = rank_ic(ret_on, ret_intra) # 隔夜 -> 同日日内
ic_next = rank_ic(ret_on[:, :-1], ret_intra[:, 1:]) # 隔夜 -> 次日日内python结果:隔夜→同日日内 rank-IC = −0.324(显著为负 → 反转成立);隔夜→次日日内 rank-IC = +0.177(持续性弱于同日)。

注意那个 IC 符号的切换:反转在同一天最强(因为日内交易者当天就纠正),到次日就衰减甚至翻正(信息开始延续)。这给我们的实战约束是——淡看跳空最好是「当天开仓、当天平仓」的日内策略,而不是隔夜持有。
四、可交易检验:按隔夜跳变做十档#
最干净的可交易验证:每天按「隔夜跳变」做横截面十分位,统计各组同日日内收益均值。
- D1 = 隔夜最跌组,应该日内最强(被回补)
- D10 = 隔夜最涨组,应该日内最弱(被回吐)
n_dec, DAYS = 10, 20 * 252
dec_mean_intra = np.zeros(n_dec)
for k in range(n_dec):
vals = []
for d in range(DAYS):
order = np.argsort(ret_on[:, d]); ranks = np.empty(N); ranks[order] = np.arange(N)
dec = np.clip(ranks // (N // n_dec), 0, n_dec - 1)
vals.append(ret_intra[dec == k, d].mean())
dec_mean_intra[k] = np.mean(vals)
spread = dec_mean_intra[0] - dec_mean_intra[-1] # D1 - D10python跑出来非常漂亮:
- D1(隔夜最跌组)同日日内收益 +0.873%
- D10(隔夜最涨组)同日日内收益 −0.862%
- 二者差 +1.734%,t 统计 ≈ 341
- 10 组日内收益与隔夜排序的相关系数 = −0.988(严格单调下滑)

这就是「fade the gap / 淡看跳空」的截面证据:开盘已知昨收→今开跳变,按此排序,做多隔夜最跌组、做空最涨组,赚的是同日日内反转。信号与持仓同属一天、且信号在开盘即确定,严格无前视。
⚠️ 诚实声明:本文不画「fade-the-gap 净值曲线」。原因是——若把「每天按隔夜排序、当天收割日内反转」做成一个日频多空净值,合成设定下面会得到一个虚高的 Sharpe(日度成批平均把特异风险几乎全抹掉),那是合成作弊不是真策略。上面那张十分位柱状图才是诚实的呈现方式:它只证明「反转效应存在且单调」,不假装有可轻松实现的超高夏普。
五、为什么这事在 A 股要打折#
美股隔夜窗口夹着漫长的盘后+盘前,散户情绪集中释放,隔夜异象干净。但 A 股的「隔夜」是 15:00→次日 9:30 这一段——中间无法交易、且政策市/消息市特征更强。直接套「昨收→今开跳空」常出现:
- 跳空来自停牌复牌、重大事项、指数调仓,不是情绪过度反应;
- 做空受限,D10(隔夜最涨)那一侧你卖不出去,策略只能做多 D1 半边;
- T+1 下「当天开仓当天平仓」的日内反转在个股上根本无法实现。
所以 A 股更稳的玩法,是把「跳空幅度」当辅助过滤器:配合「今开相对昨收的强弱 + 日内量价确认」合成信号,而不是单独裸做跳空反转。
六、六类真实陷阱(实战必看)#
- 合成 Sharpe 虚高:本文所有数字都是合成设定下的结果,证明方向与机制成立,不证明实盘能赚这么多。第十章把 300 只股票同日平均掉,特异风险被大量对冲,t 才会到 341——实盘单标的绝不会有这数。
- 幸存者/流动性偏差:合成没有退市、没有冲击成本。实盘里「隔夜跳最猛」的常是小盘妖股,做空成本、冲击成本能把反转利润吃光甚至反亏。
- 做空约束:fade-the-gap 本质是买输家卖赢家,靠卖赢家赚钱。A 股融券难,纯多头只能做 D1 半边,收益砍半、且失去多空对冲的保护。
- 微观结构噪声:隔夜跳空里有大量「盘后大宗、指数调仓、除权除息」的纯噪声,不等于过度反应。要先剔除异常跳空(如 ±10% 以上的事件跳)再算信号。
- IC 时效性:反转在同日最强(IC −0.32),到次日就衰减翻正(+0.18)。所以策略窗口必须是「开盘定方向、日内了结」,隔夜持有会把效应吃掉。
- 中美结构不同:Berkman 等人的「隔夜赚钱、日内不赚」结论建立在美股 T+0、散户主导盘前情绪的市场上。直接套到 A 股政策市,常会失效——务必本地化重测。
七、小结:隔夜是投票机,日内是称重机#
把这篇文章和「短期反转因子」「时间序列动量」放在一起看,逻辑链就通了:
- 隔夜跳变 = 散户情绪的过度反应 → 同日日内均值回归(反转)
- 日内博弈 = 信息交易者的纠正 → 中期趋势延续(动量)
所谓「隔夜收益异象」,不是一个孤立的怪现象,而是市场微观结构里两类参与者时间错配的必然结果。它给你的实用洞见是:别把「今天的收益」当成一个整体。拆成隔夜和日内,你会发现——隔夜该反向看、日内该顺势看,把两段分开建模,比用一个模糊的「当日总收益」信号干净得多。
代码与图表均由自包含 Python(numpy/scipy/matplotlib)真实计算,随机种子固定为 20260717,可完整复现。所有统计数字(隔夜/日内年化、rank-IC、十分位日内收益与 t 统计)均来自文中脚本输出。合成 Sharpe 含成批平均带来的虚高,实战请以真实成本与做空约束重新估计。