数据准备:ESG评级数据获取与清洗

做ESG负面剔除,第一步就是搞数据。这步要是没做好,后面所有分析都是空中楼阁。我见过太多人花大把时间调模型,结果发现数据源本身就有问题——那真是白忙活一场。

今天咱们就聊聊,怎么把ESG评级数据拿到手、洗干净、对齐好。说白了,就是让数据变得「能用」。你想想看,如果连MSCI和Sustainalytics的评级都搞混了,那剔除组合还怎么建?

主流ESG评级机构数据源介绍

目前市场上主流的ESG评级机构,我接触下来主要有这几家:

  • MSCI ESG Ratings:覆盖全球超过8,500家公司,评级从AAA到CCC。我个人习惯用MSCI做基准,因为它覆盖面广,而且历史数据比较完整。
  • Sustainalytics:侧重ESG风险评级,分数越低风险越小。它家对争议事件的反应特别快,我曾在项目中用它来捕捉某家能源公司的突发环境事故。
  • Refinitiv (路孚特):数据颗粒度很细,有超过630个指标。嗯,这里要注意,它的评分逻辑跟MSCI不太一样,直接对比容易出问题。
  • Bloomberg ESG Disclosure Scores:主要看披露质量,不是看绩效。说白了,它衡量的是「你说没说」,而不是「你做没做」。

每家机构的评级逻辑都不一样。举个例子,MSCI看重行业实质性,Sustainalytics更关注未管理的风险敞口。我在项目中遇到过这样的情况:同一家公司,MSCI给了AA,Sustainalytics却给了高风险。为什么?因为评价维度不同。所以,做负面剔除时,我建议至少用两家机构的数据做交叉验证。

核心要点: 不要迷信单一评级机构。每家都有自己的方法论盲区。用两家以上数据源做交叉验证,是ESG数据清洗的第一条铁律。

数据清洗实战:从原始数据到可用格式

拿到原始数据后,你会发现——嗯,真是一团乱麻。不同机构的字段命名不同,日期格式不同,甚至公司标识符也不同。我刚开始做ESG研究时,光清洗数据就花了两周。

下面是我总结的一套清洗流程:

  1. 统一公司标识符:把ISIN、CUSIP、SEDOL都映射到统一的ID体系。我习惯用ISIN作为主键,因为它全球通用。
  2. 对齐评级日期:MSCI每年更新一次,Sustainalytics可能每季度更新。时间戳不对齐,分析结果就会失真。
  3. 处理缺失值:这是最头疼的一步。有些小公司根本没有ESG评级,怎么办?
  4. 标准化评级尺度:把AAA-CCC、0-100分、1-5星都映射到统一尺度上。

来看一段我常用的Python清洗代码:

import pandas as pd
import numpy as np

# 加载MSCI和Sustainalytics数据
msci = pd.read_csv('msci_ratings.csv')
sustain = pd.read_csv('sustainalytics_ratings.csv')

# 统一公司标识符为ISIN
msci['isin'] = msci['isin'].str.upper().str.strip()
sustain['isin'] = sustain['isin'].str.upper().str.strip()

# 对齐日期到季度末
msci['date'] = pd.to_datetime(msci['rating_date'])
msci['quarter'] = msci['date'].dt.to_period('Q')

# 处理缺失值:用行业均值填充
def fill_missing_by_sector(df, sector_col, rating_col):
    sector_mean = df.groupby(sector_col)[rating_col].transform('mean')
    df[rating_col].fillna(sector_mean, inplace=True)
    return df

msci = fill_missing_by_sector(msci, 'sector', 'esg_score')
我的经验: 缺失值处理不要一刀切。如果某公司连续3年都没有ESG评级,我建议直接标记为「数据不可得」,而不是强行填充。因为缺失本身也是一种信息——可能意味着这家公司ESG披露极差。

数据对齐:跨机构评级的映射技巧

不同机构的评级尺度完全不同。MSCI用字母等级,Sustainalytics用百分制,Bloomberg用披露分数。怎么对齐?

我常用的方法是百分位映射法:

MSCI等级 对应百分位 Sustainalytics风险等级 对应百分位
AAA 90-100 可忽略风险 (0-10) 90-100
AA 75-90 低风险 (10-20) 75-90
A 60-75 中风险 (20-30) 60-75
BBB 45-60 高风险 (30-40) 45-60
BB及以下 0-45 严重风险 (40+) 0-45

你看,这样映射后,两家机构的评级就能放在同一个尺度上比较了。我曾经用这个方法处理过3000多家公司的数据,效果还不错。

缺失值处理的进阶策略

缺失值处理,说白了就是「猜」。但怎么猜得有道理?

  • 行业均值填充:适用于行业内部ESG表现差异不大的情况。比如公用事业公司,ESG水平相对接近。
  • 时间序列插值:如果某公司去年有评级、今年没有,可以用线性插值。但要注意——如果公司发生了重大争议事件,插值会严重失真。
  • 模型预测填充:用公司财务数据(市值、ROE、杠杆率)来预测ESG评级。这个方法精度高,但计算量大。
避坑指南: 我曾经在构建负面剔除组合时,直接用均值填充了所有缺失值。结果呢?组合里混入了好几家「数据黑洞」公司——它们没有ESG评级,恰恰是因为ESG表现太差、不敢披露。那次回测结果完全失真。所以,缺失值处理一定要结合业务逻辑,不能纯技术操作。

知识体系:ESG数据准备全流程

下面这张图,是我自己总结的ESG数据准备全流程。你一看就明白了:

ESG数据准备全流程 数据获取 MSCI / Sustainalytics 标识符统一 ISIN / CUSIP 映射 日期对齐 季度末 / 年末 缺失值处理 行业均值填充 适合同质化行业 时间序列插值 需排除争议事件 模型预测填充 精度高但计算量大 清洗后的ESG数据集

你看,整个流程其实就五步:获取数据 → 统一标识符 → 对齐日期 → 处理缺失值 → 输出可用数据集。每一步都有坑,但踩过一遍之后,后面就顺了。

最后说一句:数据准备这件事,没有捷径。我做了这么多年量化,最深的体会就是——数据质量决定了分析的天花板。你模型再牛,数据是垃圾,结果就是垃圾。所以,别嫌麻烦,把这一步做扎实了。

专注资料整理