0

在下面的代码中,我正在获取三个交易品种的数据,然后我想对这些数据应用一个简单的函数(这是一种交易策略)。理想情况下,我会对这些回报进行统计,例如 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)
4

1 回答 1

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

并添加llappy()

y <- lapply(x,SYSTEM)
z <- do.call("cbind", y)
于 2016-02-11T23:08:58.277 回答