熊猫年度回报率

时间:2016-12-23 00:38:32

标签: python pandas

我正在寻求确认我对年化回报公式(使用月回报)的表示是最佳的。

我使用的年化回报公式(其中M是月回报,D是月回报的总数),其中月回报的计数大于12,如下所示:

formula

或者,如果月回报计数小于12,则会发生变化:

formula

以下是我在熊猫中对此公式的描述:

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

2 个答案:

答案 0 :(得分:3)

D = len(ann_return)
ann_return.add(1).prod() ** (12 / D) - 1

答案 1 :(得分:1)

这将计算年度回报率。它可以与单个数字或Pandas数据框一起使用。在后一种情况下,第一个参数percent和可选的第二个参数months可以是一个数据帧。

这已在Python 3.7.0和NumPy 1.15.2的Pandas 0.23.4上进行了测试。

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)