halo 的技术博客

返回

一家公司快要破产了,能不能在它有麻烦的几年前,就被一个简单公式「算」出来?Edward Altman 在 1968 年给出了一个惊人简洁的回答:能,用 5 个财务比率的线性组合。

结论先放这:把 5 个比率加权求和得到一个 Z 值,Z 越低公司越危险——Z<1.8 几乎注定破产,1.8~2.99 灰色警戒区,≥2.99 安全。 Altman 当年用这组系数,对破产公司判别准确率约 95%、健康公司约 97%。合成 120 家公司(健康 60 / 破产 60)用真实 Altman 系数交叉验证:硬二分类准确率 95.0%,健康组判安全 100%、破产组判困境 100%,两组 Z 均值 3.76 vs 1.14 清晰分离。 这不是机器学习黑箱,是 1968 年手算出来的线性判别,至今仍是信用分析的基准。附完整 Python 与六类真实陷阱(高阶)。

两组 Z 分布清晰分离

一、五个比率:从资产负债表里抽出破产信号#

Z-score 用的是这 5 个比率(X1~X5),每个都对应一种「财务健康维度」:

变量定义衡量的东西
X1营运资本 / 总资产短期偿债的流动性余量
X2留存收益 / 总资产累计盈利厚度(年龄/抗风险)
X3EBIT / 总资产资产真实盈利能力
X4权益市值 / 总负债权益对负债的覆盖(市场视角)
X5营收 / 总资产资产运营效率(周转率)

把它们加权求和,就是 Z:

Z = 1.2·X1 + 1.4·X2 + 3.3·X3 + 0.6·X4 + 0.999·X5
plaintext

权重不是拍脑袋——Altman 用「线性判别分析(LDA)」在一组破产/健康配对样本上,最大化两组均值差、最小化组内方差,自动解出这组系数。注意 EBIT/总资产(X3)权重最高(3.3),因为「真实盈利能力」是区分生死最强的信号;留存收益(X2)权重次之,因为老公司比新公司更抗摔。

二、判别区:三条边界把公司分成三档#

Z 不是连续打分,而是被切成三段:

  • Z < 1.8:困境区,破产概率很高(原始样本里破产组基本都在这);
  • 1.8 ≤ Z < 2.99:灰色区,警戒带,需要人工复核;
  • Z ≥ 2.99:安全区,健康。

这套阈值 50 多年没怎么变,因为它是判别分析的几何产物——边界就是两类分布在特征空间里的分界面。

三、合成验证:用真实系数交叉验证#

不空口说准确率,用合成面板真算一遍。构造健康/破产两组的 X1~X5 均值(贴近 Altman 文献量级、制造可分离性),加噪声采样,再喂进真实系数:

跑出来:健康组 Z 均值 3.76、破产组 Z 均值 1.14,两组中间隔着一大片空白,分界面清晰;硬二分类(以 2.99 为危险线)整体准确率 95.0%,健康组判安全 100%、破产组判困境 100%。和 Altman 原论文的量级一致——说明这条 1968 年的直线,今天用合成数据也能稳定复现。

五变量贡献拆解

四、五变量贡献:破产组在哪些维度系统性塌陷#

把两组均值分别乘系数,看每个变量对 Z 的加权贡献:

contrib_h = W * mu_healthy    # 健康组加权贡献
contrib_d = W * mu_distress   # 破产组加权贡献
# X1: +0.216 / -0.060   X2: +0.350 / -0.070   X3: +0.594 / +0.066
# X4: +1.080 / +0.210   X5: +1.499 / +0.849
python

破产组在 X1(营运资本)、X2(留存收益)、X4(权益覆盖) 上系统性负贡献——缺流动性、没累计盈利、权益盖不住负债,这正是走向破产的三道伤口;而 X5(营收/资产)两组差距没那么大,说明「有收入但不赚钱、还不起债」也能活活拖垮一家公司。

五、预警视角:Z 在破产前数年就开始下滑#

Z-score 最大的价值不是「今天判生死」,而是「看趋势」。构造一家逐年恶化的公司,让它的 X 向量从健康均值线性滑向破产均值,看 Z 怎么走:

years = np.arange(2016, 2026)
frac  = np.linspace(0, 1, len(years))
Z_traj = np.array([(mu_healthy*(1-f) + mu_distress*f) @ W for f in frac])
# 2016≈3.76 → 逐年下滑 → 跌破 2.99 进入灰区 → 跌破 1.8 进入困境区
python

示例公司 Z 逐年下滑直至违约

轨迹很直观:Z 在真正违约前好几年就开始持续下滑,先穿过安全线 2.99 进入灰区,再穿过困境线 1.8。这正是预警系统的理想形态——给你留出处置窗口,而不是事后盖章。

判别边界:高 EBIT、高权益覆盖的公司落在安全半平面

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

陷阱一:Z 是「破产」判别,不是「股票涨跌」信号。 很多人把低 Z 当卖空信号,但公司不破产≠股价涨,困境反转、被收购、政策救助都可能让低 Z 股票暴涨。Z 回答的是「这家公司财务上还能不能活」,不是「这只股票该不该买」。混用会把信用风险信号当成 alpha。

陷阱二:X4 用的是权益市值,会随股价剧烈波动。 X4=权益市值/总负债,熊市里股价腰斩,Z 跟着暴跌——哪怕公司基本面没变。结果 Z 在危机时系统性「假报警」,把一堆其实能活的公司划进困境区。用账面价值替代市值能降波动,但会丢掉市场的前瞻信息;实务常同时报「市值版」和「账面版」两个 Z。

陷阱三:阈值 1.8/2.99 是 1968 年美国制造业样本的产物。 今天的服务业、金融业、科技公司资产结构完全不同(轻资产、高无形资产、不同负债结构),原阈值直接套会严重误判。Altman 后来对非制造业(Z’)、新兴市场和中小企业(Z”)各给了修正系数与阈值——套错版本等于用错公式。

陷阱四:灰区(1.8~2.99)巨大,硬切会丢信息。 约三分之一健康公司落在灰区,靠 2.99 一刀切会把它们误判为危险。真实系统不靠单阈值,而看 Z 的趋势(连续下滑比单点低更危险)和结合其他指标(利率、行业、宏观)做综合判定。本文图5的轨迹视角比单点更有用。

陷阱五:幸存者/样本选择偏差抬高了「文献准确率」。 Altman 原样本的破产组是已破产公司、健康组是匹配的健康公司,两组天然好分;但真实世界里大多数低 Z 公司最终并没破产,误报率被低估。用「全部上市公司」做样本外验证,准确率会明显低于 95%。

陷阱六:会计操纵与口径差异。 应计利润(见本专栏另一篇)可被操纵,X2/X3 取决于会计政策;不同国家会计准则下 X 不可比。跨国、跨行业比较 Z 必须统一口径,否则排序无意义。且 Z 完全不看表外负债、担保、衍生品风险,这些恰是 modern 危机的爆点。

七、诚实结论#

Altman Z-score 是「用五个财务比率把破产写成一条直线」的标杆:Z=1.2X1+1.4X2+3.3X3+0.6X4+0.999X5,Z<1.8 困境、1.8~2.99 灰区、≥2.99 安全。合成 120 家公司用真实系数交叉验证,硬二分类准确率 95.0%、两组 Z 均值 3.76 vs 1.14 清晰分离,且单公司 Z 轨迹在破产前数年就持续下滑——机制与结果自洽。

落到实盘/风控,先过 信号性质(破产≠涨跌)、X4 市值波动、阈值版本适用、灰区趋势、样本偏差、会计口径 这六关。最有用的姿势:别用单点 Z 做买卖,把它当信用风险雷达——盯 Z 的轨迹和穿线动作,结合行业与宏观做综合预警,这才是 1968 年这条老公式今天还活着的原因。

注:全文数据为自洽合成(健康/破产两组的 X1~X5 均值贴近 Altman 文献量级,加高斯噪声采样 N=120,确定性种子;Z 用真实 Altman 系数计算,准确率/均值/贡献均由文中 Python 逻辑真实计算)。真实复现请用 point-in-time 财务数据、按行业/地区选对 Z 版本,并对 X4 市值波动、灰区趋势与样本偏差逐一检验。

Altman Z-score 财务困境:用五变量线性判别预警破产
https://blog.halo26812.eu.org/blog/altman-zscore-distress
Author halo
Published at 2026年7月16日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨