Reputation: 161
I am seeking to confirm that my representation of the annualized return formula (using monthly returns) is optimal.
The annualized return formula I am using (where M is a monthly return and D is the total count of monthly returns) where the count of monthly returns is greater than 12 is as follows:
Alternatively, the this would change in the case of the monthly return count being less than 12:
Here is my representation of this formula in Pandas:
ann_return = observations.apply(lambda y: y.apply(lambda x: x+1))
ann_return = (ann_return.prod() ** (np.min(12/len(ann_return.index.values)) if len(ann_return.index.values) > 12 else 12/len(ann_return.index.values)))-1
Upvotes: 5
Views: 22427
Reputation: 63252
This calculates the annualized return percentage. It works with both an individual number or a Pandas dataframe. In the latter case, the first argument percent
and optionally the second argument months
can be a dataframe.
This was tested with Python 3.7.0 and Pandas 0.23.4 with NumPy 1.15.2.
def annualize_return(percent: float, months: int) -> float:
"""Return the annualized return percentage given the holding return percentage and the number of months held.
>>> annualize_return(1.5, 1) # doctest: +ELLIPSIS
19.56...
>>> annualize_return(6.1, 3) # doctest: +ELLIPSIS
26.72...
>>> annualize_return(30, 12) # doctest: +ELLIPSIS
30.00...
>>> annualize_return(30, 15) # doctest: +ELLIPSIS
23.35...
>>> annualize_return(float('nan'), 15)
nan
>>> annualize_return(0, 0)
0
References:
https://en.wikipedia.org/wiki/Holding_period_return
https://www.wikihow.com/Calculate-Annualized-Portfolio-Return
"""
# Ref: https://stackoverflow.com/a/52618808/
if months == 0:
return percent
rate = percent / 100
years = months / 12
rate = ((rate + 1)**(1 / years)) - 1
percent = rate * 100
return percent
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True, exclude_empty=True)
Upvotes: 3
Reputation: 294198
D = len(ann_return)
ann_return.add(1).prod() ** (12 / D) - 1
Upvotes: 7