##定义
最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况
##计算公式
-
回辙
d r a w _ d o w n = 当 日 净 值 − 当 日 之 前 最 大 净 值 当 日 之 前 最 大 净 值 draw\_down = \frac{当日净值-当日之前最大净值}{当日之前最大净值} draw_down=当日之前最大净值当日净值−当日之前最大净值
-
最大回辙
m a x _ d r a w _ d o w n = m a x [ ( D i − D j ) D i ) ] = m a x ( 1 − 当 日 净 值 当 日 之 前 最 高 净 值 ) max\_draw\_down = max[\frac{(D_i-D_j)}{D_i}) ] = max(1 - \frac{当日净值}{当日之前最高净值} ) max_draw_down=max[Di(Di−Dj))]=max(1−当日之前最高净值当日净值)
D D D为某一天的净值 , i i i为某一天, j j j为 i i i后面的某一天. D j D_j Dj 为 D i D_i Di后面某一天的净值
##数据模型设计
统计时间 | 用户ID | 窗口最大值 | 窗口起点 | 窗口终点 | 当前净值 | 窗口今日回撤值 | 窗口最大回撤 |
---|---|---|---|---|---|---|---|
a | =(当前净值 - 窗口最大值)/窗口最大值 | max(窗口最大回撤T-1,窗口今日回撤值 ) | |||||
b | |||||||
c |
SQL 实现
根据上面的数据模型 ,可以:
O(1)实现自然窗口最新一天的最大回辙
O(n) 实现滑动窗口最新一天的最大回辙
Python实现
O ( n 2 ) O(n^2) O(n2)
def get_max_drawdown_slow(array):
drawdowns = []
for i in range(len(array)):
max_array = max(array[:i+1])
drawdown = max_array - array[i]
drawdowns.append(drawdown)
return max(drawdowns)
O ( n ) O(n) O(n)
def get_max_drawdown_fast(array):
drawdowns = []
max_so_far = array[0]
for i in range(len(array)):
if array[i] > max_so_far:
drawdown = 0
drawdowns.append(drawdown)
max_so_far = array[i]
else:
drawdown = max_so_far - array[i]
drawdowns.append(drawdown)
return max(drawdowns)