一、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评级变化率。结果回测效果很差。后来加入价格动量和舆情动量,效果才起来。嗯,这里有个教训:单一数据源永远不够。
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动量因子从理论变成代码,从代码变成策略,从策略变成收益。
准备好了吗?