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:
signalEMA (or signalSMA) - c(3, 6, 9, 12, 15)
slowEMA (or slowSMA) - c(45, 90, 135, 180, 225, 270)
volat.sd - c(60, 120, 180)
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:
volatility memory = 90, volatility multiplier = 2
volatility memory = 90, volatility multiplier = 3
volatility memory = 60, volatility multiplier = 3
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.