将股票列表的最后可用值导出到 .csv 的功能

Function to export last available value of list of stocks to .csv

我正在尝试将一些来自 Quantmod 的数据导出到 .csv。

我想导出到 .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

的 "Tail"
            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",我们会在我的列表中获得最新的可用数据量

last(MSFT$MSFT.Volume)

             MSFT.Volume
2018-10-05    29064300

现在,我想创建一个函数来获取我的列表 (all_stocks) 中所有代码的最后可用 "Volume" 数据,并将其导出到 .csv 文件中。

所需的输出是一个 .csv 文件,其中包含代码名称和最后的交易量数据。

MSFT,29064300
stock1,volume1
stock2,volume2

有什么方法可以帮助吗?

非常感谢。

创建了一个函数来获取每只股票的最后成交量。然后你可以使用 lapply 来获取数据,但我用 rbind 将它包装在 Reduce 中,以便在 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")

假设最后的注释中给出了设置,sapply 通过代码名称将卷提取到命名向量中 vols。然后将其重新加工成数据框 DF。如果指定了 file,则将其写出。最后 return 数据框。

我们展示了几种不同的使用方法。

# 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)

quantmod 附加包 qmao (https://github.com/gsee/qmao) 有一个函数 PF (或 makePriceFrame,这是相同函数的较长名称)将在一行中为您提供最后一天或您感兴趣的任何一天的音量(参数 prefer 让您 select 您感兴趣的列):

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