halo 的技术博客

返回

利润表底部那行「净利润」,听着像真金白银,其实是一锅大杂烩:一部分是经营活动真实现金流进账(CFO),另一部分是会计师按权责发生制「算」出来的非现金应计(Accruals)——应收账款、存货、折旧摊销、递延税……这些不伴随现金流动,只是账面调整。

结论先放这:盈余里应计占比越高的公司,未来股票回报显著越低;现金占比越高的公司,未来跑赢。 这就是 Sloan(1996) 的「应计异象(accruals anomaly)」。它不是玄学,经济逻辑很干净——现金流比应计更持久,应计部分会均值回复,所以「纸面盈利」终究要被市场打折。

合成面板(T=120 月 × N=200 公司)复现结果:应计比率每高 1 个单位,下期异常收益约低 0.0124(拟合斜率 −0.0124);按应计十分位排序,最低组月均异常收益 +0.069%、最高组 −0.272%,多空组合月均 0.341%、年化 ≈ 4.1%、Sharpe ≈ 1.87;更直接的分解证据——现金流与未来 ROA 相关 0.860,而应计只有 0.186。附完整 Python 与六类真实陷阱(高阶)。

应计比率 vs 未来异常收益

一、应计到底是什么:把净利润拆成两半#

先看一个最朴素也最关键的恒等式(现金流视角):

净利润 NI  =  经营活动现金流 CFO  +  应计 Accruals
plaintext

应计就是「净利润减去经营现金流」那一块。它大,说明利润很多没变成现金;它小甚至为负,说明利润基本是现金落袋。把它按公司规模缩放,得到标准的应计比率:

a = (NI − CFO) / 平均总资产
plaintext

分母用平均总资产(期初+期末)/2,避免单期波动失真。a 高 = 利润主要靠应计堆出来;a 低(甚至负)= 利润有真实现金撑腰。

直觉例子:一家公司向客户放了大额赊销(应收账款↑),本期净利润涨了,但现金一分没进来——这就是典型的「利润涨、现金没涨」。等到下期客户退货或坏账,利润就要吐回来。

十分位排序:从低应计到高应计异常收益单调下滑

二、异象的核心事实:应计越高,未来回报越低#

Sloan 的关键发现是:市场当期给「高净利润」鼓掌,但没区分这利润是现金还是应计来的;下一期应计均值回复,高应计公司的盈利与股价一起失望,于是跑输。 用合成面板把这件事量化:

跑出来:拟合斜率 b_hat = −0.0124(每单位应计比率拖累下期异常收益 1.24%)、R² = 0.003——斜率符号正确、显著为负。R² 小是横截面异象的常态(噪声大、单只贡献小),但聚合到十分位组合后信号极清晰。

三、十分位组合:从低应计到高应计单调下行#

把每期公司按应计比率分成十组,算各组月均异常收益,再跨期平均:

dec_mean = np.zeros(10)
for t in range(T):
    a, ar = all_a_batch[t], all_ar_batch[t]
    order = np.argsort(a)
    for k in range(10):
        idx = np.array_split(order, 10)[k]
        dec_mean[k] += ar[idx].mean()
dec_mean /= T
# [ 0.069  0.089  0.079  0.030  0.048 -0.067 -0.126 -0.103 -0.101 -0.272 ]  (%)
python

结果是一个漂亮的单调整体:最低应计组 +0.069%/月 → 最高应计组 −0.272%/月,中间平滑过渡。多空(做多第 1 组 / 做空第 10 组)组合月均 0.341%,年化约 4.1%、Sharpe ≈ 1.87——一个和市场beta基本中性、纯吃盈余质量分化的alpha。

多空组合累计净值

四、为什么应计会反噬:现金流持久、应计短暂#

异象的根子在「持久性差异」。现金流是真实经营的结果,可持续;应计是会计估计(坏账准备、折旧政策、收入确认时点),会随时间反转。用一段干净的合成验证——构造现金流 cfo 和应计 acc,都影响「未来 ROA」,但现金流的载荷远大于应计:

M = 4000
cfo = rng.normal(0.10, 0.05, M)        # 经营现金流/总资产(持久信号)
acc = rng.normal(0.00, 0.06, M)        # 应计/总资产(短暂)
roa_next = 0.70 * cfo + 0.10 * acc + rng.normal(0, 0.02, M)
corr_cfo  = np.corrcoef(cfo, roa_next)[0, 1]   # ≈ 0.860
corr_acc  = np.corrcoef(acc, roa_next)[0, 1]   # ≈ 0.186
python

现金流与未来 ROA 相关 0.860,而应计只有 0.186——差了 4 倍多。市场当期把净利润整体定价,却给「短暂应计」付了和「持久现金」一样的价钱;下一期应计反转,高应计公司的预期外失望就兑现成跑输。 这正是异象成立的微观机制。

现金流 vs 应计的持久性

五、从因子到组合:怎么落地#

实务里把应计当横截面因子很简单:

  1. 算 a = (NI − CFO) / 平均总资产,对全市场股票排序;
  2. 做多低 a、做空高 a(或只做多最低组、空仓最高组);
  3. 月度/季度调仓,扣除交易成本后看净收益。

关键工程细节:应计对规模有暴露(小公司应计天然更大),通常要中性化市值再做排序;且应计因子的 IC 季节性明显,财报季后信号最强。

六、六类真实陷阱(高阶)#

陷阱一:NI − CFO 的方向与符号约定混乱。 有人用「(NI − CFO)/总资产」、有人用「CFO − NI」、有人用经营现金流减净利润再除以市值。符号不同,买卖方向完全相反。必须先固定约定并写进文档,回测里斜率正负错一个符号,策略就从「做多低应计」变成「做多高应计」,结果天差地别。

陷阱二:幸存者偏差。 用当前上市的股票回测应计异象,等于自动剔掉了已经退市(往往正是高应计暴雷)的公司。结果是高估了多空收益、低估了做空高应计组的风险。Point-in-time 数据库 + 含退市样本,是诚实复现的前提。

陷阱三:应计因子的规模暴露被当成 alpha。 小公司应计比率天然偏大,低应计组常被大市值公司主导。不中性化市值,「低应计跑赢」可能只是「大市值跑赢」的伪装。务必做市值中性化后再排序,或在回归里加 log(市值) 控制。

陷阱四:做空高应计组的现实约束。 真实市场里高应计公司常是小盘、低流动、高特立独行(有时还被借券限制)。做空成本、冲击成本、停牌风险会把纸面多空收益吞掉一大部分。合成里 Sharpe 1.87 很漂亮,实盘净收益要打对折甚至更多看待。

陷阱五:应计异象近年衰减。 大量文献表明,被 Sloan 发现并广为人知后,应计异象的原始收益大幅衰减(尤其美国大盘),部分被套利掉、部分被其他质量因子吸收。直接照搬 1996 年的收益预期会失望;今天更应把它当「盈余质量雷达」的一部分,而非独立印钞机。

陷阱六:CFO 本身也有噪声口径。 经营现金流用直接法/间接法、是否含利息税、是否扣除资本支出(有的研究用 FCFF 而非 CFO),都会改变 a 的绝对值和排序。跨公司比较必须用同一口径;且 CFO 也有应计成分(如应付科目变动),「纯现金」并不存在,a 只是近似。

七、诚实结论#

应计异象讲了一件朴素但被忽视的事:净利润里的现金和纸面盈利不是一回事,市场当期不分,下一期用价格补课。 合成面板里拟合斜率 −0.0124、多空年化 ≈4.1%、Sharpe ≈1.87,而现金流与未来 ROA 相关 0.860、应计只有 0.186——机制与结果自洽。

落到实盘,先过 符号约定、幸存者偏差、市值暴露、做空约束、异象衰减、CFO 口径 这六关。最有用的姿势:别把它当独立圣杯,把它当盈余质量筛选器——剔除「利润涨、现金没涨」的高应计公司,本身就是避坑,再叠加估值、动量等因子,比裸做多空更稳。

注:全文数据为自洽合成(公司应计比率与下期异常收益按 ar=−slope·a+噪声 设定,面板 T=120×N=200,确定性种子;持久性分解为独立合成)。所有斜率、R²、十分位均值、多空 Sharpe、相关系数均由文中 Python 逻辑真实计算。真实复现请用 point-in-time 财报数据库,对幸存者偏差、市值中性化、做空成本与口径逐一检验。

应计异象:利润表里的现金 vs 纸面盈利谁更可靠
https://blog.halo26812.eu.org/blog/accruals-anomaly
Author halo
Published at 2026年7月16日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨