R将函数应用于价格数据列表

时间:2016-02-11 23:03:26

标签: r trading performanceanalytics

在下面的代码中我抓取三个符号的数据,然后我想对这个数据应用一个简单的函数(这是一个交易策略)。理想情况下,我会对这些回报运行统计信息,例如PerformanceAnalytics的原生回报。

library("quantmod")
library("PerformanceAnalytics")
options(scipen=999)

PriceData <- new.env()
Symbols <- c("SPY", "QQQ", "IWM")
StartDt <- as.Date("2015-01-01")
suppressWarnings(getSymbols(Symbols, src="yahoo", env=PriceData, from=StartDt))

x <- list()
for (i in 1:length(Symbols)) {
 x[[i]] <- get(Symbols[i], pos=PriceData)
}

SYSTEM <- function(data){
 ret<- Delt(Cl(x[[i]]),Op(x[[i]]),type = 'arithmetic')

 mavga <- SMA(Cl(x[[i]]), n=10)
 mavgb <- SMA(Cl(x[[i]]), n=20)

 sig <- ifelse(mavga>mavgb,1,0)+ifelse(mavgb>mavga,-1,0)
 sig <- lag(sig,1)
 sig[is.na(sig)]=0
 strategyreturn <- sig * ret
 return(strategyreturn)
}


######I'm doing something wrong here######
y <- lappy(x,SYSTEM)
z <- do.call("cbind", y)


PerformanceTable <- function(returns){
 scalar <- 252
 CS <- t(Return.cumulative(returns, geometric = FALSE))
 SR <- t(SharpeRatio.annualized(returns, scale=scalar, geometric = FALSE))
 SOR <- t(SortinoRatio(returns))
 MDD <- t(maxDrawdown(returns))
 WP <- colSums(returns > 0)/colSums(returns != 0)
 WP <- as.data.frame(WP)
 ASD = t(sd.annualized(returns, scale=scalar))
 Stat <- cbind(CS,SR,SOR,MDD,ASD,WP)

 colnames(Stat) <- c("Profit","SharpeRatio", "Sortino","MaxDrawdown",      "AnnStdDev", "WinPct")
 print("Performance Table")
 print(Stat)
 return (Stat)
}

Perf <- PerformanceTable(y)

1 个答案:

答案 0 :(得分:0)

你几乎就在那里,只需在你的函数中用x[[i]]替换data

SYSTEM <- function(data){
  ret<- Delt(Cl(data),Op(data),type = 'arithmetic')

  mavga <- SMA(Cl(data), n=10)
  mavgb <- SMA(Cl(data), n=20)

  sig <- ifelse(mavga>mavgb,1,0)+ifelse(mavgb>mavga,-1,0)
  sig <- lag(sig,1)
  sig[is.na(sig)]=0
  strategyreturn <- sig * ret
  return(strategyreturn)
}

并将l添加到lappy()

y <- lapply(x,SYSTEM)
z <- do.call("cbind", y)