一、 内部收益率和净现值

内部收益率(Internal Rate of Return, IRR)其实要和净现值(Net Present Value, NPV)结合起来讲。净现值指的是某个投资项目给公司或企业带来的价值增值,可以简单地用以下公式去计算。

1.净现值:

NPV = CF0 + CF1/(1+r1) + ... + CFt/(1+rt)^t

其中,CF0是初始投资额,是一个负值,代表现金的流出;t表示时间,指第t期;后面的CF1,CF2,...,CFt这些是每期的回报金额,为正值,表示投资所得的收益。r1,r2,...、rt是指每期的折现率。

举个比较通俗的例子,我们花100万元投资了一个一年期理财产品,预期收益率为10%,一年期国债利率为5%,投资是否合算?

这里涉及到折现率的相关知识,简单介绍一下:我们都知道银行存款是有利率的,我们把10000块钱存到银行,一年后,连本带息就会超过10000元。如果我们不把钱存银行,一年后还是10000元钱,不存钱相当于亏掉了那么多利息的钱。也就是说,在存入银行后,一年后的10000元的拿到现在来看,实际是不到10000元的,我可能存9500,一年后就能拿到10000。这就是一个折现的概念,用时间来换利息。

我们再看这个问题,

1年后,预期的现金流就是:

100×(1+10%)=110(万元),

然后,我们按照国债的利率5%来对其折现(假设该产品与国债信用风险相当),即:一年后的110万元,如果我们按信用等级较高的国债去投资,现在价值多少?

答案是:110/(1+5%)。

计算净现值:

NPV = -100 + 110/(1+5%)= 4.7619(万元)

净现值是正的,说明这笔投资合算。当然,这里其实只看年利率就可以做出简单的判断,实际情况下,不论是理财产品还是国债利率都是浮动的。

2.内部收益率

前面我们取的折现率是国债的利率,是一个与投资决策之外的值,也可以理解是外部的收益率。这里内部收益率,指的是使净现值等于0时的折现率,就称为内部收益率(IRR)。我们用一个固定的折现率r去计算,令NPV=0,则

0 = CF0 + CF1/(1+r) + ... + CFt/(1+r)^t

那么,此时的r在数值上与IRR相等。因此,我们只要知道每年的现金流量情况,就能计算出该笔投资的IRR,将IRR与r相比,若IRR>r,则该项目值得投资;若IRR<r,则该项目不值得投资,不如去买同期的稳定国债之类的产品。

3.内部收益率的简单计算

如下表所示,第0年也就是现在,产生了-500万的现金流量,即用500万元去做一个投资,1年、2年、3年后的现金流量均为正的100万元、200万元和300万元。假设还是以5%的国债利率去做折现,这笔投资是否值得?

年份 现金流 (万元)
0 -500
1 100
2 200
3 300

计算内部收益率,将其与国债利率比较,

-500 + 100/(1+IRR) + 200/(1+IRR)^2 + 300/(1+IRR)^3 vs 5%

计算得到

IRR约为8% >5%,该笔投资值得。

从另一个角度看,这笔投资3年后累计现金流为+100万元,如果买3年期利率为5%的国债,则累计现金流为

500×(1+5%)^3-500=78.8125(万元) < 100(万元)

二、Numpy计算内部收益率IRR

直接上源码:

def irr(values):
"""
Return the Internal Rate of Return (IRR).
.. deprecated:: 1.18
`irr` is deprecated; for details, see NEP 32 [1]_.
Use the corresponding function in the numpy-financial library,
https://pypi.org/project/numpy-financial.
This is the "average" periodically compounded rate of return
that gives a net present value of 0.0; for a more complete explanation,
see Notes below.
:class:`decimal.Decimal` type is not supported.
Parameters
----------
values : array_like, shape(N,)
Input cash flows per time period. By convention, net "deposits"
are negative and net "withdrawals" are positive. Thus, for
example, at least the first element of `values`, which represents
the initial investment, will typically be negative.
Returns
-------
out : float
Internal Rate of Return for periodic input values.
Notes
-----
The IRR is perhaps best understood through an example (illustrated
using np.irr in the Examples section below). Suppose one invests 100
units and then makes the following withdrawals at regular (fixed)
intervals: 39, 59, 55, 20. Assuming the ending value is 0, one's 100
unit investment yields 173 units; however, due to the combination of
compounding and the periodic withdrawals, the "average" rate of return
is neither simply 0.73/4 nor (1.73)^0.25-1. Rather, it is the solution
(for :math:`r`) of the equation:
.. math:: -100 + \\frac{39}{1+r} + \\frac{59}{(1+r)^2}
+ \\frac{55}{(1+r)^3} + \\frac{20}{(1+r)^4} = 0
In general, for `values` :math:`= [v_0, v_1, ... v_M]`,
irr is the solution of the equation: [2]_
.. math:: \\sum_{t=0}^M{\\frac{v_t}{(1+irr)^{t}}} = 0
References
----------
.. [1] NumPy Enhancement Proposal (NEP) 32,
https://numpy.org/neps/nep-0032-remove-financial-functions.html
.. [2] L. J. Gitman, "Principles of Managerial Finance, Brief," 3rd ed.,
Addison-Wesley, 2003, pg. 348.
Examples
--------
>>> round(np.irr([-100, 39, 59, 55, 20]), 5)
0.28095
>>> round(np.irr([-100, 0, 0, 74]), 5)
-0.0955
>>> round(np.irr([-100, 100, 0, -7]), 5)
-0.0833
>>> round(np.irr([-100, 100, 0, 7]), 5)
0.06206
>>> round(np.irr([-5, 10.5, 1, -8, 1]), 5)
0.0886
"""
# `np.roots` call is why this function does not support Decimal type.
#
# Ultimately Decimal support needs to be added to np.roots, which has
# greater implications on the entire linear algebra module and how it does
# eigenvalue computations.
res = np.roots(values[::-1]) # 求根
mask = (res.imag == 0) & (res.real > 0) # 虚部为0,实部为大于0
if not mask.any(): # 判断是否有满足条件的实根
return np.nan # 不满足,返回Not A Number
res = res[mask].real
# NPV(rate) = 0 can have more than one solution so we return
# only the solution closest to zero.
rate = 1/res - 1
rate = rate.item(np.argmin(np.abs(rate))) #
return rate

我们直接调用numpy.irr()进行计算,参数为一个数组,每年的现金流量。然后用round()函数将其约到小数点后四位。

计算结果为:0.0821。我们发现这里还报了一个DeprecationWarning,在NumPy 1.20版本,irr()函数将被移除,有一个专门计算金融的Python包从Numpy中独立出来了,叫做numpy_financial,大致看了一下,可以计算fv、pmt、nper、impt、ppmt、pv、rate、irr、npv、mirr等,感兴趣的可以点击进去看一看。

>>> import numpy as np
>>> print(round(np.irr([-500, 100, 200, 300]),4)) Warning (from warnings module):
File "C:\Users\Administrator\Desktop\func1.py", line 2
print(round(np.irr([-100, 39, 59, 55, 20]),4))
DeprecationWarning: numpy.irr is deprecated and will be removed from NumPy 1.20. Use numpy_financial.irr instead (https://pypi.org/project/numpy-financial/).
0.0821

利用Numpy求解投资内部收益率IRR的更多相关文章

  1. Python利用最优化算法求解投资内部收益率IRR【一】

    一. 内部收益率和净现值 内部收益率(Internal Rate of Return, IRR)其实要和净现值(Net Present Value, NPV)结合起来讲.净现值指的是某个投资项目给公司 ...

  2. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

  3. 02_利用numpy解决线性回归问题

    02_利用numpy解决线性回归问题 目录 一.引言 二.线性回归简单介绍 2.1 线性回归三要素 2.2 损失函数 2.3 梯度下降 三.解决线性回归问题的五个步骤 四.利用Numpy实战解决线性回 ...

  4. Numpy求解线性方程组

    Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证

  5. 利用numpy+matplotlib绘图的基本操作教程

    简述 Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单.具体介绍见matplot官网. Numpy(Nu ...

  6. 使用c语言计算分期贷款折算年化收益率(内部收益率IRR*12)

    众所周知,现在银行的分期贷款利率是很有诱惑性人.表面看利率是很低的,例如招行的闪电贷有时给我的利率是4.3% 但是,由于贷款是分期还本的,我手上的本金每月都在减少,到最后一个月时手上只有少量本金,但是 ...

  7. OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换

    1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...

  8. python 利用numpy进行数据分析

    一.numpy.loadtxt读取数据 data=numpy.loadtxt('数据路径.txt',delimiter=',',usecols=(0,1,2,3) , dtype=float)#读取后 ...

  9. 在Python中利用CVXOPT求解二次规划问题

    工作中需要用到cvxopt,cvxopt安装有坑,大家注意下.1.首先一定要卸载numpy,无论是直接安装的,还是anaconda安装的,主要是必须用whl安装numpy才不会有包的冲突2.二次规划包 ...

随机推荐

  1. mysql 8.0 主从复制配置

    背景: 主库: 192.168.211.128 从库: 192.168.211.129 一.关闭防火墙 [root@node01 ~]# systemctl disable firewalld [ro ...

  2. 容器编排系统之K8s资源标签、标签选择器、资源注解

    前文我们聊到了使用k8s资源配置清单定义资源的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14132890.html:今天我们来聊下资源标签,标签选 ...

  3. Eureka系列(二) 服务注册Server端具体实现

    服务注册 Server端流程   我们先看下面这张图片,这张图片简单描述了下我们EurekaClient 在调用EurekaServer 提供的服务注册Http接口,Server端实现接口执行的大致流 ...

  4. Kafka高性能的原理

    Kafka高性能的原理 高性能,高并发,高可用 使用了NIO技术.高并发. 顺序读写.硬盘的顺序读写性能要高于内存的随机读写. 跳表设计. 稀疏索引.index文件里面有部分offset的位置. 使用 ...

  5. NO.001- 简说 Java 并发编程史

    这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进.对历史理解 ...

  6. Django项目连接多个数据库配置

    1.设置数据库连接 pip install PyMySQL 2.在项目同名目录myproject/myproject下的__init__.py添加以下代码 import pymysql pymysql ...

  7. 【剑指offer】04 重建二叉树

    题目地址:重建二叉树 题目描述                                    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不 ...

  8. MySQL:判断逗号分隔的字符串中是否包含某个字符串 && 如何在一个以逗号分隔的列表中的一个字段中连接MySQL中的多对多关系中的数据

    需求:      sql语句中,判断以逗号分隔的字符串中是否包含某个特定字符串,类似于判断一个数组中是否包含某一个元素, 例如:判断 'a,b,c,d,e,f,g' 中是否包含 'a',sql语句如何 ...

  9. 学习 Gin 问题总结 2020.12.29

    学习 Gin 问题总结 2020.12.29 数据绑定与解析 BindXXX,ShouldBindXXX和ShouldBindWith区别 BindXXX 会自动返回信息,输入无效时,在header写 ...

  10. SpringMVC+JPA+SpringData配置

    <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  ...