年收益与年收益与CAGR

时间:2018-06-29 06:34:17

标签: python pandas

我在Internet上阅读并在年度回报年度回报 CAGR 上浏览了不同的文章,我有点困惑,我愿意不知道它们是不同还是相同。

这是我需要的。假设我三年的增长率为10%。从100美元开始,我有:

初始资金:100 $ 1年:110 $ 2年:121 $ 第三年:133 $

现在年度回报为10%,年度平均回报应为33/3 = 11%。正确?显然,年平均回报率不能很好地衡量我的增长率,因为它没有考虑复利。我对么?

现在假设我将问题的输入日期取反了。我有100美元的初始资金和133美元的最终资金,我想计算增长率。公式应为(大写/大写)^(1/3)-1。

(133/100)^(1/3)-1 =(1,33)^(1/3)= 0.098

大约等于10%。到目前为止,我的计算和推理是否正确?如果是这样,年度回报 CAGR 有什么区别?看来它们是一样的,对吗?

现在我的时间范围是从2008年9月10日到2012年10月10日,我的时间范围是3年132天。根据该网站(参见视频)https://www.investopedia.com/ask/answers/071014/what-formula-calculating-compound-annual-growth-rate-cagr-excel.asp,这里的年数是(3 + K),其中K是以年为单位转换的天数,在我们的示例中,K = 132/365 = 0.36,所以年数N = 3 + 0.36 = 3.36,这是我应该在公式中使用的值。我说得对吗?

现在,最后一个疑问是,要计算K的网站建议将天数除以360或365,但是在我的计算中,我应该只考虑股票市场开放的天数(该数字或多或少等于272)?

关于python的最后一个问题是,假设我有一个熊猫数据框df,有人可以放入我可以用来计算年收益和/或CAGR的代码段。该代码应考虑到时间范围可能超过一年而不是一年的整数倍(例如上面的示例)。

我试图写它,但是我不确定我做得很好。

此外,如果我的时间范围少于一年,会发生什么?我应该使用年度回报吗?在这种情况下代码如何更改?

预先感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您的公式是正确的,但是假设增长10%,您最终获得133.1,而不是133。

然后:(133.1 / 100)^(1/3)-1 = 10%

答案 1 :(得分:0)

通过评论和几天的工作,我找到了问题的详细解答。我将它们放在这里是为了他人的利益。我将它们分为两部分:理论和编程。

理论

根据上面的示例,如果我的投资的年收益率为10%,初始资本为100美元,那么我拥有:

第一年:110 $ 2年:121 $ 第三年:133.1 $

总收入为33.1 $,被称为累积回报。如果将此收入除以年数,您将得到平均平均回报。了解趋势是一个很好的估计,但它没有考虑复利。要获得真实的年回报率,您应该应用此公式(该公式是复利公式的衍生工具-有关详细信息,请参阅Wikipedia)。

年度回报(或CAGR) =(最终资本/初始资本)^(1 / N)-1

其中N是年数。如果投资的开始日期和结束日期从1月1日开始,到12月31日结束,则N为整数,否则N可以为实数,其中小数部分计算为365 /天数。

编程

最初,由于我是Python的初学者,因此我认为可以使用复杂的算法来计算时间序列的收益。后来,一旦我了解了理论,事情就变得容易了。假设您有:

  • 开始时间
  • 结束时间
  • 起始价格
  • end_price

累积收益是python中的一个简单公式:

cum_return_percentage=((end_price/start_price) - 1)*100

年收益公式也很容易实现:

annual_return=(pow((end_price/start_price),(1/number_years))-1)*100

问题是要正确计算number_years作为实际值,同时将剩余的天数考虑为十进制值。这是我正在使用的代码:

diffyears=end_date.year - start_date.year
difference=end_date - start_date.replace(end_date.year)
days_in_year=isleap(end_date.year) and 366 or 365
number_years=diffyears + difference.days/days_in_year
annual_return=(pow((end_price/start_price),(1/number_years))-1)*100

要感谢,此代码来自以下讨论: Pythonic difference between two dates in years?

希望这可以帮助其他遇到我同样问题的人。

答案 2 :(得分:0)

# We ask the user for the initial and final amounts of the investment

start_price = float(input('Initial investment amount: '))
end_price = float(input('Final amount of the investment: '))
start_time = input('Investment date: ')    
end_time = input('Final date considered for the CAGR calculation: ')
    
def CAGR(start_price, end_price, start_time, end_time):
    # days number
    fecha1 = datetime.strptime(start_time, "%Y-%m-%d")
    fecha2 = datetime.strptime(end_timeal, '%Y-%m-%d')
    dias = (fecha1 - fecha2).days
    años = dias/365
    return (end_price/start_price)**(1/años)-1
CAGR  = CAGR(start_price, end_price, start_time, end_time)

# CAGR is negative in the case of losses.
if start_price > end_price:
    CAGR = -CAGR
print ('Your investment had a CAGR of {:.2%} '.format(CAGR))