零優惠券

如何使用 CIR (Cox-Ingersoll-Ross) 模型為 ZCB 定價

  • September 8, 2020

請看下面的程式碼

我的問題是關於輸入參數(a、b 和 sigma)及其計算。

對於長期均值“b”,我們是否使用有效的聯邦基金利率?還是 3m 國庫券?

另外,我如何計算平均回歸速度’a’?


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math


import timeit

start = timeit.default_timer()


def inst_to_ann(r):
   return np.expm1(r)


def ann_to_inst(r):
   return np.log1p(r)




def cir(n_years = 1, n_scenarios=1, a=0.05, b=0.03, sigma=0.05, steps_per_year=52, r_0=None):

   if r_0 is None: r_0 = b
   r_0 = ann_to_inst(r_0)
   dt = 1/ steps_per_year
   num_steps = int(n_years * steps_per_year) + 1  # because n_years might be a float

   I = np.random.normal(0, scale=np.sqrt(dt), size=(num_steps, n_scenarios))
   rates = np.empty_like(I)
   rates[0] = r_0

   ## For Price Generation
   h = math.sqrt(a ** 2 + 2 * sigma ** 2)
   prices = np.empty_like(I)



   def price(ttm, r):
       _A = ((2 * h * math.exp((h + a) * ttm / 2)) / (2 * h + (h + a) * (math.exp(h * ttm) - 1))) ** (
                   2 * a * b / sigma ** 2)
       _B = (2 * (math.exp(h * ttm) - 1)) / (2 * h + (h + a) * (math.exp(h * ttm) - 1))
       _P = _A * np.exp(-_B * r)
       return _P

   prices[0] = price(n_years, r_0)
   

   for step in range(1, num_steps):
       r_t = rates[step - 1]
       d_r_t = a * (b - r_t) * dt + sigma * np.sqrt(r_t) * I[step]
       rates[step] = abs(r_t + d_r_t)
       # generate prices at time t as well ...
       prices[step] = price(n_years - step * dt, rates[step])

   rates = pd.DataFrame(data=inst_to_ann(rates), index=range(num_steps))
   ### for prices
   prices = pd.DataFrame(data=prices, index=range(num_steps))
 
   return rates, prices


dfrates,dfprices = cir(n_scenarios=1000)
dfprices.plot()
plt.show()

print(dfprices)

stop = timeit.default_timer()
print('Time: ', stop - start)

零息債券定價的蒙特卡羅模擬

評估價值 $ V_t $ 零息債券 $ B_{T, t} $ 今天發布的時間 $ t $ 到期時間 $ T $ , 你可以使用公式 $$ V_t = \mathbb{E}\left(\exp\left(-\int_t^T r_s \mathrm{d}s\right)\underbrace{B_{T, T}}_{=1}\right). $$ 現在,如果您使用的是 CIR 模型,那麼好處是 $ r_T $ 給定 $ r_t $ 已知(它是一個非中心 $ \chi^2 $ ),因此您可以使用關係 $$ r_T = r_s + \int_t^T r_s \mathrm{d}s, $$ 並重新安排它以了解 $ \int_t^T r_s \mathrm{d}s $ .

如果您知道確切的分佈,請不要使用 Euler-Maruyama 方案

眾所周知,準確的分佈 $ \int_t^T r_s \mathrm{d}s $ ,不需要使用 Euler-Maruyama 方案來逼近一個樣本,因為可以抽取一個精確的樣本。這使得使用蒙地卡羅計算期望值變得更加容易(儘管是非中心的 $ \chi^2 $ 並不便宜!),因此定價零息債券很容易。

校準模型

你問如何找到值 $ a $ ,以及用於什麼 $ b $ . 最好的方法是校准你的模型,這是一個更棘手的問題,我將讓其他答案解決。

對於長期均值“b”,我們是否使用有效的聯邦基金利率?還是 3m 國庫券?

我不這麼認為。對於這個特定的短期利率模型,您必須提供 3 個輸入參數,即: $ a $ , $ b $ 和 $ \sigma $ (使用你的符號)。

我相信 $ a $ 和 $ b $ 通過擬合目前零息債券的期限結構得到 $ P^M(0,T) $ 存在於市場和 $ \sigma $ 來自掉期價格。

例如,高斯短速率模型 (GSR) 有一個解析表達式 $ b(t) $ ,這取決於導數 $ P^M(0,T) $ ,通過前向瞬時速率 $ f(0, T) $ 及其衍生物。另一方面,CIR 模型沒有這樣的分析結果。

建設 $ P(0, T) $ 和 $ f(0, T) $ 本身就是一個完整的主題(通常稱為引導收益率曲線)。如果需要,我可以詳細說明。

希望能幫助到你!謝謝!

引用自:https://quant.stackexchange.com/questions/57871