Chapter 9 Stop Loss Optimization
We take the code from 8 and reuse it here this time to test parameters for our stop-loss just as we did in 7. This time though instead of optimizing indicators we’re going to optimize .stopLoss
in a new integer vector .StopLoss
.
.StopLoss = seq(0.05, 0.6, length.out = 48)/100
We’ll name this strategy Luxor.Stop.Loss.Opt
.
strategy.st <- "Luxor.Stop.Loss.Opt"
rm.strat(portfolio.st)
rm.strat(account.st)
initPortf(name = portfolio.st,
symbols = symbols,
initDate = init_date)
## [1] "Port.Luxor.Stop.Loss"
initAcct(name = account.st,
portfolios = portfolio.st,
initDate = init_date)
## [1] "Acct.Luxor.Stop.Loss"
initOrders(portfolio = portfolio.st,
initDate = init_date)
strategy(strategy.st, store = TRUE)
9.1 Add Indicators
add.indicator(strategy.st,
name = "SMA",
arguments = list(x = quote(Cl(mktdata)),
n = .fast),
label = "nFast")
## [1] "Luxor.Stop.Loss.Opt"
add.indicator(strategy.st,
name = "SMA",
arguments = list(x = quote(Cl(mktdata)),
n = .slow),
label = "nSlow")
## [1] "Luxor.Stop.Loss.Opt"
9.2 Add Signals
add.signal(strategy.st,
name = "sigCrossover",
arguments = list(columns = c("nFast", "nSlow"),
relationship = "gte"),
label = "long"
)
## [1] "Luxor.Stop.Loss.Opt"
add.signal(strategy.st,
name = "sigCrossover",
arguments = list(columns = c("nFast", "nSlow"),
relationship = "lt"),
label = "short")
## [1] "Luxor.Stop.Loss.Opt"
9.3 Add Rules
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "long" ,
sigval = TRUE,
replace = FALSE,
orderside = "long" ,
ordertype = "stoplimit",
prefer = "High",
threshold = .threshold,
TxnFees = .txnfees,
orderqty = +.orderqty,
osFUN = osMaxPos,
orderset = "ocolong"),
type = "enter",
label = "EnterLONG")
## [1] "Luxor.Stop.Loss.Opt"
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "short",
sigval = TRUE,
replace = FALSE,
orderside = "short",
ordertype = "stoplimit",
prefer = "Low",
threshold = .threshold,
TxnFees = .txnfees,
orderqty = -.orderqty,
osFUN = osMaxPos,
orderset = "ocoshort"),
type = "enter",
label = "EnterSHORT")
## [1] "Luxor.Stop.Loss.Opt"
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "short",
sigval = TRUE,
replace = TRUE,
orderside = "long" ,
ordertype = "market",
TxnFees = .txnfees,
orderqty = "all",
orderset = "ocolong"),
type = "exit",
label = "Exit2SHORT")
## [1] "Luxor.Stop.Loss.Opt"
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "long",
sigval = TRUE,
replace = TRUE,
orderside = "short",
ordertype = "market",
TxnFees = .txnfees,
orderqty = "all",
orderset = "ocoshort"),
type = "exit",
label = "Exit2LONG")
## [1] "Luxor.Stop.Loss.Opt"
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "long" ,
sigval = TRUE,
replace = FALSE,
orderside = "long",
ordertype = "stoplimit",
tmult = TRUE,
threshold = quote(.stoploss),
TxnFees = .txnfees,
orderqty = "all",
orderset = "ocolong"),
type = "chain",
parent = "EnterLONG",
label = "StopLossLONG",
enabled = FALSE)
## [1] "Luxor.Stop.Loss.Opt"
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "short",
sigval = TRUE,
replace = FALSE,
orderside = "short",
ordertype = "stoplimit",
tmult = TRUE,
threshold = quote(.stoploss),
TxnFees = .txnfees,
orderqty = "all",
orderset = "ocoshort"),
type = "chain",
parent = "EnterSHORT",
label = "StopLossSHORT",
enabled = FALSE)
## [1] "Luxor.Stop.Loss.Opt"
9.4 Add Position Limit
for(symbol in symbols){
addPosLimit(portfolio = portfolio.st,
symbol = symbol,
timestamp = init_date,
maxpos = .orderqty)
}
9.5 Add Distribution
We use add.distribution
again to assign our .StopLoss
vector as values for the StopLossLONG and StopLossSHORT rule chains.
add.distribution(strategy.st,
paramset.label = "StopLoss",
component.type = "chain",
component.label = "StopLossLONG",
variable = list(threshold = .StopLoss),
label = "StopLossLONG")
## [1] "Luxor.Stop.Loss.Opt"
add.distribution(strategy.st,
paramset.label = "StopLoss",
component.type = "chain",
component.label = "StopLossSHORT",
variable = list(threshold = .StopLoss),
label = "StopLossSHORT")
## [1] "Luxor.Stop.Loss.Opt"
9.6 Add Distribution Constraint
We set a distribution constraint to keep the StopLossLONG and StopLossSHORT parameters the same.
add.distribution.constraint(strategy.st,
paramset.label = "StopLoss",
distribution.label.1 = "StopLossLONG",
distribution.label.2 = "StopLossSHORT",
operator = "==",
label = "StopLoss")
## [1] "Luxor.Stop.Loss.Opt"
9.7 Enable Rules
enable.rule(strategy.st, 'chain', 'StopLoss')
## [1] "Luxor.Stop.Loss.Opt"
9.8 Apply Paramset
cwd <- getwd()
setwd("./_data/")
results_file <- paste("results", strategy.st, "RData", sep = ".")
if( file.exists(results_file) ) {
load(results_file)
} else {
results <- apply.paramset(strategy.st,
paramset.label = "StopLoss",
portfolio.st = portfolio.st,
account.st = account.st,
nsamples = .nsamples,
verbose = TRUE)
if(checkBlotterUpdate(portfolio.st, account.st, verbose = TRUE)) {
save(list = "results", file = results_file)
save.strategy(strategy.st)
}
}
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
setwd(cwd)