2020-11-09

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))

}

代码运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值