파생상품&금융공학

금리 모델링 #4 short rate modeling

seungbeomdo 2024. 2. 17. 21:27

금리 파생상품이란 금리를 기초자산으로 하여 수익이 결정되는 파생상품을 말한다. 대부분 금융공학 교과서들을 보면 금리 파생상품을 설명할 때 다른 기초자산들보다 특별히 더 많은 분량을 할애하는 것을 알 수 있다. 그 이유는 크게 두 가지인데, 

 

1) 금리의 확률과정은 더 복잡하다. 금리는 매크로 변수로서의 성격이 있기 때문에, 단지 기하적 브라운 운동만으로 나타내기 힘들다. 예를 들어 주가는 계속 상승할 수 있지만, 금리는 계속 상승하지 않고 일정 수준이 되면 다시 내려온다. 이를 mean-reverting이라고 한다.

 

2) 금리는 주가처럼 하나의 값이 아니라, 수익률 '곡선'으로서 존재한다. 기간 구조를 무시한 상태에서 그냥 "금리"라는 것은 존재하지 않는다. 따라서 금리를 추정할 때는 금리 커브 자체를 추정할 방법을 고민해야 한다.

 

물론 금리는 주식 파생상품의 가치를 평가할 때도 할인율로 사용된다. 하지만 주식 파생상품에서는 기초자산인 주가의 움직임이 훨씬 중요해서 금리에 별로 신경을 쓰지 않는다. 금리 파생상품은 금리 자체가 기초자산이기 때문에 금리의 성질을 무시한 상태에서 제대로 평가할 수 없다. 


 

저번 글까지 금리 파생상품들에 대해 알아보았다. 간단하게 가격 평가 모델들을 함께 살펴보았는데, 대부분은 기하적 브라운 운동을 기반으로 하는 블랙숄즈류의 모델이었기 때문에, 이자율의 확률과정을 제대로 반영하지 못한다.

 

1. Short rate model

금리의 확률과정이라고 하면 어딘가 이상한 것이 있다. 왜냐하면 금리는 주어진 만기에 대해 정의되는 것이기 때문이다. 도대체 어떤 만기의 금리의 확률 과정을 말하는 것일까? 그리고 금리 커브를 완성하려면 모든 만기에 대해 금리의 확률 과정을 다 만들어야 하는 것일까?

 

금융공학에서 말하는 금리의 확률과정은, 아주 짧은 순간을 만기로 하는 금리 즉 short rate의 확률과정을 의미한다. 가령 다음과 같은 확률과정이다.

$$dr = \mu r dt + \sigma r dW$$

$$dW \sim N(0, dt^{2})$$

 

이것은 short rate가 주가와 같은 기하적 브라운 운동을 따른다고 가정하는 모형이다. 즉 블랙숄즈 모델의 그것과 동일하다. Rendleman and Barter model이라고도 부른다.

 

위의 모델은 금리의 mean-reverting 성질 등을 무시하기 때문에 일반적으로 사용되는 모델은 아니다. 하지만 일단 이런 식으로 short rate의 확률과정을 나타낸다고 해보자.

 

short rate의 확률과정이 주어지면, 이로부터 금리의 커브를 유도해낼 수 있다. 즉 short rate의 확률과정만 있으면 모든 만기의 금리를 구할 수 있다는 뜻이다.

 

2. Short rate에서 Term structure로

 

만기 T에서 단위 금액을 지급하는 제로본드의 t시점 가치는

$$P(t, T) = \hat{E}[e^{-\bar{r}(T-t)}]$$

이때 $\bar{r}$은 기간 [t, T]에서의 평균 short rate이다.

 

동일한 기간 [t, T]에 적용되는 연속복리 이자율이 R(t, T)라고 하자. 그러면 마찬가지로

$$P(t, T) = e^{-R(t,T)(T-t)}$$

 

따라서

$$e^{-R(t,T)(T-t)} = \hat{E}[e^{-\bar{r}(T-t)}]$$

$$R(t,T) = \frac{1}{T-t}ln\hat{E}[e^{-\bar{r}(T-t)}]$$

 

즉 기간 [t, T]에서 short rate의 모델만 있으면, 그 기간 동안 유지되는 제로본드의 가격을 위험중립적으로 구함으로써 임의의 [t, T]를 잔존만기로 하는 연속복리 이자율을 구할수 있다.

 

시뮬레이션으로 구현해보면 아래와 같다.

 

먼저 short rate가 GBM을 따른다고 가정하고 시뮬레이션 경로들을 생성한다.

 

r0 = 0.05 #초기 이자율
T = 3 #종료시점 (연 기준)
dt = 1/365 #time step의 길이
s = 0.15 #volatility
mu = 0.001
J = 100 #시뮬레이션 path의 개수

I = int(T/dt) #각 시뮬레이션의 time step 개수
paths_RB = np.zeros([I, J])
paths_RB[0, :] = r0

for i in np.arange(I-1):
  dB = np.random.randn(J) * dt
  dr = mu * paths_RB[i, :] * dt + s * np.sqrt(paths_RB[i, :]) * dB
  paths_RB[i+1, :] = paths_RB[i, :] + dr

plt.plot(paths_RB)
plt.show()

 

 

각각의 path에서 실현된 short rate의 평균을 구한다. 그리고 그 평균 short rate로 할인하여 0시점에서 제로본드의 값을 구한다. 그러면 각 시뮬레이션 path마다의 제로본드 가치가 구해진다. 그 값의 평균을 내고, 로그를 취하고 잔존만기(3년)로 나누면, 위의 경우에서 구한 값은 0.04994이다. 즉 위의 short rate 모델에서 3년 만기 제로레이트는 4.994%이다.

 

그러면 기준이 되는 만기 T를 고정하지 말고, 임의의 시점들에 대해 구하면, 그 시점이 만기가 되는 제로레이트들을 구할 수 있다. 즉 제로커브를 만들 수 있는 셈이다. 

 

def ER(t, T, dt, Paths):
  i = int(t/dt)
  I = int(T/dt)
  r_avg = Paths[i:I, :].mean(axis = 0)
  df = np.exp(-r_avg * (T-t))
  Er = np.mean(df)
  return -1/(T-t)*np.log(Er)

def Curve(T0, T1, dt, Paths):
  i = int(T0/dt)
  I = int(T1/dt)
  curve = np.zeros([I - i, 2])
  curve[:, 0] = np.arange(T0+dt, T1+dt, dt)
  for i, t in enumerate(np.arange(T0+dt, T1+dt, dt)):
    curve[i, 1] = ER(T0, t, dt, Paths)
  return curve
  
plt.plot(Curve(dt, T, dt, paths_RB)[:,0], Curve(dt, T, dt, paths_RB)[:,1])
plt.show()

 

위의 시뮬레이션에서 수익률 커브는 아래와 같이 추정되었다. 기반이 되는 short rate의 확률과정이 제대로 캘리브레이션되었다고 할 수 없기 때문에, 현실의 제로커브를 제대로 묘사하지는 않는다.