FOClass: 債券殖利率曲線計算
在 FOClass: 零息債券殖利率計算 中,我們可算出零息債券的殖利率,但如果要套用在實務上的應用中,我們必須將觀察到的各點作一迴歸函式,讓我們可以找到各天期的殖利率。
運用原理為 Cubic Spline 方法。假設債券的 Discount 因子為一個三次方程式:
而每張債券的現金流量再套入下方方程式:
可得到類似 3.3a + 1.2b + 5.5c = 30 的等式。像是代入 前篇文章 的九張債券可得如下式子:
經過矩陣移位:
再透過 OLS(ordinary least square) 方法求出 a, b, c 的適當值後,即可代入:
便算出殖利率曲線。如下圖:
我們可以看到 20~30年期的殖利率下降的十分奇怪。原因是我們的觀察值債券的年期最大只有 20 年,所以這一條函式在預測 20~30 年期的數據應該是有問題。
Python 程式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | from numpy import array, append, dot, matrix, linalg class CubicSpline: """ 使用最小平方和原則作三次方方程式的迴歸 """ def __init__(self): self.PVs = array([]) self.X = array([]) def addBondData(self, PV=0, Ci=[], Ni=[]): self.PV = PV < 0 and PV or -1*PV if Ni[0] == 0: self.PVs = append(self.PVs, -1*self.PV-Ci[0]) self.Ci = array(Ci[1:]) self.Ni = array([[1, t, t**2, t**3] for t in Ni[1:]]) else: self.PVs = append(self.PVs, -1*self.PV) self.Ci = array(Ci) self.Ni = array([[1, t, t**2, t**3] for t in Ni]) self.dt = dot(self.Ci, self.Ni) if len(self.X): self.X = append(self.X, [self.dt[1:]], axis=0) else: self.X = array([self.dt[1:]]) self.PVs[-1] -= self.dt[0] def runOLS(self): self.X = matrix(self.X) self.PVs = matrix(self.PVs).T self.b = (linalg.inv(self.X.T * self.X) * self.X.T * self.PVs) return self.b |