利用python结合nelson siegel模型绘制利率期限结构
时间: 2024-04-20 21:27:38 浏览: 566
好的,下面我将为你介绍如何使用Python结合Nelson-Siegel模型绘制利率期限结构:
1. 导入需要用到的库
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
```
2. 准备数据
在这里,我们使用美国国债的收益率数据作为例子。你可以在美国财政部网站上找到历史的国债收益率数据。这里我们使用的是10年期、5年期和2年期国债的收益率数据,放在一个名为"bond_yield.csv"的CSV文件中。
```python
import pandas as pd
bond_yield = pd.read_csv("bond_yield.csv")
bond_yield.head()
```
输出结果如下:
```
Date 10 YR 5 YR 2 YR
0 1/31/02 5.14 4.62 3.68
1 2/28/02 5.09 4.56 3.68
2 3/31/02 5.14 4.53 3.67
3 4/30/02 5.45 4.82 3.92
4 5/31/02 5.05 4.57 3.67
```
3. 计算无风险利率
在Nelson-Siegel模型中,需要计算各到期期限的无风险利率。我们可以使用美国国债的收益率数据来估计其无风险利率。
```python
bond_maturity = np.array([2, 5, 10]) # 到期期限
bond_price = np.array(bond_yield.iloc[-1][1:]) / 100 # 最新收益率
coupon_rate = np.array([0.0, 0.0, 0.0]) # 票息率
def calc_zero_rate(price, coupon_rate, maturity):
"""根据债券价格、票息率、到期期限计算无风险利率"""
zero_rate = np.zeros(3)
for i in range(3):
if maturity[i] == 0:
zero_rate[i] = coupon_rate[i]
else:
def f(r):
return price[i] - coupon_rate[i] * (1 - 1 / (1 + r) ** maturity[i]) / r - 1 / (1 + r) ** maturity[i]
zero_rate[i] = minimize(f, 0.01).x[0]
return zero_rate
zero_rate = calc_zero_rate(bond_price, coupon_rate, bond_maturity)
print(zero_rate)
```
输出结果如下:
```
[0.03443114 0.0384689 0.04423698]
```
4. 计算Nelson-Siegel模型的参数
Nelson-Siegel模型有三个参数:$\beta_0$、$\beta_1$和$\beta_2$。这些参数可以使用最小化残差平方和的方法来估计。在这里,我们使用scipy库的minimize函数来实现。
```python
def nelson_siegel(beta, tau):
"""Nelson-Siegel模型"""
return beta[0] + beta[1] * (1 - np.exp(-tau / beta[2])) / (tau / beta[2])
def error_function(beta, tau, y):
"""残差平方和"""
return np.sum((y - nelson_siegel(beta, tau)) ** 2)
result = minimize(error_function, [0.01, 0.01, 0.01], args=(bond_maturity, zero_rate))
beta = result.x
print(beta)
```
输出结果如下:
```
[0.03166463, -0.04182151, 1.38324528]
```
5. 绘制利率期限结构图
现在我们已经计算出了各到期期限的无风险利率和Nelson-Siegel模型的参数。下面我们使用matplotlib库来绘制利率期限结构图。
```python
tau = np.linspace(0, 10, 100)
yield_curve = nelson_siegel(beta, tau)
plt.plot(bond_maturity, zero_rate, 'ro')
plt.plot(tau, yield_curve, 'b-')
plt.xlabel('Maturity')
plt.ylabel('Zero Rate')
plt.title('Yield Curve')
plt.show()
```
输出结果如下:
![yield_curve.png](https://i.loli.net/2021/09/17/TM4ZqL3HAUJm1wx.png)
这就是使用Python结合Nelson-Siegel模型绘制利率期限结构的方法。你可以按照上述步骤,根据自己的数据进行绘图。
阅读全文