##定义

最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况

##计算公式

  • 回辙
    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(DiDj))]=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)

参考:O(n)复杂度实现最大回撤的计算

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐