二叉樹
為什麼更改二叉樹中的步長會如此大地改變最終股票價格?
我正在嘗試使用二叉樹為可轉換債券定價。為此,我為股票價格寫了一個二叉樹。我注意到改變步長(時間步長)會顯著改變我的股票價格的最終價值。直覺上這是錯誤的,因為上下運動應該相應地縮放。我可以想像這也會改變可轉換債券的價格。
我以為設置 $ u = \text{e}^{\sigma\sqrt{dt}} $ 會成功的。誰能告訴我我做錯了什麼?謝謝!
import numpy as np import math as math S0 = 100 #Initial stock price T = 5 #Maturity timesteps = 16 #Amount of steps in the three dt = T/timesteps #Step size sigma = 0.28 #Vol r = 0.01 #Interest rate N = 300 #Notional amount (for convertible bond) kappa = N/S0 #Conversion rate (for convertible bond) c = 0.05 #Coupomn rate (for convertible bond) u = np.exp(sigma*math.sqrt(dt)) d = 1/u p = (np.exp(r*dt)-d)/(u-d) S = np.zeros((timesteps,timesteps)) for i in range(timesteps): for j in range(timesteps): S[j,i] = S0*(u**(i-j))*(d**j) S = np.triu(S)
你只有一個小錯誤,但讓我解釋一下為什麼範圍會增加。
讓我們表示 $ n:=timesteps $ , 然後
- 填充時循環一次迭代太少 $ S $ 矩陣數組,導致您將 S(T-dt) 而不是 S(T) 作為終端值。這是因為你沒有考慮到你的起始位置,即你需要 $ 1+n $ 每個維度的迭代。
... S = np.zeros((1+timesteps, 1+timesteps)) # Include starting position too (S0). for i in range(S.shape[1]): for j in range(S.shape[0]): S[j,i] = S0*(u**(i-j))*(d**j) S = np.triu(S)
- 的可能值的範圍 $ S(T) $ 確實增加了 $ n $ . 範圍由下式給出 $ [S_0 d^n, S_0 u^n] = [S_0 e^{-\sigma\sqrt{nT}}, S_0 e^{\sigma\sqrt{nT}}] $ . 請注意,當範圍增加時,以這些極值結束的機率會降低。事實上,根據中心極限定理,在極限為 $ n\to \infty $ 二項分佈將變為連續對數正態分佈,確實具有無限正支持 $ (0,+\infty) $ .
- CRR 二項式模型確保離散二項式模型的均值和變異數與連續模型的均值和變異數相匹配。股票的平均值將完全匹配任何 $ n $ ,而變異數將漸近接近連續情況。變異數不完全匹配的原因 $ n $ 就是找參數的時候 $ u $ 通過匹配變異數,僅通過在泰勒級數展開中保留一階項來進行近似。
# ==================================================== # === Compare moments to the continuous exact ones === # ==================================================== from scipy import stats as stats # Binomial model for number of down moves pd = 1-p dist = stats.binom(n=timesteps, p=pd) # Stock terminal mean and variance E[S(T)/S0] and V[S(T)/S0] # 1st moment for S(T) bin_m1 = dist.expect(lambda k: S[k.astype(int),-1]/S0) # 2nd moment for S(T) bin_m2 = dist.expect(lambda k: (S[k.astype(int),-1]/S0)**2) # Var[S_T] = E[S_T^2] - E[S_T]^2 bin_var = bin_m2 - bin_m1**2 print(f'Binomial Model: E[S/S0]={bin_m1:.4f}, V[S/S0]={bin_var:.4f}') # Continuous S(T) moments, https://en.wikipedia.org/wiki/Geometric_Brownian_motion#Properties gbm_m1 = np.exp(r*T) gbm_var = np.exp(2*r*T)*(np.exp(sigma**2*T)-1) gbm_m2 = gbm_var + gbm_m1**2 print(f'Continuous GBM: E[S/S0]={gbm_m1:.4f}, V[S/S0]={gbm_var:.4f}')
二項式模型:E
$$ S/S0 $$= 1.0513, V$$ S/S0 $$=0.5218 連續GBM:E
$$ S/S0 $$= 1.0513, V$$ S/S0 $$=0.5304