Я пытаюсь вычислить максимальную серию выигрышей и проигрышей в наборе данных (то есть наибольшее количество последовательных положительных или отрицательных значений). Я нашел несколько похожий вопрос здесь, в 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)
) не сработало.
Как я могу это сделать?
Расчет размера полосы Помимо длины полосы, я также хотел бы включить в свой анализ размер полосы. С ответами, приведенными ниже, я подумал, что смогу сделать это сам, но, к сожалению, я ошибаюсь и сталкиваюсь со следующей проблемой (ами):
Со следующим фреймом данных:
> 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 привести к каким-либо изменениям. Какой очевидный момент мне не хватает?