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
To calculate the annualized portfolio return, divide the final value by the initial value, then raise that number by 1/n, where "n" is the number of years you held the investments. Then, subtract 1 and multiply by 100.
The yearly rate of return is calculated by taking the amount of money gained or lost at the end of the year and dividing it by the initial investment at the beginning of the year. This method is also referred to as the annual rate of return or the nominal annual rate.
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)
D = len(ann_return)
ann_return.add(1).prod() ** (12 / D) - 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With