【问题标题】:max drawdown with data.table使用 data.table 的最大回撤
【发布时间】:2014-05-13 19:25:35
【问题描述】:

我对@9​​87654321@ 有点生疏了,我想找到意甲X_t 的最大回撤(任何时间t 的最大回撤可以定义为argmin{X_T-X_t} 其中T>t,在英语,对于时间系列的每个元素,我需要找到带有T>t 的系列元素,以便最小化 X_T-X-t,如果系列增加则没有缩编)。

library(data.table) 
set.seed(1)
DT = data.table(x=rnorm(10))
DT[,cumsumX:=cumsum(x)]

#I am interested in the drawdown for cumsumX    

DT
                x       cumsumX
 1: -0.6264538107 -0.6264538107 => max drawdown is -1.27.. index 3 (-1.27+0.62 is mini)
 2:  0.1836433242 -0.4428104865 => max drawdown is -1.27.. index 3 (-1.27+0.62 is mini)
 3: -0.8356286124 -1.2784390989 => max drawdown is NA (-1.27 is global minima)
 4:  1.5952808021  0.3168417032 => max drawdown is -0.17.. index 6
 5:  0.3295077718  0.6463494750 ...
 6: -0.8204683841 -0.1741189091
 7:  0.4874290524  0.3133101433
 8:  0.7383247051  1.0516348485
 9:  0.5757813517  1.6274162001
10: -0.3053883872  1.3220278130

如何使用data.table找到maxdrawdow

这是我的解决方案

DT[,`:=`(dd=min(0,min(DT$cumsumX[.I:nrow(DT)])-cumsumX),ddIDX=.I-1L+which.min(DT$cumsumX[.I:nrow(DT)])),by=IDX]
DT
             x    cumsumX IDX         dd ddIDX
 1: -0.6264538 -0.6264538   1 -0.6519853     3
 2:  0.1836433 -0.4428105   2 -0.8356286     3
 3: -0.8356286 -1.2784391   3  0.0000000     3
 4:  1.5952808  0.3168417   4 -0.4909606     6
 5:  0.3295078  0.6463495   5 -0.8204684     6
 6: -0.8204684 -0.1741189   6  0.0000000     6
 7:  0.4874291  0.3133101   7  0.0000000     7
 8:  0.7383247  1.0516348   8  0.0000000     8
 9:  0.5757814  1.6274162   9 -0.3053884    10
10: -0.3053884  1.3220278  10  0.0000000    10

【问题讨论】:

  • 我不明白你的定义 - 你能把它清理一下吗(例如“X_t-X_T is minimum”是什么意思)?
  • 太棒了,看起来@majom 正确理解了你,你在下面有你的答案(我编辑我的除了“maxdrawdown”之外添加索引)
  • 请注意,在您和 @majom 的解决方案中,您都在循环所有行并对每一行进行各种计算,这将非常低效

标签: r data.table


【解决方案1】:

好像你想要的:

DT[, maxdrawdown := rev(cummin(rev(cumsumX)))]
DT[, index := .I[.N], by = maxdrawdown]
DT[cumsumX == min(cumsumX), `:=`(index = NA, maxdrawdown = NA)]
#             x    cumsumX maxdrawdown index
# 1: -0.6264538 -0.6264538  -1.2784391     3
# 2:  0.1836433 -0.4428105  -1.2784391     3
# 3: -0.8356286 -1.2784391          NA    NA
# 4:  1.5952808  0.3168417  -0.1741189     6
# 5:  0.3295078  0.6463495  -0.1741189     6
# 6: -0.8204684 -0.1741189  -0.1741189     6
# 7:  0.4874291  0.3133101   0.3133101     7
# 8:  0.7383247  1.0516348   1.0516348     8
# 9:  0.5757814  1.6274162   1.3220278    10
#10: -0.3053884  1.3220278   1.3220278    10

【讨论】:

    【解决方案2】:

    这是一种可能的方法:

    # Load package
    library(data.table) 
    
    # Generate data
    set.seed(1)
    DT = data.table(x=rnorm(10))
    DT[,cumsumX:=cumsum(x)]
    
    # Define number of rows in data table and index variable
    DT$index <- rownames(DT)
    length.DT <- nrow(DT)
    
    # Calculate maxdrawdown
    DT[ ,maxdrawdown:=min(DT$cumsumX[index:length.DT]), by=index]
    
    # Substitute the minimum value of the entire column to be NA
    DT$maxdrawdown[DT$cumsumX==min(DT$cumsumX)] <- NA
    

    结果如下所示:

    > DT
                 x    cumsumX index maxdrawdown
     1: -0.6264538 -0.6264538     1  -1.2784391
     2:  0.1836433 -0.4428105     2  -1.2784391
     3: -0.8356286 -1.2784391     3          NA
     4:  1.5952808  0.3168417     4  -0.1741189
     5:  0.3295078  0.6463495     5  -0.1741189
     6: -0.8204684 -0.1741189     6  -0.1741189
     7:  0.4874291  0.3133101     7   0.3133101
     8:  0.7383247  1.0516348     8   1.0516348
     9:  0.5757814  1.6274162     9   1.3220278
    10: -0.3053884  1.3220278    10   1.3220278
    

    【讨论】:

    • +1 但不要将$&lt;-data.table 一起使用,这是一种浪费,只需使用:=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2020-01-28
    • 2014-01-30
    • 2023-04-05
    • 1970-01-01
    • 2018-02-17
    • 2021-11-17
    相关资源
    最近更新 更多