第二章:ESG数据全景——数据来源、粒度与清洗的坑
做ESG量化,第一步不是写代码,而是搞懂数据。
我见过太多团队,模型建得漂漂亮亮,结果数据源选错了,全白干。ESG数据不像股价,每天收盘就一个数字。它复杂、混乱、充满主观判断。今天我就带你把这摊事理清楚。
核心观点:ESG数据质量直接决定因子有效性。数据清洗花掉的时间,通常占整个项目的60%以上。
2.1 三大主流数据源:MSCI、Sustainalytics、Refinitiv
目前市场上,ESG数据供应商少说几十家。但真正被机构广泛采用的,其实就三家。
2.1.1 MSCI ESG Ratings
MSCI 的评级体系,我个人觉得是最「量化友好」的。它把每个公司拆成 35 个关键议题,每个议题打分,最后加权汇总。评级从 AAA 到 CCC,一共七档。
我记得有一次做回测,发现 MSCI 的数据对大型公司覆盖很全,但中小盘股经常缺数据。嗯,这个坑后面会细说。
2.1.2 Sustainalytics
Sustainalytics 的强项在于「争议事件」的追踪。它专门有一个模块叫 Controversy Research,专门盯着公司有没有环境污染、劳工纠纷、数据泄露这些破事。
说白了,如果你要做「尾部风险」相关的因子,Sustainalytics 比 MSCI 更敏感。我有个项目,就是用它的争议事件评分构建了一个「丑闻预警因子」,效果出奇的好。
2.1.3 Refinitiv (原汤森路透)
Refinitiv 的数据覆盖面最广,全球超过 10,000 家公司。它的评分体系比较透明,每个指标都有详细的定义和计算方式。
我个人习惯用 Refinitiv 做初筛,因为它数据量大,适合做全市场扫描。但要注意,它的数据更新频率偏低,有些指标一年才更新一次。
| 数据源 | 覆盖范围 | 更新频率 | 核心优势 | 主要缺点 |
|---|---|---|---|---|
| MSCI | 约 8,500 家公司 | 月度/季度 | 评级体系成熟,量化友好 | 中小盘覆盖不足 |
| Sustainalytics | 约 12,000 家公司 | 持续更新 | 争议事件追踪能力强 | 评分标准不够透明 |
| Refinitiv | 约 10,000+ 家公司 | 年度为主 | 覆盖面广,指标定义清晰 | 更新频率低,有时滞 |
2.2 数据粒度与频率:你该用日频还是年频?
这个问题,我经常被问到。很多人一上来就想用日频数据做高频交易,但ESG数据不是股价。
2.2.1 数据粒度
ESG数据有三个常见粒度:
- 公司级:每个公司一个总分。最简单,但信息损失最大。
- 议题级:比如碳排放、董事会多样性、供应链管理,每个议题单独打分。我个人推荐这个粒度,因为可以自己构建因子。
- 指标级:最细的粒度,比如「温室气体排放量(吨CO2e)」、「女性董事占比(%)」。适合做深度研究,但数据缺失率极高。
我的建议:如果刚开始做,从议题级入手。既保留了足够的信息,又不会因为缺失值太多而崩溃。
2.2.2 数据频率
ESG数据大部分是年度更新的。为什么?因为很多指标,比如碳排放数据,公司一年才披露一次。
有些供应商会做「季度滚动更新」,但说白了,那只是把去年的数据往前推,实际信息量没变。
你想想看,如果用年度ESG数据去做日频交易策略,那基本是伪命题。我建议至少用月度频率做因子计算,再低就没什么意义了。
2.3 数据清洗的坑:我踩过的那些雷
这部分是重点。数据清洗占了我ESG项目里至少一半的时间。下面这几个坑,我一个个说。
2.3.1 坑一:缺失值不是随机的
很多人一上来就用均值填充缺失值。大错特错。
ESG数据的缺失往往是有偏的。小公司、新兴市场的公司,数据缺失率远高于大公司。如果你简单填充均值,相当于把大公司的特征强加给小公司,因子会严重失真。
我曾经犯过这个错,回测结果漂亮得不行,结果实盘一跑就崩。后来发现,因为缺失值填充导致因子在小盘股上完全失效。
避坑指南:先分析缺失模式。如果缺失集中在某些行业或市值区间,考虑分组填充,或者干脆剔除该样本。
2.3.2 坑二:不同数据源的评分不可直接对比
MSCI 的 A 级,不等于 Sustainalytics 的 A 级。每个供应商的评分标准、权重、覆盖范围都不一样。
我见过有人把 MSCI 和 Refinitiv 的数据直接合并成一个面板数据,然后跑回归。结果出来一堆伪相关。
正确的做法是:要么只用一个数据源,要么做标准化处理(比如 z-score 或百分位排名),让不同来源的数据可比。
2.3.3 坑三:时间戳的陷阱
ESG数据的时间戳,不是你想的那样。很多供应商标注的「发布日期」,其实是数据收集的截止日期,而不是实际反映的时期。
举个例子:某公司2023年的碳排放数据,可能在2024年6月才发布。如果你用2024年6月的时间戳去匹配2024年6月的股价,那就犯了前瞻性偏差。
我个人习惯:永远用「财报截止日」或「数据反映的会计期间」作为时间戳,而不是发布日期。
2.3.4 坑四:数据修正与回溯
ESG数据供应商经常做历史数据修正。你今天下载的数据,和三个月前下载的同一家公司同一时期的数据,可能不一样。
为什么?因为供应商会不断更新方法论,或者发现之前的错误。
这会导致一个严重问题:你的回测结果可能无法复现。我建议每次下载数据时,都保留原始时间戳和版本号。最好建立一个数据版本管理机制。
# 一个简单的数据版本管理示例
import pandas as pd
from datetime import datetime
def load_esg_data(source, version_date):
"""
加载指定版本日期的ESG数据
source: 'msci', 'sustainalytics', 'refinitiv'
version_date: 数据下载日期,格式 'YYYY-MM-DD'
"""
file_path = f'data/{source}/esg_{version_date}.parquet'
df = pd.read_parquet(file_path)
df['data_version'] = version_date
df['download_timestamp'] = datetime.now()
return df
# 使用示例
df_2024q1 = load_esg_data('msci', '2024-04-01')
df_2024q2 = load_esg_data('msci', '2024-07-01')
# 对比两个版本,看看哪些数据被修正了
2.4 本章知识体系总览
下面这张图,把ESG数据的全貌串起来了。从数据源到清洗,每一步都有坑,每一步都有解法。
最后说一句:ESG数据清洗没有银弹。每个项目、每个市场、每个数据源都有自己的脾气。多花时间理解数据生成过程,比急着跑模型有用得多。
公众号:蓝海数据掘金营,微信deep3321