You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码关键逻辑说明

  1. 基准数据提取:先筛选出所有Implied场景的数据,以Rate Index为索引,后续可快速匹配任意Rate Index的基准利率。
  2. 场景计算规则:
    • 固定bps场景(+100/+25/-25/-100):直接将bps转换为百分比后,与Implied基准利率加减。
    • EBA场景:从Rate Index字符串中拆分出币种,匹配预设的shock值后计算预期利率。
  3. 误差处理:用1e-6的精度阈值,避免浮点运算的微小误差导致误标记。
  4. 结果标记:为每个月度利率列新增{列名}_check列,直观显示该场景利率是否符合预期。

示例验证

针对你提到的测试案例:

  • Implied场景2024-06-30利率=5
  • +100场景预期值=5 + 100/100=6,代码会用这个值与文件中实际值对比,若实际值不是6则标记为错误,彻底解决原代码用场景自身值计算的问题。

内容的提问来源于stack exchange,提问作者Atul sanwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:10