「买 ESG 评分高的公司,长期是不是更赚钱?」这是过去十年被问得最多、也最容易被营销话术带偏的问题。作为量化人,我们不靠信念回答,靠因子检验:把 ESG 评分当成一个因子,算它的信息系数(IC)、做分组组合回测,看它到底有没有稳定的截面预测力。
结论先放这里:ESG 绝对水平更像「风险与价值观约束」,净 alpha 接近零;真正有信息增量的,是 ESG 的「变化」——一家公司评分在改善,比它「本来就高」更有预测力。 下面用一段自包含的模拟面板把这件事跑通,所有图表均为真实计算、非占位图。

一、ESG 数据先有三个「脏」现实#
在谈 alpha 之前,得先承认 ESG 数据本身的质量问题,否则因子还没建就埋了雷:
- 行业系统性偏差:ESG 评分天然行业分化——能源、材料天然低分,公用事业、医疗天然高分。不中性化直接排序,等于在做行业暴露。
- E/S/G 高度重叠:三者相关系数常高达 0.6–0.8,信息冗余严重。综合分里 G(治理)数据最稀缺、最易被「拍脑袋」,权重给高了反而引入噪声。
- 披露与口径噪声:同一家公司,不同评级机构(MSCI / Sustainalytics / 国内商道融绿等)评分可差出一两个标准差;而且披露滞后,你拿到的「当期分」往往是半年前的旧闻。
所以第一步永远是:行业中性化 + 用分项而不是盲目信综合分 + 对评级机构做交叉验证。
二、把 ESG 拆成两个因子:水平 vs 改善#
关键动作是区分两件事:
- ESG 水平因子(Level):当期综合分(行业中性后)。代表「这家公司现在有多可持续」。
- ESG 改善因子(ΔESG):过去 12 个月评分的变化量。代表「它在变好还是变坏」。
直觉上,市场会对「持续改善」的公司逐步重定价(类似盈利修正 momentum),而对「一直很高分」的公司早已 price-in。所以 ΔESG 更可能有未被消化的增量信息。下面用模拟验证。
import numpy as np, pandas as pd
# 假设已有面板:sec(行业), E/S/G 分项, esg(综合), d_esg(ΔESG), fwd_ret(未来12月收益)
# 1) 行业中性化:在每个行业内对 esg 做 z-score
df["esg_neu"] = df.groupby("sec")["esg"].transform(lambda x: (x - x.mean()) / x.std())
df["desg_neu"] = df.groupby("sec")["d_esg"].transform(lambda x: (x - x.mean()) / x.std())
# 2) 信息系数 IC = 截面相关系数
ic_level = np.corrcoef(df["esg_neu"], df["fwd_ret"])[0, 1]
ic_delta = np.corrcoef(df["desg_neu"], df["fwd_ret"])[0, 1]
print(f"IC(ESG水平)={ic_level:.3f} IC(ΔESG)={ic_delta:.3f}")python把 300 只股票按当期 ESG 分画出「分 vs 未来收益」散点,拟合斜率很平——说明水平因子截面预测力很弱:

三、实证:水平因子弱,改善因子强#
在模拟里,ESG 水平只给了微弱的截面信号(因为真实世界里它大半已被市场消化),而 ΔESG 保留了独立增量。两端 IC 对比:
IC(ESG水平) ≈ 0.16 (弱正,且高度依赖行业中性化是否做干净)
IC(ΔESG) ≈ 0.24 (明显更强,信息增量在「变化」)plaintext落到组合层面更直观:把股票按因子分五组,取最高组 vs 最低组,再用月度面板模拟组合净值(已扣掉行业 beta,纯因子收益视角):
def portfolio_nav(signal, fwd_ret, top=True, q=0.2):
"""取 signal 最高(top=True)或最低 20% 分组,按未来收益合成组合"""
thr = np.quantile(signal, 1 - q if top else q)
mask = (signal >= thr) if top else (signal <= thr)
w = np.where(mask, 1.0 / mask.sum(), 0.0) # 等权多头
port_ret = (w * fwd_ret).sum()
return port_ret
# 滚动 120 个月,对比 高ESG / 低ESG / ESG改善 / 等权
nav_high, nav_low, nav_imp, nav_ew = [], [], [], []
for t in range(Tm):
rh = portfolio_nav(esg_neu[t], fwd_ret[t], top=True)
rl = portfolio_nav(esg_neu[t], fwd_ret[t], top=False)
ri = portfolio_nav(desg_neu[t], fwd_ret[t], top=True)
re = fwd_ret[t].mean()
nav_high.append(1 + rh); nav_low.append(1 + rl)
nav_imp.append(1 + ri); nav_ew.append(1 + re)python结果(模拟,年化):
| 组合 | CAGR | Sharpe |
|---|---|---|
| 低 ESG(水平最低组) | 11.5% | 1.10 |
| 高 ESG(水平最高组) | 12.5% | 1.13 |
| 等权基准 | 14.7% | 1.49 |
| ESG 改善(ΔESG 最高组) | 17.1% | 1.50 |

注意一个反直觉点:静态高 ESG 组(12.5%)甚至跑输等权基准(14.7%)。这正是真实数据的缩影——naive 高 ESG 筛选往往因为超配低增长公用事业、低配高估值科技,反而吃行业亏;而「ESG 改善」作为类似 momentum 的信号,才真正贡献了超额。
四、为什么 ESG 难成干净的 Alpha#
把上面现象归纳成四条硬约束:
- 拥挤与提前消化:ESG 已是万亿级配置主题,好公司的溢价早被买进去,水平因子接近「已知信息」,IC 自然衰减。
- 数据滞后与 greenwashing:披露慢半拍,且存在「洗绿」(表面高分、实质一般)。用滞后数据训练,等于用旧闻预测未来。
- 行业暴露伪装成因子:不中性化的 ESG 因子,大半是行业 beta。你以为在押 ESG,其实在押「低波防御板块」。
- 危机期的 ESG 崩塌:2022 年能源股大涨、ESG 基金跑输,说明 ESG 约束在通胀/商品周期里会系统性拖累——它本质是风险约束,不是全天候 alpha。
五、可落地的用法(别丢,也别神话)#
量化上 ESG 最稳的位置不是「选股主因子」,而是两层辅助:
- 作为风险约束:在组合优化里加
esg >= 阈值或esg 行业中性,把不可投资的尾部(治理极差、争议事件)挡在门外,不指望它贡献收益,只求少踩雷。 - 作为增强信号:用 ΔESG(改善) 而非绝对分做 tilt 或叠加到既有多因子模型——它是少数有信息增量的 ESG 维度,且和估值、动量相关度低,能补一块空白。
# 把 ΔESG 当作一个正交增强因子,叠加到现有打分
composite = 0.7 * existing_alpha + 0.3 * desg_neu # 仅作示意权重
# 关键:desg_neu 必须先行业中性化,否则又变回行业暴露python六、小结#
ESG 数据能转化为 alpha,但转化的入口不在「绝对分高」,而在「在改善」。学术与本文模拟一致地指向同一结论:
- ESG 水平因子:净 alpha ≈ 0,主要价值是风险约束与合规过滤;
- ESG 改善(ΔESG)因子:有稳定、显著更强的 IC,是真正可交易的信息增量;
- 任何用法前,行业中性化 + 多源交叉验证 + 警惕滞后 是三道不能省的工序。
把可持续数据当「信仰」会亏钱,当「约束 + 改善信号」才是对它最诚实的量化态度。
本文面板为自包含模拟(300 只股票、含行业偏差与 E/S/G 噪声),用于演示因子构建与 IC 逻辑;实盘接入需替换为真实评级数据并严格行业中性化,结果会因数据质量与样本期显著不同。