Pythhon으로 IRBB 계산하기

TL; DR


채권을 현금 흐름으로 분해하여 수출 곡선의 형상 변화로 인한 가치 변화를 시뮬레이션하다.

IRRB 소개


IRRB는'인터레스트 레이트 릭 인 더 뱅킹북'의 약칭으로, 은행 계좌의 금리 리스크를 뜻한다.이는 금리 수준의 불리한 변동으로 인해 은행 계좌의 자산, 부채의 시장 가격이나 수익이 변동하여 발생하는 위험을 말하는데 바젤은행감독위원회의 자기자본제한 틀에서 제2의 지주(감독상의 검증 과정)의 일환으로 삼는다.또한 에서 제시한 지도에 적용된다.
금융 경제 용어집
은행이 보유한 금리 리스크를 명확히 하기 위해 금리 수준이 변화할 때의 각 방안에서 발생하는 손익을 명확히 해야 한다는 것이다.

금리 변화 방안


시나리오는 당국이 정한 여섯 가지를 구상해야 한다.
  • 병렬 이동
  • 아래로 나란히
  • 제법화
  • 평탄화
  • 단기금리 상승
  • 단기금리 인하
  • 어떤 상황에서든 금리 변화량은 화폐에 의해 규정되고 엔화의 경우 다음과 같은 계산 방법에 따라 계산된다.
  • 병렬 이동 상하 100bp
  • 스티브화, 평탄화, 단기금리 변화는 다음과 같은 공식에 따른다.(Rshort, Rlong에 100bp 부여)

  • 측정 방법


    IRRBB는 선불금에 기반한 규칙이기 때문에 구체적인 산정모델 구축은 각 금융기관에 위탁하되 금리 충격에 따른 경제가치 변화액의 EVE(Economic Value of Equity)를 발표하기로 했다.방안에 따라 계산金利変化後の経済的価値 - 金利変化前の経済的価値이 필요하다는 것이다.

    채권의 계산 방법


    은행 계좌는 보통 대출, 유가증권 등 다양한 자산을 보유하기 때문에 다양한 현금 흐름이 발생하고 그들의 현금 흐름을 해당 기간으로 분류하여 금리 변화의 영향을 관찰한다.
    여기에 고정금리 채권을 대표 자산으로 금리 충격으로 인한 가치 변화를 시뮬레이션한다.또 이자변화로 인한 채권가격의 변화는 일반적으로 수정의 두 가지 형태로 여겨지지만, 이는 이자의 병행이전에만 대응할 수 있기 때문에 전자곡선의 형상변화로 인한 손익을 계산하기 위해서는 채권을 시기별 현금흐름으로 분해해야 한다.
    import datetime
    import math
    import numpy as np
    
    # 基礎数値を設定(オリックス社債第195回)
    maturity_date = datetime.datetime(2028, 11, 8)
    base_date = datetime.datetime(2019, 3, 8)
    coupon = 0.454
    freq = 2  # 利払い回数
    
    이어 채권을 현금 흐름으로 분해했다.
    zanzon = (maturity_date - base_date).days / 365
    
    # 残存年数から利払い頻度に応じた期間を引いていく
    cashflow = []
    i = 0
    while zanzon - (1 / freq) * i > 0:
        cashflow.append(
            (zanzon - (1 / freq) * i, coupon / freq + (100 if i == 0 else 0))
        )
        i += 1
    
    뜯어낸 현금 흐름은 당국이 규정한 19개 시기의 공단에 분배된다.
    19시간을 분배할 때 전후 시간점에서 거리 비례에 따라 분배하여 주기와 금액의 가중 평균이 원시 현금 흐름과 같다.
    # バケットの中心時点を設定
    buckets_timing = [0.0028, 0.0417, 0.1667, 0.375, 0.625, 0.875, 1.25, 1.75, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 12.5, 17.5, 25]
    
    # バケットへの割当金額を初期化
    buckets_amount = [0 for t in buckets_timing]
    
    for t, a in cashflow:
        # CFの発生時期を元に前後のバケット時点を取得する
        prev_timing = max([b for b in buckets_timing if b < t])
        next_timing = min([b for b in buckets_timing if b > t])
    
        # tとの距離に比例して配分率を決める(近いほど配分率が大きい)
        prev_bucket_ratio = 1 - (t - prev_timing) / (next_timing - prev_timing)
        next_bucket_ratio = 1 - (next_timing - t) / (next_timing - prev_timing)
    
        prev_bucket_cf = a * prev_bucket_ratio
        next_bucket_cf = a * next_bucket_ratio
    
        # 前後のバケットに割当CF金額を加算する
        buckets_amount[buckets_timing.index(prev_timing)] += prev_bucket_cf
        buckets_amount[buckets_timing.index(next_timing)] += next_bucket_cf
    
    현금 흐름을 통에 분배한 후 서로 다른 방안의 금리 변화폭을 생성한다.
    # イールドカーブ上の金利を求める関数を作成
    # べき乗分母
    x = 4.0
    
    # パラレルシフトシナリオ
    def change_parallel(parallel):
        return parallel
    
    # スティープ化シナリオ
    def change_steepner(t, rshort, rlong):
        return -0.65 * (rshort * math.e ** (-t / x)) + 0.9 * (rlong * (1 - math.e ** (-t / x)))
    
    # フラット化シナリオ
    def change_flattener(t, rshort, rlong):
        return 0.8 * (rshort * math.e ** (-t / x)) - 0.6 * (rlong * (1 - math.e ** (-t / x)))
    
    # 短期金利変化シナリオ
    def change_short(t, rshort):
        return rshort * math.e ** (-t / x)
    
    그렇다면 이 채권의 원래 수출 곡선에 각 방안의 금리 변화폭을 더하면 시뮬레이션해야 할 수출 곡선을 만들 수 있지만, 채권에 따라 원래 특정 연한이 발행되지 않아 단기에 대응하는 수출 곡선을 그릴 수 없는 경우도 있다.
    이런 상황에서 다음과 같은 방법을 구상할 수 있다.
    해결책
    장점
    결점
    기타 지표 이율(국채의 수출 곡선 등)으로 대체하다
    전 기간의 수출 곡선은 입수하기 쉽다
    주식 고유의 신용 리스크가 무시되다
    이 채권의 복리를 고정 기한으로 삼다
    손쉬운 컴퓨팅
    기간 구조를 반영하지 않는 가상의 수출 곡선으로 변하다
    그러면 저는 이 채권의 시장가격을 받을 수 없습니다. 기간에 따라 원래 수출 곡선을 얻는 것도 번거롭기 때문에 장기 이자를 기초로 하는 수출 곡선으로 간편하게 사용하기로 했습니다.
    가뜩이나 EVE는 금리 충격 시 경제 가치의 변동에 초점을 맞추고 있어 상대적 충격 폭이 중요하고, 절대적인 금리 수준은 큰 영향을 미치지 않잖아요.
    base_rate = -0.00035
    
    # 長短金利とパラレル変動幅
    parallel = 0.01
    rshort = 0.01
    rlong = 0.01
    
    # 変化量を取得する
    senario = [
        [(t, 0) for t in buckets_timing], # 変化なし
        [(t, change_parallel(parallel)) for t in buckets_timing], # 上方パラレルシフト
        [(t, change_parallel(parallel * -1)) for t in buckets_timing], # 下方パラレルシフト
        [(t, change_steepner(t, rshort, rlong)) for t in buckets_timing], # スティープ化
        [(t, change_flattener(t, rshort, rlong)) for t in buckets_timing], # フラット化
        [(t, change_short(t, rshort)) for t in buckets_timing], # 短期金利上昇
        [(t, change_short(t, rshort * -1)) for t in buckets_timing] #短期金利低下
    ]
    
    이덕 곡선 이율에서 방안수의 할인율을 구하다.
    discount_factors = [[ 1 / ((1 + r / freq) ** (t * freq)) for t, r in change ] for change in senario]
    
    분할 상환한 채권의 현금 흐름에 할인 인자를 곱해서 현찰을 요구하다.pvs[0]는 금리에 변화가 없는 현찰이기 때문에 각 방안에서 뺀다.
    pvs = [ sum(bucket_amount * np.array(df)) for df in discount_factors ]
    
    for i, pv in enumerate(pvs):
        print(i, pv - pvs[0])
    
    0 0.0
    1 -9.417604340848655
    2 10.42500387955431
    3 -7.210492083514865
    4 4.776781579555461
    5 -0.9106947203782738
    6 0.9193271935525047
    
    위로 평행으로 이동하는 상황에서 가장 큰 손실이 발생하는 것을 발견하다.경사

    좋은 웹페이지 즐겨찾기