Quantmod: создать новый столбец для нескольких тикеров за один раз - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть собственный CSV-файл со списком акций, который я использую для загрузки данных тикеров с Yahoo.

Для этой цели я использую следующий код (правильный):

library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)
getSymbols(Tickers$Tickers,from="2018-01-01", src="yahoo" )

enter image description here

В результате 55 тикеров были загружены правильно.

Теперь я хотел бы сделать некоторые расчеты, мне нужно создать новый столбец на каждом тикере с выпиской из (Высокая цена - Цена открытия)

Мне нужно что-то вроде этого, например, тикер AABA:

Имя нового столбца = AABA.Range

AABA.Range =(AABA$AABA.High - AABA$AABA.Open)

Как я могу применить это и получить новый столбец для 55 тикеров?

Мне удалось создать новый столбец один за другим, но как это сделать для всех них с помощью одной функции?

Возможно ли это?

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 16 сентября 2018

Одна из ваших проблем заключается в том, что вся информация о запасах находится в глобальной среде. Итак, сначала нам нужно собрать их всех в гигантский список. Затем я создал функцию диапазона, которая возвращает данные запаса плюс столбец диапазона с правильным именем.

# Put all stocks in big list, by checking which xts objects are in the global environment.
stock_data = sapply(.GlobalEnv, is.xts)
all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))

# range function
stock_range <- function(x) {
  stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
  stock_name <- paste0(stock_name, ".range")
  column_names <- c(names(x), stock_name)
  x$range <- quantmod::Hi(x) - quantmod::Lo(x)
  x <- setNames(x, column_names)
  return(x)
}

# calculate all ranges and add them to the data
all_stocks <- lapply(all_stocks, stock_range)


head(all_stocks$MSFT)
           MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted MSFT.range
2007-01-03     29.91     30.25    29.40      29.86    76935100      22.67236   0.850000
2007-01-04     29.70     29.97    29.44      29.81    45774500      22.63439   0.529998
2007-01-05     29.63     29.75    29.45      29.64    44607200      22.50531   0.299999
2007-01-08     29.65     30.10    29.53      29.93    50220200      22.72550   0.569999
2007-01-09     30.00     30.18    29.73      29.96    44636600      22.74828   0.450000
2007-01-10     29.80     29.89    29.43      29.66    55017400      22.52049   0.459999

Может быть, лучше при загрузке данных просто запустить lapply, чтобы получить все данные в списке. Таким образом, первый шаг не требуется, и вы можете использовать все функции TTR с помощью lapply (или Map)

my_stock_data <- lapply(Tickers , getSymbols, auto.assign = FALSE)
names(my_stock_data) <- Tickers 
...