用户交易数据分析 -最大回辙 O(1) O(n)实现

##定义

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

##计算公式

  • 回辙
    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)复杂度实现最大回撤的计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值