Почему daily возвращает все нули при использовании Quantmod?

Я использовал следующий код:

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

В чем может быть проблема? Спасибо впереди!

Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
1
0
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

С помощью 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()

Большое спасибо! Вы предоставили мне больше вещей для изучения.

RnewBie 20.02.2023 20:16

Такое поведение ожидается, поскольку арифметические и логические операции над объектами xts выполняются над наблюдениями, имеющими одинаковую дату.

Вы должны использовать функцию lag(), чтобы изменить выравнивание индекса даты и времени. log(stkdata / lag(stkdata)).

Обратите внимание, что вы должны быть очень осторожны, используя lag() с загруженным dplyr. Это нарушает то, как должна работать базовая функция R lag(), что нарушает lag(my_xts). Он также ломает lag() для всех других типов объектов, у которых есть собственный метод lag() (например, зоопарк).

Ваше предупреждение заставило меня с осторожностью использовать lag(). Спасибо за ваш ответ и предупреждение.

RnewBie 20.02.2023 20:14

Вы можете использовать stats::lag(), если хотите быть уверены, что не используете dplyr::lag()

Joshua Ulrich 20.02.2023 20:19
Ответ принят как подходящий

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 действительно принимает аббревиатуру?

RnewBie 20.02.2023 20:15

В пакете quantmod есть удобные функции для извлечения столбцов из данных финансового рынка. Взгляните на help("OHLC", package = "quantmod").

Joshua Ulrich 20.02.2023 21:18

Другие вопросы по теме