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