Вычисление последовательной серии данных

Я пытаюсь вычислить максимальную серию выигрышей и проигрышей в наборе данных (то есть наибольшее количество последовательных положительных или отрицательных значений). Я нашел несколько похожий вопрос здесь, в StackOverflow, и хотя он дал мне несколько хороших предложений, угол этого вопроса другой, и у меня (пока) недостаточно опыта, чтобы перевести и применить эту информацию к этой проблеме. Так что я надеялся, что вы можете мне помочь, даже предложение было бы отличным.

Мой набор данных выглядит так:

> subRes
   Instrument TradeResult.Currency.
1         JPM                    -3
2         JPM                   264
3         JPM                   284
4         JPM                    69
5         JPM                   283
6         JPM                  -219
7         JPM                   -91
8         JPM                   165
9         JPM                   -35
10        JPM                  -294
11        KFT                    -8
12        KFT                   -48
13        KFT                   125
14        KFT                  -150
15        KFT                  -206
16        KFT                   107
17        KFT                   107
18        KFT                    56
19        KFT                   -26
20        KFT                   189
> split(subRes[,2],subRes[,1])
$JPM
 [1]   -3  264  284   69  283 -219  -91  165  -35 -294
$KFT
 [1]   -8  -48  125 -150 -206  107  107   56  -26  189

В этом случае максимальная (выигрышная) серия для JPM составляет четыре (а именно 264, 284) , 69 и 283 последовательных положительных результата), а для KFT это значение равно 3 (107, 107, 56).

Моя цель - создать функцию, которая дает максимальное количество выигрышных серий для каждого инструмента (например, JPM: 4, KFT: 3). Для этого:

R необходимо сравнить текущий результат с предыдущим, и если он выше, то имеется серия по крайней мере из 2 последовательных положительных результатов. Затем R нужно посмотреть на следующее значение, и если оно также выше: прибавить 1 к уже найденному значению 2. Если это значение не выше, R необходимо перейти к следующему значению, запомнив 2 как промежуточный максимум.

Я пробовал cumsum и cummax в соответствии с условным суммированием (например, cumsum (c (TRUE, diff (subRes [ , 2])> 0)) ), что не сработало. Также rle в соответствии с lapply (например, lapply (rle (subRes $ TradeResult.Currency.), Function (x) diff (x)> 0) ) не сработало.

Как я могу это сделать?

Редактировать 19 января 2011 г.

Расчет размера полосы Помимо длины полосы, я также хотел бы включить в свой анализ размер полосы. С ответами, приведенными ниже, я подумал, что смогу сделать это сам, но, к сожалению, я ошибаюсь и сталкиваюсь со следующей проблемой (ами):

Со следующим фреймом данных:

> subRes
   Instrument TradeResult.Currency.
1         JPM                    -3
2         JPM                   264
3         JPM                   284
4         JPM                    69
5         JPM                   283
6         JPM                  -219
7         JPM                   -91
8         JPM                   165
9         JPM                   -35
10        JPM                  -294
11        KFT                    -8
12        KFT                   -48
13        KFT                   125
14        KFT                  -150
15        KFT                  -206
16        KFT                   107
17        KFT                   107
18        KFT                    56
19        KFT                   -26
20        KFT                   189
> lapply(split(subRes[,2], subRes[,1]), function(x) {
+             df.rle <- ifelse(x > 0, 1, 0)
+             df.rle <- rle(df.rle)
+ 
+             wh <- which(df.rle$lengths == max(df.rle$lengths))
+             mx <- df.rle$lengths[wh]
+             suma <- df.rle$lengths[1:wh]
+             out <- x[(sum(suma) - (suma[length(suma)] - 1)):sum(suma)]
+             return(out)
+         })
$JPM
[1] 264 284  69 283

$KFT
[1] 107 107  56

Этот результат правильный, и изменив последнюю строку на return (sum (out)) Я могу получить общий размер полосы:

$JPM
[1] 900

$KFT
[1] 270

Однако функция, похоже, не считает полосы проигрышей при изменении ifelse условие:

lapply(split(subRes[,2], subRes[,1]), function(x) {
            df.rle <- ifelse(x < 0, 1, 0)
            df.rle <- rle(df.rle)

            wh <- which(df.rle$lengths == max(df.rle$lengths))
            mx <- df.rle$lengths[wh]
            suma <- df.rle$lengths[1:wh]
            out <- x[(sum(suma) - (suma[length(suma)] - 1)):sum(suma)]
            return(out)
        })
$JPM
[1] 264 284  69 283

$KFT
[1] 107 107  56

Я не вижу, что мне нужно изменить в этой функции, чтобы в конечном итоге прийти к общей сумме проигрышной полосы. Однако я настраиваю / меняю функцию, но получаю тот же результат или ошибку. Функция ifelse сбивает меня с толку, потому что она кажется очевидной частью функции, которую нужно изменить, но не t привести к каким-либо изменениям. Какой очевидный момент мне не хватает?

9
задан Community 23 May 2017 в 12:17
поделиться