校準 Vasicek 模型時遇到問題
我根據 Vasicek 過程模擬了一些數據,然後我嘗試應用普通最小二乘 (OLS) 回歸分析來查看估計的模型參數與估計值的準確性。然而,我估計的模型參數似乎與它們應有的值並不接近。我試過讓 T 變得非常大,我什至模擬了 100,000 條路徑並估計了每條路徑的模型,然後對估計值進行平均。然而結果看起來仍然不對勁。所以要麼我模擬我的數據錯誤,要麼我所做的回歸在某種程度上是錯誤的。我在下面附上了我的 python 程式碼,所以如果有人可以看一下並告訴我為什麼我的模型參數關閉,我將非常感激。
我使用的模型形式是:
$$ dr_t = (a - b r_t) dt + \sigma dW. $$
為了估計我的模型參數,我對離散數據進行回歸擬合,得到以下模型:
$$ r_{t+1} - r_{t} = (a - b r_t) \Delta t + \sigma Z_t $$
在哪裡 $ Z_t \sim N(0,\Delta t) $ (即均值 0,變異數 $ \Delta t $ )。從這個設置我知道我估計的攔截將是 $ a\Delta t $ 我估計的斜率是 $ -1 * b \Delta t $ . 因此,在我的 fit_vasicek_model 函式中,我進行了必要的轉換以恢復“a”和“b”。
這是我的程式碼(我省略了一些與這個問題無關的部分)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import random import statsmodels.formula.api as smf import statsmodels.api as sm import statsmodels.tools as sm_tools class InterestRateModels: def __init__(self, nsim, T, Vas = None): self.N = nsim self.T = T self.dt = 1/T self.Vas = Vas def sim_vasicek(self, r0, a, b, sigma): """ Inputs: ------- N = number of paths to simulate T = number of time steps to take r0 = initial (current) short-term rate a, b, sigma = parameters of the model The Model: ---------- dr_t = (a − b*r_t)*dt + σ * dBt r_t = short rate a = long-run average rate, a in Real Numbers b = speed of reversion, b > 0 sigma = volatility of short rate Bt = Gaussian (0 mean, 1 sigma) process Returns: -------- Creates an object attribute that is a matrix of simulated short rate paths. """ dt = 1.0/self.T X = np.random.normal(0,np.sqrt(dt),size=(self.N,self.T)) self.Vas = np.zeros((self.N,self.T)); self.Vas[:,0] = r0; for i in range(self.N): for j in range(1,self.T): self.Vas[i,j] = self.Vas[i,j-1] + (a-b*self.Vas[i,j-1]) * dt + sigma * X[i,j] return def plot_vasicek(self): for i in range(self.N): plt.plot(self.Vas[i,:]) return def fit_vasicek_model(self, rate_path): """ Inputs: ------- rate_path is a single interest rate path. Returns: -------- Parameters of the model (not the regression paraneters, as they get transformed) Intercept = a * dt Slope = -1 * b * dt (The slope needs to be multiplied by negative 1) """ n = len(rate_path) X = rate_path[:n-1] y = np.diff(rate_path) X = sm_tools.tools.add_constant(X) model = sm.OLS(y,X) results = model.fit() a, b1 = results.params / self.dt b = -1 * b1 return a, b
所以現在當我創建一個實例並模擬一堆路徑時,然後擬合模型 I 的參數 a 和 b 甚至不接近它們的真實值。以下是我對原因的猜測:相對於回歸參數 b,需要有足夠長的周期(即 T 足夠大)。這意味著如果 b 很大,則 T 可以很小。如果 b 很小,則 T 必須很大。
# nsim=1000, T=30, a=1, b=4 # rates_sim = InterestRateModels(nsim=1000, T=30) rates_sim.sim_vasicek(.02, a=1, b=4, sigma=.3) rates_sim.plot_vasicek() b_lst = [] a_lst = [] for i in range(rates_sim.N): rate_path = rates_sim.Vas[i,:] a, b = rates_sim.fit_vasicek_model(rate_path) a_lst.append(a) b_lst.append(b) np.mean(b_lst) Out[273]: 7.0396842314975165
請注意,b 的平均值是 7.03,而不是 4。所以現在當我讓 T=1000 時,這就是我所看到的。
np.mean(b_lst) Out[275]: 7.538313498938557
這還是有點過。我確實看過利率曲線圖,它們看起來並不完全靜止。因此,讓 b 變得非常大(即 b=30),即使對於較小的 T=30,我也會得到以下結果
np.mean(b_lst) Out[277]: 31.078385891056488
這看起來像我所期望的。那麼,合理收斂的一般規則是什麼?我在某個地方讀到了我們必須擁有的 $ \mid 1 - b \Delta t \mid <= 1 $ ,雖然當 $ \Delta t = 1/30 $ 和 $ b=4 $ ,這仍然成立,但結果看起來很糟糕。感謝您閱讀本文,感謝您提供的任何幫助。
你的模型是:
dr_t = (a − b*r_t)*dt + σ * dBt
然而,Vasicek 模型是:
dr_t = a(b - r_t)*dt + σ * dBt
您可以更新方程式並再試一次嗎?
通常,a 是平均回歸速度,b 是平均回歸水平
查看這篇文章:https ://papers.ssrn.com/sol3/papers.cfm?abstract_id=130068
這是在離散時間完成的,這使得在實踐中校準更加友好。