golang计算可转债纯优债券到期年化收益率
作为一个兴趣学习golang的金融民工,最近遇到可转债计算收益问题,写了一次代码用来计算可转债的年化收益.
通常可转债面值100元,设计6年,每年支付一定利息,到期兑付最后一期利息和回购金额.如
翼东水泥可转债:
票面利率:第1年0.20%,第2年0.40%,第3年0.80%,第4年1.20%,第五年1.50%,第6年2.00%;
到期赎回价:106元(含最后一期利息)
学过一些金融知识的会知道,这其实是把每一期的利息和最后一期回入折现到现在,即未来现金流量=现在支付现金的问题.
所以我们得先计算现值折现率( present value coefficient)
func pvCof(ratio,year int) float32{
var pv float32 = 1
for i :=1; i <=year; i++{
pv = pv/(1+float32(ratio)/10000) // 因为年化收益率通常为0.0n%即 精确到万分位,所以我们视其为整数,再除10000
}
return pv
}
其次把每期现金收入,视其为一数列[0.002,0.004,0.008,0.012,0.015,0.02,1.04],折现到现在得到 present value
func Pv(array []float32, ratio int) float32{
var pvSum float32 = 0
for i,v := range array {
if v <1 {
pvSum = pvSum + v*pvCof( ratio, i+1)
} else {
pvSum = pvSum + v* pvCof(ratio,(len(array)-1))
}
}
return pvSum
}
最后我们用循环去计算得到年化收益率
func rateOfReturn(array []float32) float32 {
var ratio float32
var i int = 0
for {
i++
if Pv(array,i) >1 && Pv(array,i+1) <= 1 {
if Pv(array,i) - 0.5 >= 1 {
ratio = float32(i+1)/100
} else {
ratio = float32(i) / 100
}
break
}
}
return ratio
}
最后帖上全部完整代码
package main
import (
"fmt"
)
func pvCof(ratio,year int) float32{
var pv float32 = 1
for i :=1; i <=year; i++{
pv = pv/(1+float32(ratio)/10000)
}
return pv
}
func Pv(array []float32, ratio int) float32{
var pvSum float32 = 0
for i,v := range array {
if v <1 {
pvSum = pvSum + v*pvCof( ratio, i+1)
} else {
pvSum = pvSum + v* pvCof(ratio,(len(array)-1))
}
}
return pvSum
}
func rateOfReturn(array []float32) float32 {
var ratio float32
var i int = 0
for {
i++
if Pv(array,i) >1 && Pv(array,i+1) <= 1 {
if Pv(array,i) - 0.5 >= 1 {
ratio = float32(i+1)/100
} else {
ratio = float32(i) / 100
}
break
}
}
return ratio
}
func main(){
/*
翼东水泥可转债:
票面利率:第1年0.20%,第2年0.40%,第3年0.80%,第4年1.20%,第五年1.50%,第6年2.00%;
到期赎回价:106元(含最后一期利息)
*/
array1 := []float32{0.002,0.004,0.008,0.012,0.015,0.02,1.04}
fmt.Printf("翼东水泥转债的纯债券年化收益率为:%.2f%%\n",rateOfReturn(array1))
}
代码运行效果: