📘 Day 15 · 建模与量化决策
📖 本章学习目标:掌握回归分析、ANOVA、因素分析、聚类分析、决策树和蒙特卡洛模拟——学完能用这些模型从数据中提取洞察并做出量化决策。
Day 15: 建模与量化决策 — 从数据到决策的完整链条
核心问题: 手上有数据,怎么建立模型?模型建好了,怎么用它做出比直觉更好的商业决策?
前置条件: Day 14 的 p 值、置信区间、概率分布是今天所有内容的基础。如果你还不太确定 p 值到底是什么——先回去看 Day 14 第四节。
今天的目标: 学完之后,你面对任何一个"数据 + 决策"的商业问题,知道该用什么模型、怎么跑、怎么解读结果、怎么向非技术人员解释。
Day 14 vs Day 15 的区别: Day 14 教你"从样本推断总体"(这个差异是真实的还是噪音?);Day 15 教你"用数据建立预测和做选择"(给定多个可能方案,选哪个?)。前者是判断,后者是决策。
第一节:回归分析深入 — 商业中最被滥用的工具,也是最强大的工具
回归分析是投行和咨询面试中最常被问到的量化工具。你不仅要会说"我做过回归",还要能解释 R² 到底什么意思、p 值为什么可能骗你、以及为什么加了更多变量 R² 一定不会降。
1.1 简单线性回归 — 手动计算斜率和截距
回归的本质:找到一条直线 Ŷ = β₀ + β₁X,使得所有数据点到这条直线的垂直距离平方和最小。这就是普通最小二乘法(OLS)。
场景: 一家零售品牌过去 5 个季度的广告支出与销售收入:
| 季度 | 广告支出 X (百万) | 销售收入 Y (百万) |
|---|---|---|
| Q1 | 2 | 12 |
| Q2 | 3 | 15 |
| Q3 | 5 | 20 |
| Q4 | 4 | 17 |
| Q5 | 6 | 22 |
第一步:计算均值。
X̄ = (2 + 3 + 5 + 4 + 6) ÷ 5 = 20 ÷ 5 = 4.0
Ȳ = (12 + 15 + 20 + 17 + 22) ÷ 5 = 86 ÷ 5 = 17.2
第二步:构建完整计算表格。
| 季度 | X | Y | X - X̄ | Y - Ȳ | (X - X̄)(Y - Ȳ) | (X - X̄)² |
|---|---|---|---|---|---|---|
| Q1 | 2 | 12 | -2.0 | -5.2 | 10.4 | 4.0 |
| Q2 | 3 | 15 | -1.0 | -2.2 | 2.2 | 1.0 |
| Q3 | 5 | 20 | +1.0 | +2.8 | 2.8 | 1.0 |
| Q4 | 4 | 17 | 0.0 | -0.2 | 0.0 | 0.0 |
| Q5 | 6 | 22 | +2.0 | +4.8 | 9.6 | 4.0 |
| 合计 | 20 | 86 | 0 | 0 | 25.0 | 10.0 |
验证:X - X̄ 的和必须为零(-2 -1 +1 +0 +2 = 0 ✓),Y - Ȳ 的和也应为零(-5.2 -2.2 +2.8 -0.2 +4.8 = 0 ✓)。
第三步:计算斜率 β₁。
β₁ = Σ(X - X̄)(Y - Ȳ) ÷ Σ(X - X̄)² = 25.0 ÷ 10.0 = 2.5
第四步:计算截距 β₀。
β₀ = Ȳ - β₁ × X̄ = 17.2 - 2.5 × 4.0 = 17.2 - 10.0 = 7.2
第五步:写出回归方程。
Ŷ = 7.2 + 2.5X
第六步:解读回归系数。
β₁ = 2.5 的含义:每增加 100 万广告支出,销售收入平均增加 250 万。
β₀ = 7.2 的含义:即使广告支出为零,基础销售收入约为 720 万。(但要注意:X=0 不在我们的数据范围内,β₀ 是外推值,不一定可信。)
这个 β₁ 就是边际效应(marginal effect),也是面试中你要脱口而出的词。
思考: 为什么用"平均"二字?因为回归给出的是条件期望 E(Y|X),不是确定性的 Y。X=5 时,Ŷ=7.2+2.5×5=19.7,但实际 Q3 的 Y=20——差的那 0.3 就是残差(residual),我们马上会用到。
1.2 R² — "模型解释了多少变异"
R² 是回归输出的"明星指标",也是最容易被误解的指标。它的精确定义:Y 的总变异中,有多少比例能被 X 的变异解释。
继续上面的例子。先计算每个 X 对应的预测值 Ŷ:
Q1: Ŷ = 7.2 + 2.5×2 = 12.2 Q2: Ŷ = 7.2 + 2.5×3 = 14.7 Q3: Ŷ = 7.2 + 2.5×5 = 19.7 Q4: Ŷ = 7.2 + 2.5×4 = 17.2 Q5: Ŷ = 7.2 + 2.5×6 = 22.2
第一步:计算总平方和 SS_total(Total Sum of Squares)——Y 自身的总变异。
SS_total = Σ(Y - Ȳ)² = (12-17.2)² + (15-17.2)² + (20-17.2)² + (17-17.2)² + (22-17.2)²
= (-5.2)² + (-2.2)² + (2.8)² + (-0.2)² + (4.8)²
= 27.04 + 4.84 + 7.84 + 0.04 + 23.04 = 62.80
第二步:计算残差平方和 SS_residual ——模型没有解释掉的变异。
SS_residual = Σ(Y - Ŷ)² = (12-12.2)² + (15-14.7)² + (20-19.7)² + (17-17.2)² + (22-22.2)²
= (-0.2)² + (0.3)² + (0.3)² + (-0.2)² + (-0.2)²
= 0.04 + 0.09 + 0.09 + 0.04 + 0.04 = 0.30
第三步:计算回归平方和 SS_regression ——模型解释掉的变异。
SS_regression = SS_total - SS_residual = 62.80 - 0.30 = 62.50
第四步:计算 R²。
R² = SS_regression ÷ SS_total = 62.50 ÷ 62.80 = 0.9952
解读:广告支出解释了销售收入 99.5% 的变异。
重要提醒: 这个 R² 异常高(接近 1.0),因为这是一个仅 5 个数据点的教学示例。在实际商业数据中,R² 通常在 0.3-0.7 之间。R² 高不代表模型好——如果你加了 50 个自变量,R² 几乎肯定会变高(哪怕这些变量纯粹是噪音),但你的模型可能严重过拟合。
面试中常见的 R² 陷阱问题:
问:"我往回归里多加了 5 个变量,R² 从 0.45 变成了 0.48,模型变好了吗?"
答:不一定。R² 永远不会因为增加变量而下降。应该看调整 R²(Adjusted R²),它会对新增变量的个数进行惩罚。公式:
Adjusted R² = 1 - [(1 - R²)(n - 1) ÷ (n - k - 1)]
其中 n=样本量,k=自变量个数。如果新增变量没有带来足够的解释力提升,Adjusted R² 会下降。
1.3 回归系数的显著性检验 — "β₁ = 2.5 是真实的广告效果,还是随机噪音?"
这是我们 Day 14 学过的假设检验在回归中的直接应用。零假设 H₀: β₁ = 0(广告对销售没有影响)。备择假设 H₁: β₁ ≠ 0。
第一步:计算残差的均方 MS_residual。
MS_residual = SS_residual ÷ (n - 2) = 0.30 ÷ 3 = 0.10
为什么分母是 n-2?因为我们估计了 2 个参数(β₀ 和 β₁),损失了 2 个自由度。
第二步:计算 β₁ 的标准误 SE(β₁)。
SE(β₁) = √[MS_residual ÷ Σ(X - X̄)²] = √(0.10 ÷ 10.0) = √0.01 = 0.10
直观理解:SE(β₁) 衡量的是"如果我们重复抽取样本 100 次,每次算出的 β₁ 会波动多少"。X 的变异越大(Σ(X-X̄)² 越大),SE 越小——这意味着你的估计更精确。
第三步:计算 t 统计量。
t = β₁ ÷ SE(β₁) = 2.5 ÷ 0.10 = 25.0
自由度 df = n - 2 = 3
第四步:计算 p 值和置信区间。
查 t 分布表:t₃, ₀.₀₂₅ = 3.182(双侧,α = 0.05 时每侧 2.5%)
25.0 >> 3.182,所以 p << 0.001(极其显著)。
95% 置信区间:β₁ ± t₀.₀₂₅,₃ × SE(β₁) = 2.5 ± 3.182 × 0.10 = 2.5 ± 0.318 = [2.182, 2.818]
解读:我们有 95% 的把握认为,每增加 100 万广告支出,销售收入的实际增加在 218 万到 282 万之间。
因为整个 CI 都在 0 以上(且 p < 0.001),我们拒绝 H₀:广告支出对销售收入有统计显著的正向影响。
Day 14 的连接: 这个 t 检验的逻辑和 Day 14 第四节的双样本 t 检验完全一样——都是"信号 ÷ 噪音"(估计值 ÷ 标准误),只是这里"信号"变成了回归系数而不是均值差。
1.4 残差分析 — "模型在哪些地方犯了错"
回归给了一个单一的 β₁ 和 R²,但这不代表模型在每个数据点上都同样准确。残差分析帮你诊断四个关键问题:
残差 = Y - Ŷ = 实际值 - 预测值
| 季度 | X | 实际 Y | 预测 Ŷ | 残差 e |
|---|---|---|---|---|
| Q1 | 2 | 12 | 12.2 | -0.2 |
| Q2 | 3 | 15 | 14.7 | +0.3 |
| Q3 | 5 | 20 | 19.7 | +0.3 |
| Q4 | 4 | 17 | 17.2 | -0.2 |
| Q5 | 6 | 22 | 22.2 | -0.2 |
你应该检查的四件事:
1. 线性性(Linearity): 画残差 vs 预测值图。如果残差呈现 U 形或倒 U 形分布,说明 X 和 Y 的关系不是线性的——你可能需要加 X² 项,或者对 Y 取对数。
2. 同方差性(Homoscedasticity): 残差的散布应该在所有预测值水平上大致相同。如果残差图呈"喇叭形"(预测值越大,残差波动越大),说明存在异方差性(heteroscedasticity)。这会使得 SE(β₁) 的估计不准确,进而导致 p 值不可靠。
3. 独立性(Independence): 对于时间序列数据(如季度销售),残差不应有自相关。如果 Q1 的残差是负的,Q2 也是负的,Q3 也是负的——说明模型系统性地在某个阶段高估了。用 Durbin-Watson 统计量检测。
4. 正态性(Normality): 残差应大致服从正态分布(尤其是小样本时)。画 Q-Q 图:如果点大致落在 45° 线上,残差正态;如果尾巴偏离,说明有异常值或偏态。
为什么这些检查重要: 如果残差有明显的模式,那么你的标准误、p 值、置信区间都可能不准确。面试官问"你建完模型之后做什么",正确答案不是"报告结果",而是"检查残差"。
1.5 多元线性回归 — 当不止一个因素在影响结果
简单回归只控制了一个变量。现实商业中,销售收入受多种因素影响。多元回归的核心价值:在控制其他变量不变的情况下,分离出每个变量的"纯净"效应。
场景扩展: 我们的零售品牌发现,销售收入可能还受"销售人员数量"的影响。在原数据中增加一列:
| 季度 | 广告支出 X₁ (百万) | 销售人数 X₂ (人) | 销售收入 Y (百万) |
|---|---|---|---|
| Q1 | 2 | 3 | 12 |
| Q2 | 3 | 4 | 15 |
| Q3 | 5 | 5 | 20 |
| Q4 | 4 | 4 | 17 |
| Q5 | 6 | 6 | 22 |
多元回归的手动计算需要矩阵代数(β = (X'X)⁻¹X'Y),对于 3 个参数那就涉及 3×3 矩阵求逆——手算过于复杂。我们直接看软件输出式的结果:
多元回归结果:
Ŷ = 6.0 + 1.2 × X₁ + 1.8 × X₂
R² = 0.98,Adjusted R² = 0.96
β₁ 的 p 值 = 0.03(显著),β₂ 的 p 值 = 0.01(显著)
关键解读——这是多元回归最核心的洞见:
- 在简单回归中,β₁_ad = 2.5(每增加 100 万广告,销售增加 250 万)
- 在多元回归中,β₁_ad = 1.2(在控制销售人员数量不变的情况下,每增加 100 万广告,销售增加 120 万)
为什么从 2.5 降到了 1.2? 因为在简单回归中,β₁ = 2.5 实际上"偷走"了销售人员的部分贡献。广告支出高的季度,通常销售人员也多(相关性 r ≈ 0.89)——简单回归把本该归功于销售人员的销售增长也算在了广告头上。这种偏误叫做遗漏变量偏误(Omitted Variable Bias)。
β₂ = 1.8 的含义:在控制广告支出不变的情况下,每多 1 名销售人员,销售收入增加 180 万。
这就是为什么我们要做多元回归:不是为了把 R² 堆高,而是为了更准确地估计每个变量的因果效应。
1.6 多重共线性 — "解释变量之间纠缠不清"
多元回归的一个核心假设:自变量之间不能高度相关。如果两个解释变量几乎在说同一件事,模型就无法区分它们各自的影响。
衡量工具:VIF(Variance Inflation Factor,方差膨胀因子)
VIFⱼ = 1 ÷ (1 - R²ⱼ)
其中 R²ⱼ 是:把 Xⱼ 作为因变量,对其他所有 X 做回归得到的 R²。
计算示例:
在我们的数据中,广告支出 X₁ 和销售人员 X₂ 的相关系数 r = 0.89。
这意味着 R²₁₂ ≈ 0.89² = 0.79(将 X₁ 对 X₂ 回归的 R²)
VIF_广告 = 1 ÷ (1 - 0.79) = 1 ÷ 0.21 = 4.76
同理,VIF_销售人数 ≈ 4.76
判断标准:
VIF 范围 严重程度 行动 1 完全不相关 理想状态(很少见) 1-5 中等相关 通常可接受 5-10 高相关 需要关注,SE 被膨胀 2-3 倍 >10 严重共线性 必须处理
我们的 VIF ≈ 4.76,处于"可接受但偏高"的临界值。
多重共线性的后果(非常重要):
- β 的估计值仍然是无偏的(期望值等于真实值)
- 但标准误被放大(这就是"方差膨胀"的含义)
- 导致 t 值变小,p 值变大——你可能错误地认为某个变量"不显著",事实上它只是标准误被吹大了
- β 的估计对数据的微小变化极其敏感——加一个数据点,系数可能大幅跳动
补救措施:
- 删除一个高度相关的变量(最简单,但丢信息)
- 将相关变量合并为复合指标(如将"广告"和"销售人数"合并为"市场投入强度")
- 使用岭回归(Ridge Regression)或 LASSO(在模型中加惩罚项,自动压缩系数)
- 增加样本量(更多数据 → 更多独立变异 → 更容易区分各变量的贡献)
1.7 逻辑回归 — 当 Y 不是数字而是"是/否"
至此我们一直在处理连续的 Y(销售收入可以是 12.5,可以是 20.3)。但商业中大量问题只有两个答案:客户流失了吗?(是/否),贷款违约了吗?(是/否),并购成功了吗?(是/否)。
为什么不能直接用线性回归?
假设 Y=1 表示违约,Y=0 表示不违约。用线性回归 Ŷ = β₀ + β₁X,当 X 很大或很小时,Ŷ 可能小于 0 或大于 1——概率不能在这个范围之外。
解决方案:逻辑函数(Logistic Function)
P(Y = 1) = 1 ÷ (1 + e^-(β₀ + β₁X))
这个函数的值域为 (0, 1),完美对应概率的范围。形状是 S 形曲线。
关键概念:胜率(Odds)和胜率比(Odds Ratio)
胜率 = P ÷ (1 - P)。如果违约概率是 0.2,胜率 = 0.2 ÷ 0.8 = 0.25("违约的胜率是 1:4")。
在逻辑回归中,e^β₁ = 胜率比 = "X 每增加 1 单位,胜率乘以多少"。
完整工作示例:用信用评分预测贷款违约
场景:银行有 200 个历史贷款申请人的数据。用信用评分(范围 300-850)预测是否违约(Yes=1, No=0)。
逻辑回归输出:
log(P/(1-P)) = 5.2 - 0.008 × credit_score
即 β₀ = 5.2,β₁ = -0.008
解读 β₁:
e^β₁ = e^(-0.008) = 0.9920
信用评分每提高 1 分,违约胜率乘以 0.992——也就是说,违约胜率下降约 0.8%。
如果信用评分提高 50 分: 胜率比 = (e^(-0.008))^50 = e^(-0.008 × 50) = e^(-0.40) = 0.6703
评分提高 50 分,违约胜率降低约 33%。
具体预测示例:
一个信用评分为 650 的申请人:
log(P/(1-P)) = 5.2 - 0.008 × 650 = 5.2 - 5.2 = 0
P/(1-P) = e⁰ = 1 → P = 0.5(违约概率 50%)
一个信用评分为 700 的申请人:
log(P/(1-P)) = 5.2 - 0.008 × 700 = 5.2 - 5.6 = -0.4
P/(1-P) = e^(-0.4) = 0.6703
P = 0.6703 ÷ (1 + 0.6703) = 0.6703 ÷ 1.6703 = 0.401
违约概率从 50%(650 分)降到 40%(700 分)。
面试要点: 线性回归给的是边际效应(每单位 X 变动带来的 Y 变动量,是常数),逻辑回归给的是胜率比(每单位 X 变动带来的胜率倍数变动,是乘数)。两者不能混用。
第二节:ANOVA — 不止两组,怎么同时比较
Day 14 我们学了 t 检验来比较两组均值。但如果有三组、五组、十组呢?做两两 t 检验?问题在于:每多做一次检验,犯第一类错误的概率就累积——10 组两两比较要做 45 次 t 检验,即使 H₀ 全为真,至少有 1 次"显著"的概率接近 90%。ANOVA(方差分析)一次性检验"所有组均值是否相等",把整体错误率控制在 α。
2.1 单因素 ANOVA — 完整手动计算
场景: 测试三种广告策略的效果。每种策略在 5 个城市试点,记录销售增长百分比:
| 策略 A(短视频) | 策略 B(搜索广告) | 策略 C(KOL 种草) | |
|---|---|---|---|
| 12 | 15 | 20 | |
| 14 | 17 | 22 | |
| 11 | 16 | 19 | |
| 15 | 18 | 23 | |
| 13 | 14 | 21 | |
| nⱼ | 5 | 5 | 5 |
| x̄ⱼ | 13.0 | 16.0 | 21.0 |
| sⱼ² | 2.5 | 2.5 | 2.5 |
第一步:计算总均值(Grand Mean)。
x̄ = (13.0 × 5 + 16.0 × 5 + 21.0 × 5) ÷ 15 = (65 + 80 + 105) ÷ 15 = 250 ÷ 15 = 16.667
第二步:计算组间平方和 SSB(Sum of Squares Between)。
SSB = 5 × (13.0 - 16.667)² + 5 × (16.0 - 16.667)² + 5 × (21.0 - 16.667)²
= 5 × (-3.667)² + 5 × (-0.667)² + 5 × (4.333)²
= 5 × 13.444 + 5 × 0.445 + 5 × 18.778
= 67.22 + 2.22 + 93.89 = 163.33
SSB 衡量的是各组均值与总均值之间的差异。SSB 大 → 各组之间差异大。
第三步:计算组内平方和 SSW(Sum of Squares Within)。
关键公式:对于第 j 组,Σ(X - x̄ⱼ)² = (nⱼ - 1) × sⱼ²
SSW = (5-1) × 2.5 + (5-1) × 2.5 + (5-1) × 2.5 = 10 + 10 + 10 = 30.0
SSW 衡量的是各组内部的随机波动(不受策略影响的纯噪音)。
第四步:计算自由度。
df_between = k - 1 = 3 - 1 = 2
df_within = N - k = 15 - 3 = 12
第五步:计算均方(Mean Square)。
MSB = SSB ÷ df_between = 163.33 ÷ 2 = 81.67
MSW = SSW ÷ df_within = 30.0 ÷ 12 = 2.50
MSW = 2.50 也是各组的共同方差估计(因为我们假设了方差齐性,且三组的 s² 恰好相同)。
第六步:计算 F 统计量。
F = MSB ÷ MSW = 81.67 ÷ 2.50 = 32.67
F 统计量的直观理解:组间变异是组内变异的多少倍。 如果各组均值真的完全相等,F 应该接近 1。F 越大,越不可能"各组均值相等"。
第七步:查 F 分布表并做决策。
查 F(2, 12) 在 α = 0.05 的临界值:3.89
32.67 >> 3.89 → 拒绝 H₀
结论:三种广告策略的销售增长均值不全相等。至少有一种策略的效果显著不同。
Day 14 的连接: t 检验的 t² 等于 F(1, df)。ANOVA 是 t 检验从两组到多组的推广。
2.2 事后检验(Post-Hoc Test)— "哪两组之间显著不同?"
ANOVA 告诉你"至少有一组不同",但没告诉你是哪两组。事后检验在 ANOVA 显著后进行两两比较,同时对多重比较进行校正。
Tukey HSD(Honestly Significant Difference)——最常用的事后检验:
HSD = q(α, k, df_within) × √(MSW ÷ n)
其中 q 是学生化范围分布(Studentized Range)的临界值,需查表。
q(0.05, k=3, df=12) ≈ 3.77
HSD = 3.77 × √(2.50 ÷ 5) = 3.77 × √0.50 = 3.77 × 0.7071 = 2.67
两两比较:
| 对比 | 均值差绝对值 | HSD | 结果 |
|---|---|---|---|
| A vs B | |13 - 16| = 3.0 | 2.67 | 3.0 > 2.67 → 显著 |
| A vs C | |13 - 21| = 8.0 | 2.67 | 8.0 > 2.67 → 显著 |
| B vs C | |16 - 21| = 5.0 | 2.67 | 5.0 > 2.67 → 显著 |
结论:三种策略彼此之间存在显著差异。按照效果排序:C(KOL 种草)> B(搜索广告)> A(短视频)。
如果某两组差值小于 HSD,意味着它们的差异在统计上和随机噪音无法区分——即使它们的样本均值不同,也不能说"一个比另一个好"。
2.3 ANOVA 的假设与诊断
和所有统计方法一样,ANOVA 有三个关键假设:
假设 1:正态性——每组数据应来自正态分布。检验方法:Shapiro-Wilk 检验(每组单独做)。如果 p > 0.05,不能拒绝正态性假设。在我们的例子中,每组 5 个数据点太少,SW 检验的效力很低,建议看 Q-Q 图做视觉判断。
假设 2:方差齐性——各组的总体方差应相等。检验方法:Levene 检验。H₀: 各组方差相等。如果 Levene 检验的 p < 0.05,拒绝 H₀ → 方差不等。
假设 3:独立性——各组数据之间相互独立(一个城市的销售增长不影响另一个城市)。这在实验设计中保障,无法用统计检验。
如果假设被违反怎么办?
违反的假设 替代方法 正态性(严重偏态) Kruskal-Wallis 检验(非参数 ANOVA) 方差齐性(方差不相等) Welch ANOVA(不假设等方差) 独立性 改用重复测量 ANOVA 或混合效应模型
2.4 双因素 ANOVA — 不止一个分类变量
回到广告策略的例子。如果不同策略的效果还取决于城市规模(一线城市 vs 二线及以下),我们就有两个因素。双因素 ANOVA 可以同时检验:
- 策略的主效应(不同策略之间有差异吗?)
- 城市规模的主效应(不同规模城市之间有差异吗?)
- 交互效应(策略 C 在一线城市是否效果特别好?)
设计:2 × 3 因子设计(2 种城市规模 × 3 种策略 = 6 个条件组合)。每个组合 5 个观测值,共 30 个数据点。
交互效应的直观理解:
如果没有交互:策略 C 在所有城市类型中都优于 A 和 B,且差距大致相同。两条"策略-效果"线平行。
如果有交互:策略 C 在一线城市效果极好(增长 25%),但在二线及以下效果一般(增长 15%),而策略 A 在两种城市中效果相近。两条线交叉。
F 检验分解:
双因素 ANOVA 将总变异分解为四部分:
- SS_策略(策略主效应)
- SS_城市(城市规模主效应)
- SS_交互(策略 × 城市交互效应)
- SS_误差(组内随机变异)
每个效应都有自己的 F = MS_效应 ÷ MS_误差,都有自己的 p 值。
业务含义: 如果交互效应显著,意味着"哪种策略最好"的答案取决于城市类型——你不能一刀切地推荐策略 C。在面试中展示你理解交互效应,说明你能想到"策略效果是有场景依赖的"。
第三节:主成分分析与因素分析 — 压缩 50 个变量到 3 个因子
投行和 PE 面试中,如果你能讨论 PCA 和因素模型,说明你的量化深度远超平均候选者。定性地说:你有 50 个高度相关的变量,怎么把它们的信息压缩到 3 个不相关的"超级变量"里?
3.1 PCA 主成分分析 — 手动计算(3×3 相关矩阵)
场景: 3 只科技股(苹果、微软、谷歌)过去 5 天的日收益率:
| 天 | 苹果 | 微软 | 谷歌 |
|---|---|---|---|
| 1 | +1.0% | +0.8% | +0.6% |
| 2 | -0.5% | -0.3% | -0.4% |
| 3 | +2.0% | +1.8% | +1.5% |
| 4 | -1.0% | -0.8% | -0.7% |
| 5 | +0.5% | +0.4% | +0.3% |
第一步:去均值。 计算每只股票的平均收益率并减去。
苹果均值 = (1.0 - 0.5 + 2.0 - 1.0 + 0.5) ÷ 5 = 2.0 ÷ 5 = 0.4%
微软均值 = (0.8 - 0.3 + 1.8 - 0.8 + 0.4) ÷ 5 = 1.9 ÷ 5 = 0.38%
谷歌均值 = (0.6 - 0.4 + 1.5 - 0.7 + 0.3) ÷ 5 = 1.3 ÷ 5 = 0.26%
去均值后的数据(为简洁,略去详细表格——每行减去对应股票的均值)。
第二步:计算 3×3 协方差矩阵,再标准化为相关矩阵。
用去均值后的数据计算两两相关系数:
| 苹果 | 微软 | 谷歌 | |
|---|---|---|---|
| 苹果 | 1.00 | 0.98 | 0.95 |
| 微软 | 0.98 | 1.00 | 0.92 |
| 谷歌 | 0.95 | 0.92 | 1.00 |
三只股票的回报率高度相关——这不奇怪,因为它们都属于科技板块,受共同的宏观和行业因素驱动。
第三步:提取特征值(Eigenvalues)和特征向量。
特征值的计算需要解行列式方程 |R - λI| = 0。对于 3×3 矩阵,这是一个三次方程,我们直接给出结果:
- λ₁ = 2.86(解释 95.3% 的总方差)
- λ₂ = 0.12(解释 4.0% 的总方差)
- λ₃ = 0.02(解释 0.7% 的总方差)
验证:λ₁ + λ₂ + λ₃ = 2.86 + 0.12 + 0.02 = 3.00 = 变量总数 ✓
第四步:解读载荷(Loadings)——第一主成分 PC1:
PC1 的特征向量(载荷):
- 苹果:0.58
- 微软:0.57
- 谷歌:0.58
三只股票在 PC1 上的载荷几乎完全相同。含义:PC1 捕捉到了一个共同的"科技板块因子"——当科技板块整体上涨时,三只股票同步上涨;当板块下跌时,三只股票同步下跌。 PC1 解释了 95.3% 的总变异,意味着这三只股票几乎完全被同一个因子驱动。
PC2 的载荷:苹果 +0.70, 微软 -0.15, 谷歌 -0.70。这捕捉了苹果和谷歌之间的相对差异(可能在反映硬件 vs 服务的商业模式差异),但只解释了 4% 的变异——不重要。
PC3 解释不足 1%,基本可以忽略。
核心洞见: 你原本有 3 个变量(3 列 × 5 行的数据矩阵),经过 PCA,你发现几乎所有的信息都可以用 1 个主成分(PC1)来概括——维度从 3 降到了 1,信息损失不到 5%。
3.2 PCA vs 因素分析 — 什么时候用哪个
面试中经常被混淆的两个概念,它们的区别决定了你该在什么场景下用哪个。
| 维度 | PCA(主成分分析) | FA(因素分析) |
|---|---|---|
| 目标 | 维度压缩:用更少的变量保留尽可能多的方差 | 发现潜变量:假设观测变量由少数不可直接观测的"因素"生成 |
| 数学逻辑 | 纯几何变换:旋转坐标轴,让新轴沿方差最大方向 | 统计模型:X = ΛF + ε(观测变量 = 载荷×因子 + 独特误差) |
| 对方差的处理 | 不区分"共同方差"和"独特方差"——所有方差都保留 | 区分共同方差(多个变量共享)和独特方差(单个变量独有) |
| 是否允许测量误差 | 不允许——PC1 是原始变量的精确线性组合 | 允许——每个变量有独特的误差项 εᵢ |
| 适用场景 | 纯数据压缩、去噪、可视化高维数据、构建指数 | 心理学量表开发、客户满意度调查、发现隐藏的市场细分维度 |
实用经验法则:
- 如果你只是想压缩数据(如把 20 只股票的回报压缩成 3 个因子用于风险管理)→ PCA。
- 如果你相信数据背后存在不可直接测量的"构念"(如"品牌忠诚度""服务质量感知")→ FA。
- 在大样本下,两者的结果通常很接近。样本量 < 100 时,FA 比 PCA 更可靠。
3.3 Fama-French 三因素模型 — PCA 思想在金融中的经典应用
Fama-French 模型是资产定价领域引用量最高的成果之一(2013 年诺贝尔经济学奖)。它不是说"我们跑了 PCA,提取了三个因子"——恰恰相反,因子是预先根据经济理论构建的,不是从数据中提取的。 这一点在面试中说出来,说明你真的理解两者的区别。
三因子:
- 市场因子(MKT): Rm - Rf(市场组合回报减去无风险利率)——这与 CAPM 相同
- 规模因子(SMB, Small Minus Big): 小盘股组合的平均回报 - 大盘股组合的平均回报
- 价值因子(HML, High Minus Low): 高账面市值比(B/M)组合的平均回报 - 低 B/M 组合的平均回报
SMB 的构建方法(以 6 个组合为例):
第一步:按市值将股票分为 Small(市值下 50%)和 Big(市值上 50%)。
第二步:按 B/M 将股票分为 High(前 30%)、Medium(中间 40%)、Low(后 30%)。
第三步:形成 2×3 = 6 个交叉组合:
| Low B/M(成长股) | Medium B/M | High B/M(价值股) | |
|---|---|---|---|
| Small(小盘) | S/L | S/M | S/H |
| Big(大盘) | B/L | B/M | B/H |
第四步:SMB = (S/L + S/M + S/H) ÷ 3 - (B/L + B/M + B/H) ÷ 3
HML = (S/H + B/H) ÷ 2 - (S/L + B/L) ÷ 2
一个小型数值示例(单期数据):
| 组合 | 该期平均回报 | 说明 |
|---|---|---|
| S/L | +0.8% | 小盘 + 成长 |
| S/M | +1.2% | 小盘 + 中性 |
| S/H | +1.5% | 小盘 + 价值 |
| B/L | +0.5% | 大盘 + 成长 |
| B/M | +0.9% | 大盘 + 中性 |
| B/H | +1.1% | 大盘 + 价值 |
SMB = (0.8 + 1.2 + 1.5) ÷ 3 - (0.5 + 0.9 + 1.1) ÷ 3 = 1.167 - 0.833 = +0.334%
解读:本期小盘股平均比大盘股多涨了 0.334%。如果 SMB 长期为正,意味着小盘股有规模溢价。
HML = (1.5 + 1.1) ÷ 2 - (0.8 + 0.5) ÷ 2 = 1.30 - 0.65 = +0.65%
解读:本期价值股平均比成长股多涨了 0.65%。如果 HML 长期为正,意味着价值股有"价值溢价"。
回归方程(你可以用它来分析任何一只股票):
Rᵢ - Rf = αᵢ + βᵢ × MKT + sᵢ × SMB + hᵢ × HML + εᵢ
- βᵢ:对市场因子的敏感度(如果 βᵢ > 1,这只股票比市场波动更大)
- sᵢ:对规模因子的暴露(sᵢ > 0 → 表现得像小盘股)
- hᵢ:对价值因子的暴露(hᵢ > 0 → 表现得像价值股)
- αᵢ:截距项——如果 αᵢ 显著 > 0,说明模型无法解释的超额收益(Jensen's alpha,即基金经理追求的"α")
3.4 因素分析在商业中的应用 — 消费者调研实例
场景: 某护肤品品牌让 200 名消费者对 15 个产品属性打分(1-7 分)。15 个属性包括:"包装美观""成分天然""吸收快""香味好闻""品牌知名度高""朋友推荐购买"等等。
如果逐项分析,15 个维度太散,无法形成清晰的战略建议。
因素分析过程:
第一步:提取因子。 对 15 个变量的相关矩阵做因素分析。使用 Kaiser 准则(特征值 > 1 的因子才保留),发现 3 个因子的特征值大于 1。
| 因子 | 特征值 | 解释方差% | 累计% |
|---|---|---|---|
| F1 | 5.4 | 36.0% | 36.0% |
| F2 | 3.2 | 21.3% | 57.3% |
| F3 | 1.8 | 12.0% | 69.3% |
| F4 | 0.9 | 6.0% | 75.3% |
F4 及之后的特征值 < 1 → 保留 3 个因子。这 3 个因子共解释了 69.3% 的总方差。
第二步:旋转(Varimax Rotation)。 旋转前,很多变量在多个因子上都有中等载荷(如"包装美观"在 F1=0.40, F2=0.35, F3=0.38——看不出它到底属于哪个因子)。旋转后,每个变量的载荷朝向一个主要因子"收敛"。
第三步:命名因子。 旋转后的载荷矩阵:
| 变量 | F1(产品体验) | F2(品牌信任) | F3(社交驱动) |
|---|---|---|---|
| 吸收快 | 0.85 | 0.12 | 0.08 |
| 香味好闻 | 0.78 | 0.05 | 0.20 |
| 包装美观 | 0.72 | 0.25 | 0.18 |
| 成分天然 | 0.45 | 0.68 | 0.10 |
| 品牌知名度 | 0.15 | 0.82 | 0.12 |
| 老品牌信赖 | 0.08 | 0.79 | 0.05 |
| 朋友推荐 | 0.22 | 0.15 | 0.88 |
| 网红推荐 | 0.10 | 0.08 | 0.91 |
变量在某个因子上的载荷 > 0.6 即为"高载荷"。我们发现:
- F1 = "产品体验因子"(使用感受相关的变量都高载荷)
- F2 = "品牌信任因子"(成分、品牌认知相关的变量都高载荷)
- F3 = "社交驱动因子"(口碑传播相关的变量都高载荷)
共同度(Communality): "成分天然"的共同度 = 0.45² + 0.68² + 0.10² = 0.2025 + 0.4624 + 0.01 = 0.675。这意味着 3 个因子共同解释了"成分天然"67.5% 的方差——剩下的 32.5% 是该变量独有的信息(独特方差)。
商业行动建议: "原来我们的消费者价值主张是三维的——不是只有一个'满意度'。产品团队优化 F1,品牌部强化 F2,营销部围绕 F3 设计社交传播——各司其职。"
第四节:聚类分析 — "物以类聚"的数学实现
分类是你天天在做的事(这个客户有价值,那个没有),但直觉分类有两大问题:不一致(不同分析师分类不同),不系统(遗漏隐藏的群体模式)。聚类分析把分类变成算法。
4.1 K-means 聚类 — 手动迭代一次
场景: 一家电商平台有 6 个客户,用两个维度刻画他们的行为:
| 客户 | R(距上次购买天数) | F(年购买次数) |
|---|---|---|
| A | 5 | 30 |
| B | 10 | 25 |
| C | 80 | 3 |
| D | 90 | 5 |
| E | 7 | 28 |
| F | 95 | 2 |
设定 K=2(我们希望分成两组),初始质心(centroid)选取 A 和 C:
C1 = (5, 30),C2 = (80, 3)
第一次迭代:分配每个点到最近的质心。
距离使用欧氏距离:d = √[(R₁-R₂)² + (F₁-F₂)²]
A(5, 30):
- d(C1) = √[(5-5)² + (30-30)²] = 0
- d(C2) = √[(5-80)² + (30-3)²] = √(5625 + 729) = √6354 ≈ 79.7
- 分配 → C1
B(10, 25):
- d(C1) = √[(10-5)² + (25-30)²] = √(25 + 25) = √50 ≈ 7.1
- d(C2) = √[(10-80)² + (25-3)²] = √(4900 + 484) = √5384 ≈ 73.4
- 分配 → C1
C(80, 3):
- d(C1) ≈ 79.7, d(C2) = 0
- 分配 → C2
D(90, 5):
- d(C1) = √[(90-5)² + (5-30)²] = √(7225 + 625) = √7850 ≈ 88.6
- d(C2) = √[(90-80)² + (5-3)²] = √(100 + 4) = √104 ≈ 10.2
- 分配 → C2
E(7, 28):
- d(C1) = √[(7-5)² + (28-30)²] = √(4 + 4) = √8 ≈ 2.8
- d(C2) = √[(7-80)² + (28-3)²] = √(5329 + 625) = √5954 ≈ 77.2
- 分配 → C1
F(95, 2):
- d(C1) = √[(95-5)² + (2-30)²] = √(8100 + 784) = √8884 ≈ 94.3
- d(C2) = √[(95-80)² + (2-3)²] = √(225 + 1) = √226 ≈ 15.0
- 分配 → C2
第一次迭代结果:
簇 1 = {A, B, E}:R̄ = (5+10+7)÷3 = 7.33,F̄ = (30+25+28)÷3 = 27.67
簇 2 = {C, D, F}:R̄ = (80+90+95)÷3 = 88.33,F̄ = (3+5+2)÷3 = 3.33
业务解读:
簇 1 = "高频忠诚客户":最近刚买过(R 很小),一年买 25-30 次(F 很高)。这是核心用户,应推送会员权益和交叉销售。
簇 2 = "流失客户":快 3 个月没买了(R 很大),一年买 2-5 次(F 很低)。这群人可能已经转投竞品,需要"挽回优惠券"或直接联系。
在没有聚类之前,你可能对所有客户群发同一条促销短信。现在你知道:对簇 1 说的话和对簇 2 说的话应该完全不同。
第二次迭代会用新质心 C1=(7.33, 27.67) 和 C2=(88.33, 3.33) 重新分配,直到质心不再(或几乎不再)移动。在这个简单例子中,第二次迭代就已经收敛。
4.2 选择 K — 肘部法和轮廓系数
K-means 要求你预先指定 K(聚成几类)。怎么选?
方法一:肘部法(Elbow Method)
计算每个 K 对应的 WCSS(Within-Cluster Sum of Squares,簇内平方和)——所有点到其所属质心的距离平方之和。
WCSS 随着 K 增大必然下降(K 越大,簇越"紧"),但边际收益递减。
| K | WCSS | WCSS 的下降 |
|---|---|---|
| 1 | 12500 | — |
| 2 | 5200 | 7300(大幅下降) |
| 3 | 3800 | 1400 |
| 4 | 3200 | 600 |
| 5 | 2900 | 300 |
画 WCSS 对 K 的折线图,在 K=2 处有一个明显的"肘部"——之后增加 K 带来的边际改善急剧减小。K=2 是最优选择。
方法二:轮廓系数(Silhouette Score)
对每个点 i:
- a(i) = 点 i 到同簇其他点的平均距离(越小越好,说明簇内紧密)
- b(i) = 点 i 到最近的其他簇的平均距离(越大越好,说明簇间分离好)
- s(i) = (b - a) ÷ max(a, b)(范围 [-1, 1])
所有点的 s(i) 平均值就是整体轮廓系数。越接近 1 越好。
通常做法:对 K=2,3,4...10 都算轮廓系数,选最高值对应的 K。
面试中: "你最后选了 K=3,为什么不是 K=4?" —— 拿出肘部图或轮廓系数图,这是数据驱动的答案,不是"感觉"。
4.3 层次聚类 — 树状图的解读
K-means 需要你预设 K。如果连 K 的可能范围都不知道,可以先做层次聚类,画出树状图(Dendrogram),然后决定在哪里"切一刀"。
基本原理(自底向上,凝聚式):
- 每个点自成一簇(N 个簇)
- 找到距离最近的两个簇,合并为一个
- 重复步骤 2,直到所有点合并为一个大簇
- 整个过程可以画成一棵树
簇间距离的定义:
| 连接方法 | 定义 | 特点 |
|---|---|---|
| 单一连接(Single Linkage) | 两个簇中最近的两个点的距离 | 容易产生"链状"长条簇 |
| 完全连接(Complete Linkage) | 两个簇中最远的两个点的距离 | 倾向于产生紧凑的球形簇 |
| 平均连接(Average Linkage) | 两个簇中所有点对的距离平均值 | 折中方案,最常用 |
树状图解读:
假设我们有 A, B, C, D 四个点。树状图显示:
- 第一步:A 和 B 在高度 2.1 处合并(它们非常像)
- 第二步:C 和 D 在高度 2.5 处合并
- 第三步:(A,B) 和 (C,D) 在高度 8.7 处合并
竖着画一条"切割线"在高度 4.0 处 → 得到 2 个簇:{A,B} 和 {C,D}。 切割线在高度 1.5 处 → 得到 4 个簇:{A},{B},{C},{D}(每个独自一个簇)。
"切割线"的高度就是控制聚类粒度的旋钮。
K-means vs 层次聚类 的选用原则:
- 数据量大(N > 10,000)且你知道 K → K-means(计算快)
- 数据量小或你想看到嵌套的群体结构 → 层次聚类
- 实际工作中,两者经常搭配使用:先用层次聚类确定 K 的范围,再用 K-means 跑最终结果
4.4 聚类的局限 — 以及怎么避免踩坑
局限 1:标准化是必须的,不是可选的。
在我们的客户例子中,R 的取值范围是 1-365(天),F 的取值范围是 1-50(次)。如果不做标准化,欧氏距离几乎完全被 R 主导:
d = √[(R₁-R₂)² + (F₁-F₂)²] ≈ √[(几百)² + (几)²] ≈ |R₁-R₂|
F 的差异(比如 30 次和 20 次之间的差距)在距离计算中几乎被淹没。
解决:Z-score 标准化 → 每个变量减去其均值,除以标准差。变换后所有变量的均值为 0,标准差为 1,距离度量中的权重自然平衡。
局限 2:K-means 对初始质心敏感。
不同的初始质心可能导致不同的聚类结果。解决:用 K-means++ 初始化(选择彼此尽量远离的点作为初始质心),或者跑多次选 WCSS 最低的结果。
局限 3:聚类总会给你结果——即使数据中根本没有自然的群组结构。
把完全均匀分布的随机点丢进 K-means,K-means 仍然会分成 K 个簇。你必须用轮廓系数或领域知识判断"这些簇是否有意义"。
局限 4:K-means 只适合球形簇。
如果数据是环形的、月牙形的,K-means 完全无能为力——它会硬切成两半。这种场景需要用 DBSCAN(基于密度的聚类)。
第五节:决策树 — 把"如果...就..."可视化
决策树是最直观的机器学习模型——你不需要懂数学就能理解它的逻辑。但面试中问的不只是"什么是决策树",而是信息增益怎么算、为什么选这个特征先分叉。
5.1 信息熵 — "不确定性"的度量
场景: 银行有 10 个历史贷款申请人,已知是否违约,以及两个特征:信用评分高低、是否有抵押物。我们想建立一个决策树来预测新申请人的违约风险。
熵的公式(信息论的基石):
H = -Σ pᵢ × log₂(pᵢ)
其中 pᵢ 是第 i 个类别的比例。熵的范围:[0, 1](对于二分类)。H=0 表示完全确定(全是同一类),H=1 表示完全不确定(各类正好 50:50)。
计算目标变量的熵:
10 个申请人中,4 人违约,6 人还款。
p(违约) = 4 ÷ 10 = 0.4 p(还款) = 6 ÷ 10 = 0.6
H(目标) = -0.4 × log₂(0.4) - 0.6 × log₂(0.6)
log₂(0.4) = ln(0.4) ÷ ln(2) = -0.9163 ÷ 0.6931 = -1.3219 log₂(0.6) = ln(0.6) ÷ ln(2) = -0.5108 ÷ 0.6931 = -0.7370
H(目标) = -0.4 × (-1.3219) - 0.6 × (-0.7370) = 0.5288 + 0.4422 = 0.9710
接近 1.0——数据"非常不确定"。什么都不做,你猜错的概率很高。
5.2 信息增益 — "知道这个特征后,不确定性减少了多少"
给定以下数据布局:
| 申请人 | 信用评分 | 有抵押物 | 违约? |
|---|---|---|---|
| 1 | 高 | 是 | 否 |
| 2 | 高 | 是 | 否 |
| 3 | 高 | 是 | 否 |
| 4 | 高 | 是 | 否 |
| 5 | 高 | 否 | 否 |
| 6 | 高 | 否 | 是 |
| 7 | 低 | 是 | 否 |
| 8 | 低 | 否 | 是 |
| 9 | 低 | 否 | 是 |
| 10 | 低 | 否 | 是 |
先看按"信用评分"分叉:
高信用组(6 人): 1 人违约,5 人还款
H(高信用) = -(1/6) × log₂(1/6) - (5/6) × log₂(5/6)
= -(0.1667) × (-2.5850) - (0.8333) × (-0.2630)
= 0.4308 + 0.2192 = 0.6500
低信用组(4 人): 3 人违约,1 人还款
H(低信用) = -(3/4) × log₂(3/4) - (1/4) × log₂(1/4)
= -(0.75) × (-0.4150) - (0.25) × (-2.0000)
= 0.3113 + 0.5000 = 0.8113
按信用评分分叉后的加权平均熵:
H(信用) = (6/10) × 0.6500 + (4/10) × 0.8113 = 0.3900 + 0.3245 = 0.7145
信用评分的信息增益:
IG(信用评分) = H(目标) - H(信用) = 0.9710 - 0.7145 = 0.2565
再看按"是否有抵押物"分叉:
有抵押物组(5 人): 0 人违约,5 人还款
H(有抵押物) = 0 ———— 完美纯净!(全是 "否")
无抵押物组(5 人): 4 人违约,1 人还款
H(无抵押物) = -(4/5) × log₂(4/5) - (1/5) × log₂(1/5)
= -(0.8) × (-0.3219) - (0.2) × (-2.3219) = 0.2575 + 0.4644 = 0.7219
按是否有抵押物分叉后的加权平均熵:
H(抵押物) = (5/10) × 0 + (5/10) × 0.7219 = 0.3610
是否有抵押物的信息增益:
IG(抵押物) = 0.9710 - 0.3610 = 0.6100
决策:IG(抵押物) = 0.610 > IG(信用评分) = 0.257 → 先按"是否有抵押物"分叉!
完整的决策树:
[根节点: 10人, 4违约] / 是否有抵押物? \ / \ [有抵押物: 5人] [无抵押物: 5人, 4违约] 0违约 → 结论: 还款 / 信用评分? \ / \ [高信用: 1人] [低信用: 4人, 3违约] 0违约 → 还款 → 结论: 违约(75%)
规则提取:
规则 1:IF 有抵押物 → 预测还款(准确率 100%) 规则 2:IF 无抵押物 AND 信用评分高 → 预测还款(准确率 100%——目前数据) 规则 3:IF 无抵押物 AND 信用评分低 → 预测违约(准确率 75%)
这些规则可以直接交给信贷审批员:"先看有没有抵押物,没有的话再看信用评分。" 这就是决策树胜过逻辑回归的地方——你可以向非技术人员解释"为什么"这个申请人被拒绝。
5.3 剪枝 — 不要让树"记住"噪音
如果决策树一直长下去,直到每个"叶子"只包含一个数据点,那么训练准确率 = 100%,但测试准确率可能只有 60%。这就是过拟合——树把训练数据中的随机噪音也"记住"了。
预剪枝(Pre-Pruning): 在生长过程中就限制树的复杂度。
- 信息增益小于某阈值 → 停止分裂
- 节点中的样本数小于某最小值(如 < 5)→ 停止分裂
- 树的最大深度设为 3 或 4
后剪枝(Post-Pruning): 先让树长到最大,再自底向上地评估:如果把这个子树替换成一个叶子节点(用多数类作为预测),验证集的准确率会下降吗?如果不会,就剪掉。
后剪枝通常比预剪枝效果更好,但计算成本更高。实际中,随机森林(Random Forest)和梯度提升树(XGBoost)通过集成多棵树来避免单棵树的过拟合——这些在量化金融和数据竞赛中是标配。
第六节:蒙特卡洛模拟 — 当公式给不了解析解时,用计算机暴力破解
在所有量化工具中,蒙特卡洛模拟可能是面试里最让你"出圈"的——大多数商科候选人只会说"我们用 Excel 算了 DCF",而你能说出"我对每个输入参数定义了概率分布,跑了 10,000 次模拟,给出了估值的分布而非一个点估计"。
6.1 为什么需要模拟
场景: 你给百威亚太(1876.HK)做 DCF 估值。
传统方法:拍一个 WACC = 8.5%,拍一个永续增长率 g = 2.0%,代入公式 → DCF 估值 = 850 亿。
这个"850 亿"给你的是一种虚假的精确感。实际上:
- WACC 可能在 7.5% 到 9.5% 之间(取决于你如何估计股权成本和债务成本)
- g 可能在 1.5% 到 2.5% 之间(取决于你对啤酒行业长期前景的判断)
- 营收增速可能在 2% 到 6% 之间(取决于竞争格局和消费趋势)
你给老板说"估值 850 亿",老板以为你很确定。但如果 WACC 取 9.5% 且 g 取 1.5%,估值可能只有 600 亿。点估计掩盖了不确定性,蒙特卡洛揭示不确定性。
6.2 蒙特卡洛模拟 — 分步走
第一步:为每个不确定的输入定义概率分布。 这需要判断和经验——这就是为什么蒙特卡洛不是"纯数学",它也需要业务理解。
| 参数 | 分布类型 | 参数 | 理由 |
|---|---|---|---|
| WACC | Triangular | min=7.0%, mode=8.5%, max=10.0% | 有一个"最可能"值,但上下限不对称 |
| 永续增长率 g | Uniform | min=1.5%, max=2.5% | 没有特别的"最可能"值,在区间内均匀分布 |
| 未来 5 年营收增速 | Normal | μ=4.0%, σ=2.0% | 围绕均值对称分布,有一定波动 |
第二步:从每个分布中随机抽取一个值,代入 DCF 模型,得到一个估值。
假设第一次抽样:
- WACC = 8.3%(从 Triangular 分布中抽)
- g = 2.1%(从 Uniform 分布中抽)
- 营收增速 = 3.8%(从 Normal 分布中抽)
代入 DCF → 估值 = 870 亿(记下来)
第二次抽样:
- WACC = 9.1%, g = 1.7%, 营收增速 = 5.2% → 估值 = 780 亿
...重复 10,000 次...
第三步:分析输出分布。 你得到了 10,000 个估值,而不是 1 个。
| 统计量 | 值 |
|---|---|
| 均值(Mean) | 860 亿 |
| 中位数(Median) | 855 亿 |
| 标准差(Std Dev) | 95 亿 |
| 第 5 百分位 | 720 亿 |
| 第 95 百分位 | 1020 亿 |
| P(DCF < 800 亿) | 18% |
第四步:形成投资建议。
当前市值 = 800 亿。在 10,000 次模拟中,DCF 估值低于 800 亿的概率仅为 18%。也就是说,有 82% 的概率百威亚太的内在价值高于当前市值。
你可以对 PM(基金经理)说:"基于我们的假设分布,百威亚太有大约八成的概率被低估。估值的 90% 置信区间是 [720 亿, 1020 亿],下侧风险可控。如果我们可以接受 18% 的亏损概率,这是一个值得建仓的机会。"
相比于"估值 850 亿,低于市价不用看",这段话展示了三个层次的专业性:你量化了不确定性、你给出了概率判断、你让决策者在了解风险后自己做选择。
6.3 与敏感性分析的比较
| 维度 | 敏感性分析 | 蒙特卡洛模拟 |
|---|---|---|
| 方式 | 每次只变动一个变量,看输出的变化 | 同时变动所有变量 |
| 对变量的处理 | "如果 WACC 变成 7.5%,其他不变" | WACC 从分布中随机抽,同时 g 也在随机抽 |
| 是否考虑相关性 | 否 | 可以(需要显式建模) |
| 输出 | "哪个变量对估值影响最大"(Tornado 图) | "估值可能的分布范围"(直方图 / CDF) |
| 计算复杂度 | Excel 可做 | 通常需要写代码(Python/R),至少需要插件 |
| 适用场景 | 理解关键驱动因素 | 理解整体风险敞口 |
两者互补: 先用敏感性分析找到"哪些输入值得花时间精确估计"(如果一个变量的变动几乎不影响输出,就不值得为它争论三天),再用蒙特卡洛模拟生成完整的估值分布。
6.4 蒙特卡洛的陷阱 — 以及怎么避免
陷阱 1:垃圾进,垃圾出(GIGO)。
输出的分布质量完全取决于输入的分布假设。如果你对营收增速的分布定义错了(比如假设它是 Normal 但实际上有重尾风险),那么输出的第 5 百分位可能严重低估了下行风险。
应对:做多个情景(乐观/基准/悲观分布),看结论是否稳健。不要只相信一个分布设定。
陷阱 2:忽略变量之间的相关性会严重误导结论。
假设营收增速和毛利率负相关(为了冲量降价 → 营收增速高了但毛利率低了)。如果你的模拟独立抽取这两个变量,你会生成大量"高增速 + 高毛利"的组合——这在现实中几乎不存在。这种错误组合会高估上行空间。
应对:使用 Copula 或相关矩阵来建模变量间的依赖关系。最简单的做法:识别关键的相关性对,在抽样时施加约束。
陷阱 3:尾部概率需要非常多的迭代才能稳定。
如果你想估计"估值低于 500 亿的概率"(这个事件在 10,000 次模拟中可能只出现 50 次),那么 ± 几个事件就会导致概率估计在 0.4% 到 0.6% 之间大幅波动。对于 1-in-1000 事件的估计,你需要至少 50,000 到 100,000 次迭代。
应对:关注你需要的精度。如果只是用于内部讨论,10,000 次够了。如果要提交给投委会做资金分配决策,加一个数量级。
第七节:百威亚太综合应用 — 这些工具怎么连在一起
这一节是 Day 14-15 的总复习。我们以一个完整的买方分析师工作流为例,展示如何把学过的所有工具串成一条逻辑链。
场景设定: 你是一家对冲基金的消费行业分析师,被要求给百威亚太 (1876.HK) 做出投资建议。你不能只说"我觉得它会涨"——你需要一个从数据到结论的完整证据链。
应用 1:收入预测 — 多元回归
因变量(Y): 百威亚太的季度收入同比增速(%)
自变量:
- X₁:中国 GDP 同比增速(%)
- X₂:CPI 餐饮分项同比(%)
- X₃:当月平均气温偏离历史均值(°C)——啤酒是典型的"天气敏感品"
- X₄:高端及以上产品收入占比(%)——衡量产品高端化进展
用过去 5 年(20 个季度)的数据跑多元回归。
假设回归输出:
| 变量 | β | SE | t | p 值 | VIF |
|---|---|---|---|---|---|
| 截距 β₀ | -3.2 | 1.8 | -1.78 | 0.095 | — |
| GDP 增速 X₁ | 0.85 | 0.22 | 3.86 | 0.001 | 2.1 |
| CPI 餐饮 X₂ | 0.42 | 0.18 | 2.33 | 0.034 | 1.8 |
| 气温偏离 X₃ | 0.15 | 0.06 | 2.50 | 0.024 | 1.2 |
| 高端占比 X₄ | 1.10 | 0.30 | 3.67 | 0.002 | 2.5 |
R² = 0.72,Adjusted R² = 0.65
解读(面试级别):
- 四个变量全部统计显著(p < 0.05)——GDP 增速和高端占比的显著性最强
- VIF 都在 3 以下——没有严重的多重共线性问题
- β₄ = 1.10 的含义:在控制 GDP、CPI、气温不变的情况下,高端产品占比每提高 1 个百分点,收入增速提高 1.10 个百分点——高端化确实在推动增长
- R² = 0.72 意味着这四个变量解释了收入增速 72% 的变异——还算不错,但仍有 28% 未被解释(可能是因为促销活动、竞品动作、一次性事件等)
- 预测下一年收入增速:假设 GDP=4.5%, CPI=2.0%, 气温偏离=+0.5°C, 高端占比=38%
Ŷ = -3.2 + 0.85×4.5 + 0.42×2.0 + 0.15×0.5 + 1.10×38
= -3.2 + 3.825 + 0.84 + 0.075 + 41.8 = 43.34%...
等等,这个结果不合理——高端占比的单位需要确认。如果 X₄ 是百分比数值(如 38 代表 38%),β₄ = 1.10 意味着高端占比从 37% 提高到 38%,收入增速变化 1.10 个百分点。这更合理。
修正:Ŷ = -3.2 + 3.825 + 0.84 + 0.075 + 1.10×38 = -3.2 + 3.825 + 0.84 + 0.075 + 41.8... 还是不对。
这说明 X₄ 需要定义为"百分比变化"而非"百分比水平"。假设 X₄ 定义为"高端占比同比变化(百分点)",去年高端占比从 30%→34%(+4 个百分点),那么 β₄ = 1.10 的解释就是:占比提高 1 个百分点,增速提高 1.10 个百分点。
预测:GDP=4.5%, CPI餐饮=2.0%, 气温偏离=+0.5°C, 高端占比变化=+3.0 个百分点
Ŷ = -3.2 + 0.85×4.5 + 0.42×2.0 + 0.15×0.5 + 1.10×3.0
= -3.2 + 3.825 + 0.84 + 0.075 + 3.30 = 4.84%
预测下一年收入增速约为 4.8%。(这个数字看起来合理得多。)
这个例子也揭示了一个重要的建模教训:定义变量时要非常小心单位——β₄ = 1.10 看起来很"大",但如果 X₄ 的定义不同,解释完全不同。面试中展示这种自我质疑会让面试官觉得你真正理解回归,而不只是会跑代码。
应用 2:估值蒙特卡洛
基于应用 1 的回归结果,我们为 DCF 模型的关键输入定义分布:
| 参数 | 分布 | 参数设定 |
|---|---|---|
| 营收增速(未来 5 年平均) | Normal | μ = 4.8%, σ = 2.5% |
| WACC | Triangular | min=7.0%, mode=8.5%, max=10.0% |
| 永续增长率 g | Uniform | min=1.5%, max=2.5% |
| EBITDA 利润率 | Normal | μ = 32.0%, σ = 3.0% |
跑 10,000 次 → 估值分布的均值为 880 亿,90% CI = [700 亿, 1100 亿]。
当前市值 = 820 亿 → P(低估) ≈ 68% → 建议:买入,但下侧风险(估值跌至 700 亿意味着约 15% 的下跌空间)需要仓位控制。
应用 3:竞争格局 — K-means 聚类
收集中国啤酒行业 20+ 家公司的财务数据,对以下维度做标准化后跑 K-means:
| 维度 | 含义 |
|---|---|
| 营收规模 | log(营收) |
| 毛利率 | % |
| 高端产品收入占比 | % |
| 销售费用率 | % |
| ROE | % |
| 营收增速 | 3 年 CAGR |
K-means(K=4 时轮廓系数最高)将公司分为 4 个战略群组:
- 簇 1(高端领导者):百威亚太、华润雪花(高端线)——高毛利、高高端占比、高 ROE
- 簇 2(规模大众玩家):青岛啤酒、燕京啤酒——大营收但较低毛利率和高端占比
- 簇 3(区域性价比品牌):珠江啤酒、重庆啤酒——小规模、低成本、区域聚焦
- 簇 4(精酿新势力):各种小型精酿品牌——高增速、小规模、极高毛利率
洞见: 百威亚太真正的竞争对手不在"啤酒行业",而在"簇 1"——和华润雪花的高端线才是直接竞争。你在做竞争分析时,应该对比的是簇 1 内的公司,而不是整个行业的平均。
应用 4:假设检验 — "高端化战略是否真的提升了毛利率"
百威亚太从 2019 年开始大力推高端化(引入时代、科罗娜、福佳等高端品牌)。问题是:毛利率真的因此提高了吗?还是原材料成本下降等其他因素在起作用?
简单检验(Day 14 的双样本 t 检验):
H₀: μ_高端化后 - μ_高端化前 = 0(毛利率没有提高) H₁: μ_高端化后 - μ_高端化前 > 0(毛利率提高了)
收集高端化战略实施前后各 8 个季度的毛利率数据:
高端化前(8 个季度):均值 = 50.2%, s = 2.1% 高端化后(8 个季度):均值 = 53.8%, s = 2.4%
合并标准误 SE = √[s²_p × (1/8 + 1/8)] = √[(2.1²+2.4²)/2 × 0.25]... 实际应使用 Welch t 检验(方差不等的版本)。
假设 t = 3.2, df ≈ 13, p = 0.003(单侧)
结论:拒绝 H₀,高端化后毛利率统计显著提高。
但等一下——这里有个混杂变量(confounder): 同期全球大麦价格下降了约 8%,原材料成本的下降本身就会提升毛利率。你观察到的高端化"效果"可能部分是原材料成本的贡献。
更严谨的做法: 做一个多元回归,因变量是季度毛利率,自变量包括:(1) 高端产品占比,(2) 原材料成本指数,(3) 季度虚拟变量(控制季节性)。
如果控制原材料成本后,高端占比的系数仍然显著为正,你才能说"高端化确实提升了毛利率"。
这回到了应用 1 的逻辑——多元回归的最大价值就是控制混杂变量,分离出"纯净"的因果效应。
应用 5:决策树 — "该不该进入下一个省份?"
百威亚太计划进入一个新的省份市场。过去 5 年在 15 个省份的进入结果(成功/失败)可以作为训练数据。
| 省份 | 人均 GDP (万) | 啤酒人均消费量 (升) | 竞品数量 | 分销网络覆盖 (%) | 结果 |
|---|---|---|---|---|---|
| 江苏 | 15.1 | 38 | 2(少) | 80%(高) | 成功 |
| 四川 | 6.8 | 42 | 3(多) | 60%(中) | 成功 |
| 河南 | 5.9 | 35 | 3(多) | 30%(低) | 失败 |
| 湖南 | 6.5 | 30 | 2(少) | 55%(中) | 成功 |
| ... | ... | ... | ... | ... | ... |
跑决策树,提取出的关键规则:
规则 1: IF 人均 GDP > 8 万 AND 分销网络覆盖 > 50% → 进入(历史成功率 7/8 = 88%) 规则 2: IF 人均 GDP < 6 万 AND 竞品数量 ≥ 3 → 不进入(历史失败率 5/6 = 83%) 规则 3: IF 6 万 < 人均 GDP < 8 万 AND 啤酒人均消费量 > 35 升 → 进入(成功率较高)
对于目标新省份(人均 GDP = 7.2 万,啤酒消费 = 38 升,竞品 = 2,分销网络 = 45%)→ 规则 3 适用 → 建议进入,但分销网络是短板,需配套投入。
应用 6:PCA — 理解百威亚太的风险敞口
收集百威亚太 + 20 家同业公司(啤酒 + 饮料 + 消费)的月度回报率,跑 PCA:
| 主成分 | 特征值 | 解释方差% | 累计% | 载荷最大的行业 | 解读 |
|---|---|---|---|---|---|
| PC1 | 8.5 | 42.5% | 42.5% | 所有消费股 | 消费板块整体因子 |
| PC2 | 4.2 | 21.0% | 63.5% | 啤酒股正载荷,饮料股负载荷 | 酒精 vs 非酒精因子 |
| PC3 | 2.8 | 14.0% | 77.5% | 高端品牌 | 消费升级因子 |
百威亚太在各 PC 上的载荷:
- PC1:+0.42(对消费板块整体敏感)
- PC2:+0.68(对"酒精"因子非常敏感——啤酒股特征明显)
- PC3:+0.52(对消费升级因子敏感——高端定位决定其 beta 于升级趋势)
投资含义: 买百威亚太,你实际上在做三个赌注:(1) 消费板块整体走强,(2) 酒精饮料跑赢非酒精饮料,(3) 消费升级趋势持续。如果你只想赌消费升级但不想赌酒精,你需要找到 PC3 载荷高但 PC2 载荷低的替代标的(比如高端乳制品或高端餐饮)。
面试题一览
Q1(回归基础): 某分析师跑了一个回归:销售量 = 100 + 5×价格 + 20×广告支出,R² = 0.65。请你解读这三个数字,并指出至少两个这个回归可能存在的问题。
参考答案框架:
- β_价格 = 5:价格每提高 1 单位,销售量增加 5 单位——符号方向不对!(正常应该是负的,价格涨销量跌)。可能的解释:遗漏变量偏误(价格高的产品可能质量更好或品牌更强,而质量和品牌才是驱动销量的真正原因),或者多重共线性(价格和广告高度相关)。
- β_广告 = 20:广告每增加 1 单位,销售量增加 20 单位。需要检验 p 值判断是否显著。
- R² = 0.65:模型解释了 65% 的销量变异。
- 可能的问题:(1) 遗漏变量——如促销力度、季节性、竞品价格;(2) 价格的内生性——价格和销量可能互相决定(联立方程偏误);(3) 没有检查残差——如果残差有自相关,标准误会偏小。
Q2(逻辑回归): 信用卡公司用逻辑回归预测客户流失。β_使用频率 = -0.05。求:(1) 使用频率每增加 1 次/月,流失胜率变化多少?(2) 如果某客户当前流失概率为 30%,使用频率增加 10 次/月后的流失概率是多少?
参考答案框架: (1) e^(-0.05) = 0.9512,每增加 1 次使用,胜率乘以 0.951(降低约 4.9%)。 (2) 当前胜率 = 0.3/(1-0.3) = 0.4286。增加 10 次后胜率 = 0.4286 × (0.9512)^10 = 0.4286 × e^(-0.5) = 0.4286 × 0.6065 = 0.260。新概率 P = 0.260/(1+0.260) = 0.206。流失概率从 30% 降到 20.6%。
Q3(ANOVA): 测试四种不同定价策略(每组 6 个城市)。ANOVA 表给出:SSB=480, SSW=600, df_between=3, df_within=20。求 F 统计量,并用 α=0.05 做检验(F(3,20) 临界值 = 3.10)。
参考答案框架: MSB = 480/3 = 160, MSW = 600/20 = 30, F = 160/30 = 5.33 > 3.10 → 拒绝 H₀。四种定价策略的效果不全相等。接下来应该做 Tukey HSD 事后检验确认哪些对之间有显著差异。
Q4(决策树): 数据:20 封邮件,12 封被打开,8 封未被打开。按照"标题是否包含数字"分叉:包含数字的 10 封中 8 封被打开;不包含数字的 10 封中 4 封被打开。求"标题是否包含数字"的信息增益。
参考答案框架: H(目标) = -(12/20)×log₂(12/20) - (8/20)×log₂(8/20) = -(0.6)×(-0.737) - (0.4)×(-1.322) = 0.442 + 0.529 = 0.971 H(有数字) = -(8/10)×log₂(8/10) - (2/10)×log₂(2/10) = -(0.8)×(-0.322) - (0.2)×(-2.322) = 0.258 + 0.464 = 0.722 H(无数字) = -(4/10)×log₂(4/10) - (6/10)×log₂(6/10) = 0.971(刚好和目标熵相同——分叉后没减少不确定性) 加权平均 = 0.5×0.722 + 0.5×0.971 = 0.8465 IG = 0.971 - 0.8465 = 0.1245。信息增益很小——这个特征帮助有限。事实上,不包含数字的那组和原始分布完全一样,等于没有提供新信息。
Q5(蒙特卡洛): 你给一个项目做 NPV 分析。初始投资 = 1000 万。每年现金流服从 Normal(μ=250万, σ=50万),持续 5 年。折现率 10%。(1) 用期望值直接计算 NPV。(2) 解释为什么蒙特卡洛比你刚算出的"点 NPV"更有信息量。
参考答案框架: (1) NPV = -1000 + 250/(1.1) + 250/(1.1)² + 250/(1.1)³ + 250/(1.1)⁴ + 250/(1.1)⁵ = -1000 + 250×3.7908 = -1000 + 947.7 = -52.3 万(负的——按期望值不应投资)。 (2) 但"期望值"掩盖了现金流的波动。如果σ=50万,有相当概率现金流高于250万,NPV可能为正。蒙特卡洛可以给出P(NPV>0)的概率分布,让决策者在"期望NPV为负但有概率为正"之间做权衡。而且现金流可能不是独立同分布的——如果第一年表现好,后续年份可能也好(正自相关),蒙特卡洛可以建模这种依赖关系。
Q6(综合 — PCA + 聚类): 你对一个包含 50 只股票的池子做 PCA + K-means。(1) 为什么在做 K-means 之前先做 PCA?(2) 前两个 PC 分别解释了 40% 和 25% 的方差。K-means 在 PC1-PC2 空间上给出 3 个簇。你如何向 PM 解释"这三个簇代表什么"?
参考答案框架: (1) 原因有三:降维(50 维 → 2 维,避免"维度诅咒"——高维空间所有距离都差不多,K-means 失效);去噪(PC3-50 中的变异很可能是不重要的噪音);可视化(在 PC1-PC2 的 2D 图上直接展示聚类结果)。 (2) 先看每个 PC 上哪些原始变量载荷高,给 PC 命名(如 PC1="规模因子"——大市值股票载荷高,PC2="动量因子"——近期涨幅大的股票载荷高)。然后在 PC1-PC2 散点图上标注三个簇的位置:(高规模+高动量)的"白马成长股"簇,(低规模+高动量)的"小盘热门股"簇,(高规模+低动量)的"大盘价值股"簇。PM 听完就知道这三个簇对应的投资主题。
Q7(综合应用题): 你是一家 VC 的分析师,需要从 200 家初创公司中选出 10 家做尽调。描述你会如何使用 Day 14-15 学过的至少四种工具来完成这个任务。
参考答案框架:
- 数据收集和清洗: 收集 200 家公司的财务、团队、市场、产品数据。处理缺失值(Day 14 第一节课)。
- 回归分析: 用历史上已投资项目的成败数据跑逻辑回归。因变量=成功/失败,自变量=创始团队经验年限、市场规模、月活用户增速、毛利率等。得到每个变量的胜率比,理解"什么因素最能预测成功"。
- PCA 降维: 200 家公司在 30 个指标上 → PCA 压缩到 5-6 个主成分(团队能力因子、市场潜力因子、产品成熟度因子等)。
- K-means 聚类: 在 PCA 空间上聚类,找到"高质量"的簇(该簇中历史成功项目比例高)。从该簇中选代表性公司。
- 蒙特卡洛模拟: 对每家公司做 scenario-based valuation(乐观/基准/悲观),用蒙特卡洛模拟合并市场风险 → 得到每家公司的期望回报分布 → 选期望回报最高的同时相关性低的(组合思维)。
- 最终输出: 推荐 10 家尽调标的,附带每家的逻辑回归成功概率预测、所属聚类和估值分布。这比"我觉得这几家不错"要专业得多。
今日核心公式速记
| 概念 | 公式 | 一句话 |
|---|---|---|
| OLS 斜率 | β₁ = Σ(X-X̄)(Y-Ȳ) ÷ Σ(X-X̄)² | 协方差 ÷ X 的方差 |
| R² | 1 - SS_residual ÷ SS_total | 被解释的变异比例 |
| SE(β₁) | √[MS_residual ÷ Σ(X-X̄)²] | X 变异越大,估计越精确 |
| VIF | 1 ÷ (1 - R²ⱼ) | R²ⱼ 是 Xⱼ 对其他 X 回归的 R² |
| 胜率比 | e^β | X 每增 1 单位,胜率乘 e^β |
| F 统计量 | MSB ÷ MSW | 组间变异 ÷ 组内变异 |
| Tukey HSD | q × √(MSW ÷ n) | 最小显著差异 |
| 信息熵 | -Σ pᵢ × log₂(pᵢ) | 不确定性 = 0(纯)到 1(混乱) |
| 信息增益 | H(父) - H(加权子) | 熵的减少量 |
| 欧氏距离 | √Σ(xᵢ - yᵢ)² | K-means 的距离度量 |
Day 14 + Day 15 总览:从数据到决策的完整工具箱
Day 14 和 Day 15 合在一起,给了你一个完整的"量化分析工作流":
数据收集 → 描述性统计(Day 14 第一节)
→ 可视化探索(分布、散点图)
→ 假设检验(Day 14 第四-五节)→ "这几个组的差异是真实的吗?"
→ 回归分析(Day 15 第一节)→ "哪个因素在驱动结果?效应多大?"
→ 降维 + 聚类(Day 15 第三-四节)→ "数据的底层结构是什么?"
→ 决策树(Day 15 第五节)→ "可操作的规则是什么?"
→ 蒙特卡洛模拟(Day 15 第六节)→ "不确定性的全貌是什么?"
→ 决策建议每一个箭头都是一个"你可以向面试官解释你做了什么"的步骤。每一块你都有手动计算的肌肉记忆(因为我们从 Day 14 到 Day 15 一直在手算),这意味着你在面试中被要求"在黑板上给我演示一下"的时候不会卡住。
最后一条建议: 在面试中,不要一次性把所有这些工具都甩出来。先理解业务问题,再选择 1-2 个最合适的工具深入展开。面试官想要的不是"我会多少种方法",而是"我知道在这个情境下哪种方法最合适,以及为什么"。
Day 15 · 建模与量化决策 · 2026-08-12本手册是 Day 14(概率与统计推断)的延续,建议与 Day 14 手册配合使用。