2016-02-11 3 views
0

dans le code ci-dessous Je saisis des données pour trois symboles, puis je veux appliquer une fonction simple (qui est une stratégie de négociation) à ces données. Idéalement, je ferais alors des statistiques sur ces retours, tels que ceux natifs de PerformanceAnalytics.R appliquer une fonction à une liste de données de prix

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) 

Répondre

0

Vous y êtes presque, il suffit de remplacer x[[i]] par data dans votre fonction:

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

et ajouter un l à lappy()

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

Merci beaucoup! Cela fonctionne exactement comme prévu maintenant. – SMN