Используя их дневные цены закрытия, я хочу смоделировать зависимость между пятью основными индексами: SP500, SSEC, HSI, TASI и DAX. Мне нужно согласовать трехвременные ряды с общими для них торговыми днями и исключить другие дни.
Вот моя попытка, которая всегда приводит к ошибке:
library(quantmod)
# Fetch daily close prices
sp500 <- getSymbols("^GSPC", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")
ssec <- getSymbols("000001.SS", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")
hsi <- getSymbols("^HSI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")
tasi <- getSymbols("^TASI.SR", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")
dax <- getSymbols("^GDAXI", src = "yahoo", auto.assign = FALSE, from = "2017-10-09", to = "2022-09-29")
# Align the data
all_dates <- Reduce(intersect, list(index(sp500), index(ssec), index(hsi), index(tasi), index(dax)))
sp500_aligned <- Cl(sp500)[all_dates]
ssec_aligned <- Cl(ssec)[all_dates]
hsi_aligned <- Cl(hsi)[all_dates]
Ошибка
sp500_aligned <- Cl(sp500)[all_dates]
Ошибка в[.xts
(Cl(sp500), all_dates): нижний индекс выходит за пределы
Проблема с кодом в вопросе заключается в том, что intersect
удаляет класс из дат. Хотя это легко исправить, мы предлагаем другой подход, основанный на merge.xts
, который поддерживает многосторонние слияния.
1) Поместите данные символов в среду e
, а затем используйте eapply
, чтобы получить список данных закрытия тикеров (или используйте Ad
, чтобы получить скорректированные закрытия).
Определите и вызовите mergeList
, который берет список объектов xts из одного столбца, объединяет их и устанавливает имена выходных данных в исходные имена списков. Наконец, удалите все строки, в которых есть одна или несколько NA, используя na.omit
.
library(quantmod)
tickers <- c("^GSPC", "000001.SS", "^HSI", "^TASI.SR", "^GDAXI")
getSymbols(tickers, env = e <- new.env(),
from = "2017-10-09", to = "2022-09-29")
mergeList <- \(x) do.call("merge", x) |> setNames(names(x))
alldata <- e |>
eapply(Cl) |>
mergeList() |>
na.omit()
# rm(e) # optional
2) Вариант вышеизложенного помещает данные в глобальную среду, а затем извлекает их. Преимущество этого подхода состоит в том, что он представляет собой единый конвейер, но в глобальной среде остается множество незакрепленных объектов, что не так аккуратно, как хранить их все в отдельной среде, как в (1), хотя их можно удалить, если они нежелательны, как показано. в дополнительной строке ниже.
alldata <- tickers |>
getSymbols(from = "2017-10-09", to = "2022-09-29") |>
mget(envir = .GlobalEnv) |>
Map(f = Cl) |>
mergeList() |>
na.omit()
# rm(list = names(alldata), envir = .GlobalEnv) # optional
Упрощено и исправлено. Добавьте (2).
Отличная помощь и объяснение. Большое спасибо за вашу помощь. Я ценю это.
Возможно, вам придется преобразовать результат
Reduce
в дату (as.Date()
).