隨機過程

校準 Vasicek 模型時遇到問題

  • February 24, 2022

我根據 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://en.wikipedia.org/wiki/Vasicek_model

查看這篇文章:https ://papers.ssrn.com/sol3/papers.cfm?abstract_id=130068

這是在離散時間完成的,這使得在實踐中校準更加友好。

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