本文章采用EXCEL的VBA计算债券凸度,水平有限,还望海涵,如有问题欢迎留言
应为EXCEL中不包含凸度的公式,所以用VBA写了一个
先上公式
所以要计算凸度需要以上几个变量,由于我们需要计算债券的凸度,可得债券的条件有:
- 结算日
- 到期日
- 票息率
- 收益率
- 年付息次数
- 债券面值
通过以上条件可手动算出凸度,但是付息次数太多了就有点麻烦了,所以上代码吧
Public Function Convexity(mianzhi, Rate, coupon, t, Fre)
cishu = t * Fre '获取付息次数
piaoxi = mianzhi * Rate / Fre '每期票息
percou = coupon / Fre '每期收益率
night = 0 '除最后一期的ct(t^2+t)/(1+y)^t
For i = 1 To cishu - 1 '计算除最后一年的ct(t^2+t)/(1+y)^t
a1 = i ^ 2 + i '计算(t方+t)
a2 = piaoxi * a1 / (1 + percou) ^ i
night = night + a2
Next
cashfinal = (mianzhi + piaoxi) * (cishu ^ 2 + cishu) / (1 + percou) ^ cishu
Totalcash = night + cashfinal
timb = CDate("2010/10/10")
timend = DateAdd("yyyy", 5#, timb)
'MsgBox timend
xxx = (1 + percou) ^ 2
'MsgBox xxx
yyy = Application.WorksheetFunction.Price(timb, timend, Rate, coupon, mianzhi, Fre) * xxx
Convexity = Totalcash / yyy / Fre ^ 2
End Function
Sub t()'测试用的
i = Convexity(100, 0.08, 0.08, 2, 2)
MsgBox i
End Sub
第一个参数债券面值,第二个是息票率,第三个是收益率,第四个是年份(就是到期日减去结算日得到的年份),第五个是每年付息多少次
下面来讲以下怎么用
以上是两种债券的相关信息,假设债券面值100
然后打开EXCEL开发工具栏的Visual Basic,新建一个模块,将代码复制粘贴进去后保存。
000000000000000000000000000000000000000000000000000000000000000000000000000000
在红框内填入第一种债券的参数,运行即可得到第一种债券的凸度
当然也可以在EXCEL表格中直接使用该函数
如图,在表格中使用该函数,填入第二种债券的参数,就可以算出第二种债券的凸度。