内部收益计算函数

曾经看过一个帖子:有一个理财产品,每年年初存入10000元,每年年底得到利息1000元。持续5年,5年后返还本金50000元:问:利率是多少?
下面有个回复:每年存10000,利息1000,所以利率是10%。
那么问题来了,真实利率到底是多少?
office的excel有个公式叫xirr,参考 https://support.office.com/zh-cn/article/XIRR-%E5%87%BD%E6%95%B0-de1242ec-6477-445b-b11b-a303ad9adc9d
irr,参考 https://support.office.com/zh-cn/article/IRR-%E5%87%BD%E6%95%B0-64925eaa-9988-495b-b290-3ad0c163c1bc

实现如下:

require 'date'

def simply_parse str
year, month, day = str.split('-')
return Date.new(year.to_i, month.to_i, day.to_i)
end def simply_sum arr
arr.inject(0) { |sum, element| sum + element }
end # guess : 从该值开始计算
# accuracy : 计算精度,即每次递进的增量
# cal_times : 计算次数
def xirr(arr, guess = 0.05, accuracy = 0.0001, cal_times = 1000)
rate = guess
start_date = simply_parse(arr[0][1])
end_date = simply_parse(arr[-1][1])
__n = arr.map(&:first).map(&:to_f).select{|x| x < 0}
__p = arr.map(&:first).map(&:to_f).select{|x| x > 0}
t1 = ((simply_sum(__p))*accuracy).abs
t2 = ((simply_sum(__n))*accuracy).abs
tt = (t2+t1)/2
return 'number error' if __n.empty? && __p.empty?
last_sum = 0
sum = 0
flag = 0
cal_times.times do
sum = 0
arr.each do |item|
_date = simply_parse(item[1])
return 'date error' if _date < start_date || _date > end_date
profit = item[0].to_f * ((1+rate)**((end_date-_date)/365))
sum = sum + profit
end
if last_sum == 0
last_sum = sum
next
end
if last_sum.abs < sum.abs
accuracy = 0 - accuracy
flag = flag + 1
end
if sum > (0 + tt)
return rate if flag > 1
rate = rate + accuracy
last_sum = sum
elsif sum < (0 - tt)
return rate if flag > 1
rate = rate - accuracy
last_sum = sum
else
return rate
end
end
if sum > (0 - tt*2) && sum < (0 + tt*2)
return rate
end
return "guess failed, try guess = #{rate}"
end #test
arr = '10000 2010-01-01
-1000 2010-12-31
10000 2011-01-01
-1000 2011-12-31
10000 2012-01-01
-1000 2012-12-31
10000 2013-01-01
-1000 2013-12-31
10000 2014-01-01
-1000 2014-12-31
-50000 2014-12-31'.split("\n").map{|x| x.split}
xirr arr, 0.05, 0.0001, 2000 # => 0.03409999999999955 arr = '-10000 2008-1-1
2750 2008-3-1
4250 2008-10-30
3250 2009-2-15
2750 2009-4-1'.split("\n").map{|x| x.split}
xirr arr, 0.37 # => 0.37329999999999963 arr = '10000 2008-1-1
-2750 2008-3-1
-4250 2008-10-30
-3250 2009-2-15
-2750 2009-4-1'.split("\n").map{|x| x.split}
xirr arr, 0.37 # => 0.37329999999999963 arr = '-700000 2008-1-1
120000 2009-1-1
150000 2010-1-1
180000 2011-1-1
210000 2012-1-1'.split("\n").map{|x| x.split}
xirr arr, 0.0 # => -0.021199999999999927 arr = '-700000 2008-1-1
120000 2009-1-1
150000 2010-1-1
180000 2011-1-1
210000 2012-1-1
260000 2013-1-1'.split("\n").map{|x| x.split}
xirr arr, 0.07 # => 0.08670000000000049 arr = '-700000 2008-1-1
120000 2009-1-1
150000 2010-1-1'.split("\n").map{|x| x.split}
xirr arr, -0.47 # => -0.44300000000000295

xirr函数的更多相关文章

  1. C#操作Excel的函数

    对于Excel的数据处理功能,大家都已经了解. 我们经常需要将数据导入到Excel,或直接打开Excel文档,读写文件操作,这需要用到ExcelHelper类,有了这个类,这些操作大大的减少我们工作量 ...

  2. Excel教程(8) - 财务函数

    ACCRINT 用途:返回定期付息有价证券的应计利息. 语法:ACCRINT(issue,first_interest, settlement, rate,par,frequency, basis) ...

  3. 123_Power Pivot&Power BI DAX函数说明速查

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 说明 1.基于DAX Studio 2.9.2版本导出整理: 2.DAX Studio网站,及时更新下载,DAX学习利器: ...

  4. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  5. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  6. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  7. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

随机推荐

  1. vuex数据持久化插件--指定持久化特定的值

    指定需要持久化的state,配置如下 import createPersistedState from "vuex-persistedstate" conststore = new ...

  2. java面向对象编程(八)--抽象类、接口

    1.抽象类 1.1抽象类概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. //抽象类的必要性[Demo124.java] ...

  3. sql server 字符串根据指定分隔符进行分组

    SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO --功能:分拆字符串 --参数:@String:要分拆的字符串:@Delimiter:分割符号 --返回值: ...

  4. python基础—字符串的常用函数“”

    #字符串常用语法name = "wang yan li"print(name.capitalize())#首字母大写print(name.count("n")) ...

  5. django + 阿里云云服务器网站搭建

    最近自己用django搭了一个小网站,个人的项目挂在了github上 https://github.com/LOMOoO/tpure 预计是挂在阿里云的云服务器上运行,云服务器买好了,阿里云的域名也买 ...

  6. Vue组件中的问题

    错误信息: 提示信息含义:组件模板中只能包含一个根元素 解决办法:在模板元素内部增加块级元素div将这些元素标签包裹起来,如图所示

  7. vuex核心

    最详细的Vuex教程 什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是dat ...

  8. swift4.0 数据转模型

    swift 4.0时代的到来,说明了swift已经趋于稳定了,已经完全可以入坑了. 下面就拿最简单的数据转模型来说说,实战一下. 接口使用:  http://116.211.167.106/api/l ...

  9. jQuery-4.动画篇---淡入淡出效果

    jQuery中淡出动画fadeOut 让元素在页面不可见,常用的办法就是通过设置样式的display:none.除此之外还可以一些类似的办法可以达到这个目的.这里要提一个透明度的方法,设置元素透明度为 ...

  10. 软件测试2019:第四次作业—— 性能测试(含JMeter实验)

    题目:性能测试练习 一.回答下述问题: 性能测试有几种类型,它们之间什么关系? 性能测试根据不同测试目的可以分为以下类: (1)性能验证测试 (2)性能基准测试 (3)性能规划测试 (4)容量测试 渗 ...