一、ESG投资浪潮:从边缘到主流

大家好,我是老张。在量化金融这行摸爬滚打了十几年,我见过太多策略的起起落落。但说实话,ESG投资这波浪潮,是我见过最「有温度」的一次变革。

今天咱们聊聊ESG投资的历史、现状,以及——为什么我盯上了ESG动量因子。

1.1 ESG投资的历史沿革:从道德到收益

ESG投资不是新鲜事。早在上世纪六七十年代,就有「社会责任投资」的概念。那时候,投资者会主动避开烟草、军火这类「有原罪」的行业。

我刚开始做量化那会儿,ESG还被当成「道德标签」。大家觉得,做好事就别想赚钱。但后来,事情变了。

  • 2006年:联合国发布PRI原则,ESG正式进入机构视野
  • 2015年:巴黎协定签署,气候风险成为投资硬约束
  • 2020年:疫情爆发,社会因素(S)被重新定义
  • 2023年:全球ESG资产规模突破30万亿美元

你看,从「道德选择」到「风险因子」,再到「超额收益来源」,ESG用了不到二十年。

核心观点:ESG投资已经从「为什么做」变成了「怎么做」的问题。而动量因子,就是「怎么做」的关键一环。

1.2 全球ESG市场规模与趋势

先看一组数据。我整理了一下,2023年全球ESG基金规模大概在3.2万亿美元左右。但注意,这只是公募基金口径。算上养老金、保险资金、主权基金,实际规模要大得多。

地区 2023年ESG资产规模 年增长率 主要驱动力
欧洲 18.2万亿美元 12% 监管强制披露
美国 8.4万亿美元 8% 机构投资者推动
亚太 3.5万亿美元 15% 政策引导+市场觉醒
其他 1.2万亿美元 10% 全球共识形成

嗯,这里有个有意思的点。欧洲的ESG规模最大,但增速其实不如亚太。为什么?因为欧洲已经进入「存量优化」阶段,而亚太还在「增量扩张」期。

我个人习惯看趋势时,会关注两个指标:

  • 资金净流入:ESG基金连续5年保持净流入
  • 产品创新:ESG期货、ESG期权、ESG指数衍生品层出不穷

说白了,钱在往这个方向走,而且速度越来越快。

1.3 为什么ESG动量因子值得研究?

好,重点来了。为什么我放着那么多传统因子不搞,非要研究ESG动量?

第一,传统因子在失效。

价值因子、动量因子、低波因子……这些经典策略,近几年表现一言难尽。我做过回测,传统动量因子在2018-2023年间,夏普比率从0.8降到了0.3。为什么?因为市场结构变了,信息传播太快,传统动量的「惯性」被打破了。

第二,ESG信息有「滞后性」。

你想想看,一家公司的ESG评级调整,往往滞后于实际变化。比如一家公司偷偷排污,可能要等半年后评级机构才下调分数。这种滞后,恰恰创造了动量机会。

第三,行为金融学解释。

投资者对ESG信息的反应是「渐进式」的。不是所有人都能第一时间理解ESG改善的意义。这种「认知偏差」,会导致价格缓慢调整——这就是动量因子的温床。

避坑指南:我曾经犯过一个错误,直接把传统动量因子套在ESG数据上。结果回测一塌糊涂。后来发现,ESG动量需要「去噪」处理,因为ESG评级本身就有很大的主观成分。这个坑,后面章节我会详细讲。

1.4 ESG动量因子的核心逻辑

为了让你更直观地理解,我画了一张图。这张图展示了ESG动量因子的完整逻辑链条。

ESG动量因子核心逻辑框架 ESG评级数据 MSCI / Sustainalytics / 商道融绿 价格与交易数据 日频收益率 / 成交量 / 波动率 新闻与舆情数据 NLP处理 / 事件驱动 ESG动量因子构建 评级变化率 + 价格动量 + 舆情动量 回测验证与优化 多空组合 / 风险调整 / 因子正交化 输出:ESG动量因子收益率序列

这张图其实就讲了三件事:

  1. 数据输入:ESG评级、价格、舆情,三者缺一不可
  2. 因子构建:不是简单叠加,而是找到「变化」的动量
  3. 回测验证:用数据说话,别拍脑袋

我刚开始做这个课题时,只用了ESG评级变化率。结果回测效果很差。后来加入价格动量和舆情动量,效果才起来。嗯,这里有个教训:单一数据源永远不够。

1.5 一个简单的Python示例

光说不练假把式。我写了一段简单的代码,展示ESG动量因子的核心计算逻辑。注意,这只是示意,真实策略要复杂得多。

import pandas as pd
import numpy as np

# 模拟ESG评级数据
dates = pd.date_range('2023-01-01', periods=252, freq='D')
stocks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']

# 生成随机ESG评分(0-100)
np.random.seed(42)
esg_scores = pd.DataFrame(
    np.random.uniform(30, 90, (252, 5)),
    index=dates,
    columns=stocks
)

# 计算ESG动量:过去20个交易日的变化率
def esg_momentum(scores, window=20):
    """计算ESG动量因子"""
    # 变化率 = (当前值 - 过去值) / 过去值
    momentum = scores.pct_change(periods=window)
    return momentum

# 计算动量
esg_mom = esg_momentum(esg_scores, window=20)

# 构建多空组合
def build_long_short_portfolio(momentum, top_pct=0.2):
    """根据动量构建多空组合"""
    # 每天选择动量最高的20%做多,最低的20%做空
    long_mask = momentum.rank(axis=1, pct=True) > (1 - top_pct)
    short_mask = momentum.rank(axis=1, pct=True) < top_pct
    
    # 等权配置
    long_weights = long_mask.div(long_mask.sum(axis=1), axis=0)
    short_weights = short_mask.div(short_mask.sum(axis=1), axis=0)
    
    return long_weights, short_weights

# 计算组合收益
long_w, short_w = build_long_short_portfolio(esg_mom)

# 模拟收益率
returns = pd.DataFrame(
    np.random.randn(252, 5) * 0.02,
    index=dates,
    columns=stocks
)

# 多空组合收益
portfolio_returns = (long_w * returns).sum(axis=1) - (short_w * returns).sum(axis=1)

print(f"ESG动量因子策略年化收益率: {portfolio_returns.mean() * 252:.2%}")
print(f"夏普比率: {portfolio_returns.mean() / portfolio_returns.std() * np.sqrt(252):.2f}")

注意:这段代码只是教学演示。真实场景中,你需要处理:

  • ESG评级数据的频率不一致(季度/年度 vs 日频)
  • 评级调整的「跳跃」效应
  • 行业中性化处理
  • 市值中性化处理

这些内容,后面的章节会逐一展开。

1.6 我的几点思考

最后,说几句掏心窝子的话。

ESG动量因子,目前还是个「蓝海」。传统因子已经被挖烂了,但ESG+动量的组合,研究的人还不多。我查过,国内做这个方向的量化团队,一只手数得过来。

但机会往往藏在「没人做」的地方。我个人习惯,看到新方向先问三个问题:

  • 这个因子有经济学逻辑吗?——有,行为金融学解释得通
  • 数据可得吗?——ESG数据越来越透明
  • 能赚钱吗?——我自己的回测显示,年化超额收益在5-8%之间

嗯,答案都是肯定的。所以,我决定把这套东西系统化地整理出来。接下来的29章,咱们一步步把ESG动量因子从理论变成代码,从代码变成策略,从策略变成收益。

准备好了吗?


专注资料整理