将RSI功能应用于数据帧列表

时间:2018-09-26 17:39:24

标签: r dataframe lapply finance

我创建了所有标普500公司收盘价的数据框列表。我想为每个公司计算RSI。

library(BatchGetSymbols)

first.date <- Sys.Date()-365
last.date <- Sys.Date()

df.SP500 <- GetSP500Stocks()
tickers <- df.SP500$tickers

l.out <- BatchGetSymbols(tickers = tickers,
                         first.date = first.date,
                         last.date = last.date)

l.out$df.tickers$price.open <- NULL
l.out$df.tickers$price.high  <- NULL
l.out$df.tickers$price.low <- NULL
l.out$df.tickers$volume <- NULL
l.out$df.tickers$price.adjusted <- NULL
l.out$df.tickers$ret.adjusted.prices <- NULL
l.out$df.tickers$ret.closing.prices <- NULL


SP <- l.out$df.tickers

mylist <- split(SP, SP$ticker)

我尝试使用lapply但失败了:

rsi <- lapply(names(mylist$price.close), RSI)

它产生的列表为0。感谢您对此提供的任何帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

Sub cmdButtonData_Click() Dim SellStartDate As Date Dim SellEndDate As Date SellStartDate = Sheets("Launch").Range("H10").Value SellEndDate = Sheets("Launch").Range("H11").Value Sheets("Sheet2").Cells.Clear On Error Resume Next 'I have the connection string here. If Err.Number <> 0 Then Sheets("Sheet3").Activate Else 'Copy the data Sheets("Sheet1").Range("A1:K2").Copy Sheets("Sheet2").Range("A1") Sheets("Sheet1").Range("A3:K16000").SpecialCells(xlCellTypeConstants).Copy Sheets("Sheet2").Range("A3") Sheets("Sheet1").Activate Sheets("Sheet2").Range("A3:T3").Delete End If End Sub 与匿名函数一起使用,以price.close调用lapply函数。默认情况下,RSI的前14个值为NA,因为它会计算14天的RSSI。

RSI

答案 1 :(得分:0)

请考虑by,它将splitlapply紧凑地替换为诸如 ticker 之类的因素进行分组操作。对于一个因子,输出是函数返回的等于因子唯一数量的命名列表:

RSI_list <- by(SP, SP$ticker, function(sub) TTR::RSI(sub$price.close))

万一其中一个行情自动收报器无法维持有效的收盘价,请在tryCatch中包装看涨期权,并为这些有问题的情况返回NA:

RSI_list <- by(SP, SP$ticker, function(sub) 
                    tryCatch(TTR::RSI(sub$price.close),
                             error = function(e) return(NA)))