财报是法律文本,不是真相。一家公司可以净利润大涨,却经营现金流为负——利润是会计政策”做”出来的,现金是实打实流进流出的。当两者严重背离,往往有人在修饰数字。这一篇我们用 Beneish M-Score 把这个”背离”量化成一个可机械计算的打假分。
结论先放这:Beneish(1999) 用 8 个相邻两年的财务比率,线性组合成一个分 M = −4.84 + 0.920·DSRI + 0.528·GMI + 0.404·AQI + 0.892·SGI + 0.115·DEPI − 0.172·SGAI + 4.679·TATA − 0.327·LVGI。M > −1.78 即高操纵嫌疑。核心是抓”利润与现金流背离”(TATA 权重最高 4.679)与”应收增速远超营收增速”(DSRI)。合成 220 健康+220 操纵公司里,健康中位 M=−2.42、操纵中位 M=−1.27,两组 AUC≈0.99,阈值把绝大多数操纵者切到了右侧。附完整 Python 与六类真实陷阱(高阶)。

一、为什么比率比科目更抗操纵#
直接看”利润”会被会计政策骗。但比率往往暴露结构矛盾:一家营收只涨 10% 的公司,如果应收账款涨了 80%,那 10% 的营收里有多少是真卖货、多少是放宽信用”塞货”给经销商?比率把这种”不该同步却同步、该同步却背离”的矛盾暴露出来。
Beneish 的洞见是:财务操纵会在特定的相邻两年比率上留下指纹——操纵者为了把利润做上去,必然伴随应收暴涨、毛利率异常、现金流跟不上、资产质量下降。把这些指纹写成 8 个比率,再加权合成一个分。
二、8 个比率:每张指纹对应什么操纵手法#
每个比率都是”今年 / 去年”的比值,>1 表示恶化(对操纵者是危险信号):
- DSRI 应收/营收比变动:应收增速远超营收增速 → 放宽信用塞货虚增收入。权重 0.920。
- GMI 毛利率指数:毛利率同比下降(>1 表示恶化)→ 真实盈利能力在掉,利润靠别处补。0.528。
- AQI 资产质量指数:无形资产/长期资产占比上升 → 把费用资本化藏进资产。0.404。
- SGI 营收增长率:营收异常暴涨(>1 且很高)→ 高速成长是操纵高发温床。0.892。
- DEPI 折旧指数:折旧率下降 → 延长折旧年限虚增当期利润。0.115。
- SGAI 销售/营收比变动:费用占比上升 → 收入质量差、靠烧钱冲规模。−0.172(费用恶化本应减分,负号体现”多花少赚”可疑)。
- TATA 总应计占比:(净利润−经营现金流)/总资产,越负越糟 → 利润与现金严重背离,最核心的红旗。权重 4.679,全场最高。
- LVGI 杠杆指数:杠杆上升 → 为撑利润加负债。−0.327。
COEF = dict(DSRI=0.920, GMI=0.528, AQI=0.404, SGI=0.892,
DEPI=0.115, SGAI=-0.172, TATA=4.679, LVGI=-0.327)
INTER = -4.84
THRESH = -1.78
def mscore(r):
"""r: dict, 含上述 8 个比率。返回 M-Score。"""
return INTER + sum(COEF[k] * r[k] for k in COEF)python注意 TATA 权重 4.679 是绝对主角:Beneish 认定”利润与现金流背离”是最硬的证据,一个强负的 TATA 几乎能单独把 M 推过阈值。这跟 Sloan 应计异象(本专栏另一篇)一脉相承。

三、合成数据:两组为什么分开#
用自洽合成的两组公司演示。健康组:稳健增长、应收与营收同步、现金流为正、折旧正常。操纵组:应收暴涨(DSRI 1.62.6)、毛利率恶化(GMI>1.1)、资产质量下降(AQI>1.2)、营收虚增(SGI 1.31.8)、现金流为负(TATA<0)、杠杆抬升(LVGI>1.2)。
结果两组干净分离:健康公司中位 M=−2.42(远低于阈值,安全区),操纵公司中位 M=−1.27(越过阈值,红旗区)。阈值 −1.78 正好切在两组交界——这就是 Beneish 当年用样本外数据标定出的分界。
import numpy as np
def gen_firm(manip=False, seed=0):
rng = np.random.default_rng(seed)
if not manip:
return dict(DSRI=rng.uniform(0.85,1.12), GMI=rng.uniform(0.95,1.05),
AQI=rng.uniform(0.92,1.06), SGI=rng.uniform(0.95,1.12),
DEPI=rng.uniform(0.92,1.08), SGAI=rng.uniform(0.90,1.10),
TATA=rng.uniform(-0.02,0.04), LVGI=rng.uniform(0.85,1.10))
return dict(DSRI=rng.uniform(1.60,2.60), GMI=rng.uniform(1.10,1.40),
AQI=rng.uniform(1.20,1.50), SGI=rng.uniform(1.30,1.80),
DEPI=rng.uniform(0.85,1.00), SGAI=rng.uniform(1.10,1.30),
TATA=rng.uniform(-0.12,-0.02), LVGI=rng.uniform(1.20,1.60))
firms_h = [gen_firm(False, s) for s in np.random.default_rng(1).integers(1,9999,220)]
firms_m = [gen_firm(True, s) for s in np.random.default_rng(2).integers(10000,19999,220)]
M_h = [mscore(f) for f in firms_h]
M_m = [mscore(f) for f in firms_m]python
四、系数贡献瀑布:谁把分推过线#
拿一家代表性操纵公司,看每个系数”推”了多少。DSRI(+0.92×高值)、TATA(4.679×强负值)、SGI(0.892×高值)是三大推力,累计把 M 从截距 −4.84 一路推到 −1.27,越过阈值。这张图说明:M-Score 不是黑盒,每个比率的贡献都可拆解、可审计——这正是它比神经网络可解释性强的工程优势。

五、六类真实陷阱(这才是重点)#
-
原始阈值 −1.78 来自 1999 年美国制造业样本:当年 Beneish 用 74 家操纵 + 配对健康公司标定。今天不同市场、不同行业、不同会计准则(IFRS vs 中国 CAS vs US GAAP)下的分布已漂移。直接套 −1.78 会把阈值”切歪”——应做样本内重新标定或至少分行业分市场设定阈值。
-
M > −1.78 是”嫌疑”不是”定罪”:高 M 只说明财务特征像操纵者,不代表真舞弊。高速成长的健康公司(DSRI、SGI 都高)也会被误判——这正是 ROC 里假阳性的来源。M-Score 是初筛警报,命中后要人工看附注、现金流、关联交易,不能据此直接做空。
-
比率依赖相邻两年可比数据:DSRI、SGI 等都是 t/t−1。若公司有并购、重组、会计准则变更、财年调整,分母基准被污染,比率会失真给出假红旗。用之前必须核对”两年口径是否可比”。
-
操纵者会 reverse-engineer:Beneish 是公开的,专业舞弊团队知道该压住哪几个比率(比如控制应收增速、平滑 TATA)。公开模型的对手会针对它优化——这跟因子被套利掏空是同一类问题。长期有效性必然衰减,需叠加其它红旗(如本福特定律、关联交易密度)。
-
TATA 权重最高也最易被”做平”:经营现金流可以靠推迟付款、加快收款临时美化,把 TATA 从强负调到接近 0。单一比率可被短期手段伪装,但 8 个同时伪装极难——M-Score 的稳健性来自多指纹交叉,别只看 TATA。
-
幸存者/披露偏差:模型训练与验证都基于”已被发现舞弊”的公司。大量未被发现的操纵者不在样本里,真实假阴性率被系统性低估——你看到的 AUC 是”已知操纵者 vs 健康者”的区分力,不是”全市场真实舞弊检出力”。
六、总结#
Beneish M-Score 把”财报打假”从审计师的定性直觉,变成 8 个比率、一把线性权重、一个阈值的可复现机械流程。它的威力在于:抓的是”利润与现金流背离”这个操纵的共性指纹,且每个比率贡献可拆解、可审计。合成数据里它能把健康与操纵两组以 AUC≈0.99 干净分开。
但务必记住:它是初筛警报不是定罪,阈值会随市场会计准则漂移,公开模型会被对手针对优化,真实假阴性率因披露偏差被低估。把它当成投资流程第一道过滤网——M 越界先亮红灯、再深入看附注与现金流,而不是据此直接下注。完整代码(8 比率生成、M-Score 计算、分布、瀑布、ROC)已给出,可直接替换成真实财报数据落地。