使用Python计算风险模型参与者Shapley值获取边际贡献方法咨询
风险场景下Shapley边际贡献计算方案
前置数据修正
你提供的样本中存在2条Firm为H的预期损失记录,先合并得到H的独立预期损失总额为27755.97,修正后的全量独立损失数据如下:
Firm 独立预期损失 A 6,103.40 B 12,370.25 C 11,897.43 D 5,199.82 E 26,384.77 F 5,747.24 G 31,206.84 H 27,755.97 I 11,357.89 合计 138,023.60
和你给出的总风险数值完全匹配,可直接用于后续计算。
Shapley值核心计算逻辑
针对风险分摊场景的Shapley值,本质是计算单个主体加入所有可能的参与方子集时,带来的边际风险贡献的加权平均值,公式为:
φᵢ = Σ [ |S|! × (n - |S| - 1)! / n! ] × [ v(S ∪ {i}) - v(S) ]
各参数含义:
- n为参与方总数,修正后本场景n=9
- S为不包含主体i的任意参与方子集
- v(S)为子集S的联合风险损失
如果当前你仅持有各主体独立风险损失、没有任意子集的联合风险数据,可默认采用加和规则:v(S)等于S内所有主体的独立损失之和,该场景下Shapley值等于各主体自身的独立损失,边际贡献占比为该主体独立损失除以总风险
如果你持有子集联合风险数据(比如多主体联合存在风险分散/放大效应,联合损失不等于独立损失加和),替换v(S)为实际联合损失即可。
落地计算步骤
无联合风险数据场景
直接用各主体独立损失作为Shapley值即可,比如:
- A的边际贡献为6103.40,占总风险比例约4.42%
- B的边际贡献为12370.25,占总风险比例约8.96%
其余主体以此类推计算即可。
有联合风险数据场景
9个参与方总共有512个子集,可通过代码批量计算,示例代码如下:
import itertools import math # 参与方列表 players = ['A','B','C','D','E','F','G','H','I'] n = len(players) shapley_res = {} # 自定义函数:输入参与方子集,返回该子集的实际联合风险损失 def get_joint_risk(subset): # 此处替换为你实际的联合风险查询逻辑 # 示例默认用加和规则,有实际数据可直接修改 risk_map = { 'A':6103.40, 'B':12370.25, 'C':11897.43, 'D':5199.82, 'E':26384.77, 'F':5747.24, 'G':31206.84, 'H':27755.97, 'I':11357.89 } return sum([risk_map[p] for p in subset]) for player in players: shapley_val = 0 other_players = [p for p in players if p != player] # 遍历所有不包含当前主体的子集 for k in range(len(other_players)+1): for subset in itertools.combinations(other_players, k): # 计算权重 weight = math.factorial(k) * math.factorial(n - k -1) / math.factorial(n) # 计算边际贡献 marginal = get_joint_risk(subset + (player,)) - get_joint_risk(subset) shapley_val += weight * marginal shapley_res[player] = round(shapley_val, 2) print(shapley_res)
运行代码即可得到所有主体的Shapley边际贡献结果。
内容的提问来源于stack exchange,提问作者charl0
相关产品推荐
相关产品推荐

