第二章: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数据全景:从来源到清洗 数据源 数据粒度 数据频率 MSCI 评级体系成熟 中小盘覆盖不足 月度/季度更新 Sustainalytics 争议事件追踪强 评分标准不透明 持续更新 Refinitiv 覆盖面最广 指标定义清晰 年度更新为主 数据粒度:公司级 → 议题级 → 指标级 数据清洗四大坑:缺失偏倚 | 源不可比 | 时间戳陷阱 | 版本回溯 核心原则:理解数据生成过程,比模型更重要

最后说一句:ESG数据清洗没有银弹。每个项目、每个市场、每个数据源都有自己的脾气。多花时间理解数据生成过程,比急着跑模型有用得多。


公众号:蓝海数据掘金营,微信deep3321