Quantmod:一次为多个代码创建新列
Quantmod: Create new column for multiple tickers in one time
我有自己的 csv 文件,其中包含我用来从雅虎下载行情数据的股票列表。
为此,我使用以下代码(正确):
library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)
getSymbols(Tickers$Tickers,from="2018-01-01", src="yahoo" )
结果是正确加载了 55 个代码。
现在我想做一些计算,我需要在每个代码上创建一个新列,减去(最高价 - 开盘价)
我需要这样的东西,例如 AABA 代码:
新列名称= AABA.Range
AABA.Range =(AABA$AABA.High - AABA$AABA.Open)
我怎样才能应用它并为 55 个代码获取一个新列?
我能够一个一个地创建新列,但是如何用一个函数为所有列创建呢?
这可能吗?
非常感谢您的帮助。
您遇到的问题之一是所有股票信息都在全局环境中。所以首先我们需要将它们全部拉到一个巨大的列表中。接下来我创建了一个范围函数,returns 股票数据加上具有正确名称的范围列。
# 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(或地图)
一起使用
my_stock_data <- lapply(Tickers , getSymbols, auto.assign = FALSE)
names(my_stock_data) <- Tickers
我有自己的 csv 文件,其中包含我用来从雅虎下载行情数据的股票列表。
为此,我使用以下代码(正确):
library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)
getSymbols(Tickers$Tickers,from="2018-01-01", src="yahoo" )
结果是正确加载了 55 个代码。
现在我想做一些计算,我需要在每个代码上创建一个新列,减去(最高价 - 开盘价)
我需要这样的东西,例如 AABA 代码:
新列名称= AABA.Range
AABA.Range =(AABA$AABA.High - AABA$AABA.Open)
我怎样才能应用它并为 55 个代码获取一个新列?
我能够一个一个地创建新列,但是如何用一个函数为所有列创建呢?
这可能吗?
非常感谢您的帮助。
您遇到的问题之一是所有股票信息都在全局环境中。所以首先我们需要将它们全部拉到一个巨大的列表中。接下来我创建了一个范围函数,returns 股票数据加上具有正确名称的范围列。
# 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(或地图)
my_stock_data <- lapply(Tickers , getSymbols, auto.assign = FALSE)
names(my_stock_data) <- Tickers