【发布时间】:2016-08-13 12:45:20
【问题描述】:
Maximum Drawdown 是量化金融中用于评估最大负回报的常见风险指标。
最近,我对使用循环方法计算最大回撤的时间感到不耐烦。
def max_dd_loop(returns):
"""returns is assumed to be a pandas series"""
max_so_far = None
start, end = None, None
r = returns.add(1).cumprod()
for r_start in r.index:
for r_end in r.index:
if r_start < r_end:
current = r.ix[r_end] / r.ix[r_start] - 1
if (max_so_far is None) or (current < max_so_far):
max_so_far = current
start, end = r_start, r_end
return max_so_far, start, end
我熟悉矢量化解决方案会更好的普遍看法。
问题是:
- 我可以向量化这个问题吗?
- 这个解决方案是什么样的?
- 它有多大好处?
编辑
我将 Alexander 的答案修改为以下函数:
def max_dd(returns):
"""Assumes returns is a pandas Series"""
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
【问题讨论】:
-
看看这个问答是否有帮助:stackoverflow.com/questions/21058333/…
-
游戏迟到了,但我认为
r.loc[:end].argmax()会给你一个问题。你想要r.loc[:end].sort_index(ascending=False).argmax()。如果您的系列中有多个零(多个高水位线),则当前行将按原样返回第一次出现而不是最后一次出现,并产生一个过早的开始日期。 -
@BradSolomon 除非我遗漏了什么,如果有多个相同的高水位线,那么最大回撤期发生的时间是一个解释问题。此外,这不会影响回报的计算。
-
假设您有一个回撤系列(不是返回系列)[0, 0, -2, 0, -3, -5] 由前 6 个月索引那一年。 -5 回撤期之前的高水位线是第三个 0(4 月),而不是第一个,所以不使用
.sort_index(ascending=False)来反转系列会错误地告诉您您的回撤开始于 1 月。我猜这是解释,但在此之下方法不是每次回撤都从第 0 个月或第 1 个月开始吗?我从未见过这样描述的开始日期。 HWM 不一定要相同才能在您的回撤系列中获得多个零。
标签: python numpy pandas quantitative-finance