Homework 2.1

Firstly, I am running the train data as provided at class.

# lets load needed packages
library(xts)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.2.1
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.2.2
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries) 
library(chron)
## Warning: package 'chron' was built under R version 4.2.2
## 
## Attaching package: 'chron'
## The following object is masked from 'package:tseries':
## 
##     is.weekend
library(TTR)
library(caTools)
## Warning: package 'caTools' was built under R version 4.2.2
library(roll)
## Warning: package 'roll' was built under R version 4.2.2
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.2.2
## Loading required package: timechange
## Warning: package 'timechange' was built under R version 4.2.2
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:chron':
## 
##     days, hours, minutes, seconds, years
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.1
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lattice)
## Warning: package 'lattice' was built under R version 4.2.2
library(grDevices)

# lets change the LC_TIME option to English
Sys.setlocale("LC_TIME", "English")
## [1] "English_United States.1252"
# setting the working directory
setwd("H:/My Drive/Applied_Finance/2/")

# lets create a simple function calculating Sharpe ratio

mySR <- function(x, # x = series of returns
                 scale) # scaling parameter = Nt
{
  sqrt(scale) * mean(coredata(x), na.rm = TRUE) / 
    sd(coredata(x), na.rm = TRUE)
} # end of definition

# lets import the data on currencies (futures contracts)
load("currencies.RData")

# lets use the first half of the month (days 1-16) 
# as the training dataset and the rest (days 17-31)
# as the test data

currencies_train <- currencies[day(currencies) < 17,]
currencies_test <- currencies[day(currencies) >= 17,]

# E6 is still investigated
E6 <- currencies_train$E6

# Remove the data with high votality, 5 mins before and after the break
E6["T18:01/T18:05"] <- NA
E6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(E6)), index(E6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(E6)

# lets create a vector of times in a character format
time_ <- substr(index(E6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# simple momentum strategy: volatility breakout model
# an universal function for position calculation 
# in a basic volatility breakout model
source("function_positionR.R")

summary.all.breakout <- NULL
# run the model for test data with different parameters
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(E6$E6)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(E6$E6)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(E6$E6)), 
                                 volat.sd)
        
        # position for momentum strategy
        pos.mom <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mom" # important !!!
                             )
        
        # gross pnl
        pnl.gross.mom <- ifelse(is.na(pos.mom * diff.xts(E6$E6)),
                                0, pos.mom * diff.xts(E6$E6) * 125000 # point value for E6
                                )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mom))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mom <- pnl.gross.mom - ntrans * 15 # 15$ per transaction of E6
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(E6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mom.d <- period.apply(pnl.gross.mom, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mom.d <- period.apply(pnl.net.mom, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mom <- mySR(pnl.gross.mom.d, scale = 252)
        net.SR.mom <- mySR(pnl.net.mom.d, scale = 252)
        gross.PnL.mom <- sum(pnl.gross.mom.d, na.rm = T)
        net.PnL.mom <- sum(pnl.net.mom.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mom,
                               net.SR.mom,
                               gross.PnL.mom,
                               net.PnL.mom,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mom, net.SR.mom, gross.PnL.mom, net.PnL.mom, 
           pnl.gross.mom.d, pnl.net.mom.d, 
           pnl.gross.mom, pnl.net.mom,
           pos.mom, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mom

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mom)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mom  net.SR.mom gross.PnL.mom
## 1         10     150      120 3 2013-08    5.1277503  4.75330781        1000.0
## 2         10     120      120 3 2013-08    3.7454701  3.64732748         687.5
## 3         10      90       90 2 2013-08    3.5856582  1.92748352        1175.0
## 4         10      60      120 2 2013-08    2.7382887  1.54843632         862.5
## 5         10     180      120 3 2013-08    2.0421604  1.39070809         662.5
## 6         45     120       90 1 2013-08    3.0110788  0.93074597        1112.5
## 7         20     180      120 2 2013-08    1.9371667  0.45585095         675.0
## 8         15      90       60 2 2013-08    1.4294155 -0.07427575         512.5
## 9         10      60       90 2 2013-08    0.3951227 -0.26147105         125.0
## 10        45     120       60 1 2013-08    1.9566927 -0.30372480         850.0
##    net.PnL.mom
## 1        910.0
## 2        657.5
## 3        635.0
## 4        502.5
## 5        452.5
## 6        362.5
## 7        165.0
## 8        -27.5
## 9        -85.0
## 10      -140.0
print(paste('Mean of net.SR.mom of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mom of 10 top performance combinations is  1.4"
print(paste('Mean of net.PnL.mom of 10 top performance combinations is ', 
            round(mean(result[,'net.PnL.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mom of 10 top performance combinations is  343.25"
# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 10 
# and slowEMA = 150


# net.SR.mom
levelplot(net.SR.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 10, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# net.PnL.mom
levelplot(net.PnL.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 10, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

Secondly, I am running the data again, now using the test data.

# E6 is investigated
E6 <- currencies_test$E6

# Remove the data with high votality, 5 mins before and after the break
E6["T18:01/T18:05"] <- NA
E6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(E6)), index(E6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(E6)

# lets create a vector of times in a character format
time_ <- substr(index(E6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday


# run the model for test data with different parameters
summary.all.breakout <- NULL
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(E6$E6)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(E6$E6)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(E6$E6)), 
                                 volat.sd)
        
        # position for momentum strategy
        pos.mom <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mom" # important !!!
                             )
        
        # gross pnl
        pnl.gross.mom <- ifelse(is.na(pos.mom * diff.xts(E6$E6)),
                                0, pos.mom * diff.xts(E6$E6) * 125000 # point value for E6
                                )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mom))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mom <- pnl.gross.mom - ntrans * 15 # 15$ per transaction of E6
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(E6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mom.d <- period.apply(pnl.gross.mom, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mom.d <- period.apply(pnl.net.mom, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mom <- mySR(pnl.gross.mom.d, scale = 252)
        net.SR.mom <- mySR(pnl.net.mom.d, scale = 252)
        gross.PnL.mom <- sum(pnl.gross.mom.d, na.rm = T)
        net.PnL.mom <- sum(pnl.net.mom.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mom,
                               net.SR.mom,
                               gross.PnL.mom,
                               net.PnL.mom,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mom, net.SR.mom, gross.PnL.mom, net.PnL.mom, 
           pnl.gross.mom.d, pnl.net.mom.d, 
           pnl.gross.mom, pnl.net.mom,
           pos.mom, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mom

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mom)) %>% 
  head(10)

print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mom net.SR.mom gross.PnL.mom
## 1         30     120       60 2 2013-08     7.994370   6.675129        3150.0
## 2         15     150      120 2 2013-08     7.964361   6.241617        2287.5
## 3         10      90       60 3 2013-08     6.372420   5.634107         625.0
## 4         45     120      120 1 2013-08     5.906238   5.354725        1537.5
## 5         45     180      120 2 2013-08     5.024225   4.556045        1337.5
## 6         10     120       90 2 2013-08     6.294352   4.285003        2375.0
## 7         30      90      120 1 2013-08     6.047622   4.258273        1512.5
## 8         45     120       90 1 2013-08     5.539341   4.116727        2312.5
## 9         15      90       60 3 2013-08     4.098780   4.098780         325.0
## 10        20      90       60 3 2013-08     4.098780   4.098780         325.0
##    net.PnL.mom
## 1       2580.0
## 2       1777.5
## 3        505.0
## 4       1327.5
## 5       1157.5
## 6       1625.0
## 7       1062.5
## 8       1712.5
## 9        295.0
## 10       295.0
print(paste('Mean of net.SR.mom of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mom of 10 top performance combinations is  4.93"
print(paste('Mean of net.PnL.mom of 10 top performance combinations is ', 
            round(mean(result[,'net.PnL.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mom of 10 top performance combinations is  1233.75"

Look at the the table above, top 5 performing combinations are profitable. Comparing with the train data, below is the table of top 10 from train data:

signalEMA slowEMA volat.sd m period gross.SR.mom net.SR.mom gross.PnL.mom net.PnL.mom
1 10 150 120 3 2013-08 5.1277503 4.75330781 1000 910
2 10 120 120 3 2013-08 3.7454701 3.64732748 687.5 657.5
3 10 90 90 2 2013-08 3.5856582 1.92748352 1175 635
4 10 60 120 2 2013-08 2.7382887 1.54843632 862.5 502.5
5 10 180 120 3 2013-08 2.0421604 1.39070809 662.5 452.5
6 45 120 90 1 2013-08 3.0110788 0.93074597 1112.5 362.5
7 20 180 120 2 2013-08 1.9371667 0.45585095 675 165
8 15 90 60 2 2013-08 1.4294155 -0.07427575 512.5 -27.5
9 10 60 90 2 2013-08 0.3951227 -0.26147105 125 -85
10 45 120 60 1 2013-08 1.9566927 -0.3037248 850 -140

At first glance, the net.SR in the test data is higher than from in train data in general. When checking the mean of top 10 best combinations, this strategy in test data is even better than in train data (mean of 10 best net.SR is 4.93 vs. 2.75).

After that, because the top combination is sinalEMA = 30 and slowEMA = 120, I check the sensitivity using those 2 parameters.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 30 
# and slowEMA = 120


# net.SR.mom
levelplot(net.SR.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 30, 
                          slowEMA == 120),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

The best combination would be volatility multiplier = 2 and volatility = 60. This is also the best combination that we witnessed earlier. If we deviate from it, the results are all bad in term of net sharpe ratio.

# net.PnL.mom
levelplot(net.PnL.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 30, 
                          slowEMA == 120),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

The same conclusion can be seen in the graph about net profit and loss. The most profitable combination would be volatility multiplier = 2 and volatility memory = 60.It can still be profitable in some other cases as seen in the light green zones in the graph. However, those profit are not higher than profit from risk-free investment as confirmed in the graph shown earlier.

Homework 2.2

For this homework, I just utilize the codes earlier and adapt some changes. To make it tidier, I will not repeat the comments for each section. I choose B6 to check the difference between SMAs and EMAs.

For parameters, I will change it as below:

First, I’ll run train data, EMA for B6.

# B6 is investigated
B6 <- currencies_train$B6

# Remove the data with high votality, 5 mins before and after the break
B6["T18:01/T18:05"] <- NA
B6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(B6)), index(B6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(B6)

# lets create a vector of times in a character format
time_ <- substr(index(B6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# run the model for test data with different parameters
summary.all.breakout <- NULL
for(signalEMA in c(3, 6, 9, 12, 15)) {
  for(slowEMA in c(45, 90, 135, 180, 225, 270)) {
    for(volat.sd in c(60, 120, 180)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(B6$B6)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(B6$B6)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(B6$B6)), 
                                 volat.sd)
        
        # position for momentum strategy
        pos.mom <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mom" # important !!!
                             )
        
        # gross pnl
        pnl.gross.mom <- ifelse(is.na(pos.mom * diff.xts(B6$B6)),
                                0, pos.mom * diff.xts(B6$B6) * 62500 # point value for B6
                                )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mom))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mom <- pnl.gross.mom - ntrans * 15 # 15$ per transaction of B6
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(B6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mom.d <- period.apply(pnl.gross.mom, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mom.d <- period.apply(pnl.net.mom, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mom <- mySR(pnl.gross.mom.d, scale = 252)
        net.SR.mom <- mySR(pnl.net.mom.d, scale = 252)
        gross.PnL.mom <- sum(pnl.gross.mom.d, na.rm = T)
        net.PnL.mom <- sum(pnl.net.mom.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mom,
                               net.SR.mom,
                               gross.PnL.mom,
                               net.PnL.mom,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mom, net.SR.mom, gross.PnL.mom, net.PnL.mom, 
           pnl.gross.mom.d, pnl.net.mom.d, 
           pnl.gross.mom, pnl.net.mom,
           pos.mom, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 3
# lets order strategies according to decreasing net.SR.mom

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mom)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mom net.SR.mom gross.PnL.mom
## 1          6      90       60 3 2013-08     6.906544  5.9749797       1712.50
## 2          9      90       60 3 2013-08     5.708793  3.8771211        593.75
## 3         12      90       60 3 2013-08     4.757091  3.5244687        506.25
## 4         15      90       60 3 2013-08     4.243888  3.2909926        450.00
## 5          6     135       60 3 2013-08     3.510215  1.6807653       1243.75
## 6         12     270      120 3 2013-08     2.224523  1.0078148        831.25
## 7          6      45      180 3 2013-08     1.517405  0.9815446        512.50
## 8          9      90      180 3 2013-08     1.230075  0.6986049        418.75
## 9         12      45      180 2 2013-08     1.108534  0.5738328        375.00
## 10        12     180      180 3 2013-08     1.197919  0.3147385        162.50
##    net.PnL.mom
## 1      1442.50
## 2       383.75
## 3       356.25
## 4       330.00
## 5       613.75
## 6       381.25
## 7       332.50
## 8       238.75
## 9       195.00
## 10       42.50
print(paste('Mean of net.SR.mom of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mom of 10 top performance combinations is  2.19"
print(paste('Mean of net.PnL.mom of 10 top performance combinations is ',
            round(mean(result[,'net.PnL.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mom of 10 top performance combinations is  431.62"

For top 10 combinations, we all have positive net profit with this strategy. In term of net.SR, it’s also all positive. Focusing on the top combination, I check the sensitivity with slowEMA = 90 and signalEMA = 6.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 6 
# and slowEMA = 90


# net.SR.mom
levelplot(net.SR.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 6, 
                          slowEMA == 90),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

For net sharpe ratio, with the given only one combination volatility memory = 60 and volatility multiplier = 3 results in positive net sharpe ratio.

# net.PnL.mom
levelplot(net.PnL.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 6, 
                          slowEMA == 90),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

The net profit & loss confirm the previous graph. Even though volatility memory = 180 and volatility multiplier = 3 can also bring profit, it is not significantly higher than risk-free profit.

Now, I am investigating B6 with SMA.

# run the model for test data with different parameters
summary.all.breakout <- NULL
for(signalSMA in c(3, 6, 9, 12, 15)) {
  for(slowSMA in c(45, 90, 135, 180, 225, 270)) {
    for(volat.sd in c(60, 120, 180)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalSMA = ", signalSMA,
                       ", slowSMA = ", slowSMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalSMA.values <- SMA(coredata(na.locf(B6$B6)), 
                                signalSMA)
        # basis for volatility bands
        slowSMA.values <- SMA(coredata(na.locf(B6$B6)), 
                              slowSMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(B6$B6)), 
                                 volat.sd)
        
        # position for momentum strategy
        pos.mom <- positionR(signal = signalSMA.values,
                             lower = slowSMA.values - m_ * volat.sd.values,
                             upper = slowSMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mom" # important !!!
                             )
        
        # gross pnl
        pnl.gross.mom <- ifelse(is.na(pos.mom * diff.xts(B6$B6)),
                                0, pos.mom * diff.xts(B6$B6) * 62500 # point value for B6
                                )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mom))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mom <- pnl.gross.mom - ntrans * 15 # 15$ per transaction of B6
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(B6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mom.d <- period.apply(pnl.gross.mom, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mom.d <- period.apply(pnl.net.mom, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mom <- mySR(pnl.gross.mom.d, scale = 252)
        net.SR.mom <- mySR(pnl.net.mom.d, scale = 252)
        gross.PnL.mom <- sum(pnl.gross.mom.d, na.rm = T)
        net.PnL.mom <- sum(pnl.net.mom.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalSMA = signalSMA,
                               slowSMA = slowSMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mom,
                               net.SR.mom,
                               gross.PnL.mom,
                               net.PnL.mom,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mom, net.SR.mom, gross.PnL.mom, net.PnL.mom, 
           pnl.gross.mom.d, pnl.net.mom.d, 
           pnl.gross.mom, pnl.net.mom,
           pos.mom, ends_, summary_,
           signalSMA.values, slowSMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowSMA
} # end of loop for signal
## signalSMA = 3, slowSMA = 45, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 45, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 45, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 45, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 45, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 45, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 45, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 45, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 45, volat.sd = 180, m_ = 3
## signalSMA = 3, slowSMA = 90, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 90, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 90, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 90, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 90, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 90, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 90, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 90, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 90, volat.sd = 180, m_ = 3
## signalSMA = 3, slowSMA = 135, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 135, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 135, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 135, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 135, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 135, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 135, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 135, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 135, volat.sd = 180, m_ = 3
## signalSMA = 3, slowSMA = 180, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 180, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 180, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 180, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 180, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 180, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 180, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 180, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 180, volat.sd = 180, m_ = 3
## signalSMA = 3, slowSMA = 225, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 225, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 225, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 225, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 225, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 225, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 225, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 225, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 225, volat.sd = 180, m_ = 3
## signalSMA = 3, slowSMA = 270, volat.sd = 60, m_ = 1
## signalSMA = 3, slowSMA = 270, volat.sd = 60, m_ = 2
## signalSMA = 3, slowSMA = 270, volat.sd = 60, m_ = 3
## signalSMA = 3, slowSMA = 270, volat.sd = 120, m_ = 1
## signalSMA = 3, slowSMA = 270, volat.sd = 120, m_ = 2
## signalSMA = 3, slowSMA = 270, volat.sd = 120, m_ = 3
## signalSMA = 3, slowSMA = 270, volat.sd = 180, m_ = 1
## signalSMA = 3, slowSMA = 270, volat.sd = 180, m_ = 2
## signalSMA = 3, slowSMA = 270, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 45, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 45, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 45, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 45, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 45, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 45, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 45, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 45, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 45, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 90, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 90, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 90, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 90, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 90, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 90, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 90, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 90, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 90, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 135, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 135, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 135, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 135, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 135, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 135, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 135, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 135, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 135, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 180, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 180, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 180, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 180, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 180, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 180, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 180, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 180, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 180, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 225, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 225, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 225, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 225, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 225, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 225, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 225, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 225, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 225, volat.sd = 180, m_ = 3
## signalSMA = 6, slowSMA = 270, volat.sd = 60, m_ = 1
## signalSMA = 6, slowSMA = 270, volat.sd = 60, m_ = 2
## signalSMA = 6, slowSMA = 270, volat.sd = 60, m_ = 3
## signalSMA = 6, slowSMA = 270, volat.sd = 120, m_ = 1
## signalSMA = 6, slowSMA = 270, volat.sd = 120, m_ = 2
## signalSMA = 6, slowSMA = 270, volat.sd = 120, m_ = 3
## signalSMA = 6, slowSMA = 270, volat.sd = 180, m_ = 1
## signalSMA = 6, slowSMA = 270, volat.sd = 180, m_ = 2
## signalSMA = 6, slowSMA = 270, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 45, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 45, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 45, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 45, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 45, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 45, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 45, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 45, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 45, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 90, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 90, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 90, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 90, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 90, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 90, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 90, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 90, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 90, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 135, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 135, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 135, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 135, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 135, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 135, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 135, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 135, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 135, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 180, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 180, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 180, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 180, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 180, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 180, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 180, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 180, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 180, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 225, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 225, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 225, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 225, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 225, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 225, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 225, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 225, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 225, volat.sd = 180, m_ = 3
## signalSMA = 9, slowSMA = 270, volat.sd = 60, m_ = 1
## signalSMA = 9, slowSMA = 270, volat.sd = 60, m_ = 2
## signalSMA = 9, slowSMA = 270, volat.sd = 60, m_ = 3
## signalSMA = 9, slowSMA = 270, volat.sd = 120, m_ = 1
## signalSMA = 9, slowSMA = 270, volat.sd = 120, m_ = 2
## signalSMA = 9, slowSMA = 270, volat.sd = 120, m_ = 3
## signalSMA = 9, slowSMA = 270, volat.sd = 180, m_ = 1
## signalSMA = 9, slowSMA = 270, volat.sd = 180, m_ = 2
## signalSMA = 9, slowSMA = 270, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 45, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 45, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 45, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 45, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 45, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 45, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 45, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 45, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 45, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 90, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 90, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 90, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 90, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 90, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 90, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 90, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 90, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 90, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 135, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 135, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 135, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 135, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 135, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 135, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 135, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 135, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 135, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 180, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 180, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 180, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 180, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 180, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 180, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 180, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 180, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 180, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 225, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 225, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 225, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 225, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 225, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 225, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 225, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 225, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 225, volat.sd = 180, m_ = 3
## signalSMA = 12, slowSMA = 270, volat.sd = 60, m_ = 1
## signalSMA = 12, slowSMA = 270, volat.sd = 60, m_ = 2
## signalSMA = 12, slowSMA = 270, volat.sd = 60, m_ = 3
## signalSMA = 12, slowSMA = 270, volat.sd = 120, m_ = 1
## signalSMA = 12, slowSMA = 270, volat.sd = 120, m_ = 2
## signalSMA = 12, slowSMA = 270, volat.sd = 120, m_ = 3
## signalSMA = 12, slowSMA = 270, volat.sd = 180, m_ = 1
## signalSMA = 12, slowSMA = 270, volat.sd = 180, m_ = 2
## signalSMA = 12, slowSMA = 270, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 45, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 45, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 45, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 45, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 45, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 45, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 45, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 45, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 45, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 90, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 90, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 90, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 90, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 90, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 90, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 90, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 90, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 90, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 135, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 135, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 135, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 135, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 135, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 135, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 135, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 135, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 135, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 180, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 180, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 180, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 180, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 180, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 180, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 180, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 180, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 180, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 225, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 225, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 225, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 225, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 225, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 225, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 225, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 225, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 225, volat.sd = 180, m_ = 3
## signalSMA = 15, slowSMA = 270, volat.sd = 60, m_ = 1
## signalSMA = 15, slowSMA = 270, volat.sd = 60, m_ = 2
## signalSMA = 15, slowSMA = 270, volat.sd = 60, m_ = 3
## signalSMA = 15, slowSMA = 270, volat.sd = 120, m_ = 1
## signalSMA = 15, slowSMA = 270, volat.sd = 120, m_ = 2
## signalSMA = 15, slowSMA = 270, volat.sd = 120, m_ = 3
## signalSMA = 15, slowSMA = 270, volat.sd = 180, m_ = 1
## signalSMA = 15, slowSMA = 270, volat.sd = 180, m_ = 2
## signalSMA = 15, slowSMA = 270, volat.sd = 180, m_ = 3
# lets order strategies according to decreasing net.SR.mom

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mom)) %>% 
  head(10)
print(result)
##    signalSMA slowSMA volat.sd m  period gross.SR.mom net.SR.mom gross.PnL.mom
## 1         12      90       60 3 2013-08     5.070662  4.5952384       1268.75
## 2          9      90       60 3 2013-08     5.095851  4.3579410       1287.50
## 3         15      90      180 3 2013-08     3.968627  3.9686270        131.25
## 4         15     135       60 3 2013-08     3.270734  1.4408869       1256.25
## 5         15      90       60 3 2013-08     2.441889  1.2441908        237.50
## 6          6      90       60 3 2013-08     3.791389  1.1999675       1156.25
## 7          6      45      180 3 2013-08     2.074459  1.0368680        668.75
## 8          9      45       60 2 2013-08     1.801087  0.4953524        581.25
## 9         15     180      120 3 2013-08     1.667641  0.1137940        225.00
## 10        15     180       60 3 2013-08     2.237581 -0.3544571        875.00
##    net.PnL.mom
## 1      1118.75
## 2      1077.50
## 3       101.25
## 4       566.25
## 5       117.50
## 6       376.25
## 7       338.75
## 8       161.25
## 9        15.00
## 10     -145.00
print(paste('Mean of net.SR.mom of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mom of 10 top performance combinations is  1.81"
print(paste('Mean of net.PnL.mom of 10 top performance combinations is ', 
            round(mean(result[,'net.PnL.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mom of 10 top performance combinations is  372.75"

For top 10 combinations, 9 out of 10 net.SR and net.PnL are positive. When comparing the mean with top 10 with EMA, SMA is worse in both net.SR and net.PnL. Then I check the sensitivity with the top combination: signalSMA = 12 and slowSMA = 90.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalSMA = 12
# and slowSMA = 90


# net.SR.mom
levelplot(net.SR.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalSMA == 12, 
                          slowSMA == 90),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

For net sharpe ratio, only one region brings benefit, which is volatility multiplier = 3 and volatility memory = 60. Lower volatility multipliers result in negative net sharpe ratio.

# net.PnL.mom
levelplot(net.PnL.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalSMA == 12, 
                          slowSMA == 90),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

And unsurprisingly, net profit and loss confirm the chart of net sharpe ratio, only one combination: volatility multiplier = 3 and volatility memory = 60 brings net profit.

Thirdly, I am running data using EMA for test data of B6.

# B6 is investigated
B6 <- currencies_test$B6

# Remove the data with high votality, 5 mins before and after the break
B6["T18:01/T18:05"] <- NA
B6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(B6)), index(B6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(B6)

# lets create a vector of times in a character format
time_ <- substr(index(B6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# run the model for test data with different parameters
summary.all.breakout <- NULL
for(signalEMA in c(3, 6, 9, 12, 15)) {
  for(slowEMA in c(45, 90, 135, 180, 225, 270)) {
    for(volat.sd in c(60, 120, 180)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(B6$B6)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(B6$B6)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(B6$B6)), 
                                 volat.sd)
        
        # position for momentum strategy
        pos.mom <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mom" # important !!!
                             )
        
        # gross pnl
        pnl.gross.mom <- ifelse(is.na(pos.mom * diff.xts(B6$B6)),
                                0, pos.mom * diff.xts(B6$B6) * 62500 # point value for B6
                                )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mom))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mom <- pnl.gross.mom - ntrans * 15 # 15$ per transaction of B6
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(B6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mom.d <- period.apply(pnl.gross.mom, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mom.d <- period.apply(pnl.net.mom, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mom <- mySR(pnl.gross.mom.d, scale = 252)
        net.SR.mom <- mySR(pnl.net.mom.d, scale = 252)
        gross.PnL.mom <- sum(pnl.gross.mom.d, na.rm = T)
        net.PnL.mom <- sum(pnl.net.mom.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mom,
                               net.SR.mom,
                               gross.PnL.mom,
                               net.PnL.mom,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mom, net.SR.mom, gross.PnL.mom, net.PnL.mom, 
           pnl.gross.mom.d, pnl.net.mom.d, 
           pnl.gross.mom, pnl.net.mom,
           pos.mom, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 3, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 6, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 9, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 12, slowEMA = 270, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 45, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 135, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 225, volat.sd = 180, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 1
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 2
## signalEMA = 15, slowEMA = 270, volat.sd = 180, m_ = 3
# lets order strategies according to decreasing net.SR.mom

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mom)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mom net.SR.mom gross.PnL.mom
## 1         12     180      120 3 2013-08    1.4095545 -0.1525356         81.25
## 2          9      90      180 3 2013-08    1.2634794 -0.7690221         18.75
## 3         12      45      180 2 2013-08    1.2634794 -0.7690221         18.75
## 4         15     180      120 3 2013-08    0.3106958 -1.0865707         12.50
## 5          9     135      120 3 2013-08   -1.5067373 -1.9756499       -162.50
## 6          9      45      120 2 2013-08   -0.8232194 -2.3692223        -43.75
## 7         15     225      120 3 2013-08   -0.5874700 -2.4386307        -37.50
## 8          6      90       60 3 2013-08   -1.6666664 -2.8367121       -231.25
## 9          6      90      120 3 2013-08   -2.8203559 -3.4385318       -306.25
## 10         3      45       60 3 2013-08   -3.1863016 -3.9875842       -262.50
##    net.PnL.mom
## 1        -8.75
## 2       -11.25
## 3       -11.25
## 4       -47.50
## 5      -222.50
## 6      -133.75
## 7      -157.50
## 8      -411.25
## 9      -396.25
## 10     -382.50

In comparison with Train Data, test data behaves differently. All net.SR and net.PnL are negative.

print(paste('Mean of net.SR.mom of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mom of 10 top performance combinations is  -1.98"
print(paste('Mean of net.PnL.mom of 10 top performance combinations is ', 
            round(mean(result[,'net.PnL.mom'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mom of 10 top performance combinations is  -178.25"

And of course, because all are negative, the mean are negative.

Then I check the sensitivity using the least bad combination sinalSMA = 12 and slowSMA = 180.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalSMA = 12
# and slowSMA = 180


# net.SR.mom
levelplot(net.SR.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 12, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# net.PnL.mom
levelplot(net.PnL.mom ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 12, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

For both graphs, the combination of volatility memory = 120 and volatility multiplier = 3 is the least bad, it minimizes the loss.

Homework 2.3

Now, I analyse the mean-reverting strategy for the spread between Canadian dollar and Australian dollar. Firstly, I investigate the side “C6 - A6”.

# A6C6 is investigated
A6C6 <- currencies_train[,c("A6","C6")]
#Column R (result) is the result of "C6 - A6"
A6C6$R <- A6C6$C6 - A6C6$A6

# Remove the data with high votality, 5 mins before and after the break
A6C6["T18:01/T18:05"] <- NA
A6C6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(A6C6)), index(A6C6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(A6C6)

# lets create a vector of times in a character format
time_ <- substr(index(A6C6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# simple mr strategy: volatility breakout model
# an universal function for position calculation 
# in a basic volatility breakout model
source("function_positionR.R")

summary.all.breakout <- NULL
# run the model for test data with different parameters
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(A6C6$R)), 
                                   volat.sd)
        
        # position for mr strategy
        pos.mr <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mr" # important !!!
        )
        
       
        
        
        # gross pnl
        pnl.gross.mr <- ifelse(is.na(pos.mr * (diff.xts(A6C6$C6) - diff.xts(A6C6$A6))),
                                0, pos.mr * diff.xts(A6C6$C6) * 100000 - pos.mr * diff.xts(A6C6$A6) * 100000
        )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mr))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mr <- pnl.gross.mr - ntrans * 2*15
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(A6C6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mr.d <- period.apply(pnl.gross.mr, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mr.d <- period.apply(pnl.net.mr, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mr <- mySR(pnl.gross.mr.d, scale = 252)
        net.SR.mr <- mySR(pnl.net.mr.d, scale = 252)
        gross.PnL.mr <- sum(pnl.gross.mr.d, na.rm = T)
        net.PnL.mr <- sum(pnl.net.mr.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mr,
                               net.SR.mr,
                               gross.PnL.mr,
                               net.PnL.mr,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mr, net.SR.mr, gross.PnL.mr, net.PnL.mr, 
           pnl.gross.mr.d, pnl.net.mr.d, 
           pnl.gross.mr, pnl.net.mr,
           pos.mr, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mr

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mr)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mr net.SR.mr gross.PnL.mr
## 1         20     180      120 2 2013-08    9.600187  5.987830         2900
## 2         30     180      120 2 2013-08    7.436080  5.514138         2290
## 3         20      90       60 3 2013-08    5.577259  5.472402          660
## 4         30      90       60 3 2013-08    5.506955  5.383692          700
## 5         15      90      120 2 2013-08    5.560825  5.044037          600
## 6         10      90       60 2 2013-08   11.587949  4.503847         3310
## 7         45     150      120 1 2013-08    8.642115  4.462420         4320
## 8         10     120      120 3 2013-08    4.388698  4.153222          530
## 9         30      60       60 1 2013-08    5.794111  3.998944          790
## 10        45      90       90 1 2013-08    5.232056  3.989137         1460
##    net.PnL.mr
## 1        1700
## 2        1630
## 3         540
## 4         580
## 5         420
## 6        1090
## 7        1980
## 8         470
## 9         490
## 10       1040

All of the top 10 combinations result in positive net.PnL.

print(paste('Mean of net.SR.mr of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mr of 10 top performance combinations is  4.85"
print(paste('Mean of net.PnL.mr of 10 top performance combinations is ',
            round(mean(result[,'net.PnL.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mr of 10 top performance combinations is  994"

Then I choose the top combination: signalEMA = 20 and slowEMA = 180 for further sensitivity analysis.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 20 
# and slowEMA = 180


# net.SR.mr
levelplot(net.SR.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# net.PnL.mr
levelplot(net.PnL.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

From the 2 graphs about the net Profit and Loss and net Sharpe Ratio, we can see the the best scenario would be volatility multiplier = 2 and volatility memory = 120. But it is also good with 3 other combinations:

Then I check the same side, same strategy with test data.

# A6C6 is investigated
A6C6 <- currencies_test[,c("A6","C6")]
#Column R (result) is the result of "C6 - A6"
A6C6$R <- A6C6$C6 - A6C6$A6

# Remove the data with high votality, 5 mins before and after the break
A6C6["T18:01/T18:05"] <- NA
A6C6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(A6C6)), index(A6C6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(A6C6)

# lets create a vector of times in a character format
time_ <- substr(index(A6C6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# simple mr strategy: volatility breakout model
# an universal function for position calculation 
# in a basic volatility breakout model
source("function_positionR.R")

summary.all.breakout <- NULL
# run the model for test data with different parameters
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(A6C6$R)), 
                                   volat.sd)
        
        # position for mr strategy
        pos.mr <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mr" # important !!!
        )
        
       
        
        
        # gross pnl
        pnl.gross.mr <- ifelse(is.na(pos.mr * (diff.xts(A6C6$C6) - diff.xts(A6C6$A6))),
                                0, pos.mr * diff.xts(A6C6$C6) * 100000 - pos.mr * diff.xts(A6C6$A6) * 100000
        )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mr))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mr <- pnl.gross.mr - ntrans * 2*15
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(A6C6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mr.d <- period.apply(pnl.gross.mr, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mr.d <- period.apply(pnl.net.mr, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mr <- mySR(pnl.gross.mr.d, scale = 252)
        net.SR.mr <- mySR(pnl.net.mr.d, scale = 252)
        gross.PnL.mr <- sum(pnl.gross.mr.d, na.rm = T)
        net.PnL.mr <- sum(pnl.net.mr.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mr,
                               net.SR.mr,
                               gross.PnL.mr,
                               net.PnL.mr,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mr, net.SR.mr, gross.PnL.mr, net.PnL.mr, 
           pnl.gross.mr.d, pnl.net.mr.d, 
           pnl.gross.mr, pnl.net.mr,
           pos.mr, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mr

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mr)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mr net.SR.mr gross.PnL.mr
## 1         20     150       60 3 2013-08    6.906330  4.480281         2540
## 2         10     120       90 3 2013-08    4.098780  4.098780          140
## 3         15      60       60 2 2013-08    4.098780  4.098780           70
## 4         20      90       60 3 2013-08    4.098780  4.098780           80
## 5         30      90       60 3 2013-08    4.098780  4.098780           80
## 6         45     120       60 2 2013-08    5.062933  2.993028         2030
## 7         10     150       60 3 2013-08    6.591783  2.978896         2040
## 8         30     150       60 3 2013-08    4.812821  2.593958         1900
## 9         45     150       60 3 2013-08    3.877769  2.109604         1100
## 10        15     150       60 3 2013-08    5.578855  2.056185         1610
##    net.PnL.mr
## 1        1520
## 2          80
## 3          10
## 4          20
## 5          20
## 6        1070
## 7         780
## 8         940
## 9         560
## 10        530
print(paste('Mean of net.SR.mr of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mr of 10 top performance combinations is  3.36"
print(paste('Mean of net.PnL.mr of 10 top performance combinations is ',
            round(mean(result[,'net.PnL.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mr of 10 top performance combinations is  553"

Even though top ten combinations of the test data also result in positive profit, it is not as good as in train data when looking at the mean of 10 top combinations. I am checking further about the sensitivity with the top combination parameters.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 20 
# and slowEMA = 150


# net.SR.mr
levelplot(net.SR.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 20 
# and slowEMA = 150


# net.SR.mr
levelplot(net.SR.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

From the graphs, it seems that the only scenario that brings profit is volatility memory = 60 and volatility multiplier = 3.

Secondly, I am checking the other side “A6 - C6”

# A6C6 is investigated
A6C6 <- currencies_train[,c("A6","C6")]
#Column R (result) is the result of "A6 - C6"
A6C6$R <- A6C6$A6 - A6C6$C6

# Remove the data with high votality, 5 mins before and after the break
A6C6["T18:01/T18:05"] <- NA
A6C6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(A6C6)), index(A6C6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(A6C6)

# lets create a vector of times in a character format
time_ <- substr(index(A6C6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# simple mr strategy: volatility breakout model
# an universal function for position calculation 
# in a basic volatility breakout model
source("function_positionR.R")

summary.all.breakout <- NULL
# run the model for test data with different parameters
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(A6C6$R)), 
                                   volat.sd)
        
        # position for mr strategy
        pos.mr <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mr" # important !!!
        )
        
       
        
        
        # gross pnl
        pnl.gross.mr <- ifelse(is.na(pos.mr * (diff.xts(A6C6$A6) - diff.xts(A6C6$C6))),
                                0, pos.mr * diff.xts(A6C6$A6) * 100000 - pos.mr * diff.xts(A6C6$C6) * 100000
        )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mr))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mr <- pnl.gross.mr - ntrans * 2*15
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(A6C6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mr.d <- period.apply(pnl.gross.mr, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mr.d <- period.apply(pnl.net.mr, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mr <- mySR(pnl.gross.mr.d, scale = 252)
        net.SR.mr <- mySR(pnl.net.mr.d, scale = 252)
        gross.PnL.mr <- sum(pnl.gross.mr.d, na.rm = T)
        net.PnL.mr <- sum(pnl.net.mr.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mr,
                               net.SR.mr,
                               gross.PnL.mr,
                               net.PnL.mr,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mr, net.SR.mr, gross.PnL.mr, net.PnL.mr, 
           pnl.gross.mr.d, pnl.net.mr.d, 
           pnl.gross.mr, pnl.net.mr,
           pos.mr, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mr

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mr)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mr net.SR.mr gross.PnL.mr
## 1         20     180      120 2 2013-08    9.600187  5.987830         2900
## 2         30     180      120 2 2013-08    7.436080  5.514138         2290
## 3         20      90       60 3 2013-08    5.577259  5.472402          660
## 4         30      90       60 3 2013-08    5.506955  5.383692          700
## 5         15      90      120 2 2013-08    5.560825  5.044037          600
## 6         10      90       60 2 2013-08   11.587949  4.503847         3310
## 7         45     150      120 1 2013-08    8.642115  4.462420         4320
## 8         10     120      120 3 2013-08    4.388698  4.153222          530
## 9         30      60       60 1 2013-08    5.794111  3.998944          790
## 10        45      90       90 1 2013-08    5.232056  3.989137         1460
##    net.PnL.mr
## 1        1700
## 2        1630
## 3         540
## 4         580
## 5         420
## 6        1090
## 7        1980
## 8         470
## 9         490
## 10       1040
print(paste('Mean of net.SR.mr of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mr of 10 top performance combinations is  4.85"
print(paste('Mean of net.PnL.mr of 10 top performance combinations is ',
            round(mean(result[,'net.PnL.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mr of 10 top performance combinations is  994"

For this side, the strategy is also good. All top 10 combinations have positive net SR and net PnL. Then I investigate further the sensitivity using the top combination parameters.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 20 
# and slowEMA = 180


# net.SR.mr
levelplot(net.SR.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# net.PnL.mr
levelplot(net.PnL.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 180),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

From both graphs, we can see the the strategy works well with volatility multiplier = 3. It is also good with volatility multiplier = 2 and volatility memory = 120.

Now, I am checking the same with test data.

# A6C6 is investigated
A6C6 <- currencies_test[,c("A6","C6")]
#Column R (result) is the result of "A6 - C6"
A6C6$R <- A6C6$A6 - A6C6$C6

# Remove the data with high votality, 5 mins before and after the break
A6C6["T18:01/T18:05"] <- NA
A6C6["T16:56/T17:00"] <- NA

#create position filled with 0s
pos_flat <- xts(rep(0, nrow(A6C6)), index(A6C6))

# then adjust so that the specific time is untradeable.
pos_flat["T16:46/T18:15"] <- 1

# add 1s for weekends (Fri, 17:00 - Sun, 18:00)
dweek_ <- wday(A6C6)

# lets create a vector of times in a character format
time_ <- substr(index(A6C6), 12, 19)

# lets use it to define being flat on the weekend
pos_flat[(dweek_ == 6 & times(time_) > times("17:00:00")) |   # end of Friday
           (dweek_ == 7) |                                      # whole Saturday
           (dweek_ == 1 & times(time_) <= times("18:00:00")),] <- 1 # beginning of Sunday

# simple mr strategy: volatility breakout model
# an universal function for position calculation 
# in a basic volatility breakout model
source("function_positionR.R")

summary.all.breakout <- NULL
# run the model for test data with different parameters
for(signalEMA in c(10, 15, 20, 30, 45)) {
  for(slowEMA in c(60, 90, 120, 150, 180)) {
    for(volat.sd in c(60, 90, 120)) {
      for(m_ in c(1, 2, 3)) {
        
        message(paste0("signalEMA = ", signalEMA,
                       ", slowEMA = ", slowEMA,
                       ", volat.sd = ", volat.sd,
                       ", m_ = ", m_)) 
        
        # calculating elements of the strategy
        
        # here calculation on coredata() makes a difference
        # signal
        signalEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                                signalEMA)
        # basis for volatility bands
        slowEMA.values <- EMA(coredata(na.locf(A6C6$R)), 
                              slowEMA)
        # size of volatility bands
        volat.sd.values <- roll_sd(coredata(na.locf(A6C6$R)), 
                                   volat.sd)
        
        # position for mr strategy
        pos.mr <- positionR(signal = signalEMA.values,
                             lower = slowEMA.values - m_ * volat.sd.values,
                             upper = slowEMA.values + m_ * volat.sd.values,
                             pos_flat = coredata(pos_flat),
                             strategy = "mr" # important !!!
        )
        
       
        
        
        # gross pnl
        pnl.gross.mr <- ifelse(is.na(pos.mr * (diff.xts(A6C6$A6) - diff.xts(A6C6$C6))),
                                0, pos.mr * diff.xts(A6C6$A6) * 100000 - pos.mr * diff.xts(A6C6$C6) * 100000
        )
        
        # nr of transactions - the same for mom and mr
        ntrans <- abs(diff.xts(pos.mr))
        ntrans[1] <- 0
        
        # net pnl
        pnl.net.mr <- pnl.gross.mr - ntrans * 2*15
        
        # aggregate pnls and # transactions to daily
        
        # lets find endpoints of days
        ends_ <- endpoints(A6C6, "days")
        
        # aggregating gross pnl 
        pnl.gross.mr.d <- period.apply(pnl.gross.mr, 
                                        INDEX = ends_, 
                                        FUN = function(x) sum(x, na.rm = TRUE))
        # aggregating net pnl 
        pnl.net.mr.d <- period.apply(pnl.net.mr, 
                                      INDEX = ends_,
                                      FUN = function(x) sum(x, na.rm = TRUE))
        
        # calculate summary measures
        gross.SR.mr <- mySR(pnl.gross.mr.d, scale = 252)
        net.SR.mr <- mySR(pnl.net.mr.d, scale = 252)
        gross.PnL.mr <- sum(pnl.gross.mr.d, na.rm = T)
        net.PnL.mr <- sum(pnl.net.mr.d, na.rm = T)
        
        # summary of a particular strategy
        summary_ <- data.frame(signalEMA = signalEMA,
                               slowEMA = slowEMA,
                               volat.sd = volat.sd,
                               m = m_,
                               period = "2013-08",
                               gross.SR.mr,
                               net.SR.mr,
                               gross.PnL.mr,
                               net.PnL.mr,
                               stringsAsFactors = FALSE
        )
        
        # putting all summaries together
        if(!exists("summary.all.breakout")) summary.all.breakout <- summary_ else
          summary.all.breakout <- rbind(summary.all.breakout, summary_)
        
        # deleting working files not needed any more
        rm(gross.SR.mr, net.SR.mr, gross.PnL.mr, net.PnL.mr, 
           pnl.gross.mr.d, pnl.net.mr.d, 
           pnl.gross.mr, pnl.net.mr,
           pos.mr, ends_, summary_,
           signalEMA.values, slowEMA.values, volat.sd.values
        )
        
      } # end of loop for m_
    } # end of loop for volatility  
  } # end of loop for slowEMA
} # end of loop for signal
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 10, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 15, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 20, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 30, slowEMA = 180, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 60, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 90, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 120, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 150, volat.sd = 120, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 60, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 90, m_ = 3
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 1
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 2
## signalEMA = 45, slowEMA = 180, volat.sd = 120, m_ = 3
# lets order strategies according to decreasing net.SR.mr

result <- summary.all.breakout %>% 
  arrange(desc(net.SR.mr)) %>% 
  head(10)
print(result)
##    signalEMA slowEMA volat.sd m  period gross.SR.mr net.SR.mr gross.PnL.mr
## 1         20     150       60 3 2013-08    6.906330  4.480281         2540
## 2         10     120       90 3 2013-08    4.098780  4.098780          140
## 3         15      60       60 2 2013-08    4.098780  4.098780           70
## 4         20      90       60 3 2013-08    4.098780  4.098780           80
## 5         30      90       60 3 2013-08    4.098780  4.098780           80
## 6         45     120       60 2 2013-08    5.062933  2.993028         2030
## 7         10     150       60 3 2013-08    6.591783  2.978896         2040
## 8         30     150       60 3 2013-08    4.812821  2.593958         1900
## 9         45     150       60 3 2013-08    3.877769  2.109604         1100
## 10        15     150       60 3 2013-08    5.578855  2.056185         1610
##    net.PnL.mr
## 1        1520
## 2          80
## 3          10
## 4          20
## 5          20
## 6        1070
## 7         780
## 8         940
## 9         560
## 10        530
print(paste('Mean of net.SR.mr of 10 top performance combinations is ',
            round(mean(result[,'net.SR.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.SR.mr of 10 top performance combinations is  3.36"
print(paste('Mean of net.PnL.mr of 10 top performance combinations is ',
            round(mean(result[,'net.PnL.mr'],na.rm = TRUE),2)))
## [1] "Mean of net.PnL.mr of 10 top performance combinations is  553"

The result of test data is also good, but it is not as good as the train data when focusing on the average of the top 10 combinations.

I am checking the sensitivity of the top combination parameters.

# lets do some sensitivity analysis with the use 
# of the heatmap graph for best signalEMA = 20 
# and slowEMA = 150


# net.SR.mr
levelplot(net.SR.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Sharpe ratio",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

# net.PnL.mr
levelplot(net.PnL.mr ~ as.factor(m) * as.factor(volat.sd), # formula
          data = summary.all.breakout %>% 
            dplyr::filter(signalEMA == 20, 
                          slowEMA == 150),
          xlab = "volatility multiplier",
          ylab = "volatility memory",
          main = "net Profit and Loss",
          # we create a color palette from red to green (by white)
          col.regions = colorRampPalette(c("red", "white", "green"))
          )

From the 2 graphs, it seems that only one scenario is good for the net SR and net profit, which is volatility multiplier = 3 and volatility memory = 60.