[R-SIG-Finance] quantstrat - luxor.8 periodic optimization & walk-forward procedure
amarjit chandhial
a.chandhial at btinternet.com
Mon Sep 1 09:11:27 CEST 2014
Many thanks for getting back to me Guy. I should have noticed the frequency! Anyways it's got me started on proper strategy design in quantstrat.
UBUNTU
----------
Running on Ubuntu 14.10, I get past the 1st in-sample training and 1st out-of-sample WFA testing, however an error thereafter
[1] "=== training WFA on 2002-10-21 00:30:00/2002-10-22 23:30:00"
[1] "=== testing param.combo 1 on 2002-10-23/2002-10-23 23:30:00"
nFAST nSLOW
1 1 42
[1] "=== training WFA on 2002-10-22/2002-10-23 23:30:00"
error calling combine function:
<simpleError in fun(result.1, result.2, result.3, result.4, result.5, result.6, result.7, result.8, result.9, result.10, result.11, result.12, result.13,
result.14, result.15): attempt to select less than one element>
Error in walk.forward(strategy.st, paramset.label = "WFA", portfolio.st = portfolio.st, :
obj.func() returned empty result
In addition: Warning message:
In max(x$tradeStats$Net.Trading.PL) :
no non-missing arguments to max; returning -Inf
WINDOWS
------------
Running on Windows, I get past the 1st in-sample training then get problems at the 1st out-of-sample testing with the file 'wfa.GBPUSD.2002-10-21 00:30:00.2002-10-22 23:30:00.RData'
[1] "=== training WFA on 2002-10-21 00:30:00/2002-10-22 23:30:00"
nFAST nSLOW
1 1 42
[1] "2002-10-22 02:00:00 GBPUSD 1e+05 @ 1.545"
[1] "2002-10-22 16:30:00 GBPUSD -1e+05 @ 1.5453"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5448"
nFAST nSLOW
2 3 42
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.547"
[1] "2002-10-22 17:00:00 GBPUSD -1e+05 @ 1.5453"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5447"
nFAST nSLOW
3 5 42
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.547"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5435"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5447"
nFAST nSLOW
4 7 42
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.547"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
5 9 42
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:30:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5425"
nFAST nSLOW
6 1 44
[1] "2002-10-22 02:00:00 GBPUSD 1e+05 @ 1.545"
[1] "2002-10-22 17:00:00 GBPUSD -1e+05 @ 1.5453"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5447"
nFAST nSLOW
7 3 44
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.547"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5435"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5447"
nFAST nSLOW
8 5 44
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
9 7 44
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
10 9 44
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:30:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5425"
nFAST nSLOW
11 1 46
[1] "2002-10-22 02:00:00 GBPUSD 1e+05 @ 1.545"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5435"
[1] "2002-10-22 17:30:00 GBPUSD -1e+05 @ 1.5447"
nFAST nSLOW
12 3 46
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.547"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
13 5 46
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
14 7 46
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5469"
[1] "2002-10-22 18:00:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5426"
nFAST nSLOW
15 9 46
[1] "2002-10-22 04:00:00 GBPUSD 1e+05 @ 1.5466"
[1] "2002-10-22 18:30:00 GBPUSD -1e+05 @ 1.543"
[1] "2002-10-22 19:00:00 GBPUSD -1e+05 @ 1.5425"
[1] "=== testing param.combo 1 on 2002-10-23/2002-10-23 23:30:00"
nFAST nSLOW
1 1 42
Error in gzfile(file, "wb") : cannot open the connection
In addition: Warning messages:
1: executing %dopar% sequentially: no parallel backend registered
2: In gzfile(file, "wb") :
cannot open compressed file 'wfa.GBPUSD.2002-10-21 00:30:00.2002-10-22 23:30:00.RData', probable reason 'Invalid argument'
However, if I commet out #audit.prefix='wfa', the following error at the end of the 2nd in-sample training
error calling combine function:
<simpleError in fun(result.1, result.2, result.3, result.4, result.5, result.6, result.7, result.8, result.9, result.10, result.11, result.12, result.13, result.14, result.15): attempt to select less than one element>
Error in walk.forward(strategy.st, paramset.label = "WFA", portfolio.st = portfolio.st, :
obj.func() returned empty result
In addition: Warning messages:
1: executing %dopar% sequentially: no parallel backend registered
2: In covMcd(as.matrix(R), alpha = 1 - alpha) :
Initial scale 0 because more than 'h' (=9) observations are identical.
3: In covMcd(as.matrix(R), alpha = 1 - alpha) :
Initial scale 0 because more than 'h' (=9) observations are identical.
4: In covMcd(as.matrix(R), alpha = 1 - alpha) :
Initial scale 0 because more than 'h' (=9) observations are identical.
5: In max(x$tradeStats$Net.Trading.PL) :
no non-missing arguments to max; returning -Inf
Please help!
################################################################################################
Here's the program:
##############################
# MUST RUN LUXOR.5.ORDERSETS #
##############################
setwd(" your directory ")
require(quantstrat)
source(paste0(path.package("quantstrat"),"/demo/luxor.include.R"))
source(paste0(path.package("quantstrat"),"/demo/luxor.getSymbols.R"))
#IMPORTANT NOTE
#---------------------
# As of 2013-08-12, apply.paramset does not appear to run properly in parallel on
# Windows. To run on a Windows platform, load the doParallel package but do not call
# the registerDoParallel function; apply.paramset will then be able to run in sequential
# rather than parallel mode.
library(parallel)
detectCores()
if( Sys.info()['sysname'] == "Windows" )
{
library(doParallel)
# registerDoParallel(cores=detectCores())
} else {
library(doMC)
registerDoMC(cores=detectCores())
}
###############################################################################################
#usual stuff
#-----------
initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD', initEq=100000)
initOrders(portfolio.st, initDate=initDate)
load.strategy(strategy.st)
#chain rules
#-----------
#enable.rule(strategy.st, 'chain', 'StopLoss')
#enable.rule(strategy.st, 'chain', 'StopTrailing')
enable.rule(strategy.st, 'chain', 'TakeProfit')
addPosLimit(portfolio=portfolio.st,symbol='GBPUSD',timestamp=initDate, maxpos=.orderqty)
###############################################################################################
#objective function
#------------------
ess <- function(account.st, portfolio.st) {
require(robustbase, quietly=TRUE)
require(PerformanceAnalytics, quietly=TRUE)
portfolios.st <- ls(pos=.blotter, pattern=paste('portfolio', portfolio.st, '[0-9]*',sep='.'))
pr <- PortfReturns(Account = account.st, Portfolios=portfolios.st)
my.es <- ES(R=pr, clean='boudt')
return(my.es)
}
##########
#walk.forward
#------------
my.obj.func <- function(x){
#pick one of the following objective functions (uncomment)
#return(max(x$tradeStats$Max.Drawdown) == x$tradeStats$Max.Drawdown)
return(max(x$tradeStats$Net.Trading.PL) == x$tradeStats$Net.Trading.PL)
#return(max(x$user.func$GBPUSD.DailyEndEq) == x$user.func$GBPUSD.DailyEndEq)
}
r <- walk.forward(strategy.st,
paramset.label='WFA',
portfolio.st=portfolio.st,
account.st=account.st,
period='days',
k.training=2,
k.testing=1,
obj.func=my.obj.func,
obj.args=list(x=quote(result$apply.paramset)),
user.func=ess,
user.args=list('account.st'=account.st,
'portfolio.st'=portfolio.st),
audit.prefix='wfa',
anchored=FALSE,
verbose=FALSE)
###############################################################################################
#Results
#-------
pdf(paste('GBPUSD', .from, .to, 'pdf', sep='.'))
chart.Posn(portfolio.st)
dev.off()
ts <- tradeStats(portfolio.st)
save(ts, file=paste('GBPUSD', .from, .to, 'RData', sep='.'))
Amarjit
----Original message----
>From : gyollin at r-programming.org
Date : 31/08/2014 - 18:54 (GMTST)
To : r-sig-finance at r-project.org
Subject : Re: [R-SIG-Finance] quantstrat - luxor.8 periodic optimization & walk-forward procedure
Amarjit,
I'm pretty sure that you can get the luxor.8.walk.forward.R script to
run successfully as follows:
1. execute luxor.5.strategy.ordersets.R which saves the strategy
2. modify the the period argument in the call to walk.forward() to be
period='days'
Good luck with this.
G
On 8/31/2014 12:13 AM, amarjit chandhial wrote:
>
>
> I cannot get quantstrat's luxor.8 periodic optimization & walk-forward
> procedure, in the demos working.
>
>
> The idea being akin to the following diagram:
>
> http://www.tradestation.com/trading-technology/tradestation-platform/analyze/walk-forward-optimizer
>
>
> The error I get is,
>
> Error in if (!all(i <= 0)) stop("only zeros may be mixed with negative
> subscripts") :
> missing value where TRUE/FALSE needed
>
>
> If anybody can please email a working program.
>
>
>
> Otherwise, what I am really after is a demo with the workflow:
> - a simple vanilla technical stratgey - I can do
> - In-sample optimization of parameter(s) of simple strategy,
> Out-of-sample run - I can do
> - periodic optimization & walk-forward procedure
>
>
>
>
> Amarjit
>
>
>
>
>
>
>
> _______________________________________________
> 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.
[[alternative HTML version deleted]]
_______________________________________________
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.
More information about the R-SIG-Finance
mailing list