python中的最大活动下降

piR*_*red 12 python numpy quantitative-finance pandas

我最近问了一个关于计算最大缩幅的问题,其中Alexander给出了一种非常简洁有效的方法来计算大熊猫中的DataFrame方法.

我想通过询问其他人如何计算最大有效缩编来跟进?

这计算Max Drawdown.不!最大有效亏损

这是我根据Alexander对上述问题的回答实现的最大缩编:

def max_drawdown_absolute(returns):
    r = returns.add(1).cumprod()
    dd = r.div(r.cummax()).sub(1)
    mdd = dd.min()
    end = dd.argmin()
    start = r.loc[:end].argmax()
    return mdd, start, end
Run Code Online (Sandbox Code Playgroud)

它需要一个返回序列并返回max_drawdown以及下降发生的指数.

我们首先生成一系列累积回报,作为回报指数.

r = returns.add(1).cumprod()
Run Code Online (Sandbox Code Playgroud)

在每个时间点,通过将回报指数的当前水平与之前所有时期的最大回报指数进行比较来计算当前的亏损.

dd = r.div(r.cummax()).sub(1)
Run Code Online (Sandbox Code Playgroud)

然后,最大亏损是所有计算下降的最小值.

我的问题:

我想通过询问其他人如何计算最大 有效缩编来跟进?

假设解决方案将扩展到上面的解决方案.

piR*_*red 10

从一系列投资组合回报和基准回报开始,我们为两者建立累积回报.假设下面的变量已经在累积回报空间中.

从期间j到期间i的主动回报是:

主动回报的公式

这就是我们如何扩展绝对解决方案:

def max_draw_down_relative(p, b):
    p = p.add(1).cumprod()
    b = b.add(1).cumprod()
    pmb = p - b
    cam = pmb.expanding(min_periods=1).apply(lambda x: x.argmax())
    p0 = pd.Series(p.iloc[cam.values.astype(int)].values, index=p.index)
    b0 = pd.Series(b.iloc[cam.values.astype(int)].values, index=b.index)
    dd = (p * b0 - b * p0) / (p0 * b0)
    mdd = dd.min()
    end = dd.argmin()
    start = cam.ix[end]
    return mdd, start, end
Run Code Online (Sandbox Code Playgroud)

说明

与绝对情况类似,在每个时间点,我们想知道最大累积活动回报到达该点的时间.我们得到了这一系列累积的主动回报p - b.不同之处在于我们想要记录此时的p和b,而不是差异本身.

因此,我们产生了一系列的" whens "在捕获cam(ç umulative 一个 RG 斧)和随后的串联组合与基准值中的那些" whens ".

    p0 = pd.Series(p.ix[cam.values.astype(int)].values, index=p.index)
    b0 = pd.Series(b.ix[cam.values.astype(int)].values, index=b.index)
Run Code Online (Sandbox Code Playgroud)

现在可以使用上面的公式类似地进行缩减计算:

    dd = (p * b0 - b * p0) / (p0 * b0)
Run Code Online (Sandbox Code Playgroud)

示范

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.random.seed(314)
p = pd.Series(np.random.randn(200) / 100 + 0.001)
b = pd.Series(np.random.randn(200) / 100 + 0.001)

keys = ['Portfolio', 'Benchmark']
cum = pd.concat([p, b], axis=1, keys=keys).add(1).cumprod()
cum['Active'] = cum.Portfolio - cum.Benchmark


mdd, sd, ed = max_draw_down_relative(p, b)

f, a = plt.subplots(2, 1, figsize=[8, 10])

cum[['Portfolio', 'Benchmark']].plot(title='Cumulative Absolute', ax=a[0])
a[0].axvspan(sd, ed, alpha=0.1, color='r')

cum[['Active']].plot(title='Cumulative Active', ax=a[1])
a[1].axvspan(sd, ed, alpha=0.1, color='r')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述