如何在股票代码列表中编写for循环以调整收盘价?

时间:2018-09-19 18:52:27

标签: r quantmod

我是R的初学者,但是我试图使用Quantmod编写一个循环以拉出一系列日期(当前,6个月前,12个月前,18个月前)的调整后的股价。我想逐渐了解一下公司的健康状况。但是,我遇到了一个接一个的错误,所以要把我的财产拿出来,希望有人能帮上忙。我还无法使用getSymbols来获取任何内容,因此CompanyTickers仅来自.csv符号。

stocks <- (CompanyTickers$Symbol)

## Generate new environment stockEnv for results
stockEnv <- new.env()

##
## This pulls available stock data for the Symbols in the stock variable
## The try function keeps the code from quitting for defunct symbols
##
df <- try(getSymbols(stocks, src ='yahoo', env=stockEnv))


## Runs a loop on the data stored to stockEnv
## One Year ago
for (stock in ls(stockEnv)){
  try(monthlyReturn(xtsTicker, subset='2017-09-18')     
}

2 个答案:

答案 0 :(得分:0)

您已将结果存储到环境中。当您使用ls时,它仅获取该环境中对象的名称。您可以使用函数get来获取对象并对其进行处理。

x <- new.env()
x$obj <- 1

for (i in ls(x)) {
  message("Accessing ls() result:")
  print(i)
  message("Properly fetch from environment")
  print(get(i, envir = x))
}

Accessing ls() result:
[1] "obj"
Properly fetch from environment
[1] 1

答案 1 :(得分:0)

下面的代码将帮助您入门。无需单独的环境,只需将所有内容存储在列表中,然后使用apply函数可以帮助您遍历所有数据。 MonthlyReturn数据需要指定的内容,例如“ 2017-09-18 ::”或“ 2017-09 ::”。不管您的开始日期是月中旬,月度收益计算都将使用该月的所有数据。

library(quantmod)

# stocklist with 1 bad stock
stocks <- c("MSFT", "MSFT2", "GIS")

# Get the data and name the list objects
stock_data <- lapply(stocks, function(x) try(getSymbols(x, src ='yahoo', auto.assign = FALSE)))
names(stock_data) <- stocks


# Show which stocks don't have any data
which(sapply(stock_data, is.character) == T)
MSFT2 
    2 

# remove stocks that don't return any data.
stock_data <- stock_data[!sapply(stock_data, is.character)]

# One Year ago
monthly_return_data <- lapply(stock_data, function(x) monthlyReturn(x, subset = "2017-09-18::"))

出于数据质量目的,您可能需要检查源tiingo或Alphavantage(需要API密钥)。雅虎并不总是拥有正确的数据。