我有此股票列表:
stock.list = c("AMZN","GOOGL","AAPL","FB","TSLA")
我有以下功能:
fnct<-function(x){
require(quantmod)
ticker <- getSymbols(x,src="google", auto.assign=FALSE)
#number of rows
n<-nrow(ticker)
# last day's close
lastvalue <- as.numeric((ticker[n,4]))
# previous day's close
prevvalue <- as.numeric((ticker[n-1,4]))
# price change
prchange <- lastvalue - prevvalue
res<-(
paste0(prchange)
)
return(res)
}
该功能的输出是一个数字,代表了最后一天的关闭价格和前一天的差额(本质上,输出的正数意味着股票价格上涨,负数意味着它发生了下降(
例如,今天使用此功能AMZN
今天返回一个正数:
> fnct('AMZN')
[1] "17.3200000000001"
我想将功能应用于股票列表,以便它仅显示具有正面更改的股票名称(>0
(,如果可能更改(
因此,理想的输出将是这样的:
AMZN 17.3200000000001
GOOGL 14.95
...and so on
这是我到目前为止提出的,但是它不起作用
for(x in stock.list) {
paste0(x,fnct(x))
}
我知道这不会消除带负面变化的股票,但这就是我能走多远。即使这似乎也不起作用。
理想情况下,它应该足够强大,可以跳过NA
的s(例如,列表中的拼写库存名称或列表中的特定股票丢失数据(
有什么建议吗?预先感谢。
最小的修复是将循环更改为...
for (x in stock.list) {
if(as.numeric(fnct(x)) >= 0) print(paste(x, fnct(x)))
}
是您的功能需要宽容错别字,最简单的行为是让它跳过任何毫无配方的符号,而不是试图猜测您要做什么。
fnct <- function(x) {
require(quantmod)
ticker <- suppressWarnings(tryCatch({ getSymbols(x, src="google", auto.assign=FALSE) }, error = function(e) NULL))
if (!is.null(ticker)) {
#number of rows
n <- nrow(ticker)
# last day's close
lastvalue <- as.numeric((ticker[n,4]))
# previous day's close
prevvalue <- as.numeric((ticker[n-1,4]))
# price change
prchange <- lastvalue - prevvalue
res <- paste0(prchange)
} else {
res <- "Not found"
}
return(res)
}
然后您的循环变为:
for (x in stock.list) {
result <- fnct(x)
if (result == "Not found" || (as.numeric(result) >= 0 & as.numeric(result) < 100) ) print(paste(x, result))
}
只是为了澄清,这是从您想要的最直接的方法。这不一定是最好的方法。
两件事:
在for循环中,您需要使用打印功能来查看粘贴语句的结果。
其次,没有理由将价格更改转换为"糊状",您应该将其保留为数字值。尝试以下操作:
require(quantmod)
stock.list = c("AMZN","GOOGL","AAPL","FB","TSLA")
fnct<-function(x){
ticker <- getSymbols(x,src="google", auto.assign=FALSE)
n<-nrow(ticker)
lastvalue <- as.numeric((ticker[n,4]))
prevvalue <- as.numeric((ticker[n-1,4]))
prchange <- lastvalue - prevvalue
return(prchange)
}
prchanges <- sapply(stock.list, fnct)
results <- data.frame(symbol=stock.list, prchange=prchanges, stringsAsFactors=F)
results_positive <- subset(results, prchange > 0)
print(results_positive)
> print(results_positive)
symbol prchange
AMZN AMZN 17.32
GOOGL GOOGL 14.95
AAPL AAPL 0.78
FB FB 2.03
以下是列表和 lapply
的方法:
stock.list = list("AMZN","GOOGL","AAPL","FB","TSLA") #put tickers in a list
res <- lapply(stock.list,fnct) #use func on list
res <- lapply(res,as.numeric) #change to numeric
res <- Map(cbind,stock.list,res) #add ticker
res <- do.call(rbind,res) #unlist to table
res <- as.data.frame(res)
colnames(res) <- c("Stock","Change")
res[res$Change!=0,] #show only stocks with non-zero changes
Stock Change
1 AMZN 17.3200000000001
2 GOOGL 14.95
3 AAPL 0.780000000000001
4 FB 2.03
5 TSLA -2.56
一个非常紧凑的(没有自定义功能,没有循环(和直接获取最新价格更改的方法将是使用qmao
软件包,该软件包已经具有一个功能来为您提供价格框架(PF
(一组符号。
library(quantmod)
library(qmao)
stock.list = c("AMZN","GOOGL","AAPL","FB","TSLA")
getSymbols(stock.list,src="google")
prices <- PF(stock.list,silent = TRUE)
priceChange <- diff(prices)
t(last(priceChange))
2017-04-18
AMZN 1.79
GOOGL -1.14
AAPL -0.63
FB -0.46
TSLA -1.19