如何使用 CIR (Cox-Ingersoll-Ross) 模型為 ZCB 定價
請看下面的程式碼
我的問題是關於輸入參數(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) $ 本身就是一個完整的主題(通常稱為引導收益率曲線)。如果需要,我可以詳細說明。
希望能幫助到你!謝謝!