R包 tvm

tvm包是用来计算资金时间价值的包。全名为time value of Money。

其中最重要的几个函数是

  • npv/xnpv : 计算现金流的净现值
  • irr/xirr: 计算某现金流的资金回报率

这几个函数的定义如下:

> irr
function (cf, ts = seq(from = 0, by = 1, along.with = cf), interval = c(-1, 
    10), ...) 
{
    uniroot(npv, interval = interval, cf = cf, ts = ts, extendInt = "yes", 
        ...)$root
}
<environment: namespace:tvm>
> npv
function (i, cf, ts = seq(from = 0, by = 1, along.with = cf)) 
sum(cf/(1 + i)^ts)
<environment: namespace:tvm>
> irr(c(-100,105))
[1] 0.05000217
> xirr
function (cf, d, interval = c(-1, 10), ...) 
{
    uniroot(xnpv, interval = interval, cf = cf, d = d, extendInt = "yes", 
        ...)$root
}
<environment: namespace:tvm>
> xnpv
function (i, cf, d) 
sum(cf/((1 + i)^(as.integer(d - d[1])/365)))
<environment: namespace:tvm>

使用实例:

1 1年后105元的现值,5%利率

library(tvm)
npv(0.05,c(0,105))
100

注意这里的cf参数,因为ts是从0开始的,因此第一项现金流即为现在的现金流。另外这里的ts都是指的是以年度为单位的,如果每半年派息,或者几个月派息,则需要使用xnpv函数

2 半年后派息2.5,一年后返还102.5。5%的利率,这个现值是多少

library(tvm)
xnpv(0.05,cf=c(0,2.5,102.5),d=Sys.Date() + c(0,250,365))
100.036883343333

3 现在付出95元,1年后得到105元,这个资金回报率是多少

library(tvm)
irr(c(-95,105))
0.105265148176488

4 现在付出95元,半年后得到2.5元,1年后收回102.5元,求回报率

library(tvm)
xirr(c(-95,2.5,102.5),d=Sys.Date() + c(0,250,365))
0.10611460762453

5 计算国债收益率

计算前文 中的国债收益率

library(tvm)
xirr(cf=c(-100.88-0.385,2.13,2.13,2.13,2.13,2.13,2.13,102.13),
     d=as.Date(c("2018-03-05","2018-07-31","2019-01-31","2019-07-31",
	       "2020-01-31","2020-07-31","2021-01-31","2021-07-31")))
0.0402335064097384

这里计算的结果为4%,和期望的结果一致。因此,tvm用于进行现值计算是比较方便的。

6 计算股票市盈率

6.1 5%的永续增长

假定当年的收益为1,下一年收益为1.05,如此以1.05的速度永续增长,即现金流为:

\[ 1x1.05 , 1x1.05^2 , 1x1.05^3 , \dots \]

那么贴现到今年,即

\[ \frac{1.05}{1+0.1} + \frac{1.05^2}{(1+0.1)^2} + ...\]

则由等比数列定义,可知其净现值为(假定r=0.1)

\[ \frac{a_1}{1-q} = \frac{1.05/1.1}{1-1.05/1.10} = 21 \]

现在利用tvm计算,假定把现金流全部贴现到下一年,然后利用npv贴现到今年,则有

library(tvm)
npv(0.10,cf=c(0,1.05/(1-1.05/1.1)))
21

注意上面两种算法的区别,对于等比数列求和而言,公式为 \( \frac{a_1}{1-q} \) , 贴现到哪一年只需要注意求和的第一项就可以了,因为1-q是不变的。

6.2 任意的增长

假定某票未来几年的增长率分别为60% 30% 30% 5% 5% 5% 。。。

那么其合理的市盈率应该是多少呢?后面第四年开始以5%的增速永续增长,那么可以把后面所有的年份都贴现到第四年,然后在贴现到今年即可,算法如下

library(tvm)
npv(0.1,cf=c(0,1.6,1.6*1.3,1.6*1.3*1.3,1.6*1.3*1.3*1.05/(1-1.05/1.1)))
47.8677685950412

也就是说,合理的市盈率为47倍,即假定今年的收益为1,那么下一年就是1.6,1.6*1.3,以此类推。最后一年按照等比数列求和 \(\frac{a_1}{1-q}\)然后再贴现。其中q为1+g/1+r,这里g=0.05,r=0.10



本文地址: http://www.bagualu.net/wordpress/archives/6781 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注