Объединение данных о запасах в al oop через Quantmod - PullRequest
1 голос
/ 23 апреля 2020

Я пытался связать вместе данные запаса, которые я собираю из пакета quantmod в R, но пакет возвращает данные в формате XTS, который довольно трудно превратить в кадр данных и связать их все вместе в один большой фрейм данных.

До сих пор я делал это. Я понимаю логику c, я понимаю, что мне нужно сделать, мне нужно создать пустой фрейм данных со всеми нужными столбцами, а затем поместить отдельные акции в фрейм данных, но работать с форматом XTS сложно.

Я также планирую связать все акции S & P 500, поэтому мне нужно сделать это в oop, а не каким-либо другим способом вручную.

library(quantmod)

start <- as.Date("2000-01-01")
end <- as.Date("2020-04-15")
symbolBasket <- c('MMM', 'AXP', 'AAPL', 'BA', 'CAT', 'MSFT', 'IBM') 

empty_df <- data.frame(Open= numeric(), 
                       High = numeric(), 
                       Low = numeric(), 
                       Close = numeric(), 
                       Volume = numeric(), 
                       Adjusted = numeric(),
                       Ticker = character())

for (i in symbolBasket) {
  xts <- as.data.frame(getSymbols(i, src = "yahoo", from = start, to = end))

  df <- as.data.frame(xts)
  ticker <- i
  df_with_ticker <- cbind(df,ticker)
  df_final <- rbind(empty_df,df)
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Нет необходимости в петлях, вы можете использовать tidyquant, чтобы получить все запасы. Это вернет data.frame со всеми данными.

library(tidyquant)

start <- as.Date("2000-01-01")
end <- as.Date("2020-04-15")
symbolBasket <- c('MMM', 'AXP', 'AAPL', 'BA', 'CAT', 'MSFT', 'IBM') 

result <- tq_get(symbolBasket, from = start, end = end)
result
# A tibble: 35,763 x 8
   symbol date        open  high   low close  volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
 1 MMM    2000-01-03  48.0  48.2  47.0  47.2 2173400     26.3
 2 MMM    2000-01-04  46.4  47.4  45.3  45.3 2713800     25.3
 3 MMM    2000-01-05  45.6  48.1  45.6  46.6 3699400     26.0
 4 MMM    2000-01-06  47.2  51.2  47.2  50.4 5975800     28.1
 5 MMM    2000-01-07  50.6  51.9  50.0  51.4 4101200     28.7
 6 MMM    2000-01-10  50.2  51.8  50    51.1 3863800     28.5
 7 MMM    2000-01-11  50.4  51.2  50.2  50.2 2357600     28.1
 8 MMM    2000-01-12  51.0  51.8  50.4  50.4 2868400     28.1
 9 MMM    2000-01-13  50.7  50.9  50.2  50.4 2244400     28.1
10 MMM    2000-01-14  50.4  50.5  49.5  49.7 2541800     27.7
# ... with 35,753 more rows

Если вы хотите сделать это для всего SP500, вы можете посмотреть на BatchGetSymbols. Это может выполняться параллельно, если для параметра do.parallel установлено значение TRUE. виньетка показывает, как получить все запасы для SP500.

1 голос
/ 23 апреля 2020

Одним из подходов будет использование встроенной функции getSymbols с аргументом env =.

Мы можем использовать простой for l oop, чтобы извлечь данные как data.frame из среды и получить даты из имен строк. rbindlist из data.table позволяет легко связать конечные результаты вместе.

library(quantmod)
library(data.table)
stockEnv <- new.env()
getSymbols(symbolBasket, src='yahoo', env=stockEnv, from = start, to = end)
datalist <- list()
for(stock in ls(stockEnv)){
  table <- as.data.frame(stockEnv[[stock]])
  date = rownames(table)
  rownames(table) <- NULL
  colnames(table) <- c("Open","High","Low","Close","Volume","Adjusted")
  bound.table <- data.frame(Ticker = stock, date ,table)
  datalist[[stock]] <-  bound.table
}
Result <- rbindlist(datalist,fill=TRUE) 
Result
#       Ticker       date       Open       High        Low      Close    Volume   Adjusted
#    1:   AAPL 2000-01-03   3.745536   4.017857   3.631696   3.997768 133949200   3.470226
#    2:   AAPL 2000-01-04   3.866071   3.950893   3.613839   3.660714 128094400   3.177650
#    3:   AAPL 2000-01-05   3.705357   3.948661   3.678571   3.714286 194580400   3.224152
#    4:   AAPL 2000-01-06   3.790179   3.821429   3.392857   3.392857 191993200   2.945139
#    5:   AAPL 2000-01-07   3.446429   3.607143   3.410714   3.553571 115183600   3.084645
#   ---                                                                                   
#35710:   MSFT 2020-04-07 169.589996 170.000000 163.259995 163.490005  62769000 163.490005
#35711:   MSFT 2020-04-08 165.669998 166.669998 163.500000 165.130005  48318200 165.130005
#35712:   MSFT 2020-04-09 166.360001 167.369995 163.330002 165.139999  51431800 165.139999
#35713:   MSFT 2020-04-13 164.350006 165.570007 162.300003 165.509995  41905300 165.509995
#35714:   MSFT 2020-04-14 169.000000 173.750000 168.000000 173.699997  52874300 173.699997
...