python 中的最大主动回撤

2024-05-10

我最近问了一个关于计算最大回撤 https://stackoverflow.com/questions/36750571/calculate-max-draw-down-with-a-vectorized-solution-in-python where 亚历山大 https://stackoverflow.com/users/2411802/alexander给出了一种非常简洁有效的方法,可以使用 pandas 中的 DataFrame 方法来计算它。

我想跟进询问其他人是如何计算的maximum active回撤?

这将计算最大回撤。不是!最大主动回撤

这是我根据亚历山大对上面链接的问题的回答实现的最大回撤:

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

它需要一个返回序列并返回 max_drawdown 以及发生回撤的索引。

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

r = returns.add(1).cumprod()

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

dd = r.div(r.cummax()).sub(1)

那么最大回撤就是所有计算出的回撤中的最小值。

我的问题:

我想跟进询问其他人是如何计算的最大限度active回撤?

假设该解决方案将扩展上述解决方案。


从一系列投资组合回报和基准回报开始,我们为两者建立累积回报。假设以下变量已经位于累积返回空间中。

期间的主动回报j到时期i is:

Solution

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

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

解释

与绝对情况类似,在每个时间点,我们想知道截至该点的最大累积主动收益是多少。我们得到这一系列的累积主动收益p - b。不同之处在于我们想要跟踪此时 p 和 b 是什么,而不是差异本身。

所以,我们生成了一系列'whens' 捕获于cam (c累计argmax) 以及随后的一系列投资组合和基准值 '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)

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

    dd = (p * b0 - b * p0) / (p0 * b0)

示范

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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中的最大主动回撤 的相关文章

随机推荐