【问题标题】:Screening list of stocks by a specific function按特定功能筛选股票列表
【发布时间】:2017-04-20 01:03:29
【问题描述】:

我有这个股票示例列表:

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"

我想将该函数应用于股票列表,以便它只显示那些有积极变化的股票名称 (&gt;0),并且如果可能的话,在它们旁边显示变化的数值(基本上,消除股票有负面变化)

所以理想的输出应该是这样的:

AMZN    17.3200000000001
GOOGL   14.95
...and so on

这是我到目前为止想出的,但它不起作用

for(x in stock.list) {
paste0(x,fnct(x))
}

我知道这并不能消除负面变化的股票,但这是我能做到的。即使这似乎不起作用。

理想情况下,它应该足够健壮,可以跳过NA(例如,列表中的股票名称拼写错误,或者列表中特定股票的数据缺失)

有什么建议吗?提前致谢。

【问题讨论】:

    标签: r quantmod


    【解决方案1】:

    最小的解决方法是将循环更改为...

    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))
    }
    

    澄清一下,这是从你拥有的东西到你想要的东西的最直接的方法。这不一定是最好的方法。

    【讨论】:

    • 这正是我要问的,但是如何让它容忍错别字呢?例如,如果我在 Google 代码名称stock.list = c("AMZN","GOOGGL","AAPL","FB","TSLA") 中输入拼写错误,它会崩溃。
    • @Oposum 更新了应对不良股票名称的答案。
    • 谢谢,这正是我所问的。现在,这有点超出了最初的问题,但是我如何指出要满足两个条件而不是一个,as.numeric(result) &gt;= 0,但同时as.numeric(result) &lt;100
    • @Oposum 见上文
    【解决方案2】:

    两件事:

    在 for 循环中,您需要使用 print 函数来查看粘贴语句的结果。

    其次,没有理由用“粘贴”来转换价格变化,您应该将其保留为数值。试试这个:

    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
    

    【讨论】:

    • 看起来很棒。但是,如果我在 Google 代码名称 stock.list = c("AMZN","GOOGGL","AAPL","FB","TSLA") 中输入拼写错误,它会崩溃,如何绕过它? `
    【解决方案3】:

    下面是如何使用列表和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
    

    【讨论】:

      【解决方案4】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 2022-01-24
        • 2011-06-14
        • 2014-11-26
        相关资源
        最近更新 更多