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

2024-09-28 05:26:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框架,里面有许多公司的年度价格和股息数据。我希望计算三年的年化回报率,将三年内收到的所有股息与期末股价相加,然后计算复合年增长率。我知道如何计算复合年增长率,但我陷入困境的地方是将当期收到的股息加在期末价格上。你知道吗

样本数据:

       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

使用公司无线电收发机(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()可以将每个公司的数据分开。感谢您的帮助!你知道吗


Tags: 数据框架return公司价格axprice年度
2条回答

保持它的可读性-如果您真的想避免创建字典,可以使用.apply。你知道吗

result = {}
for ric, grp in df.groupby('RIC'):
    first, last = grp.iloc[-1], grp.iloc[0]
    start_price, end_price = first.Price, last.Price
    cum_div = grp.Dividend.sum()
    return_ = (end_price + cum_div) / start_price
    years = (last.Date - first.Date).days / 365
    ann_return = return_ ** (1 / years) - 1
    result[ric] = ann_return

result_df = pd.DataFrame.from_dict(result, orient='index')
print(result_df)

这是针对数据框架中的整个期间的—如果您希望最后三年更改为grp.iloc[3](确保检查存在大量数据)。这还取决于这样一个事实,即您的数据与示例建议的datetime排序不变量是一致的。你知道吗

使用^{}从上面/下面的行中获取值进行计算


方法1:在RIC上使用循环

我使用每个RIC上的子数据帧的副本df.RIC.unique()循环它。假设年度价格为股息后价格,3-year return将为:

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。然后根据公式用^{}计算Annualized return

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()

基于方法1,我们可以定义一个自定义函数,通过groupbyRIC应用

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。你知道吗

相关问题 更多 >

    热门问题