数据准备: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研究时,光清洗数据就花了两周。
下面是我总结的一套清洗流程:
- 统一公司标识符:把ISIN、CUSIP、SEDOL都映射到统一的ID体系。我习惯用ISIN作为主键,因为它全球通用。
- 对齐评级日期:MSCI每年更新一次,Sustainalytics可能每季度更新。时间戳不对齐,分析结果就会失真。
- 处理缺失值:这是最头疼的一步。有些小公司根本没有ESG评级,怎么办?
- 标准化评级尺度:把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')
数据对齐:跨机构评级的映射技巧
不同机构的评级尺度完全不同。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数据准备全流程。你一看就明白了:
你看,整个流程其实就五步:获取数据 → 统一标识符 → 对齐日期 → 处理缺失值 → 输出可用数据集。每一步都有坑,但踩过一遍之后,后面就顺了。
最后说一句:数据准备这件事,没有捷径。我做了这么多年量化,最深的体会就是——数据质量决定了分析的天花板。你模型再牛,数据是垃圾,结果就是垃圾。所以,别嫌麻烦,把这一步做扎实了。