[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