[R-SIG-Finance] Custom Indicator and apply.paramset problem

Atakan Okan atakanokan at outlook.com
Sat Feb 25 21:11:19 CET 2017


Hi again,

As a followup to my custom indicator question:
Although I have successfully implemented it based on your suggestions and ran it via applyStrategy; optimizing parameters of a strategy with the same custom indicator via apply.paramset does not seem to work on Windows using the package doSNOW, despite the fact that I have run apply.paramset on a different strategy with parallelization with doSNOW but without any custom indicators. 

Any help is appreciated, thank you :) 

Atakan Okan

The reproducible code:

library(quantmod)
library(quantstrat)
library(TTR)


Sys.setenv(TZ = "UTC")                            


.strategy <- new.env()
.blotter  <- new.env()                             


#Data
getSymbols("AAPL")


#Stock
symbol.name = "AAPL" 
tick.size = 0.01
currency('USD')
stock(symbol.name, currency="USD", multiplier=1,tick_size= tick.size)


initialEquity = 100000 
port.acct.currency <- "USD"


strategy.st <- 'Custom_Prob'
rm.strat(strategy.st)                                                      


initDate = as.character(as.Date(index(AAPL[1])-1))
initPortf(strategy.st, symbol.name, initDate=initDate, currency =
            port.acct.currency) 
initAcct(strategy.st, portfolios=strategy.st,
         initDate=initDate,
         initEq=initialEquity, currency = port.acct.currency)
initOrders(portfolio=strategy.st,initDate=initDate)
strategy(strategy.st,store=TRUE)
summary(getStrategy(strategy.st))                                          




#MACD W1 indicator
MACD_W1 <- function(mktdata=quote(mktdata),
                    nFast = 12,
                    nSlow = 26,
                    nSig = 9)
{
  y <- eval(parse(text = symbol.name))
  y <- to.weekly(y)
  y <- Cl(y)
  y <- MACD(y,
            nFast = nFast,
            nSlow = nSlow,
            nSig = nSig,
            maType = "EMA")
  y <- cbind(mktdata, y[paste(first(index(mktdata)),
                              last(index(mktdata)), 
                              sep = "/")])
  if (anyNA(y[,1])){                          
    y <- y[-which(is.na(y[,1])),]
  }
  y <- na.locf(y)
  y <- y[,c((ncol(y)-1),ncol(y))]
  y
} 




add.indicator(strategy.st,  
              name = "MACD", 
              arguments = list(x=Cl(AAPL)), 
              label='macd') 


add.indicator(strategy.st,
              name = "MACD_W1",
              arguments = list(mktdata=quote(mktdata)))


add.signal(strategy.st,name="sigCrossover",
           arguments = list(columns=c("macd.macd","signal.macd"),relationship="gt"),
           label="macd.gt.signal") 


add.signal(strategy.st,name="sigCrossover",
           arguments = list(columns=c("macd.macd","signal.macd"),relationship="lt"),
           label="macd.lt.signal")


add.signal(strategy.st, name="sigFormula", 
           arguments=list(columns=c("macd.MACD_W1.ind", "signal.MACD_W1.ind"), 
                          formula="(macd.MACD_W1.ind > signal.MACD_W1.ind)", 
                          cross=FALSE), 
           label="LongCond.W1")


add.signal(strategy.st, name="sigFormula", 
           arguments=list(columns=c("macd.macd", "signal.macd","LongCond.W1"), 
                          formula="(macd.gt.signal == 1) & (LongCond.W1 == 1)", 
                          cross=FALSE), 
           label="macd.gt.signal.w1")


add.rule(strategy.st,
         name='ruleSignal',
         arguments = list(sigcol="macd.gt.signal.w1",
                          sigval=TRUE,
                          prefer="Open", 
                          orderqty= 100, 
                          ordertype='market',
                          orderside='long',
                          orderset='ocolong',
                          TxnFees = 0),
         type='enter',
         label='longenter',
         enabled=TRUE
)


add.rule(strategy.st,
         name='ruleSignal',
         arguments = list(sigcol="macd.lt.signal",
                          sigval=TRUE,
                          prefer="Open", 
                          orderqty='all',
                          ordertype='market',
                          orderside='long',
                          orderset='ocolong',
                          TxnFees = 0),
         type='exit',
         label='longexit',
         enabled=TRUE
)


macdFastMARange <- seq(2,12,by=5)
macdSlowMARange <- seq(12,24,by=6)
macdSignalRange <- seq(5,15,by=5)


paramset.label.name <- "macd_opt"


add.distribution(strategy.st,
                 paramset.label = paramset.label.name,
                 component.type = 'indicator',
                 component.label = "macd",
                 variable = list( nFast = macdFastMARange ), 
                 label = "macdFastMARANGE")


add.distribution(strategy.st,
                 paramset.label = paramset.label.name,
                 component.type = 'indicator',
                 component.label = "macd",
                 variable = list( nSlow = macdSlowMARange ),
                 label = "macdSlowMARANGE")


add.distribution(strategy.st,
                 paramset.label = paramset.label.name,
                 component.type = 'indicator',
                 component.label = "macd",
                 variable = list( nSig = macdSignalRange ),
                 label = "macdSignalRANGE")


add.distribution.constraint(strategy.st,
                            paramset.label = paramset.label.name,
                            distribution.label.1 = 'macdFastMARANGE',
                            distribution.label.2 = 'macdSlowMARANGE',
                            operator = '<',
                            label = 'FastMA<SlowMA')


#Single Core - Works
#applyStrategy(strategy=strategy.st,portfolios=strategy.st, verbose=TRUE)
#updatePortf(strategy.st)
#updateAcct(strategy.st)
#updateEndEq(strategy.st)




#DoSNOW Parallel on Windows - Does Not Work 
library(doSNOW)
library(parallel)
paramsetenv <- new.env()
cl <- snow::makeCluster(detectCores(), type = "SOCK")   
registerDoSNOW(cl)                                      
results <- apply.paramset(strategy.st,
                          paramset.label=paramset.label.name,
                          portfolio=strategy.st, 
                          account=strategy.st,
                          nsamples=0,
                          verbose = TRUE,
                          audit=paramsetenv,
                          calc = "slave")
snow::stopCluster(cl)   



More information about the R-SIG-Finance mailing list