Я пытаюсь добавить переменную, которая отслеживает рекордный максимум временного ряда. Приведенный ниже код не работает: R обнаруживает фатальную ошибку во время цикла for. Я не совсем понимаю, что здесь не так.
Редактировать: Теперь еще более странно. Иногда это работает, а иногда нет.
library(quantmod)
GSPC_df <- getSymbols("^GSPC", src = "yahoo", auto.assign = FALSE,
from = "1927-12-30")
GSPC_df$GSPC.ATH <- GSPC_df$GSPC.Close
for (i in (2:nrow(GSPC_df))){
GSPC_df$GSPC.ATH[i] <- max(GSPC_df$GSPC.Close[i], GSPC_df$GSPC.ATH[i - 1])
}
И - если это работает - это намного медленнее, чем (возможно, не так) эквивалентная операция с обычным фреймом данных:
library(quantmod)
GSPC_df <- as.data.frame(getSymbols("^GSPC", src = "yahoo", auto.assign = FALSE,
from = "1927-12-30"))
GSPC_df$GSPC.ATH <- GSPC_df$GSPC.Close
for (i in (2:nrow(GSPC_df))){
GSPC_df$GSPC.ATH[i] <- max(GSPC_df$GSPC.Close[i], GSPC_df$GSPC.ATH[i - 1])
}
@Limey Ошибка в том, что RStudio дает сбой. Я включил сообщение выше. Используемые данные должны быть доступны каждому. Я посмотрю на dplyr::lag, но мне все равно будет интересно узнать, почему описанное выше иногда не работает.
Я бы попробовал GSPC_df$GSPC.ATH = cummax(GSPC_df$GSPC.Close)
, это должно быть на несколько порядков быстрее вашего цикла.
Используйте cummax
, как показано. Возврат Zoo из getSymbols
улучшит последующую обработку имени, но в остальном аналогичен использованию xts. В конце конвертируем в xts. Эта последняя строка является необязательной.
library(magrittr)
library(quantmod)
stock <- "^GSPC" %>%
getSymbols(auto.assign = FALSE, return.class = "zoo") %>%
na.omit %>%
transform(ATH = cummax(Cl(.))) %>%
as.xts # optional
Это довольно гладко. Это не совсем работает, если (второй экземпляр) «stock» еще не определен. И он пропускает «от», что в данном случае имеет значение. Но в остальном очень полезно. Есть идеи, в чем проблема с рассматриваемым кодом?
Иметь фиксированный код. Код в вопросе, кажется, работает для меня. Вы используете старую версию Quantmod или R?
И quantmod, и R свежие.
Попробуйте без RStudio, просто R.
6 ОК из 6 попыток! (Хотя все еще очень медленно.)
Первый в вопросе с использованием R (без RStudio). Тем временем я пытаюсь придумать, как дать новой переменной имя ATH, потому что она (ваша версия) теперь дает GSPC.Close.1.
Еще раз пересмотрел решение. Кажется, проблема с именованием исчезнет, если мы будем использовать Zoo вместо xts, поэтому мы добавили return.class = "zoo"
, а затем в конце конвертировали в xts.
А твоя ошибка? И какие-нибудь примерные данные могут быть? Кроме того, «если я подумываю об использовании цикла for в R, возможно, есть лучший способ» — это полезный принцип. Подозреваю, что это именно тот случай: взгляните на
dplyr::lag
.