2016-02-11 60 views
0

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

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) 

回答

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) 
+0

非常感谢您!这与现在的预期完全相同。 – SMN