我们如何在 Dataframe 中找到现金流量的 IRR?

How can we find the IRR of cash flows in a Dataframe?

我可以使用下面的代码轻松找到数据框中的项目的 NPV。但是我怎样才能得到相同项目的内部收益率呢?

import numpy_financial as npf
import pandas as pd

# Intitialise data of lists
data = [{'Month': '2020-01-01', 'Expense':1000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-02-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2020-03-01', 'Expense':7000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-04-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2020-01-01', 'Expense':5000, 'Revenue':6000, 'Building':'Casino'}, 
       {'Month': '2020-02-01', 'Expense':5000, 'Revenue':4000, 'Building':'Casino'},
       {'Month': '2020-03-01', 'Expense':5000, 'Revenue':9000, 'Building':'Casino'},
       {'Month': '2020-04-01', 'Expense':6000, 'Revenue':10000, 'Building':'Casino'}]
df = pd.DataFrame(data)
df

df.groupby("Building")["Revenue"].apply(lambda x: npf.npv(rate=0.1, values=x))

结果:

Building
Casino     24587.528174
Stadium    15773.854245

我试着找到 IRR,就像这样。

df.groupby("Building")["Revenue"].apply(lambda x: npf.irr(values=x))

它只计算 NAN。

结果:

Building
Casino    NaN
Stadium   NaN

文档:https://numpy.org/numpy-financial/latest/irr.html

您可以合并 apply() with irr().

您试图找到的是利率,其中 NPV 为 0。但是,由于您只有正收入而没有初始投资(负号),因此不可能。请检查使用的公式 in the docs。您可能还想考虑费用?

我已经编辑了您的示例以演示可行的解决方案。

更新:我增加了大笔初始付款并将支出和收入之间的差值传递给 irr()

import numpy_financial as npf
import pandas as pd

data = [{'Month': '2020-01-01', 'Expense':100000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-02-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2020-03-01', 'Expense':7000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-04-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2020-01-01', 'Expense':500000, 'Revenue':6000, 'Building':'Casino'}, 
       {'Month': '2020-02-01', 'Expense':5000, 'Revenue':4000, 'Building':'Casino'},
       {'Month': '2020-03-01', 'Expense':5000, 'Revenue':9000, 'Building':'Casino'},
       {'Month': '2020-04-01', 'Expense':6000, 'Revenue':10000, 'Building':'Casino'}]
df = pd.DataFrame(data)

irr = df.groupby('Building')[['Revenue','Expense']].apply(lambda x: npf.irr(x['Revenue'] - x['Expense']))

print(irr)

输出:

Building
Casino    -0.786486
Stadium   -0.809623
dtype: float64

虽然我不是财务分析方面的专家,但我认为这个问题需要比所提供的内容更多的解释和评估。因此,尽管对@KarelZ 的回应给予了应有的尊重,它实际上为所述数据提供了答案,但我认为从财务分析的角度来看,它没有多大价值。
根据定义,Internal Rate of Return (IRR) 是财务分析中用于估计潜在投资盈利能力的指标。 IRR 是在贴现现金流分析中使所有现金流的净现值 (NPV) 等于零的贴现率。该定义中的固有假设是 (1) 存在初始投资,并且 (2) 存在投资产生的现金流。

根据定义,Net Present Value (NPV) 是您的项目与您的初始投资相比以指定利率 return 计算的现金流现值。实际上,它是一种计算项目或支出的 return 投资或 ROI 的方法。虽然 NPV 不一定意味着初始投资,但它确实意味着为了使计算有用,应该评估真实的现金流量,这意味着要考虑到有意义的费用和收入。

为了计算有效的内部收益率,我们需要将初始投资纳入结构中,并根据费用和收入之间的差异计算内部收益率。考虑到这一点,我通过向每个结构添加一行来修改原始数据集,将初始投资显示为费用。见下文:

# Intitialise data of lists
data = [{'Month': '2019-12-01', 'Expense':100000, 'Revenue':0, 'Building':'Stadium'},
       {'Month': '2020-01-01', 'Expense':1000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-02-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2020-03-01', 'Expense':7000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2020-04-01', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2019-12-01', 'Expense':150000, 'Revenue':0, 'Building':'Casino'}, 
       {'Month': '2020-01-01', 'Expense':5000, 'Revenue':6000, 'Building':'Casino'}, 
       {'Month': '2020-02-01', 'Expense':5000, 'Revenue':4000, 'Building':'Casino'},
       {'Month': '2020-03-01', 'Expense':5000, 'Revenue':9000, 'Building':'Casino'},
       {'Month': '2020-04-01', 'Expense':6000, 'Revenue':10000, 'Building':'Casino'}]
df = pd.DataFrame(data)  

这将生成如下所示的数据框:

    Month   Expense Revenue Building
0   2019-12-01  100000  0   Stadium
1   2020-01-01  1000    5000    Stadium
2   2020-02-01  3000    4000    Stadium
3   2020-03-01  7000    5000    Stadium
4   2020-04-01  3000    4000    Stadium
5   2019-12-01  150000  0   Casino
6   2020-01-01  5000    6000    Casino
7   2020-02-01  5000    4000    Casino
8   2020-03-01  5000    9000    Casino
9   2020-04-01  6000    10000   Casino  

我向这个数据框添加了一个 CashFlow 列,其中包含费用和收入之间的差异,如下所示:

def computeCashFlow(e, r):
    return r-e  

df['CashFlow'] = df.apply(lambda row: computeCashFlow(row.Expense, row.Revenue), axis= 1)  

这会导致添加如下所示的 CashFlow:

    Month   Expense Revenue Building    CashFlow
0   2019-12-01  100000  0   Stadium -100000
1   2020-01-01  1000    5000    Stadium 4000
2   2020-02-01  3000    4000    Stadium 1000
3   2020-03-01  7000    5000    Stadium -2000
4   2020-04-01  3000    4000    Stadium 1000
5   2019-12-01  150000  0   Casino  -150000
6   2020-01-01  5000    6000    Casino  1000
7   2020-02-01  5000    4000    Casino  -1000
8   2020-03-01  5000    9000    Casino  4000
9   2020-04-01  6000    10000   Casino  4000  

使用现金流列,您可以按如下方式计算 IRR 和 NPR:

df.groupby("Building")["CashFlow"].apply(lambda x: npf.npv(rate=0.1, values=x))  
Building
Casino    -144180.042347
Stadium    -96356.806229
Name: CashFlow, dtype: float64  

df.groupby('Building')['CashFlow'].apply(lambda x: npf.irr(x))  
Building
Casino    -0.559380
Stadium   -0.720914
Name: CashFlow, dtype: float64  

在考虑原始投资的情况下给出 NPV 和 IRR 的实际结果