R-通过特定功能筛选库存清单

  • 本文关键字:筛选 功能 r quantmod
  • 更新时间 :
  • 英文 :


我有此股票列表:

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

最新更新