2016-07-27 80 views
1

對於給定的時間序列浮體,它是很容易在O(n)時間,其中max縮編被定義爲最大虧損與最小窗口長度

\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 

是否有O(n)算法被限制爲具有窗口持續時間> MIN_LENGTH一個max_drawdown?在這種情況下,我想\ min_ {i,j,(j-i)> min_length}(x_j - x_i)。

注意,這不是一個「滾動縮編」的計算如在Compute *rolling* maximum drawdown of pandas Series。相比,你max_drawdown功能

回答

1

的修改是相當小的。目前的算法可以在僞

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

現在不是在我們尋找我們需要的min_length與這些指標的距離的最大值相同的索引搜索max_drawdown。在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 
+0

是 - 這在概念上稍有不同,從最大值向前看,而不是從當前迭代向後。它工作,比我沒有發佈的解決方案更簡單。謝謝! –