Brian G. Peterson
http://braverock.com/brian/
Ph: 773-459-4973
IM: bgpbraverock
On Mon, 2017-03-06 at 18:53 +0000, Atakan Okan wrote:
> Hello,
>
> I am trying to parallelize applyStrategy() to make it faster when
> applied to multiple symbols. The reproducible code below only
> contains 3 symbols thus it finishes fast however when I apply it to
> 100 symbols in an index, sequential computing takes a lot of time.
> What is the best way to accomplish this? Using foreach loop does not
> seem to work and couldn't find any info on stackexchange or the usual
> mailing lists.?
>
> Thanks.
>
> Atakan Okan
>
> Code with applyStrategy (foreach is below this):
>
> library(quantmod)
> library(quantstrat)
>
> symbols <- c("AAPL","GOOGL","MSFT")
>
> getSymbols(Symbols = symbols, from = "2010-01-01")
>
> currency('USD')
> stock(symbols, currency="USD")
>
> strategy.st <- "multiple_symbols_parallel_applystrategy"
> rm.strat(strategy.st)????????????????????????????????????????????????
> ??????
> ??????
> initPortf(strategy.st, symbols = symbols)
> initAcct(strategy.st, portfolios=strategy.st, initEq=100000)
> initOrders(portfolio=strategy.st)??????????????????????????
> strategy(strategy.st,store=TRUE)
> ???????????????????????????????????????????
> rule.longenter??= TRUE??
> rule.longexit???= TRUE??
> rule.shortenter = TRUE?
> rule.shortexit??= TRUE?
>
> txn.model <- 0
>
> add.indicator(strategy.st,??
> ??????????????name = "MACD",?
> ??????????????arguments = list(x=Cl(get(symbols))),?
> ??????????????label='macd')?
>
> 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.rule(strategy.st,
> ?????????name='ruleSignal',
> ?????????arguments = list(sigcol="macd.gt.signal",
> ??????????????????????????sigval=TRUE,
> ??????????????????????????prefer="Open",?
> ??????????????????????????orderqty= 1000,?
> ??????????????????????????#osFUN="osAllInLong",??
> ??????????????????????????ordertype='market',
> ??????????????????????????orderside='long',
> ??????????????????????????orderset='ocolong',
> ??????????????????????????TxnFees = txn.model),
> ?????????type='enter',
> ?????????label='longenter',
> ?????????enabled=FALSE
> )
>
> 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 = txn.model),
> ?????????type='exit',
> ?????????label='longexit',
> ?????????enabled=FALSE
> )
>
>
> add.rule(strategy.st,
> ?????????name='ruleSignal',
> ?????????arguments = list(sigcol="macd.lt.signal",
> ??????????????????????????sigval=TRUE,
> ??????????????????????????prefer="Open",?
> ??????????????????????????orderqty=-1000,?
> ??????????????????????????#osFUN="osAllInShort",??
> ??????????????????????????ordertype='market',
> ??????????????????????????orderside='short',
> ??????????????????????????orderset='ocoshort',
> ??????????????????????????TxnFees = txn.model),
> ?????????type='enter',
> ?????????label='shortenter',
> ?????????enabled=FALSE
> )
>
> add.rule(strategy.st,
> ?????????name='ruleSignal',
> ?????????arguments = list(sigcol="macd.gt.signal",
> ??????????????????????????sigval=TRUE,
> ??????????????????????????prefer="Open",?
> ??????????????????????????orderqty='all',
> ??????????????????????????ordertype='market',
> ??????????????????????????orderside='short',
> ??????????????????????????orderset='ocoshort',
> ??????????????????????????TxnFees = txn.model),
> ?????????type='exit',
> ?????????label='shortexit',
> ?????????enabled=FALSE
> )
>
> enable.rule(strategy.st,type="enter",label="longenter", enable =
> rule.longenter)?
> enable.rule(strategy.st,type="exit",label="longexit", enable =
> rule.longexit)
> enable.rule(strategy.st,type="enter",label="shortenter", enable =
> rule.shortenter)?
> enable.rule(strategy.st,type="exit",label="shortexit", enable =
> rule.shortexit)
> summary(getStrategy(strategy.st))????????????????????????????????????
> ??????????
>
> applyStrategy( strategy=strategy.st ,?
> ???????????????portfolios=strategy.st,
> ???????????????symbols = symbols,
> ???????????????verbose=TRUE)
> updatePortf(strategy.st)
> updateAcct(strategy.st)
> updateEndEq(strategy.st)
>
> -------------------------------------------------------------------
> -------------------------------------------------------------------
> -------------------------------
> Code with foreach:
>
> library(quantmod)
> library(quantstrat)
>
> if(Sys.info()["sysname"] == "Windows") {
> ? library(doSNOW)
> ? cl <- makeCluster(4)
> ? registerDoSNOW(cl)
> }
> if(Sys.info()["sysname"] == "Linux") {
> ? library(doMC)
> ? registerDoMC(cores=4)
> ? #registerDoSEQ()
> ? getDoParWorkers()
> }
>
> symbols <- c("AAPL","GOOGL","MSFT")
>
> sens.df <- foreach(sym = 1:length(symbols),?
> ???????????????????.combine = 'rbind',?
> ???????????????????.packages = c("quantstrat","quantmod")) %dopar% {
>
> ? getSymbols(Symbols = sym, from = "2010-01-01")
> ??
> ? currency('USD')
> ? stock(sym, currency="USD")
> ??
> ? strategy.st <- "multiple_symbols_parallel_applystrategy"
> ?
> rm.strat(strategy.st)????????????????????????????????????????????????
> ??????
> ????????
> ? initPortf(strategy.st, symbols = sym)
> ? initAcct(strategy.st, portfolios=strategy.st, initEq=100000)
> ? initOrders(portfolio=strategy.st)??????????????????????????
> ? strategy(strategy.st,store=TRUE)
> ?????????????????????????????????????????????
> ? rule.longenter??= TRUE??
> ? rule.longexit???= TRUE??
> ? rule.shortenter = TRUE?
> ? rule.shortexit??= TRUE?
> ??
> ? txn.model <- 0
> ??
> ? add.indicator(strategy.st,??
> ????????????????name = "MACD",?
> ????????????????arguments = list(x=Cl(get(sym))),?
> ????????????????label='macd')?
> ??
> ? 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.rule(strategy.st,
> ???????????name='ruleSignal',
> ???????????arguments = list(sigcol="macd.gt.signal",
> ????????????????????????????sigval=TRUE,
> ????????????????????????????prefer="Open",?
> ????????????????????????????orderqty= 1000,?
> ????????????????????????????#osFUN="osAllInLong",??
> ????????????????????????????ordertype='market',
> ????????????????????????????orderside='long',
> ????????????????????????????orderset='ocolong',
> ????????????????????????????TxnFees = txn.model),
> ???????????type='enter',
> ???????????label='longenter',
> ???????????enabled=FALSE
> ? )
> ??
> ? 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 = txn.model),
> ???????????type='exit',
> ???????????label='longexit',
> ???????????enabled=FALSE
> ? )
> ??
> ??
> ? add.rule(strategy.st,
> ???????????name='ruleSignal',
> ???????????arguments = list(sigcol="macd.lt.signal",
> ????????????????????????????sigval=TRUE,
> ????????????????????????????prefer="Open",?
> ????????????????????????????orderqty=-1000,?
> ????????????????????????????#osFUN="osAllInShort",??
> ????????????????????????????ordertype='market',
> ????????????????????????????orderside='short',
> ????????????????????????????orderset='ocoshort',
> ????????????????????????????TxnFees = txn.model),
> ???????????type='enter',
> ???????????label='shortenter',
> ???????????enabled=FALSE
> ? )
> ??
> ? add.rule(strategy.st,
> ???????????name='ruleSignal',
> ???????????arguments = list(sigcol="macd.gt.signal",
> ????????????????????????????sigval=TRUE,
> ????????????????????????????prefer="Open",?
> ????????????????????????????orderqty='all',
> ????????????????????????????ordertype='market',
> ????????????????????????????orderside='short',
> ????????????????????????????orderset='ocoshort',
> ????????????????????????????TxnFees = txn.model),
> ???????????type='exit',
> ???????????label='shortexit',
> ???????????enabled=FALSE
> ? )
> ??
> ? enable.rule(strategy.st,type="enter",label="longenter", enable =
> rule.longenter)?
> ? enable.rule(strategy.st,type="exit",label="longexit", enable =
> rule.longexit)
> ? enable.rule(strategy.st,type="enter",label="shortenter", enable =
> rule.shortenter)?
> ? enable.rule(strategy.st,type="exit",label="shortexit", enable =
> rule.shortexit)
> ?
> summary(getStrategy(strategy.st))????????????????????????????????????
> ??????????
> ??
> ? applyStrategy( strategy=strategy.st ,?
> ?????????????????portfolios=strategy.st,
> ?????????????????symbols = sym,
> ?????????????????verbose=TRUE)
> ? updatePortf(strategy.st)
> ? updateAcct(strategy.st)
> ? updateEndEq(strategy.st)
> ??
> ? results.checkstrat <- data.frame(t(tradeStats(strategy.st)))
> ??
> ? return(results.checkstrat[,1])
>
> }
>
> if (Sys.info()["sysname"] == "Windows"){
> ? snow::stopCluster(cl)???#dosnow??windows
> }
>
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R
> questions should go.