import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
import seaborn as sns
import pandas as pd
data=pd.read_excel('C:/Users/LJZYOU/Desktop/debt.xls')
data=pd.DataFrame(data)
sns.set(color_codes=True)
grouped = data.groupby(data["time"])
df1=pd.DataFrame(index=["beta1","beta2","beta3"])
for i in grouped:
df=pd.DataFrame()
a= i[1]['Yeartomatu'].to_numpy()
b= i[1]['Yield'].to_numpy()
λ=1.37
def sigmoid(a,β1, β2,β3):
y = β1+β2*(1- (np.e)**(-1/λ*a))/λ*a+β3*((1- (np.e)**(-1/λ*a))/λ*a-(np.e)**(-a/λ))
return y
β1 = 0.10
β2 = -0.017766
β3 = 0.135737
λ=1.37
#nonlinear regress function
popt, pcov = curve_fit(sigmoid,a,b,maxfev=1000)
df=pd.DataFrame(popt,index = ["beta1","beta2","beta3"],columns=[i[0]])
df1=pd.concat([df1,df],axis=1)
df2=df1.reset_index()
df3=df2.T
df4 = df3.reset_index()
df4.to_csv("tzzs_data2.csv", index_label="index_label")
outputpath='C:/PYTHON/fenci.csv'
df4.to_csv(outputpath,sep=',',index=True,header=False)
用Nelson siegel建模,用curve fit的非线性最小二乘法来拟合债券利差,数据选取自国泰安国债数据库,最终拟合出各时间点的beta1,beta2,beta3三个参数