Shock场景利率计算逻辑错误:需基于Implied基准修正
修正基于Implied基准的利率场景计算逻辑
问题核心
原代码的错误在于:直接对各场景自身的现有利率进行bps加减,而非以Implied场景的对应利率作为统一基准计算,同时EBA up/down场景未按币种预设shock值处理,导致计算结果完全偏离预期。
比如你提到的示例:
- Implied场景2024-06-30利率为5(即5%),+100场景正确值应为
5 + 100bps = 6,但原代码用+100场景现有值5.5加1得到6.5,逻辑完全错误。
修正后的代码实现
import pandas as pd # 预设EBA各币种对应的shock值(单位:bps) eba_shock_map = { 'AUD': 350, 'INR': 200, # 可根据实际需求添加其他币种 } # 读取目标Excel文件 df = pd.read_excel('your_rate_file.xlsx') # 提取所有月度利率列(假设列名格式为YYYY-MM-DD) rate_columns = [col for col in df.columns if col not in ['Scenario', 'Rate Index']] # 第一步:提取每个Rate Index对应的Implied基准利率数据 implied_base_rates = df[df['Scenario'] == 'Implied'].set_index('Rate Index')[rate_columns] # 第二步:遍历每一行,计算预期值并与实际值对比 for idx, row in df.iterrows(): current_scenario = row['Scenario'] current_rate_index = row['Rate Index'] # 获取当前Rate Index对应的Implied基准利率 base_rates = implied_base_rates.loc[current_rate_index] # 根据场景类型计算预期利率 if current_scenario in ['+100', '+25', '-25', '-100']: # 转换bps为百分比(100bps = 1%) bps_value = int(current_scenario) expected_rates = base_rates + (bps_value / 100) elif current_scenario == 'EBA up': # 从Rate Index中拆分币种(比如GL-AUD-AONIA-01D取第2段) currency = current_rate_index.split('-')[1] shock_bps = eba_shock_map.get(currency, 0) expected_rates = base_rates + (shock_bps / 100) elif current_scenario == 'EBA Down': currency = current_rate_index.split('-')[1] shock_bps = eba_shock_map.get(currency, 0) expected_rates = base_rates - (shock_bps / 100) elif current_scenario == 'Implied': # Implied场景为基准,无需对比检查 continue else: # 未知场景直接跳过 continue # 对比实际值与预期值,标记结果 for col in rate_columns: actual_value = row[col] expected_value = expected_rates[col] # 用1e-6的精度阈值避免浮点计算的微小误差导致误判 if not pd.isna(actual_value) and not pd.isna(expected_value): if abs(actual_value - expected_value) > 1e-6: df.loc[idx, f'{col}_check'] = '错误' else: df.loc[idx, f'{col}_check'] = '正确' # 保存检查后的结果到新Excel文件 df.to_excel('checked_rate_results.xlsx', index=False)
代码关键逻辑说明
- 基准数据提取:先筛选出所有Implied场景的数据,以
Rate Index为索引,后续可快速匹配任意Rate Index的基准利率。 - 场景计算规则:
- 固定bps场景(+100/+25/-25/-100):直接将bps转换为百分比后,与Implied基准利率加减。
- EBA场景:从
Rate Index字符串中拆分出币种,匹配预设的shock值后计算预期利率。
- 误差处理:用
1e-6的精度阈值,避免浮点运算的微小误差导致误标记。 - 结果标记:为每个月度利率列新增
{列名}_check列,直观显示该场景利率是否符合预期。
示例验证
针对你提到的测试案例:
- Implied场景2024-06-30利率=5
- +100场景预期值=5 + 100/100=6,代码会用这个值与文件中实际值对比,若实际值不是6则标记为错误,彻底解决原代码用场景自身值计算的问题。
内容的提问来源于stack exchange,提问作者Atul sanwal
相关产品推荐
相关产品推荐

