1. 机构配置里突然多出来的“气候风险”到底是什么
我所在的量化团队从2022年开始系统性接触气候相关金融风险,当时最直观的感受是:这个名字听起来像ESG的另一种包装,但实际做起来完全是另一套逻辑。气候相关金融风险的量化与投资组合优化,本质上是一个把低频、高不确定、非线性变化的外生变量转译成投资组合可度量、可限制、可优化对象的过程。这篇文章把我这两年的实操经验、踩坑和最终沉淀下来的方法写出来,主要面向量化研究员、FOF投资经理、风控同事,也适合刚接触这个方向的从业者用来建立整体框架。
先说一个最容易绕晕的地方:气候风险不是一个风险,而是两个传导路径完全不同的风险。物理风险是指气候变化直接带来的资产损失、供应链中断和需求改变,包括台风、洪水、山火这类急性事件,也包括海平面上升、平均气温升高这类慢性过程。转型风险则是指经济体系向低碳转型带来的政策变化、技术替代、成本上升和市场偏好转移,高碳资产可能面临重新定价。我在内部讨论时习惯把它们比作“天灾”和“洗牌”。天灾是直接砸在资产负债表上,洗牌是慢慢侵蚀未来现金流的折现率。
1.1 物理风险和转型风险不是同一张风险清单
物理风险的作用对象通常带有明确的地理属性。比如一家生产制造公司在沿海低洼区有工厂,洪水百年一遇重现期提高,意味着停工概率、维修费用和保险成本都会上升。这类风险是可以做空间叠加的,把持仓公司映射到设施位置,再把设施位置映射到灾害概率图,就能算出一个相对客观的暴露分数。
转型风险则相反,它更依赖行业逻辑和时间路径。一家电力公司如果高碳排放资产占比高,当碳价快速上升、清洁能源技术成本下降,公司的盈利预测就需要大幅下调。这里的核心不是地理,而是营收结构、资产结构、资本开支方向。所以物理风险和转型风险在建模时必须有完全不同的数据链路,强行合成一个“气候ESG打分”虽然省事,但会损失掉关键的决策信息。
我见过不少团队一上来就找数据商买一个现成的气候风险总分,然后直接放进组合优化。结果总分里面既包含了物理暴露,又包含了行业转型压力,甚至还有治理指标,最后谁都说不清优化器究竟在惩罚什么。这种做法在风控委员会那里尤其难通过,因为归因说不清。一旦组合收益下滑,你很难证明是气候因子在起作用,还是模型随机扰动搞出来的。
1.2 从“环境议题”到“组合损失”:传导链条才是关键
量化模型处理的不是天气,也不是新闻,而是现金流。气候风险要进入投资决策,必须有一条完整的传导链条。我对团队的要求是,任何一个气候指标都必须能回答两个问题:它影响公司利润表的哪一行?它影响资产负债表上的哪一项?比如高温灾害增加制冷用电需求,对应的是公用事业公司的营业收入和运营成本;沿海洪水增加物理资产减值概率,对应的是固定资产减值准备和保险费用;碳价上升则直接体现为成本项上升,进而压缩EBITDA margin。
没有这条传导链条,气候数据就只是PPT材料,不可能成为组合层面的风险约束。这也是气候风险量化和一般ESG评分的最大分界岭:ESG评分更多反映综合可持续性,而气候风险量化必须落到财务损失率、波动率贡献、回撤幅度这类投资语言上。团队里一位前辈说得很直接:“如果这个指标不能进估值模型,那它就不配进投资组合。”
2. 把温度和海平面变成组合输入:风险量化的数据链路设计
气候风险想要真正参与投资决策,第一件要做的事不是建模,而是把天空中的气候信号变成证券级别的风险因子。这个数据链路通常由五个环节构成,缺一环就会出现“用火箭模型算出自行车数据”的尴尬局面。
第一步是给组合里的持仓打上地理和行业标签。听起来简单,做起来非常繁琐。一家公司可能总部在北京上海,生产基地在沿海化工园区,销售网络遍布全国,不同数据商给出的地理坐标完全不同。我建议至少要做两套标签:一套是总部注册地,一套是设施级分布的营收权重,两套结果同时保留,用于敏感性对比。第二步是引入气候情景数据,包括历史灾害记录和未来情景下的温度、降水、海平面、风速等变量。第三步是把位置暴露与灾害概率匹配,得到物理暴露评分。第四步是构造行业转型敏感度矩阵,衡量高碳营收占比、碳强度、绿色技术储备等。最后才是汇总到组合维度。
2.1 物理风险与转型风险的数据特征差异
物理风险数据和转型风险数据的差别非常明显,我在实际工作中习惯用表格给同事做快速科普:
| 维度 | 物理风险数据 | 转型风险数据 |
|---|---|---|
| 核心变量 | 洪水深度、风速重现期、野火概率、海平面高度 | 碳价情景、碳排放强度、绿色营收占比、技术替代成本 |
| 主要颗粒度 | 地理坐标、设施点位 | 公司、行业、国家/区域 |
| 时间尺度 | 天/季节尺度的极端事件,也有长期慢性趋势 | 季度/年度政策与资本开支变化 |
| 获取渠道 | 气象模型、灾害地理信息系统、再保险数据 | 企业披露、监管申报、第三方测算、行业协会 |
| 主要痛点 | 历史事件稀疏,未来情景模型差异大 | 口径不一,Scope 1/2/3覆盖混乱,缺失率高 |
这个对比告诉我一个现实:物理风险更像空间问题,转型风险更像价格和时间问题。你不能用同一个函数把两者糅在一起,至少不能未经校准就糅。
2.2 把温度变成风险因子的具体做法
行业内最常见的入门指标是度日数。制冷度日数CDD衡量的是日平均温度超过基准温度的部分,采暖度日数HDD则相反,这两个指标虽然朴素,但能够直接驱动电力需求、能源成本和季节性消费。对电力公用事业、零售、农业板块来说,CDD和HDD的异常波动会对短期利润产生可测影响。
举例说明:一天平均气温25摄氏度,基准温度18摄氏度,当天的制冷度日数就是CDD=25-18,也就是7。一热一冷,单位是“度·日”。把整个夏季加总,横向比对比历史均值,就能得到“这个夏天有多热”的一个量化描述。再把公司营收的空间分布与区域度日数结合,就能估算极端高温对一家零售企业全国门店电费和客流的影响。这个数据链路虽然粗糙,但胜在可解释、可验证、可追溯。
组合层面的暴露聚合也有一套标准写法。简单示意,把每个持仓的物理暴露分和转型敏感度按权重加权求和即可得到组合层面的综合暴露:
def aggregate_climate_exposure(positions, physical_score, transition_sensitivity): total = 0.0 for pos in positions: phy = physical_score[pos.ticker] # 0~1,越高越危险 tra = transition_sensitivity[pos.sector] # 0~1,越高越脆弱 total += pos.weight * (0.5 * phy + 0.5 * tra) return total需要注意,这里的0.5权重只是示例。实际项目里物理与转型的权重应该根据组合定位动态设定,比如长周期养老金组合更关注转型风险,而重资产物业组合更关注物理风险。好的做法是分别输出物理暴露分数和转型暴露分数,在压力测试阶段再整合,而不是在一开始就合并成一个数。
3. 优化模型里怎么塞进气候因子而不把组合搞变形
很多同事第一次接触这个问题时,以为直接把气候评分作为收益预期放进均值方差优化就能解决。结果优化器会在“气候得分高”和“历史收益高”之间来回摇摆,最终生成一个风格极度偏移、行业权重失控的组合。问题出在大多数气候风险指标衡量的是风险敞口,不是预期收益,你把一个风险变量当成alpha来用,等于逼优化器做不等式求逆,结果自然荒谬。
我倾向于把气候风险因子当成风险预算的一部分,而不是收益预测的一部分。气候风险需要被限制、被对冲、被定价,但很难被精确预测为“这个季度带来几个点收益”。这个认知改变之后,模型设计的思路就顺了。
3.1 为什么不能直接把气候评分当alpha用
气候风险评分通常具备低频率、厚尾、跨期不确定性大的特点。它不像动量或价值因子,有长期稳健的收益截面关系。某个区域洪水概率上升,对应的可能是相关保险股短期承压,但也有可能带动重建概念股上涨,传导方向并不单一。如果强行把评分因子化,很容易做出一个在历史回测里有效、实盘却持续亏钱的伪因子。
另一个问题是非对称性。气候风险对组合的影响更多集中在左尾,也就是极端损失端,而传统均值方差模型用协方差矩阵只关心波动幅度,不区分上涨和下跌。举个例子:一个资产在99%的时间里平稳,1%的时间里暴跌,传统方差可能看起来很小,气候情景下的条件损失却可能惊人。没有左尾约束,优化器会把这种资产当成优质低波动资产配得很高,实盘遇到极端天气时直接吃下全部损失。
3.2 三种可落地的建模姿势
我实际用过、也帮助同事落地过三种方式,各有适用场景。
第一种是约束法,也是最容易向风控和投委会解释的方法。把组合的气候暴露分数设定上限,比如“组合物理暴露加权得分不得超过基准的1.2倍”“高转型风险行业暴露不超过总权重10%”,然后在优化器里把这个不等式条件加进去。优点是透明直观,缺点是约束过硬,可能让组合在行业配置上出现不自然的跳跃,比如突然砍掉某个被市场公认低估的行业。
第二种是罚函数法。在优化的目标函数中加入一个气候风险惩罚项,比如优化目标为组合收益率减去波动率惩罚,再减去气候暴露惩罚。公式形式大致是组合收益减半倍风险惩罚,再减lambda乘以气候暴露分数,lambda表示对气候风险的厌恶程度。lambda定多少没有标准答案,通常的做法是先跑一遍优化,观察组合气候暴露从原始水平下降到目标水平时,预期收益或跟踪误差牺牲了多少,画一条“边际成本曲线”,让投委会在成本和风险之间选一个可接受的点。这种方法的优势是连续可调,不会因为一个硬约束导致组合剧变。
第三种是情景目标优化,近年我们越来越倾向于这种方案。它对每个气候情景分别计算组合的尾部损失,然后优化最坏情景下的CVaR,也就是条件风险价值。比如把未来可能出现的高温、洪水、碳价上行、技术替代等情景各跑一遍,找出每种情景下组合损失的分布,再在优化目标中惩罚“最差的那一批情景”。这样模型真正开始把气候风险当作尾部风险来管理,而不是简单的均值调整。
无论选择哪种方式,我有一条铁律:气候暴露的调整不能以自然灾害作为唯一标准,还要保持组合行业权重和风格因子相对中性。如果气候优化最后做出来的是“全面低配能源、低配制造业”,那其实是在做行业轮动,不是在管理气候风险。正确做法是锁定基准的行业中性条件,让优化器在行业内筛选气候暴露更低的个股。
4. 情景压力测试:组合面对极端气候情景时的业绩推演
气候风险最棘手的一点是“历史没有给你足够的样本来下结论”。百年一遇的洪水,在只有几十年股票历史的市场里几乎等于没有样本。因此气候风险的压力测试不能完全依赖历史回测,必须依赖前瞻性情景推演。所谓情景压力测试,本质上不是一个预测工具,而是一个“what-if”工具:假设未来某个时点组合处在一个特定的极端气候环境下,各资产按模型重估,组合净值能扛住多少损失。
4.1 一个手工可复现的最小压力测试流程
最小流程可以分成四步。第一步设计情景,明确冲击变量,比如“某大型沿海城市遭遇百年一遇台风暴雨,并伴随三日以上的城市内涝”“某地区碳价在一年内快速上升至原水平的三倍”。第二步把冲击变量映射到行业和个股的财务变量上,例如运输成本上升、工厂停产率上升、保险理赔支出上升。第三步用估值模型重估受影响资产的损益,可以采用简化方法:先估算对EBITDA的影响幅度,再乘以行业平均估值倍数,得到个股价格影响,最后按权重加权成组合损失。第四步把多个情景结果汇总,输出组合层面的条件损失区间。
我给大家列一个完全虚构的示例表格,这个数字结构在实际项目中很常见:
| 情景名称 | 核心冲击变量 | 主要受影响板块 | 模拟组合损失区间 |
|---|---|---|---|
| 沿海强台风 | 生产停工、物流中断、保险成本上升 | 机械制造、港口公路、财产保险 | -4.5%至-8.0% |
| 碳价快速上行 | 碳成本占营收比率大幅提高 | 电力、建材、化工 | -3.0%至-6.5% |
| 极端高温干旱 | 用电需求上升、农业减产、水资源紧张 | 电力、消费食品、水务 | -2.0%至-5.0% |
| 技术替代加速 | 新能源渗透率提升、高碳资产折旧加速 | 传统能源、汽车零部件 | -2.5%至-4.5% |
损失区间比单点数值重要。我看到太多团队在压力测试里只输出一个均值,比如“组合平均损失-5.2%”,这个数字看起来精确,实际上掩盖了模型不确定性。气候模型本身就是一堆概率分布,不同气候模式预测的未来降水、风速差异很大,你用单一均值做组合决策,等于在走钢丝。
4.2 压力测试结果怎么变成风控动作
压力测试做完不是交一份报告就结束,关键是把结果变成风控阈值。我们团队现在采用的做法是:为每个情景设定“容忍阈值”,当情景模拟的组合损失超过某一水平时,强制触发再平衡。比如沿海台风情景下组合损失超过6%,意味着物理暴露明显高于团队愿意承担的水平,此时必须把组合中物理暴露得分最高的若干持仓权重降至基准以下。
这条规则看起来简单,但执行时有一个容易被忽略的问题:压力测试用的持仓数据必须和实盘一致。我们曾因为系统对接延迟,用上月末的持仓做了本月压力测试,结果风险暴露低了一截,投委会差点据此放行了本应限制的加仓。从那以后,压力测试的持仓全部改为实时同步,并且每次触发阈值后重新跑完整套估值链路,而不是只调整权重上限。
5. 实盘落地的避坑记录:我所在团队的三个教训
这部分算是两年实操下来最有增量价值的内容。成功的案例大家都写得差不多,真正差异化的反而是那些让模型翻车、让业绩变差、让风控会议的纪要里多出三四页讨论的坑。
5.1 教训一:错误的地理位置比没有地理位置更危险
第一次做物理风险暴露时,团队图省事,直接拿上市公司注册地址作为设施位置,再用行政区域匹配洪水概率。结果把一家实际生产设施位于内陆河谷的企业,因为办公注册地在市中心写字楼,算出了几乎为零的洪水暴露。等到第二年某个属地出现暴雨内涝,股价和利润双双下跌,我们才发现自己的暴露评分表里这家公司赫然排在“低风险”一档。
后来我们把规则改成设施级地理信息加权:优先获取公司披露的生产基地、仓储中心、门店分布,按照固定资产占比或营收占比加权出公司级物理暴露得分。如果设施数据无法完全覆盖,至少标注“数据完整度”字段,在组合优化时对低完整度的公司施加权重上限。现在团队内部已经形成共识:宁可用一个覆盖70%设施但路径清晰的数据,也不要一个看起来精确到经纬度但实际语义错误的总部坐标。
5.2 教训二:碳数据的口径不一致会吃掉模型可信度
转型风险建模里最刚需的数据是碳排放强度,但这个字段在不同数据商之间几乎没有可比性。同一家公司,从A数据商拿到的Scope 1加Scope 2碳强度,和从B数据商拿到的数值可以相差接近一倍。原因出在边界定义上:有的数据商只纳入母公司直接排放,有的把参股联营公司排放也算进去;有的用营收做分母,有的用总资产。如果我们不加校准就拿两家的数据混合建模,碳排放因子基本上就变成了噪声。
我们的解决方法是建立一条碳数据校对流水线。首先统一边界,只保留Scope 1和Scope 2作为核心口径,Scope 3单独存放,不进核心优化模型。其次与公司年报或监管披露的绝对排放量交叉验证,如果第三方数据与披露数偏差超过一定比例,需要人工复核并标注调整原因。最后对所有缺失值采用行业同规模组中位数插补,避免模型自动跳过那些“没有碳数据的小公司”而导致幸存者偏差。这个过程很枯燥,但它是转型风险模型不被打回重建的底线。
5.3 教训三:单一情景约束会把组合推入另一个死角
我们曾经犯过一个方向性的错误:在气候情景集合里只选取“最坏物理灾害”作为硬约束,要求所有情景下组合损失不超过3%。模型确实非常听话,把沿海、沿河、高灾频发区域的资产几乎全部低配或清零,结果组合变成了“远离自然灾害,但行业集中度极高”的畸形状态。后面市场风格一轮切换,组合因为行业过度集中出现了远超气候风险的普通市场回撤。
这个经历让我明白,气候风险优化的目标不是追求单一情景安全,而是追求在所有情景集合下的稳健。现在我们的做法是给情景设定概率权重,常规情景权重高、极端情景权重低,优化目标同时考虑加权预期损失和极端尾部损失。相当于在“平时不太差”和“极端不崩盘”之间找平衡点,而不是把宝押在某一类气候叙事上。另外,天气模型本身也有误差,我们还会给气候参数加一个先验区间,资产的气候暴露得分取区间中值而非点值,让优化器不那么容易因为单点误差做出极端决策。
最后分享一个正在推进的小技巧:把气候压力测试的阈值做成动态参数,而不是每年固定一次。过去我们一年重估一次情景参数,结果中间市场上已经出现了更恶劣的气候数据,组合却还在用旧的暴露阈值。现在改成每季度根据最新气候观测数据校准一次情景概率,这套流程对团队来说多了一点工作量,但确实能让气候风险管理和组合优化的节奏跟市场资讯保持同步。