Calculate the theoretical bond price and duration, convexity_20200613_

Calculate the theoretical bond price and duration, convexity

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']#用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用于正常显示负号
import time
import datetime
import tushare as ts
pro=ts.pro_api('')
import math
math.modf(1.54)

def price_coupon_bond(P,c,T,r):
    """计算附债券当前理论价格
    P:面值;c:票面利率;T:剩余有效期;r:预期收益率
    """
    V=P*(1+c*T)*math.exp(-1*T*r)
    return V
#price_coupon_bond(100,0.03,1,0.3)

data=pd.read_excel('债券日度价格.xlsx')
col=data.columns
data=data[['日期','收盘']]
data.columns=['日期','实际价格']
data['到期日']=datetime.datetime.strptime('2023-01-17', '%Y-%m-%d')
data['日期']=data['日期'].astype(str)
for i in data.index:
    data['日期'][i]=datetime.datetime.strptime(data['日期'][i], '%Y-%m-%d')
data['剩余年数']=0.000
for i in data.index:
        time_=data['到期日'][i]-data['日期'][i]
        data['剩余年数'][i]=time_.days/360

#通过shibor计算债券理论价格
shibor = pro.shibor(start_date='20130304', end_date='20200604')[['date','1y']]#获得shibor利率
shibor['date']=shibor['date'].astype(str)
for  i in shibor.index:
    shibor['date'][i]=datetime.datetime.strptime(shibor['date'][i], '%Y%m%d')

for i in shibor.index:
    if shibor['date'][i] not in data['日期'].tolist():
        shibor.drop(i,axis=0,inplace=True)
shibor=shibor.sort_values(['date'],ascending=True)
shibor.index=range(len(shibor.index))

data['shibor']=shibor['1y']
data['shibor'][len(data)-1]=data['shibor'][len(data)-2]
data['shibor理论价格']=0.00

for i in data.index:
    data['shibor理论价格'][i]=price_coupon_bond(P=100,c=0.051,T=data['剩余年数'][i],r=data['shibor'][i]/100)

data['日期']=data['日期'].astype(str).str[:10]

#绘图
plt.figure(figsize=(18,16))
plt.plot(data['日期'],data['实际价格'],label='债券实际价格')
plt.plot(data['日期'],data['shibor理论价格'],label='债券shibor理论价格')
plt.title('债券理论价格与实际价格对比图', fontsize=33, color='r', alpha=0.5)  # 设置标题
plt.grid(True,alpha=0.3)
plt.xlabel('日期', fontsize=24)
plt.ylabel('债券价格(元)', fontsize=24)
plt.xticks(np.arange(1,len(data['日期']),10),rotation=270)
plt.legend(loc='upper left',fontsize=16)
plt.show()

data.to_excel('债券风险测度.xlsx')

#计算债券久期
data
data['久期']=0.000
data['修正久期']=0.000
data['凸性']=0.0000
flow=100*0.051*10+100
for i in data.index:
    data['久期'][i]=data['剩余年数'][i]*flow*math.exp(-1*data['剩余年数'][i]*data['shibor'][i]/100)/data['shibor理论价格'][i]
    data['修正久期'][i] = data['剩余年数'][i]*flow * math.exp(-1 * data['剩余年数'][i] * data['shibor'][i] / 100) / data['shibor理论价格'][i]/(1+data['shibor'][i] / 100)
    data['凸性'][i]=(1+data['剩余年数'][i])*data['剩余年数'][i]*flow * math.exp(-1 * data['剩余年数'][i] * data['shibor'][i] / 100) / \
                  data['shibor理论价格'][i]/(1+data['shibor'][i] / 100)**2


#绘图
plt.figure(figsize=(18,16))
plt.plot(data['日期'],data['久期'],label='久期')
plt.plot(data['日期'],data['修正久期'],label='修正久期')
plt.plot(data['日期'],data['凸性'],label='凸性')
plt.title('债券风险测度图', fontsize=33, color='r', alpha=0.5)  # 设置标题
plt.grid(True,alpha=0.3)
plt.xlabel('日期', fontsize=24)
plt.ylabel('久期,修正久期,凸性', fontsize=24)
plt.xticks(np.arange(1,len(data['日期']),10),rotation=270)
plt.legend(loc='upper right',fontsize=16)
plt.show()


Guess you like

Origin blog.csdn.net/weixin_45590329/article/details/106729062