全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1731 1
2021-04-11
更新:
需求:我需要计算一个大数据量的分组XIRR(人话:我想要一次性计算不同投资者的XIRR)
方法:
1、EXCEL
存在的问题:没法一次性计算,并且结果表示的是年化收益率,如果一个投资者1天内赚了2%,那年化收益率将会达到137640.83%,而excel中的结果明显不对,同时对于极短期间的负收益,excel会出错。
适合:数据量小,且资金流间隔较长
2、使用程序:R
这里找到三种方法,下面一一解释:
一、“tvm"包的xirr函数
函数用法:
xirr(cf, d, tau = NULL, comp_freq = 1, interval = c(-1, 10), ...),更为具体的可以参考使用说明。这里提供一个例子(https://stackoverflow.com/questions/55954200/how-to-loop-the-xirr-function-in-r-over-multiple-ids)
library(tvm)
exampledf %>%
  mutate(Date = as.Date(Date)) %>%
  group_by(ID) %>%
   summarise(
   IRR = xirr(cf =CashFlow, d = Date,
      tau = NULL, comp_freq = 12, interval = c(-1, 10)))

缺点:函数计算并不准确,结果和excel中存在差异,与excel中类似,对于极短期间xirr计算的值不对。
二、任熊发表于知乎(https://zhuanlan.zhihu.com/p/36268182)上面分析的程序
缺点:分组计算的时候程序报错,也可能是我分组的方法不对(我使用的是tidverse包中的group_by这种分组方法)。
三、SunilVeeravalli发布在github上的程序(https://github.com/SunilVeeravalli/XIRR_in_R/blob/master/Xirr%20Code.R)
缺点:对数据格式要求严格,数据集中只能有日期和资金流两项。和我们需求不符
有点:对整体收益为负的收益率,也就是收益率为负,进行了更好的计算


本来推荐的是第一种方法,我还得意洋洋的给大家分享第一种方法的寻找经验(还有点用,放在最后了),但是我在检查的时候发现了计算错误,所以我裂开了啊!真的是裂开了啊!经过一番挣扎,我还是回头去看了具体的源码,真的是,小孩子吃糖——绝了。下面介绍整个代码的编辑思路以及代码,看完后就应该能了解为什么上面会出现问题了

整个代码的运行思路:分割试值。我们需要的内部收益率是使方程等于0的值(-流出的资金*(1+r)+流入的资金=0),所以先给内部收益率设定一个范围,然后把这个范围分割成更小的范围,不断缩小这个范围,最后求解均值就可以了。
提醒:先大致考虑一下,计算的收益率的范围,符合要求的情况下,初始的范围越小越好。还有就是最后要呈现的是年化收益率还是日度收益率,如果需要计算极小日期范围,建议不要使用年化收益率,因为太大了,真的是太大了。还有就是流入资金与流出资金的符号相反,需要注意。
代码:借鉴SunilVeeravalli发布在github上的程序,并进行了修改

复制代码


这个也不是没有缺点:缺点就是运行速度慢,好处灵活设定(只能这样安慰自己了)
#==========================================================================
经验:关于如何解决出现的问题,先百度中文答案,如果还没有解决问题,使用英语的关键词进行谷歌搜索,问题基本就能解决了。关于如何查找合适的包或者函数,可以使用这个网站”https://www.rdocumentation.org/“,使用方法与搜索引擎一样,很方便。





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2021-4-14 12:25:39
裂开了,经验都写完了,我的代码还没跑完,这万一最后再报个错,那真的是无语妈妈给无语开门——无语到家了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群