通过 quantmod 在循环中将股票数据连接在一起
Joining stock data together in a loop via quantmod
我一直在尝试将从 R 中的 quantmod 包收集的股票数据绑定在一起,但该包以 XTS 格式返回数据,这有点困难变成一个数据框并将它们绑定在一起成为一个大数据框。
到目前为止我已经做到了。我明白逻辑,我明白我必须做什么,我需要创建一个包含所有所需列的空数据框,然后将个股放入数据框,但很难使用 XTS 格式。
我还计划将所有 S&P 500 股票绑定在一起,这就是为什么我需要循环而不是其他手动方式。
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)
}
一种方法是使用带有 env =
参数的内置函数 getSymbols
。
我们可以使用一个简单的 for
循环从环境中提取数据作为 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
无需循环,使用tidyquant即可获取所有股票。这将 return 包含所有数据的 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
,这可以并行 运行。 vignette 向您展示如何获得 SP500 的所有股票。
我一直在尝试将从 R 中的 quantmod 包收集的股票数据绑定在一起,但该包以 XTS 格式返回数据,这有点困难变成一个数据框并将它们绑定在一起成为一个大数据框。
到目前为止我已经做到了。我明白逻辑,我明白我必须做什么,我需要创建一个包含所有所需列的空数据框,然后将个股放入数据框,但很难使用 XTS 格式。
我还计划将所有 S&P 500 股票绑定在一起,这就是为什么我需要循环而不是其他手动方式。
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)
}
一种方法是使用带有 env =
参数的内置函数 getSymbols
。
我们可以使用一个简单的 for
循环从环境中提取数据作为 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
无需循环,使用tidyquant即可获取所有股票。这将 return 包含所有数据的 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
,这可以并行 运行。 vignette 向您展示如何获得 SP500 的所有股票。