gpt4 book ai didi

Python:通过添加累计股息并取复合年增长率(CAGR)来计算总返回

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:56 25 4
gpt4 key购买 nike

我有一个数据框,其中包含许多公司的年度价格和股息数据。我希望通过将三年内收到的所有股息与期末股价相加,然后计算复合年增长率来计算 3 年年化返回。我知道如何计算 CAGR,但我遇到的问题是将这段时间收到的股息加到期末价格上。

示例数据:

       RIC  Date    Price   Dividend
0 RSG.AX 2018 0.814 0.000
1 RSG.AX 2017 0.889 0.015
2 RSG.AX 2016 0.937 0.012
3 RSG.AX 2015 0.181 0.000
4 RSG.AX 2014 0.216 0.000
5 RSG.AX 2013 0.494 0.000
6 QBE.AX 2018 7.119 0.352
7 QBE.AX 2017 8.331 0.202
8 QBE.AX 2016 8.961 0.389
9 QBE.AX 2015 9.159 0.363
10 QBE.AX 2014 9.156 0.302

使用公司 RSG.AX(RIC=公司代码),从 2015 年到 2018 年的计算示例为:

3-year return = (End price + cumulative dividends) / Start price = (0.814+0.015+0.012)/0.182 = 4.63

Annualized return = (return)^(1/years)-1 = (4.63)^(1/3)-1 = 0.66 = 66%

我如何使用 Python 执行此操作?或许 .groupby() 可以分离每个公司的数据。感谢您的帮助!

最佳答案

使用shift()从上面/下面的行中获取值进行计算


方法一:在RIC上使用循环

我在每个 RIC 上使用子数据帧 sub_df 的副本通过 df.RIC.unique() 循环它。假设当年的价格是股息后的,3 年返回 将是:

sub_df['3-year Return'] = (sub_df.Price +
sub_df.Dividend +
sub_df.shift(-1).Dividend +
sub_df.shift(-2).Dividend) / sub_df.Price.shift(-3)

之后将 sub_df 更新为原始 df。然后根据您的公式计算年化返回 pow()

df['3-year Return'] = None
for ric in df.RIC.unique():
sub_df = df.loc[df['RIC'] == ric].copy()
sub_df['3-year Return'] = (sub_df.Price +
sub_df.Dividend +
sub_df.shift(-1).Dividend +
sub_df.shift(-2).Dividend) / sub_df.Price.shift(-3)
df.update(sub_df)
df['Annualized return'] = pow(df['3-year Return'], 1/3) - 1
print(df)

RIC Date Price Dividend 3-year Return Annualized return
0 RSG.AX 2018.0 0.814 0.000 4.64641 0.668678
1 RSG.AX 2017.0 0.889 0.015 4.24074 0.618629
2 RSG.AX 2016.0 0.937 0.012 1.92105 0.24312
3 RSG.AX 2015.0 0.181 0.000 None NaN
4 RSG.AX 2014.0 0.216 0.000 None NaN
5 RSG.AX 2013.0 0.494 0.000 None NaN
6 QBE.AX 2018.0 7.119 0.352 0.880227 -0.0416336
7 QBE.AX 2017.0 8.331 0.202 1.01409 0.00467449
8 QBE.AX 2016.0 8.961 0.389 None NaN
9 QBE.AX 2015.0 9.159 0.363 None NaN
10 QBE.AX 2014.0 9.156 0.302 None NaN

方法 2 - 在自定义函数上使用 groupby() 和 apply()

在方法一的基础上,我们可以定义一个自定义函数,通过groupby RIC来应用

def three_year_return(row):
row['3-year Return'] = (row.Price +
row.Dividend +
row.shift(-1).Dividend +
row.shift(-2).Dividend) / row.Price.shift(-3)
return row

df = df.groupby(['RIC']).apply(three_year_return)
df['Annualized return'] = pow(df['3-year Return'], 1/3) - 1


RIC Date Price Dividend 3-year Return Annualized return
0 RSG.AX 2018 0.814 0.000 4.646409 0.668678
1 RSG.AX 2017 0.889 0.015 4.240741 0.618629
2 RSG.AX 2016 0.937 0.012 1.921053 0.243120
3 RSG.AX 2015 0.181 0.000 NaN NaN
4 RSG.AX 2014 0.216 0.000 NaN NaN
5 RSG.AX 2013 0.494 0.000 NaN NaN
6 QBE.AX 2018 7.119 0.352 0.880227 -0.041634
7 QBE.AX 2017 8.331 0.202 1.014089 0.004674
8 QBE.AX 2016 8.961 0.389 NaN NaN
9 QBE.AX 2015 9.159 0.363 NaN NaN
10 QBE.AX 2014 9.156 0.302 NaN NaN

仅供引用 - 结果看起来与您的示例有点不同,因为我发现您使用 0.182 作为 start price 而它应该是 0.181基于您的示例数据。

关于Python:通过添加累计股息并取复合年增长率(CAGR)来计算总返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58454480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com