Я использовал следующий код:
getSymbols(c("TSLA", "AAPL", "CSCO", "IBM"))
tsla<-TSLA['2022-01-03::2023-01-03']
aapl=AAPL['2022-01-03::2023-01-03']
csco=CSCO['2022-01-03::2023-01-03']
ibm=IBM['2022-01-03::2023-01-03']
tsla<-tsla$TSLA.Adjusted
aapl<-aapl$AAPL.Adjusted
csco<-csco$CSCO.Adjusted
ibm<-ibm$IBM.Adjusted
stkdata=cbind(tsla, aapl, csco, ibm)
n<-length(stkdata[,1])
rets<-log(stkdata[2:n,]/stkdata[1:(n-1),])
Он производит все нули.
После того, как я присвоил stkdata[2:n] x и stkdata[1:n-1] y, R показывает
х[1,]
TSLA.Adjusted AAPL.Adjusted CSCO.Adjusted IBM.Adjusted
2022-01-04 383.1967 178.3907 59.26239 129.9028
у[1,]
TSLA.Adjusted AAPL.Adjusted CSCO.Adjusted IBM.Adjusted
2022-01-03 399.9267 180.6839 60.75242 128.0392
Это отлично. Но
х[1,]/у[1,]
Data:
numeric(0)
Index:
Date of length 0
В чем может быть проблема? Спасибо впереди!
С помощью tidyquant вы можете рассчитать доходность ежедневного журнала следующим образом:
library(tidyquant)
library(tidyverse)
df = tq_get(c("TSLA", "AAPL", "CSCO", "IBM"),
from = "2022-01-03",
to = "2023-01-04")
log_return = df %>%
group_by(symbol) %>%
tq_mutate(select = adjusted,
mutate_fun = periodReturn,
period = "daily",
type = "log",
col_rename = "log_returns")
# A tibble: 1,008 × 9
# Groups: symbol [4]
symbol date open high low close volume adjusted log_returns
<chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 TSLA 2022-01-03 383. 400. 379. 400. 103931400 400. 0
2 TSLA 2022-01-04 397. 403. 374. 383. 100248300 383. -0.0427
3 TSLA 2022-01-05 382. 390. 360. 363. 80119800 363. -0.0550
4 TSLA 2022-01-06 359 363. 340. 355. 90336600 355. -0.0218
5 TSLA 2022-01-07 360. 360. 337. 342. 84164700 342. -0.0361
6 TSLA 2022-01-10 333. 353. 327. 353. 91815000 353. 0.0299
7 TSLA 2022-01-11 351. 359. 346. 355. 66063300 355. 0.00592
8 TSLA 2022-01-12 360. 372. 358. 369. 83739000 369. 0.0385
9 TSLA 2022-01-13 370. 372. 342. 344. 97209900 344. -0.0699
10 TSLA 2022-01-14 340. 351. 338. 350. 72924300 350. 0.0173
# … with 998 more rows
# ℹ Use `print(n = ...)` to see more rows
Заговор
log_return %>%
ggplot() +
aes(x = date, y = log_returns, col = symbol) +
geom_line() +
facet_wrap(~ symbol) +
theme_tq()
Такое поведение ожидается, поскольку арифметические и логические операции над объектами xts выполняются над наблюдениями, имеющими одинаковую дату.
Вы должны использовать функцию lag(), чтобы изменить выравнивание индекса даты и времени. log(stkdata / lag(stkdata)).
Обратите внимание, что вы должны быть очень осторожны, используя lag() с загруженным dplyr. Это нарушает то, как должна работать базовая функция R lag(), что нарушает lag(my_xts). Он также ломает lag() для всех других типов объектов, у которых есть собственный метод lag() (например, зоопарк).
Ваше предупреждение заставило меня с осторожностью использовать lag(). Спасибо за ваш ответ и предупреждение.
Вы можете использовать stats::lag(), если хотите быть уверены, что не используете dplyr::lag()
1) getSymbols может поместить результаты в локальную среду, а затем мы можем перебрать ее элементы, используя eapply. Затем используйте diff с arithmetic=FALSE, заставляя diff выполнять деление, а не вычитание.
Если х - отношение текущей цены к предыдущей цене, то хотя это правда, что log(x) приблизительно равен x-1, если доходность мала, нам на самом деле не нужно использовать это приближение, и мы можем точно рассчитать доходность, используя x-1.
Что касается вопроса, объекты xts объединяются не по положению, а по времени. Удаление первого или последнего элемента объекта xts не меняет время, поэтому код в вопросе делит stkdata сам на себя, за исключением позиций в конце, которые были удалены.
Попробуйте код ниже.
library(quantmod)
tickers <- c("TSLA", "AAPL", "CSCO", "IBM")
getSymbols(tickers, env = e <- new.env(), from = "2022-01-03", to = "2023-01-03")
stks <- do.call("merge", eapply(e, Ad))
rets <- diff(stks, arithmetic = FALSE) - 1
2) Вариант состоит в том, чтобы использовать getSymbols для загрузки данных в текущую рабочую область R, как в вопросе, а затем использовать mget.
Это предполагает, что имя объекта, созданного для каждого символа тикера, совпадает с именем входного символа, и хотя это обычно верно, это не так для таких символов, как ^SPX, которые содержат специальный символ. В этом случае используйте решение (1) выше, которое всегда будет работать, или создайте соответствующим образом модифицированную версию tickers для использования с mget. Например, если у нас есть tickers <- "^SPX", используйте tickers.out <- sub("\\^", "", tickers); mget(tickers.out) в приведенном ниже коде.
library(quantmod)
tickers <- c("TSLA", "AAPL", "CSCO", "IBM")
getSymbols(tickers, from = "2022-01-03", to = "2023-01-03")
stks <- do.call("merge", lapply(mget(tickers), Ad))
rets <- diff(stks, arithmetic = FALSE) - 1
Спасибо за ваш ответ! Я выбрал второе. Это сработало. Ваши коды были намного более краткими. Кстати, "Ad" в do.call означает "Скорректировано"? R действительно принимает аббревиатуру?
В пакете quantmod есть удобные функции для извлечения столбцов из данных финансового рынка. Взгляните на help("OHLC", package = "quantmod").
Большое спасибо! Вы предоставили мне больше вещей для изучения.