【问题标题】:Max Drawdown with Minimum Window Length最小窗口长度的最大回撤
【发布时间】:2016-07-27 19:52:57
【问题描述】:

对于给定的浮动时间序列,很容易在O(n) 时间计算不受约束的最大回撤,其中最大回撤定义为

\min_{i,j, i<j}(x_j - x_i)

在python中,我们计算的是min(x - numpy.expanding_max(x)),但是要得到O(n)算法,要明确写出来:

def max_drawdown(s):
    drawdn = 0
    m,M = s[0],s[0]
    t1,t2 = 0,0
    T1,T2 = 0,0
    for i,v in enumerate(s):
        if (v < m):
            if (v-m) < drawdn:
                drawdn = v-m
                t2 = i
                T1,T2 = t1,t2
        else:
            m = v
            t1 = i
    return T1,T2,drawdn

是否存在用于 max_drawdown 的 O(n) 算法,该算法被限制为窗口持续时间 > min_length?在这种情况下,我想要 \min_{i,j, (j-i) > min_length}(x_j - x_i)。

请注意,这不是Compute *rolling* maximum drawdown of pandas Series 中的“滚动回撤”计算。

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

    与您的 max_drawdown 函数相比,修改非常小。目前的算法可以写成伪代码

    Iterate over list
      if (current_element > maximum)
        maximum = current_element
      if (current element - maximum < drawdn)
        drawdn = current_element-maximum
    

    现在不是在同一索引处搜索max_drawdown,而是搜索我们需要与这些索引保持min_length 距离的最大值。在 Python 中,这变成:

    def max_drawdown_min_lenght(s,min_length):
        min_length += 1 #this is for i-j > l (not i-j >= l)
        drawdn = 0
        m = s[0]
        t1 = 0
        T1,T2 = 0,0
        for i in range(len(s)-min_length):
            if (s[i] >= m): #do we have new maximum?
                m = s[i]
                t1 = i
            if (s[i+min_length]-m) < drawdn:#do we have new max drawdown?
                drawdn = s[i+min_length]-m
                T1,T2 = t1,i+min_length
        return T1,T2,drawdn
    

    【讨论】:

    • 是的 - 这在概念上略有不同,从最大值向前看,而不是从当前迭代向后看。它有效,并且比我没有发布的解决方案更简单。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2016-02-29
    • 2018-08-26
    • 2021-10-29
    相关资源
    最近更新 更多