Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Annualized Return in Pandas

Tags:

python

pandas

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:

formula

Alternatively, the this would change in the case of the monthly return count being less than 12:

formula

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
like image 214
lunar_primate Avatar asked Dec 23 '16 00:12

lunar_primate


People also ask

How do you calculate an annualized return?

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.

How do you calculate annualized return on stock?

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.


2 Answers

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)
like image 21
Asclepius Avatar answered Oct 04 '22 19:10

Asclepius


Formula

D = len(ann_return)
ann_return.add(1).prod() ** (12 / D) - 1
like image 174
piRSquared Avatar answered Oct 04 '22 21:10

piRSquared