Функция экспорта последнего доступного значения списка акций в .csv - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь экспортировать в .csv некоторые данные, поступающие из Quantmod.

То, что я хотел бы экспортировать в .csv, это имя тикера и последние данные, доступные в моем спискеотносительно объема (Vol)

Позвольте мне объяснить мой подход:

Загрузить список тикеров из .csv в мою среду

library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)

getSymbols(Tickers$Tickers,from="2018-08-01", src="yahoo" )
stock_data = sapply(.GlobalEnv, is.xts)
all_stocks <- do.call(list, mget(names(stock_data)[stock_data])) 

Давайте посмотрим нанапример, «Хвост» MSFT

            MSFT.Open   MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
2018-09-28    114.19    114.57   113.68     114.37    21647800        114.37
2018-10-01    114.75    115.68   114.73     115.61    18883100        115.61
2018-10-02    115.30    115.84   114.44     115.15    20787200        115.15
2018-10-03    115.42    116.18   114.93     115.17    16648000        115.17
2018-10-04    114.61    114.76   111.63     112.79    34821700        112.79
2018-10-05    112.63    113.17   110.64     112.13    29064300        112.13

Если мы используем «последний», мы получим самые последние доступные объемные данные в моем списке

last(MSFT$MSFT.Volume)

             MSFT.Volume
2018-10-05    29064300

Теперь я хотел бы создатьфункция для получения последних доступных данных «Volume» всех тикеров в моем списке (all_stocks), экспортированных в файл .csv.

Требуемый вывод - это файл .csv с именем Ticker и последними данными Volume..

MSFT,29064300
stock1,volume1
stock2,volume2

Любая помощь о том, как подойти?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

При условии настройки, указанной в примечании в конце, sapply поверх имен тикеров, извлекающих тома в именованный вектор vols.Затем переделайте это в фрейм данных DF.Если указано file, запишите его.Наконец верните фрейм данных.

Мы показываем несколько различных способов использования этого.

# create data frame of last volumes and optionally log to .csv
lastVols <- function(Names, file, envir = .GlobalEnv) {
  vols <- sapply(Names, function(nm) Vo(last(get(nm, envir))))
  DF <- data.frame(stock = names(vols), volume = unname(vols), stringsAsFactors = FALSE)
  if (!missing(file)) write.csv(DF, file, row.names = FALSE, quote = FALSE)
  DF
}

давая:

# return volumes and display on stdout()
volsDF <- lastVols(Tickers, stdout())
## stock,volume
## MSFT,29064300
## TSLA,17913000

# returns volumes and log to csv file
volsDF <- lastVols(Tickers, "myfile.csv")

# return volumes; don't log
lastVols(Tickers)
##   stock   volume
## 1  MSFT 29064300
## 2  TSLA 17913000

Примечание

library(quantmod)

Tickers <- c("MSFT", "TSLA")
getSymbols(Tickers)
0 голосов
/ 09 октября 2018

Дополнительный пакет Quantmod qmao (https://github.com/gsee/qmao) имеет функцию PF (или makePriceFrame, которая является более длинным названием той же функции), которая даст вам объем для последнейдень или любой другой день, который вас интересует, в одну строку (аргумент prefer позволяет вам выбрать интересующий вас столбец):

library(qmao)
getSymbols(c('AAPL','AMZN','MSFT’))

tail(PF(c('AAPL','AMZN','MSFT'),prefer = 'Volume',silent = TRUE),1)
               AAPL    AMZN     MSFT
2018-10-08 28793100 7358200 29633400
0 голосов
/ 08 октября 2018

Создана функция для получения последнего тома за акцию.Затем вы можете использовать lapply для получения данных, но я обернул их в Reduce с помощью rbind, чтобы получить все в data.frame, готовом для записи в csv.

stock_last_volume <- function(x) {
  stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
  volume <- last(quantmod::Vo(x))
  colnames(volume) <- "volume"
  my_df <- data.frame(stock = stock_name, volume = volume, stringsAsFactors = FALSE, row.names = NULL)
  return(my_df)
}


all_volumes <- Reduce(rbind, lapply(all_stocks, stock_last_volume))

all_volumes[1:2, ]
  stock   volume
1  MSFT 29064300
2  GOOG  1184300

# write.csv to working directory
write.csv(all_volumes, file = "all_volumes.csv")
...