Theme Song



FRA : Elle me dit

CHN : 她对我说

ENG : She told me

JPN : 彼女は私に言う

GRE : Μου λέει

SPN : Ella me dijo

GER : Sie sagte mir

ITA : Lei mi dice

KRO : 그녀는 나에게 말한다


FRA : écris une chanson contente

CHN : 写一首欢快的歌

ENG : Write a happy song

JPN : 幸せな歌を書く

GRE : Γράψτε ένα χαρούμενο τραγούδι

SPN : Escribe una canción alegre

GER : Schreibe ein fröhliches Lied

ITA : Scrivi una canzone allegra

KRO : 쾌활한 노래 쓰기


FRA : Pas une chanson déprimante

CHN : 而不是悲伤的歌

ENG : Not a depressing song

JPN : 気のめいるような歌ではない

GRE : Όχι θλιβερό τραγούδι

SPN : No es una canción triste

GER : Kein trauriges Lied

ITA : Canzone non triste

KRO : 슬픈 노래가 아님


FRA : Une chanson que tout le monde aime

CHN : 一首让所有人都喜欢的歌

ENG : A song that everyone loves

JPN : みんなが大好きな曲

GRE : Ένα τραγούδι που αρέσει σε όλους

SPN : Una cancion que a todos les gusta

GER : Ein Lied, das jeder mag

ITA : Una canzone che piace a tutti

KRO : 모두가 좋아하는 노래


FRA : Elle me dit

CHN : 她对我说

ENG : She told me

JPN : 彼女は私に言う

GRE : Μου λέει

SPN : Ella me dijo

GER : Sie sagte mir

ITA : Lei mi dice

KRO : 그녀는 나에게 말한다


FRA : Tu deviendras milliardaire

CHN : 你将成为亿万富翁

ENG : You will become a millionaire

JPN : あなたは億万長者になります

GRE : Θα γίνετε δισεκατομμυριούχος

SPN : Te convertirás en multimillonario

GER : Sie werden Milliardär

ITA : Diventerai un miliardario

KRO : 당신은 억만 장자가 될 것입니다


FRA : Tu auras de quoi être fier

CHN : 你将为此感到骄傲

ENG : You will be proud

JPN : あなたは誇りに思うでしょう

GRE : Θα είσαι περήφανος για αυτό

SPN : Estarás orgulloso de ello

GER : Sie werden stolz darauf sein

ITA : Ne sarai orgoglioso/span>

KRO : 당신은 그것을 자랑스러워 할 것입니다



1 Introduction

Due to below issues from Deriv.com - Interday High Frequency Trading Models Comparison Blooper, here I review the research by using same dataset as we can know from below Part I.

Here I use the βest model (ETS MNZ & MNZ) from above study but adjust the data size as we can know from next section.

The purpose of adjust the data size to be intraday :

  • compare if improve the accuracy.
  • easier the workload for other models comparison (use minimum data size to get optimal model).

Load Packages

if(!suppressPackageStartupMessages(require('BBmisc'))) {
  install.packages('BBmisc', dependencies = TRUE, INSTALL_opts = '--no-lock')
}
suppressPackageStartupMessages(require('BBmisc'))
# suppressPackageStartupMessages(require('rmsfuns'))

pkgs <- c('devtools', 'knitr', 'kableExtra', 'tint', 'furrr', 'tidyr', 
          'devtools','readr', 'lubridate', 'data.table', 'reprex', 
          'feather', 'purrr', 'quantmod', 'tidyquant', 'tibbletime', 
          'timetk', 'plyr', 'dplyr', 'stringr', 'magrittr', 'tdplyr', 
          'tidyverse', 'memoise', 'htmltools', 'formattable', 'dtplyr', 
          'zoo', 'forecast', 'seasonal', 'seasonalview', 'rjson', 
          'rugarch', 'rmgarch', 'mfGARCH', 'sparklyr', 'jcolors', 
          'microbenchmark', 'dendextend', 'lhmetools', 'ggthemr', 
          'stringr', 'pacman', 'profmem', 'ggthemes', 'flyingfox', 
          'htmltools', 'echarts4r', 'viridis', 'hrbrthemes', 'gtools', 
          'fable', 'fabletools', 'Rfast', 'Metrics', 'MLmetrics')

suppressAll(lib(pkgs))
# load_pkg(pkgs)

.dtr <- 'C:/Users/User/Documents/GitHub/binary.com-interview-question-data/'

## Set the timezone but not change the datetime
Sys.setenv(TZ = 'Asia/Tokyo')
## options(knitr.table.format = 'html') will set all kableExtra tables to be 'html', otherwise need to set the parameter on every single table.
options(warn = -1, knitr.table.format = 'html')#, digits.secs = 6)

## https://stackoverflow.com/questions/39417003/long-vectors-not-supported-yet-abnor-in-rmd-but-not-in-r-script
knitr::opts_chunk$set(warning = FALSE, #cache = TRUE, 
                      message = FALSE, cache.lazy = FALSE)

rm(pkgs)

2 Data

2.1 Read Data

## check if data path set
if(!exists('dtr')) {
  dtr <- 'C:/Users/User/Documents/GitHub/binary.com-interview-question-data/'}

## save files if not exists
if(!file.exists(paste0(dtr, 'data/fx/USDJPY/dsmp.rds')) & exists('dsmp')) {
  saveRDS(dsmp, paste0(dtr, 'data/fx/USDJPY/dsmp.rds'))}

## read files if not exists
if(!exists('dsmp')) {
  dsmp <- readRDS(paste0(dtr, 'data/fx/USDJPY/dsmp.rds'))}
## plot sample data
dsmp[c(1:3, (nrow(dsmp)-3):nrow(dsmp)),] %>% 
  kbl(caption = '1 min Close Price Dataset', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  ## https://public.tableau.com/en-us/gallery/100-color-palettes?gallery=votd
  row_spec(0, background = 'DimGrey', color = 'gold', bold = TRUE) %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'Gray') %>% 
  column_spec(3, background = 'DarkGrey') %>% 
  column_spec(4, background = 'Gray') %>% 
  column_spec(5, background = 'DarkGrey') %>% 
  column_spec(6, background = '#4897D8') %>% 
  column_spec(7, background = '#556DAC') %>% 
  column_spec(8, background = '#92AAC7') %>% 
  column_spec(9, background = '#556DAC') %>% 
  column_spec(10, background = '#375E97') %>% 
  column_spec(11, background = 'CornflowerBlue') %>% 
  column_spec(12, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')
1 min Close Price Dataset
index year quarter month week wkdays wk_1m dy_1m hr_1m sq date close
2015-01-05 00:01:00 2015 1 1 1 Monday 1 1 1 1 2015-01-05 120.5740
2015-01-05 00:02:00 2015 1 1 1 Monday 2 2 2 2 2015-01-05 120.5900
2015-01-05 00:03:00 2015 1 1 1 Monday 3 3 3 3 2015-01-05 120.6035
2018-07-06 23:57:00 2018 3 7 27 Friday 7197 1437 57 1324797 2018-07-06 110.4635
2018-07-06 23:58:00 2018 3 7 27 Friday 7198 1438 58 1324798 2018-07-06 110.4740
2018-07-06 23:59:00 2018 3 7 27 Friday 7199 1439 59 1324799 2018-07-06 110.4740
2018-07-07 00:00:00 2018 3 7 27 Saturday 7200 1440 60 1324800 2018-07-07 110.4740

source : 1324800 x 12

From above table, we can know the dataset gather from 2015-01-05 to 2018-07-07 which is used in Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I).

3 ETS Modelling

3.1 Seasonal Data Modeling

Here I start my 1st forecast date from 1st trading datetime of 2016 (2016-01-04 which is 2nd year in dataset) which is used in Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I).

The default data size 7200 to forecast 1440 as we can know that’s the optimal volume of observation data as we know from Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I) to compare with below seasonality.

3.2 Daily Seasonal Data

3.2.1 Modelling

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 1440 minutes (1440 minutes is a trading day).

Refer to above function or load below r function.

3.2.2 Dy >> Dy

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 1440 mins (24 hrs * 60 mins = 1440 mins is a trading day).

tseas <- function(timeID, data = dsmp, data_len, 
                  hrz1 = c(1440, 7200), hrz2 = 1440, .model) {
  
  if(hrz1 == 1440) {
    
    tmp <- llply(1:length(timeID), function(i) {
      if(i == 1) {
        
        cat('\n===========================================\n')
        cat('train[', i, ']\n')
        print(train <- dsmp[date < timeID[i]][(.N - (data_len - 1)):.N])
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        cat('\n-------------------------------------------\n')
        cat('train_test[', i, ']\n')
        print(train_test <- dsmp[sq %in% ctr])
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        cat('\n-------------------------------------------\n')
        cat('forecast[', i, ']\n')
        print(sets %>% as.data.table)
        
        fl_pth <- paste0(.dtr, 'data/fx/USDJPY/ts_ets_', data_len, 
                         '_', hrz1, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '=', paste0('~/data/fx/USDJPY/ts_ets_', .model, '_', 
                                 data_len, '_', hrz1, '.', 
                                 as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
        
      } else if(i %in% seq(1, length(timeID), by = 6)[-1]) {
        
        
      } else if(i == length(timeID)) {
        
        
      } else  {
        
        lst_sq <- dsmp[date < timeID[i],][.N]$sq + 1
        
        cat('\n===========================================\n')
        cat('train[', i, ']\n')
        print(train <- dsmp[(lst_sq - data_len + 1):lst_sq])
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        cat('\n-------------------------------------------\n')
        cat('train_test[', i, ']\n')
        print(train_test <- dsmp[sq %in% ctr])
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        cat('\n-------------------------------------------\n')
        cat('forecast[', i, ']\n')
        print(sets %>% as.data.table)
        
        fl_pth <- paste0(.dtr, 'data/fx/USDJPY/ts_ets_', data_len, 
                         '_', hrz1, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '=', paste0('~/data/fx/USDJPY/ts_ets_', .model, '_', 
                                 data_len, '_', hrz1, '.', 
                                 as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
      }
    })
  } else if(hrz1 == 7200) {
    
    tmp <- llply(1:length(timeID), function(i) {
      
      if(i == 1) {
        
        cat('\n===========================================\n')
        cat('train[', i, ']\n')
        print(train <- dsmp[date < timeID[i]][(.N - (data_len - 1)):.N])
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        cat('\n-------------------------------------------\n')
        cat('train_test[', i, ']\n')
        print(train_test <- dsmp[sq %in% ctr])
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        cat('\n-------------------------------------------\n')
        cat('forecast[', i, ']\n')
        print(sets %>% as.data.table)

        fl_pth <- paste0(.dtr, 'data/fx/USDJPY/ts_ets_', data_len, 
                         '_', hrz1, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '=', paste0('~/data/fx/USDJPY/ts_ets_', .model, '_', 
                                 data_len, '_', hrz1, '.', 
                                 as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
        
      } else if(i > (length(timeID) - hrz1/hrz2) & i != length(timeID)) {
        
        lst_sq <- dsmp[date < timeID[i],][.N]$sq + 1
        ## filter the length of forecasted data to fit with train_test data 
        ##   when the length of forecasted data more then length of test data.
        #lst_date <- timeID[(length(timeID) - (hrz1/hrz2)):length(timeID)]
        lst_date <- timeID[timeID >= timeID[i]]
        lst_date_sq <- grep(
          timeID[i], timeID[
            (length(timeID) - (hrz1/hrz2 - 1)):length(timeID)])
        
        cat('\n===========================================\n')
        cat('train[', i, ']\n')
        print(train <- dsmp[(lst_sq - data_len + 1):lst_sq])
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        cat('\n-------------------------------------------\n')
        cat('train_test[', i, ']\n')
        print(train_test <- dsmp[sq %in% ctr])
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl
        
        sets <- sets[1:(hrz1 - (hrz2 * lst_date_sq)),] %>% 
          dplyr::mutate(index = train_test[
            (.N - (hrz1 - (hrz2 * lst_date_sq)) + 1):.N, ]$index, 
            mk.price = train_test[
              (.N - (hrz1 - (hrz2 * lst_date_sq)) + 1):.N, ]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        cat('\n-------------------------------------------\n')
        cat('forecast[', i, ']\n')
        print(sets %>% as.data.table)
        
        fl_pth <- paste0(.dtr, 'data/fx/USDJPY/ts_ets_', data_len, 
                         '_', hrz1, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '=', paste0('~/data/fx/USDJPY/ts_ets_', .model, '_', 
                                 data_len, '_', hrz1, '.', 
                                 as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
        
      } else if(i %in% seq(1, length(timeID), by = 6)[-1]) {
        
        
      } else if(i == length(timeID)) {
        
        
      } else {
        
        lst_sq <- dsmp[date < timeID[i],][.N]$sq + 1
        
        cat('\n===========================================\n')
        cat('train[', i, ']\n')
        print(train <- dsmp[(lst_sq - data_len + 1):lst_sq])
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        cat('\n-------------------------------------------\n')
        cat('train_test[', i, ']\n')
        print(train_test <- dsmp[sq %in% ctr])
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        cat('\n-------------------------------------------\n')
        cat('forecast[', i, ']\n')
        print(sets %>% as.data.table)
        
        fl_pth <- paste0(.dtr, 'data/fx/USDJPY/ts_ets_', data_len, 
                         '_', hrz1, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '=', paste0('~/data/fx/USDJPY/ts_ets_', .model, '_', 
                                 data_len, '_', hrz1, '.', 
                                 as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
      }
    })
    
  } else {
    
    
  }
  return(tmp)
}
intra_1440 <- function(timeID, data = dsmp, data_len, 
                          hrz1 = 60, .model, vb = TRUE) {
  ## data_len 1440; hrz1 = 60
  intr <- data_len/hrz1
  
  tmp <- llply(1:length(timeID), function(i) {
    if(i == 1) {
      
      tmp2 <-llply(1:intr, function(j) {
        
        if(j == 1) {
          train <- dsmp[date < timeID[i]][(.N - (data_len - 1)):.N]
        } else  {
          
          lst_sq <- dsmp[date < timeID[i]][(.N - (hrz1 * (intr - j + 1) - 1))]$sq
          train <- dsmp[lst_sq:(lst_sq + data_len - 1)]
        }
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        if(vb == TRUE) {
          cat('\n===========================================\n')
          cat('train[', i, '-', j, ']\n')
          print(train)
        }
        
        train_test <- dsmp[sq %in% ctr]
        if(vb == TRUE) {
          cat('\n-------------------------------------------\n')
          cat('train_test[', i, '-', j, ']\n')
          print(train_test)
        }
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        if(vb == TRUE) {
          cat('\n-------------------------------------------\n')
          cat('forecast[', i, '-', j, ']\n')
          print(sets %>% as.data.table)
        }
        
        fl_pth <- paste0(
          .dtr, 'data/fx/USDJPY/intraday/ts_ets_', .model, '_', data_len, 
          '_', hrz1, '.p', j, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '-', j, '=', 
            paste0('~/data/fx/USDJPY/intraday/ts_ets_', .model, '_', 
                   data_len, '_', hrz1, '.p', j, '.', 
                   as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
      })
      return(tmp2)
      
    } else if(i %in% seq(1, length(timeID), by = 6)[-1]) {
      
      
    } else if(i == length(timeID)) {
      
      
    } else  {
      
      tmp2 <-llply(1:intr, function(j) {
        
        if(j == 1) {
          lst_sq <- dsmp[date < timeID[i],][.N]$sq + 1
          
        } else {
          lst_sq <- dsmp[date < timeID[i],][.N]$sq + 1 + hrz1 * (j - 1)
        }
        
        train <- dsmp[(lst_sq - data_len + 1):lst_sq]
        ctr <- train$sq[1]:(range(train$sq)[2] + hrz1)
        
        if(vb == TRUE) {
          cat('\n===========================================\n')
          cat('train[', i, '-', j, ']\n')
          print(train)
        }
        
        train_test <- dsmp[sq %in% ctr]
        if(vb == TRUE) {
          cat('\n-------------------------------------------\n')
          cat('train_test[', i, '-', j, ']\n')
          print(train_test)
        }
        
        sets <- train[, .(index, close)] %>% 
          as_tibble %>% 
          tk_ts(frequency = hrz1) %>% 
          ets(model = .model) %>% 
          forecast(h = hrz1) %>% 
          tk_tbl %>% 
          dplyr::mutate(index = train_test[(.N - hrz1 + 1):.N,]$index, 
                        mk.price = train_test[(.N - hrz1 + 1):.N,]$close) %>% 
          dplyr::rename(fc.price = `Point Forecast`) %>% 
          dplyr::select(index, mk.price, fc.price)
        
        if(vb == TRUE) {
          cat('\n-------------------------------------------\n')
          cat('forecast[', i, '-', j, ']\n')
          print(sets %>% as.data.table)
        }
        
        fl_pth <- paste0(
          .dtr, 'data/fx/USDJPY/intraday/ts_ets_', .model, '_', data_len, 
          '_', hrz1, '.p', j, '.', as_date(sets$index[1]), '.rds')
        saveRDS(sets, fl_pth)
        
        cat('\n', i, '-', j, '=', 
            paste0('~/data/fx/USDJPY/intraday/ts_ets_', .model, '_', 
                   data_len, '_', hrz1, '.p', j, '.', 
                   as_date(sets$index[1]), '.rds saved!'))
        cat('\n\n')
        rm(sets)
      })
      return(tmp2)
    }
  })
  return(tmp)
}
# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/tseas.R')
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 1440
hrz2 <- 1440

llply(ets.m, function(md) {
  tseas(timeID = timeID, dsmp, 
        data_len = data_len, hrz1 = hrz1, 
        hrz2 = hrz2, .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/'), pattern = '^ts_ets_MNN_1440_1440.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 1440)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 1440)
index mk.price fc.price
1 2016-01-04 00:01:00 120.2200 120.208
2 2016-01-04 00:02:00 120.2200 120.208
3 2016-01-04 00:03:00 120.2200 120.208
1438 2016-01-04 23:58:00 119.4535 120.208
1439 2016-01-04 23:59:00 119.4450 120.208
1440 2016-01-05 00:00:00 119.4530 120.208

source : 1440 x 3

3.2.3 Dy >> 12Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 720 mins (12 hrs * 60 mins = 720 mins is half trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 720

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_720.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 720)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 720)
index mk.price fc.price
1 2016-01-04 00:01:00 120.2200 120.208
2 2016-01-04 00:02:00 120.2200 120.208
3 2016-01-04 00:03:00 120.2200 120.208
718 2016-01-04 11:58:00 118.9050 120.208
719 2016-01-04 11:59:00 118.8765 120.208
720 2016-01-04 12:00:00 118.8800 120.208

source : 720 x 3

3.2.4 Dy >> 8Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 480 mins (8 hrs * 60 mins = 480 mins is 8 hours in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 480

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_480.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 480)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 480)
index mk.price fc.price
1 2016-01-04 00:01:00 120.2200 120.208
2 2016-01-04 00:02:00 120.2200 120.208
3 2016-01-04 00:03:00 120.2200 120.208
478 2016-01-04 07:58:00 119.3670 120.208
479 2016-01-04 07:59:00 119.3810 120.208
480 2016-01-04 08:00:00 119.3885 120.208

source : 480 x 3

3.2.5 Dy >> 6Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 360 mins (6 hrs * 60 mins = 360 mins is 6 hours in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 360

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_360.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 360)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 360)
index mk.price fc.price
1 2017-06-09 06:01:00 110.2445 110.237
2 2017-06-09 06:02:00 110.2605 110.237
3 2017-06-09 06:03:00 110.2620 110.237
358 2017-06-09 11:58:00 110.3850 110.237
359 2017-06-09 11:59:00 110.3775 110.237
360 2017-06-09 12:00:00 110.3790 110.237

source : 360 x 3

3.2.6 Dy >> 4Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 240 mins (4 hrs * 60 mins = 240 mins is 4 hours in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 240

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_240.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 240)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 240)
index mk.price fc.price
1 2016-01-04 00:01:00 120.2200 120.208
2 2016-01-04 00:02:00 120.2200 120.208
3 2016-01-04 00:03:00 120.2200 120.208
238 2016-01-04 03:58:00 120.0205 120.208
239 2016-01-04 03:59:00 120.0300 120.208
240 2016-01-04 04:00:00 119.9450 120.208

source : 240 x 3

3.2.7 Dy >> 3Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 180 mins (3 hrs * 60 mins = 180 mins is 3 hours in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 180

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_180.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 180)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 180)
index mk.price fc.price
1 2018-03-30 03:01:00 106.4765 106.4817
2 2018-03-30 03:02:00 106.4880 106.4817
3 2018-03-30 03:03:00 106.4820 106.4817
178 2018-03-30 05:58:00 106.2140 106.4817
179 2018-03-30 05:59:00 106.2130 106.4817
180 2018-03-30 06:00:00 106.2320 106.4817

source : 180 x 3

3.2.8 Dy >> 2Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 120 mins (2 hrs * 60 mins = 120 mins is 2 hours in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 120

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_120.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 120)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 120)
index mk.price fc.price
1 2016-08-29 20:01:00 102.1715 102.1637
2 2016-08-29 20:02:00 102.1675 102.1637
3 2016-08-29 20:03:00 102.1465 102.1637
118 2016-08-29 21:58:00 101.9625 102.1637
119 2016-08-29 21:59:00 101.9695 102.1637
120 2016-08-29 22:00:00 101.9745 102.1637

source : 120 x 3

3.2.9 Dy >> 1Hr

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 60 mins (1 hr * 60 mins = 60 mins is 1 hour in a trading day).

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 60

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_60.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 60)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 60)
index mk.price fc.price
1 2018-02-07 00:01:00 109.5340 109.5435
2 2018-02-07 00:02:00 109.5650 109.5435
3 2018-02-07 00:03:00 109.5570 109.5435
58 2018-02-07 00:58:00 109.6780 109.5435
59 2018-02-07 00:59:00 109.7050 109.5435
60 2018-02-07 01:00:00 109.6945 109.5435

source : 60 x 3

3.2.10 Dy >> 30mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 30 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 30

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_30.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 30)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 30)
index mk.price fc.price
1 2017-01-26 00:01:00 113.2650 113.261
2 2017-01-26 00:02:00 113.2620 113.261
3 2017-01-26 00:03:00 113.2795 113.261
28 2017-01-26 00:28:00 113.3025 113.261
29 2017-01-26 00:29:00 113.2880 113.261
30 2017-01-26 00:30:00 113.2870 113.261

source : 30 x 3

3.2.11 Dy >> 20mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 20 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 20

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_20.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 20)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 20)
index mk.price fc.price
1 2018-04-12 03:01:00 106.8290 106.8198
2 2018-04-12 03:02:00 106.8085 106.8198
3 2018-04-12 03:03:00 106.8085 106.8198
18 2018-04-12 03:18:00 106.7110 106.8198
19 2018-04-12 03:19:00 106.7040 106.8198
20 2018-04-12 03:20:00 106.7260 106.8198

source : 20 x 3

3.2.12 Dy >> 15mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 15 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 15

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_15.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 15)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 15)
index mk.price fc.price
1 2016-06-15 02:16:00 106.0410 106.0411
2 2016-06-15 02:17:00 106.0240 106.0411
3 2016-06-15 02:18:00 106.0060 106.0411
13 2016-06-15 02:28:00 106.0210 106.0411
14 2016-06-15 02:29:00 106.0120 106.0411
15 2016-06-15 02:30:00 106.0205 106.0411

source : 15 x 3

3.2.13 Dy >> 10mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 10 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 10

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_10.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 10)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 10)
index mk.price fc.price
1 2018-04-18 03:11:00 107.0615 107.0543
2 2018-04-18 03:12:00 107.0755 107.0543
3 2018-04-18 03:13:00 107.0855 107.0543
8 2018-04-18 03:18:00 107.1230 107.0543
9 2018-04-18 03:19:00 107.1195 107.0543
10 2018-04-18 03:20:00 107.1275 107.0543

source : 10 x 3

3.2.14 Dy >> 8mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 8 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 8

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_8.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 8)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 8)
index mk.price fc.price
1 2016-05-04 13:13:00 106.8070 106.8169
2 2016-05-04 13:14:00 106.8020 106.8169
3 2016-05-04 13:15:00 106.7955 106.8169
6 2016-05-04 13:18:00 106.7970 106.8169
7 2016-05-04 13:19:00 106.8155 106.8169
8 2016-05-04 13:20:00 106.7935 106.8169

source : 8 x 3

3.2.15 Dy >> 6mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 6 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 6

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_6.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 6)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 6)
index mk.price fc.price
2016-02-01 00:01:00 121.2675 121.129
2016-02-01 00:02:00 121.2360 121.129
2016-02-01 00:03:00 121.2585 121.129
2016-02-01 00:04:00 121.2880 121.129
2016-02-01 00:05:00 121.2500 121.129
2016-02-01 00:06:00 121.2455 121.129

source : 6 x 3

3.2.16 Dy >> 5mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 5 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 5

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_5.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 5)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.2.17 Dy >> 4mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 4 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 4

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_4.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 4)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.2.18 Dy >> 3mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 3 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 3

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_3.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 3)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.2.19 Dy >> 2mins

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 2 mins in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 2

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_2.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 2)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.2.20 Dy >> 1min

I set the length of data as Daily (1440 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_1440.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1440
hrz1 <- 1

llply(ets.m, function(md) {
  intra_1440(timeID = timeID, dsmp, 
             data_len = data_len, hrz1 = hrz1, 
             .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1440_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1440 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 1440 forecast 1)
index mk.price fc.price
2016-01-04 00:01:00 120.220 120.2080
2016-01-05 00:01:00 119.449 119.4530
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4770
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:01:00 117.182 117.2420

source : 6 x 3

3.3 Weekly Seasonal Data

3.3.1 Wk >> 12Hr

I set the length of data as Daily (5 days * 1440 mins = 7200 mins which is 5 trading days) to forecast 720 mins (12 hrs * 60 mins = 720 mins is half trading day).

# --------- eval=FALSE ---------
## set all models provided by ets function.
if(!exists('ets.m')) ets.m <- 'MNN'
if(!exists('intra_7200')) source('function/intra_7200.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 7200
hrz1 <- 720

llply(ets.m, function(md) {
  intra_7200(timeID = timeID, dsmp, 
        data_len = data_len, hrz1 = hrz1, 
        .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_7200_720.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 7200 forecast 720)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 7200 forecast 720)
index mk.price fc.price
1 2016-08-26 00:01:00 100.5295 100.5295
2 2016-08-26 00:02:00 100.5295 100.5295
3 2016-08-26 00:03:00 100.5295 100.5295
718 2016-08-26 11:58:00 100.4645 100.5295
719 2016-08-26 11:59:00 100.4720 100.5295
720 2016-08-26 12:00:00 100.4685 100.5295

source : 720 x 3

3.3.2 Wk >> 6Hr

I set the length of data as Daily (5 days * 1440 mins = 7200 mins which is 5 trading days) to forecast 360 mins (6 hrs * 60 mins = 360 mins is half trading day).

# --------- eval=FALSE ---------
## set all models provided by ets function.
if(!exists('ets.m')) ets.m <- 'MNN'
if(!exists('intra_7200')) source('function/intra_7200.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 7200
hrz1 <- 360

llply(ets.m, function(md) {
  intra_7200(timeID = timeID, dsmp, 
        data_len = data_len, hrz1 = hrz1, 
        .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_7200_360.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 7200 forecast 360)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.3.3 Wk >> 3Hr

I set the length of data as Daily (5 days * 1440 mins = 7200 mins which is 5 trading days) to forecast 180 mins (3 hrs * 60 mins = 180 mins is half trading day).

# --------- eval=FALSE ---------
## set all models provided by ets function.
if(!exists('ets.m')) ets.m <- 'MNN'
if(!exists('intra_7200')) source('function/intra_7200.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 7200
hrz1 <- 180

llply(ets.m, function(md) {
  intra_7200(timeID = timeID, dsmp, 
        data_len = data_len, hrz1 = hrz1, 
        .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_7200_180.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 7200 forecast 180)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.3.4 Wk >> 1Hr

I set the length of data as Daily (5 days * 1440 mins = 7200 mins which is 5 trading days) to forecast 60 mins (3 hrs * 60 mins = 60 mins is half trading day).

# --------- eval=FALSE ---------
## set all models provided by ets function.
if(!exists('ets.m')) ets.m <- 'MNN'
if(!exists('intra_7200')) source('function/intra_7200.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 7200
hrz1 <- 60

llply(ets.m, function(md) {
  intra_7200(timeID = timeID, dsmp, 
        data_len = data_len, hrz1 = hrz1, 
        .model = md)
  })
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_7200_60.p_[0-9]{0,}.[0-9]{4}')[1]

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))
  
  data.frame(smp)[
    c(1:3, (nrow(smp)-2):nrow(smp)),] %>% 
    kbl(caption = 'Data Sample (ETS MNN 7200 forecast 60)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = 'CornflowerBlue') %>% 
    column_spec(2, background = '#556DAC') %>% 
    #column_spec(3, background = 'LightSlateGrey') %>% 
    #column_spec(3, background = '#556DAC') %>% 
    column_spec(3, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.4 Intraday Seasonal Data

3.4.1 20Hr >> 1min

I set the length of data as Daily (1200 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1200
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1200_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
  })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1200 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.4.2 18Hr >> 1min

I set the length of data as Daily (1080 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 1080
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1080_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
  })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 1080 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

3.4.3 16Hr >> 1min

I set the length of data as Daily (960 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 960
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_960_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
  })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 960 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 960 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4530
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4769
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:02:00 117.183 117.1844

3.4.4 14Hr >> 1min

I set the length of data as Daily (840 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 840
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_840_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 840 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 840 forecast 1)
index mk.price fc.price
2016-02-01 00:01:00 121.2675 121.1290
2016-02-02 00:01:00 121.0180 121.0090
2016-02-03 00:01:00 119.9710 119.9625
2016-02-04 00:01:00 117.8940 117.8950
2016-02-05 00:01:00 116.7770 116.7750
2016-02-08 00:02:00 116.8525 116.8475

3.4.5 12Hr >> 1min

I set the length of data as Daily (720 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 720
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_720_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 720 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 720 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4530
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4768
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:02:00 117.183 117.1843

3.4.6 10Hr >> 1min

I set the length of data as Daily (600 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 600
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_600_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 600 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 600 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4530
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4770
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:02:00 117.183 117.1841

3.4.7 8Hr >> 1min

I set the length of data as Daily (480 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 480
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_480_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

smp <- ldply(fl, function(x) {
  readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
  })

smp %>% 
  kbl(caption = 'Data Sample (ETS MNN 480 forecast 1)', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
  column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Data Sample (ETS MNN 480 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4530
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4769
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:02:00 117.183 117.1872

source : 6 x 3

3.4.8 6Hr >> 1min

I set the length of data as Daily (360 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 360
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_360_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

smp <- ldply(fl, function(x) {
  readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
  })

smp %>% 
  kbl(caption = 'Data Sample (ETS MNN 360 forecast 1)', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
  column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Data Sample (ETS MNN 360 forecast 1)
index mk.price fc.price
2016-01-04 00:01:00 120.220 120.2080
2016-01-05 00:01:00 119.449 119.4528
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4766
2016-01-08 00:01:00 117.665 117.6656
2016-01-11 00:01:00 117.182 117.2420

source : 6 x 3

3.4.9 4Hr >> 1min

I set the length of data as Daily (240 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 240
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_240_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 240 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 240 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4528
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4763
2016-01-08 00:01:00 117.665 117.6655
2016-01-11 00:02:00 117.183 117.1820

source : 6 x 3

3.4.10 3Hr >> 1min

I set the length of data as Daily (180 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 180
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_180_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 180 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}
Data Sample (ETS MNN 180 forecast 1)
index mk.price fc.price
2016-01-04 00:02:00 120.220 120.2104
2016-01-05 00:01:00 119.449 119.4527
2016-01-06 00:01:00 119.061 119.0605
2016-01-07 00:01:00 118.477 118.4760
2016-01-08 00:01:00 117.665 117.6656
2016-01-11 00:02:00 117.183 117.1820

source : 6 x 3

3.4.11 2Hr >> 1min

I set the length of data as Daily (120 mins which is 1 trading days) to forecast 1 min in advance.

# --------- eval=FALSE ---------
ets.m <- 'MNN'
source('function/intra_min.R')

timeID <- unique(dsmp$date)
bse <- dsmp[year == 2016]$date[1] #"2016-01-04" #1st trading date in 2nd year
timeID %<>% .[. >= bse]
#timeID %<>% .[. >= as_date('2016-01-04')]
data_len <- 120
hrz1 <- 1

llply(ets.m, function(md) {
  intra_min(timeID = timeID, dsmp, 
            data_len = data_len, hrz1 = hrz1, 
            .model = md)
  })
#```{r, warning = FALSE, message = FALSE, results = 'asis'}
fl <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_120_1.p_[0-9]{0,}.[0-9]{4}')[1:6]
#smp <- readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', fl))

if(all(is.na(fl))){
  smp <- NA

} else {
  smp <- ldply(fl, function(x) {
    readRDS(paste0(.dtr, 'data/fx/USDJPY/intraday/', x))
    })
  
  smp %>% 
    kbl(caption = 'Data Sample (ETS MNN 120 forecast 1)', escape = FALSE) %>% 
    row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
    column_spec(1, background = '#556DAC') %>% 
    column_spec(2, background = 'Gainsboro', color = 'goldenrod') %>% 
    column_spec(3, background = 'LightGray', color = 'goldenrod') %>% 
    kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
    kable_material(full_width = FALSE) %>% 
    scroll_box(width = '100%', fixed_thead = TRUE)
}

4 Comparison

4.1 1st Stage

4.1.1 Read Models

4.1.1.1 Grouped Models

Here I read the saved models. As some have mentioned a possible way is using git interactive staging. This is great when you have files with different extensions

$ git add -A
$ git status

Source : git add -A和 git add . git add -u的区别

$ git add -i
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now>

If you press 2 then enter you will get a list of available files to be added:

What now> 2
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

Now you just have to insert the number of the files you want to add, so if we wanted to add TODO and index.html we would type 1,2

Update>> 1,2
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

You see the * before the number? that means that the file was added.

Now imagine that you have 7 files and you want to add them all except the 7th? Sure we could type 1,2,3,4,5,6 but imagine instead of 7 we have 16, that would be quite cumbersome, the good thing we don’t need to type them all because we can use ranges,by typing 1-6

Update>> 1-6
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
* 3:    unchanged        +5/-1 lib/simplegit.rb
* 4:    unchanged        +5/-1 file4.html
* 5:    unchanged        +5/-1 file5.html
* 6:    unchanged        +5/-1 file6.html
  7:    unchanged        +5/-1 file7.html
Update>>

We can even use multiple ranges, so if we want from 1 to 3 and from 5 to 7 we type 1-3, 5-7:

Update>> 1-3, 5-7
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
* 3:    unchanged        +5/-1 lib/simplegit.rb
  4:    unchanged        +5/-1 file4.html
* 5:    unchanged        +5/-1 file5.html
* 6:    unchanged        +5/-1 file6.html
* 7:    unchanged        +5/-1 file7.html
Update>>

We can also use this to unstage files, if we type -number, so if we wanted to unstage file number 1 we would type -1:

Update>> -1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
* 3:    unchanged        +5/-1 lib/simplegit.rb
  4:    unchanged        +5/-1 file4.html
* 5:    unchanged        +5/-1 file5.html
* 6:    unchanged        +5/-1 file6.html
* 7:    unchanged        +5/-1 file7.html
Update>>

And as you can imagine we can also unstage a range of files, so if we type -range all the files on that range would be unstaged. If we wanted to unstage all the files from 5 to 7 we would type -5-7:

Update>> -5-7
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
* 3:    unchanged        +5/-1 lib/simplegit.rb
  4:    unchanged        +5/-1 file4.html
  5:    unchanged        +5/-1 file5.html
  6:    unchanged        +5/-1 file6.html
  7:    unchanged        +5/-1 file7.html
Update>>

Source : How to add multiple files to Git at the same time.

You can commit all files by doing a `git add .` or just specifying the directory that they're in: `git add ./folder/` or to add all files that begin with "test": `git add test*`

Source : How to add or commit specific files without specifying their full path?

## Get all files.
fls <- paste0(.dtr, 'data/fx/USDJPY/') %>% 
  list.files(., pattern = '^ts_ets_MNN_7200_1440.[0-9]{4}')

fls_pth <- paste0(.dtr, 'data/fx/USDJPY/', fls)

mds_ets_MNN_7200_1440 <- ldply(1:length(fls), function(i) {
  
  nms <- fls[i] %>% 
    str_replace_all('.rds', '') %>% 
    str_split('_|\\.') %>% 
    .[[1]]
  
  nms <- nms
  names(nms) <- c('t_series', 'model', 'sub_model', 
                  'data_min', 'fc_min', 'date')
  
  datset2 <- t(nms) %>% 
    data.frame %>% 
    mutate(model =factor(model), sub_model = factor(sub_model), 
           data_min = as.numeric(data_min), 
           fc_min = as.numeric(fc_min), 
           part = 1, 
           date = as_date(date))
  
  datset <- read_rds(fls_pth[i])
  
  res <- tibble(datset2, datset) %>% 
    dplyr::select(index, t_series, model, sub_model, data_min, 
                  fc_min, part, date, mk.price, fc.price)
  res <- res[!is.na('mk.price'),]
  cat(nms, '\n')
  
  return(res)
  
}) %>% 
  as_tibble

## https://tysonbarrett.com/jekyll/update/2019/10/06/datatable_memory/
## http://brooksandrew.github.io/simpleblog/articles/advanced-data-table/
## https://atrebas.github.io/post/2019-03-03-datatable-dplyr/

saveRDS(mds_ets_MNN_7200_1440, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_7200_1440.rds'))
## Get all files.
fls <- paste0(.dtr, 'data/fx/USDJPY/intraday/') %>% 
  list.files(., pattern = '^ts_ets_MNN_')
fls_pth <- paste0(.dtr, 'data/fx/USDJPY/intraday/', fls)

mds_ets_MNN_intraday <- ldply(1:length(fls), function(i) {
  
  nms <- fls[i] %>% 
    str_replace_all('.rds', '') %>% 
    str_split('_|\\.') %>% 
    .[[1]]
  
  nms <- nms[-6]
  names(nms) <- c('t_series', 'model', 'sub_model', 
                  'data_min', 'fc_min', 'part', 'date')
  
  datset2 <- t(nms) %>% 
    data.frame %>% 
    mutate(model =factor(model), sub_model = factor(sub_model), 
           data_min = as.numeric(data_min), 
           fc_min = as.numeric(fc_min), 
           part = as.numeric(part), 
           date = as_date(date))
  
  datset <- read_rds(fls_pth[i])
  
  res <- tibble(datset2, datset) %>% 
    dplyr::select(index, t_series, model, sub_model, data_min, 
                  fc_min, part, date, mk.price, fc.price)
  res <- res[!is.na('mk.price'),]
  cat(nms, '\n')
  
  return(res)
  
}) %>% 
  as_tibble

## https://tysonbarrett.com/jekyll/update/2019/10/06/datatable_memory/
## http://brooksandrew.github.io/simpleblog/articles/advanced-data-table/
## https://atrebas.github.io/post/2019-03-03-datatable-dplyr/

saveRDS(mds_ets_MNN_intraday, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds'))
if(!exists('mds_ets_MNN_7200_1440')) {
  mds_ets_MNN_7200_1440 <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_7200_1440.rds')) }

if(!exists('mds_ets_MNN_intraday')) {
  mds_ets_MNN_intraday <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds')) }

mds_ets_MNN_intraday <- rbind(mds_ets_MNN_7200_1440, mds_ets_MNN_intraday) %>% 
  as.data.table
mds_ets_MNN_intraday <- mds_ets_MNN_intraday[order(index, part, data_min, fc_min)]

saveRDS(mds_ets_MNN_intraday, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds'))

rm(mds_ets_MNN_7200_1440)

if(file.exists(paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_7200_1440.rds'))) {
  file.remove(paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_7200_1440.rds')) }

4.1.1.2 Long Format

rm(list = ls())

if(!exists('mds_ets_MNN_intraday')) {
  mds_ets_MNN_intraday <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds')) }

mds_ets_MNN_intraday_cmp <- mds_ets_MNN_intraday %>% 
  #tidyr::unite(model, t_series:part) %>% 
  tidyr::unite(model, t_series:fc_min) %>% 
  as.data.table %>% 
  .[, .(index, model, mk.price, fc.price)] %>% as.data.table

mds_ets_MNN_intraday_cmp <- as.data.table(mds_ets_MNN_intraday_cmp)

## ----------------------------------------
## fromLast = FALSE
mds_ets_MNN_intraday_cmp_fLF <- unique(
  mds_ets_MNN_intraday_cmp[, .(index, model, mk.price, fc.price)], fromLast = FALSE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_cmp_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_cmp_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
mds_ets_MNN_intraday_cmp_fLT <- unique(
  mds_ets_MNN_intraday_cmp[, .(index, model, mk.price, fc.price)], fromLast = TRUE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_cmp_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_cmp_fLT.rds'))

## ----------------------------------------
## convert to long format for plot chart
## fromLast = FALSE
prc <- unique(mds_ets_MNN_intraday_cmp[, .(index, model, mk.price)], fromLast = FALSE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = FALSE)

mds_ets_MNN_intraday_grph <- unique(
  mds_ets_MNN_intraday_cmp[, .(index, model, fc.price)], fromLast = FALSE)
setnames(mds_ets_MNN_intraday_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday_grph <- rbind(mds_ets_MNN_intraday_grph, prc)
mds_ets_MNN_intraday_grph_fLF <- data.table(mds_ets_MNN_intraday_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_grph_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_grph_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
prc <- unique(mds_ets_MNN_intraday_cmp[, .(index, model, mk.price)], fromLast = TRUE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = TRUE)

mds_ets_MNN_intraday_grph <- unique(
  mds_ets_MNN_intraday_cmp[, .(index, model, fc.price)], fromLast = TRUE)
setnames(mds_ets_MNN_intraday_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday_grph <- rbind(mds_ets_MNN_intraday_grph, prc)
mds_ets_MNN_intraday_grph_fLT <- data.table(mds_ets_MNN_intraday_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_grph_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_grph_fLT.rds'))
if(!exists('mds_ets_MNN_intraday')) {
  mds_ets_MNN_intraday <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds')) }

## plot sample data
mds_ets_MNN_intraday[c(1:3, (nrow(mds_ets_MNN_intraday)-3):nrow(mds_ets_MNN_intraday)),] %>% 
  kbl(caption = 'Data Sample (ETS MNN 7200/1440 from "2016-01-04" to "2018-07-06" forecast intraday)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  ## https://public.tableau.com/en-us/gallery/100-color-palettes?gallery=votd
  row_spec(0, background = 'DimGrey', color = 'gold', bold = TRUE) %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'Gray') %>% 
  column_spec(3, background = 'DarkGrey') %>% 
  column_spec(4, background = 'Gray') %>% 
  column_spec(5, background = 'DarkGrey') %>% 
  column_spec(6, background = '#4897D8') %>% 
  column_spec(7, background = '#375E97') %>% 
  column_spec(8, background = 'CornflowerBlue') %>% 
  column_spec(9, background = 'Gainsboro', color = 'goldenrod') %>% 
  column_spec(10, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')
Data Sample (ETS MNN 7200/1440 from “2016-01-04” to “2018-07-06” forecast intraday)
index t_series model sub_model data_min fc_min part date mk.price fc.price
2016-01-04 00:01:00 ts ets MNN 1440 1 1 2016-01-04 120.220 120.2080
2016-01-04 00:01:00 ts ets MNN 1440 6 1 2016-01-04 120.220 120.2080
2016-01-04 00:01:00 ts ets MNN 1440 8 1 2016-01-04 120.220 120.2080
2018-07-07 00:00:00 ts ets MNN 1440 15 96 2018-07-06 110.474 110.4192
2018-07-07 00:00:00 ts ets MNN 1440 10 144 2018-07-06 110.474 110.4571
2018-07-07 00:00:00 ts ets MNN 1440 8 180 2018-07-06 110.474 110.4586
2018-07-07 00:00:00 ts ets MNN 1440 6 240 2018-07-06 110.474 110.4796

source : 18745921 x 10

There has a small mistake in previous paper Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I) but doesn’t affect since I only want to compare the models and here I use the same MNN model and filter unique(fromLast = FALSE) and unique(fromLast = TRUE).

if(!exists('mds_ets_MNN_intraday_grph_fLF')) {
  mds_ets_MNN_intraday_grph_fLF <- readRDS(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_grph_fLF.rds')) }

if(!exists('mds_ets_MNN_intraday_grph_fLT')) {
  mds_ets_MNN_intraday_grph_fLT <- readRDS(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_grph_fLT.rds')) }
data.frame(mds_ets_MNN_intraday_grph_fLF)[
  c(1:5, (nrow(mds_ets_MNN_intraday_grph_fLF)-5):nrow(mds_ets_MNN_intraday_grph_fLF)),] %>% 
  kbl(caption = 'Data Sample', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = '#556DAC') %>% 
  column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Data Sample
index model price
1 2016-01-04 00:01:00 ts_ets_MNN_7200_1440 120.2080
2 2016-01-04 00:01:00 ts_ets_MNN_1440_1 120.2080
3 2016-01-04 00:01:00 ts_ets_MNN_1440_10 120.2080
4 2016-01-04 00:01:00 ts_ets_MNN_1440_120 120.2080
5 2016-01-04 00:01:00 ts_ets_MNN_1440_15 120.2080
15913492 2018-07-07 00:00:00 ts_ets_MNN_1440_60 110.4234
15913493 2018-07-07 00:00:00 ts_ets_MNN_1440_720 110.6322
15913494 2018-07-07 00:00:00 ts_ets_MNN_1440_8 110.4586
15913495 2018-07-07 00:00:00 ts_ets_MNN_7200_720 110.6322
15913496 2018-07-07 00:00:00 ts_ets_MNN_7200_720 110.4740
15913497 2018-07-07 00:00:00 actual 110.4740

source : 15913497 x 3

data.frame(mds_ets_MNN_intraday_grph_fLT)[
  c(1:6, (nrow(mds_ets_MNN_intraday_grph_fLT)-5):nrow(mds_ets_MNN_intraday_grph_fLT)),] %>% 
  kbl(caption = 'Data Sample', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = '#556DAC') %>% 
  column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Data Sample
index model price
1 2016-01-04 00:01:00 ts_ets_MNN_7200_1440 120.2080
2 2016-01-04 00:01:00 ts_ets_MNN_1440_1 120.2080
3 2016-01-04 00:01:00 ts_ets_MNN_1440_10 120.2080
4 2016-01-04 00:01:00 ts_ets_MNN_1440_120 120.2080
5 2016-01-04 00:01:00 ts_ets_MNN_1440_15 120.2080
6 2016-01-04 00:01:00 ts_ets_MNN_1440_180 120.2080
15913492 2018-07-07 00:00:00 ts_ets_MNN_1440_60 110.4234
15913493 2018-07-07 00:00:00 ts_ets_MNN_1440_720 110.6322
15913494 2018-07-07 00:00:00 ts_ets_MNN_1440_8 110.4586
15913495 2018-07-07 00:00:00 ts_ets_MNN_7200_720 110.6322
15913496 2018-07-07 00:00:00 ts_ets_MNN_7200_720 110.4740
15913497 2018-07-07 00:00:00 actual 110.4740

source : 15913497 x 3

4.1.2 Line Chart

4.1.2.1 unique(x, fromLast = FALSE) Dataset

## https://www.r-graph-gallery.com/line-chart-several-groups-ggplot2.html
plt <- mds_ets_MNN_intraday_grph_fLF %>% 
  ggplot(aes(x = index, y = price, group = model, color = model)) + 
  geom_line() + 

  labs(title = '1 min Open Price Forecasting', 
       subtitle = paste('From', range(unique(mds_ets_MNN_intraday_grph_fLF$index))[1L], 
                        'to', range(unique(mds_ets_MNN_intraday_grph_fLF$index))[2L]), 
       caption = "Data source: fxcm") + 
  ylab('Exchange Rates USD/JPY') + 
  theme_economist() + 
  theme(legend.position = 'right')

#ggplotly(plt)
plt

Due to the high volume of data, here I skip the line chart.

4.1.2.2 unique(x, fromLast = TRUE) Dataset

## https://www.r-graph-gallery.com/line-chart-several-groups-ggplot2.html
plt <- mds_ets_MNN_intraday_grph_fLT %>% 
  ggplot(aes(x = index, y = price, group = model, color = model)) + 
  geom_line() + 

  labs(title = '1 min Open Price Forecasting', 
       subtitle = paste('From', range(unique(mds_ets_MNN_intraday_grph_fLT$index))[1L], 
                        'to', range(unique(mds_ets_MNN_intraday_grph_fLT$index))[2L]), 
       caption = "Data source: fxcm") + 
  ylab('Exchange Rates USD/JPY') + 
  theme_economist() + 
  theme(legend.position = 'right')

#ggplotly(plt)
plt

Due to the high volume of data, here I skip the line chart.

4.1.3 Table

4.1.3.1 unique(x, fromLast = FALSE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday_cmp_fLF
if(!exists('mds_ets_MNN_intraday_cmp_fLF')) {
    mds_ets_MNN_intraday_cmp_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_cmp_fLF.rds')) }

if(!is.data.table('mds_ets_MNN_intraday_cmp_fLF')) {
  mds_ets_MNN_intraday_cmp_fLF %<>% as.data.table }

mds_ets_MNN_intraday_cmp_fLF <- unique(
  mds_ets_MNN_intraday_cmp_fLF, fromLast = FALSE, by = c('index', 'model')) %>% 
  na.omit

rp_fLF <- mds_ets_MNN_intraday_cmp_fLF[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp_fLF, paste0(.dtr, 'data/fx/USDJPY/rp_fLF.rds'))
rp_fLF <- readRDS(paste0(.dtr, 'data/fx/USDJPY/rp_fLF.rds'))

rp_tbl <- rp_fLF %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (Dataset from "2016-01-04" to "2018-07-06" Forecasted Up to Max 1440 mins)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'LightSlateGrey') %>% 
  column_spec(3, background = 'Gainsboro') %>% 
  column_spec(4, background = 'LightGray') %>% 
  column_spec(5, background = 'Gainsboro') %>% 
  column_spec(6, background = 'LightGray') %>% 
  column_spec(7, background = 'Gainsboro') %>%  
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')

rp_tbl
Accurcy Report (Dataset from “2016-01-04” to “2018-07-06” Forecasted Up to Max 1440 mins)
model N mae mape rmse smape mse
ts_ets_MNN_1440_1 850925 0.0116135 (rank: 1) 0.0001056 (rank: 1) 0.0196293 (rank: 1) 0.0001056 (rank: 1) 0.0003853 (rank: 1)
ts_ets_MNN_1440_10 936012 0.0261097 (rank: 4) 0.0002374 (rank: 4) 0.0439667 (rank: 4) 0.0002374 (rank: 4) 0.0019331 (rank: 4)
ts_ets_MNN_1440_120 936008 0.0876931 (rank: 9) 0.0007977 (rank: 9) 0.142061 (rank: 9) 0.0007976 (rank: 9) 0.0201813 (rank: 9)
ts_ets_MNN_1440_15 936005 0.0315207 (rank: 5) 0.0002866 (rank: 5) 0.0527373 (rank: 5) 0.0002866 (rank: 5) 0.0027812 (rank: 5)
ts_ets_MNN_1440_180 936004 0.1090491 (rank: 10) 0.0009924 (rank: 10) 0.1758124 (rank: 10) 0.0009922 (rank: 10) 0.03091 (rank: 10)
ts_ets_MNN_1440_20 936008 0.036005 (rank: 6) 0.0003275 (rank: 6) 0.0602137 (rank: 6) 0.0003275 (rank: 6) 0.0036257 (rank: 6)
ts_ets_MNN_1440_240 936004 0.1239933 (rank: 11) 0.0011291 (rank: 11) 0.2000525 (rank: 11) 0.0011289 (rank: 11) 0.040021 (rank: 11)
ts_ets_MNN_1440_30 936008 0.0442656 (rank: 7) 0.0004027 (rank: 7) 0.0733471 (rank: 7) 0.0004026 (rank: 7) 0.0053798 (rank: 7)
ts_ets_MNN_1440_360 936004 0.1484447 (rank: 12) 0.0013515 (rank: 12) 0.2372316 (rank: 12) 0.0013513 (rank: 12) 0.0562789 (rank: 12)
ts_ets_MNN_1440_480 936004 0.1871978 (rank: 13) 0.0017046 (rank: 13) 0.2854502 (rank: 13) 0.0017041 (rank: 13) 0.0814818 (rank: 13)
ts_ets_MNN_1440_6 936012 0.0208291 (rank: 2) 0.0001894 (rank: 2) 0.0352063 (rank: 2) 0.0001894 (rank: 2) 0.0012395 (rank: 2)
ts_ets_MNN_1440_60 936008 0.0623901 (rank: 8) 0.0005676 (rank: 8) 0.1026414 (rank: 8) 0.0005675 (rank: 8) 0.0105353 (rank: 8)
ts_ets_MNN_1440_720 936004 0.2254901 (rank: 14) 0.0020559 (rank: 14) 0.3519291 (rank: 14) 0.002055 (rank: 14) 0.1238541 (rank: 14)
ts_ets_MNN_1440_8 936012 0.0236924 (rank: 3) 0.0002155 (rank: 3) 0.0405026 (rank: 3) 0.0002155 (rank: 3) 0.0016405 (rank: 3)
ts_ets_MNN_7200_1440 936004 0.3237977 (rank: 16) 0.002952 (rank: 16) 0.4913689 (rank: 16) 0.0029499 (rank: 16) 0.2414434 (rank: 16)
ts_ets_MNN_7200_720 936005 0.2258944 (rank: 15) 0.0020595 (rank: 15) 0.3523549 (rank: 15) 0.0020585 (rank: 15) 0.124154 (rank: 15)

source :

from above models we know the βest model.

4.1.3.2 unique(x, fromLast = TRUE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday_cmp_fLT
if(!exists('mds_ets_MNN_intraday_cmp_fLT')) {
    mds_ets_MNN_intraday_cmp_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_cmp_fLT.rds')) }

if(!is.data.table('mds_ets_MNN_intraday_cmp_fLT')) {
  mds_ets_MNN_intraday_cmp_fLT %<>% as.data.table }

mds_ets_MNN_intraday_cmp_fLT <- unique(
  mds_ets_MNN_intraday_cmp_fLT, fromLast = TRUE, by = c('index', 'model')) %>% 
  na.omit

rp_fLT <- mds_ets_MNN_intraday_cmp_fLT[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp_fLT, paste0(.dtr, 'data/fx/USDJPY/rp_fLT.rds'))
rp_fLT <- readRDS(paste0(.dtr, 'data/fx/USDJPY/rp_fLT.rds'))

rp_tbl <- rp_fLT %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (Forecasted 1440 mins)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'LightSlateGrey') %>% 
  column_spec(3, background = 'Gainsboro') %>% 
  column_spec(4, background = 'LightGray') %>% 
  column_spec(5, background = 'Gainsboro') %>% 
  column_spec(6, background = 'LightGray') %>% 
  column_spec(7, background = 'Gainsboro') %>%  
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')

rp_tbl
Accurcy Report (Forecasted 1440 mins)
model N mae mape rmse smape mse
ts_ets_MNN_1440_1 853801 0.012137 (rank: 1) 0.0001103 (rank: 1) 0.023317 (rank: 1) 0.0001103 (rank: 1) 0.0005437 (rank: 1)
ts_ets_MNN_1440_10 939592 0.0266157 (rank: 4) 0.0002419 (rank: 4) 0.0456574 (rank: 4) 0.0002419 (rank: 4) 0.0020846 (rank: 4)
ts_ets_MNN_1440_120 939596 0.0879918 (rank: 9) 0.0008003 (rank: 9) 0.1423749 (rank: 9) 0.0008002 (rank: 9) 0.0202706 (rank: 9)
ts_ets_MNN_1440_15 939599 0.0320082 (rank: 5) 0.0002909 (rank: 5) 0.0541282 (rank: 5) 0.0002909 (rank: 5) 0.0029299 (rank: 5)
ts_ets_MNN_1440_180 939600 0.1092829 (rank: 10) 0.0009943 (rank: 10) 0.1759537 (rank: 10) 0.0009942 (rank: 10) 0.0309597 (rank: 10)
ts_ets_MNN_1440_20 939596 0.0364745 (rank: 6) 0.0003316 (rank: 6) 0.0614091 (rank: 6) 0.0003316 (rank: 6) 0.0037711 (rank: 6)
ts_ets_MNN_1440_240 939600 0.1241567 (rank: 11) 0.0011304 (rank: 11) 0.2000916 (rank: 11) 0.0011302 (rank: 11) 0.0400366 (rank: 11)
ts_ets_MNN_1440_30 939596 0.0447015 (rank: 7) 0.0004065 (rank: 7) 0.0742782 (rank: 7) 0.0004065 (rank: 7) 0.0055172 (rank: 7)
ts_ets_MNN_1440_360 939600 0.1485413 (rank: 12) 0.0013522 (rank: 12) 0.2371252 (rank: 12) 0.001352 (rank: 12) 0.0562284 (rank: 12)
ts_ets_MNN_1440_480 939600 0.1871554 (rank: 13) 0.001704 (rank: 13) 0.2852255 (rank: 13) 0.0017036 (rank: 13) 0.0813536 (rank: 13)
ts_ets_MNN_1440_6 939592 0.0213556 (rank: 2) 0.0001941 (rank: 2) 0.0373323 (rank: 2) 0.0001941 (rank: 2) 0.0013937 (rank: 2)
ts_ets_MNN_1440_60 939596 0.0627605 (rank: 8) 0.0005708 (rank: 8) 0.1032182 (rank: 8) 0.0005707 (rank: 8) 0.010654 (rank: 8)
ts_ets_MNN_1440_720 939600 0.22533 (rank: 14) 0.0020542 (rank: 14) 0.3514996 (rank: 14) 0.0020533 (rank: 14) 0.123552 (rank: 14)
ts_ets_MNN_1440_8 939592 0.0242083 (rank: 3) 0.00022 (rank: 3) 0.0423498 (rank: 3) 0.00022 (rank: 3) 0.0017935 (rank: 3)
ts_ets_MNN_7200_1440 939600 0.3240886 (rank: 16) 0.0029543 (rank: 16) 0.4914093 (rank: 16) 0.0029522 (rank: 16) 0.2414831 (rank: 16)
ts_ets_MNN_7200_720 943198 0.2273692 (rank: 15) 0.0020721 (rank: 15) 0.3538666 (rank: 15) 0.0020712 (rank: 15) 0.1252216 (rank: 15)

source :

from above models we know the βest model.

4.1.3.3 Summary

rm(list = ls())

## report for rp_fLF and 
if(!exists('rp_fLF')) {
    rp_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_fLF.rds')) %>% 
      as.data.table }

## report for rp_fLT and 
if(!exists('rp_fLT')) {
    rp_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_fLT.rds')) %>% 
      as.data.table }

rp_fLF <- rp_fLF[, arrange := 'from_first'][]
rp_fLT <- rp_fLT[, arrange := 'from_last'][]

rp <- rbindlist(list(rp_fLF, rp_fLT))
rp <- rp[, .(model, arrange, N, mae, mape, rmse, smape, mse)]
rp %<>% unique

#sum <- rp[mae == min(mae) | mape == min(mape) | rmse == min(rmse) | smape == min(smape) | mse == min(mse)]

rp %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (Initial Stage Comparison Dataset from "2016-01-04" to "2018-07-06")', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = 'LightSlateGrey') %>% 
  column_spec(4, background = 'Gainsboro') %>% 
  column_spec(5, background = 'LightGray') %>% 
  column_spec(6, background = 'Gainsboro') %>% 
  column_spec(7, background = 'LightGray') %>% 
  column_spec(8, background = 'Gainsboro') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Accurcy Report (Initial Stage Comparison Dataset from “2016-01-04” to “2018-07-06”)
model arrange N mae mape rmse smape mse
ts_ets_MNN_1440_1 from_first 850925 0.0116135 (rank: 1) 0.0001056 (rank: 1) 0.0196293 (rank: 1) 0.0001056 (rank: 1) 0.0003853 (rank: 1)
ts_ets_MNN_1440_10 from_first 936012 0.0261097 (rank: 7) 0.0002374 (rank: 7) 0.0439667 (rank: 7) 0.0002374 (rank: 7) 0.0019331 (rank: 7)
ts_ets_MNN_1440_120 from_first 936008 0.0876931 (rank: 17) 0.0007977 (rank: 17) 0.142061 (rank: 17) 0.0007976 (rank: 17) 0.0201813 (rank: 17)
ts_ets_MNN_1440_15 from_first 936005 0.0315207 (rank: 9) 0.0002866 (rank: 9) 0.0527373 (rank: 9) 0.0002866 (rank: 9) 0.0027812 (rank: 9)
ts_ets_MNN_1440_180 from_first 936004 0.1090491 (rank: 19) 0.0009924 (rank: 19) 0.1758124 (rank: 19) 0.0009922 (rank: 19) 0.03091 (rank: 19)
ts_ets_MNN_1440_20 from_first 936008 0.036005 (rank: 11) 0.0003275 (rank: 11) 0.0602137 (rank: 11) 0.0003275 (rank: 11) 0.0036257 (rank: 11)
ts_ets_MNN_1440_240 from_first 936004 0.1239933 (rank: 21) 0.0011291 (rank: 21) 0.2000525 (rank: 21) 0.0011289 (rank: 21) 0.040021 (rank: 21)
ts_ets_MNN_1440_30 from_first 936008 0.0442656 (rank: 13) 0.0004027 (rank: 13) 0.0733471 (rank: 13) 0.0004026 (rank: 13) 0.0053798 (rank: 13)
ts_ets_MNN_1440_360 from_first 936004 0.1484447 (rank: 23) 0.0013515 (rank: 23) 0.2372316 (rank: 24) 0.0013513 (rank: 23) 0.0562789 (rank: 24)
ts_ets_MNN_1440_480 from_first 936004 0.1871978 (rank: 26) 0.0017046 (rank: 26) 0.2854502 (rank: 26) 0.0017041 (rank: 26) 0.0814818 (rank: 26)
ts_ets_MNN_1440_6 from_first 936012 0.0208291 (rank: 3) 0.0001894 (rank: 3) 0.0352063 (rank: 3) 0.0001894 (rank: 3) 0.0012395 (rank: 3)
ts_ets_MNN_1440_60 from_first 936008 0.0623901 (rank: 15) 0.0005676 (rank: 15) 0.1026414 (rank: 15) 0.0005675 (rank: 15) 0.0105353 (rank: 15)
ts_ets_MNN_1440_720 from_first 936004 0.2254901 (rank: 28) 0.0020559 (rank: 28) 0.3519291 (rank: 28) 0.002055 (rank: 28) 0.1238541 (rank: 28)
ts_ets_MNN_1440_8 from_first 936012 0.0236924 (rank: 5) 0.0002155 (rank: 5) 0.0405026 (rank: 5) 0.0002155 (rank: 5) 0.0016405 (rank: 5)
ts_ets_MNN_7200_1440 from_first 936004 0.3237977 (rank: 31) 0.002952 (rank: 31) 0.4913689 (rank: 31) 0.0029499 (rank: 31) 0.2414434 (rank: 31)
ts_ets_MNN_7200_720 from_first 936005 0.2258944 (rank: 29) 0.0020595 (rank: 29) 0.3523549 (rank: 29) 0.0020585 (rank: 29) 0.124154 (rank: 29)
ts_ets_MNN_1440_1 from_last 853801 0.012137 (rank: 2) 0.0001103 (rank: 2) 0.023317 (rank: 2) 0.0001103 (rank: 2) 0.0005437 (rank: 2)
ts_ets_MNN_1440_10 from_last 939592 0.0266157 (rank: 8) 0.0002419 (rank: 8) 0.0456574 (rank: 8) 0.0002419 (rank: 8) 0.0020846 (rank: 8)
ts_ets_MNN_1440_120 from_last 939596 0.0879918 (rank: 18) 0.0008003 (rank: 18) 0.1423749 (rank: 18) 0.0008002 (rank: 18) 0.0202706 (rank: 18)
ts_ets_MNN_1440_15 from_last 939599 0.0320082 (rank: 10) 0.0002909 (rank: 10) 0.0541282 (rank: 10) 0.0002909 (rank: 10) 0.0029299 (rank: 10)
ts_ets_MNN_1440_180 from_last 939600 0.1092829 (rank: 20) 0.0009943 (rank: 20) 0.1759537 (rank: 20) 0.0009942 (rank: 20) 0.0309597 (rank: 20)
ts_ets_MNN_1440_20 from_last 939596 0.0364745 (rank: 12) 0.0003316 (rank: 12) 0.0614091 (rank: 12) 0.0003316 (rank: 12) 0.0037711 (rank: 12)
ts_ets_MNN_1440_240 from_last 939600 0.1241567 (rank: 22) 0.0011304 (rank: 22) 0.2000916 (rank: 22) 0.0011302 (rank: 22) 0.0400366 (rank: 22)
ts_ets_MNN_1440_30 from_last 939596 0.0447015 (rank: 14) 0.0004065 (rank: 14) 0.0742782 (rank: 14) 0.0004065 (rank: 14) 0.0055172 (rank: 14)
ts_ets_MNN_1440_360 from_last 939600 0.1485413 (rank: 24) 0.0013522 (rank: 24) 0.2371252 (rank: 23) 0.001352 (rank: 24) 0.0562284 (rank: 23)
ts_ets_MNN_1440_480 from_last 939600 0.1871554 (rank: 25) 0.001704 (rank: 25) 0.2852255 (rank: 25) 0.0017036 (rank: 25) 0.0813536 (rank: 25)
ts_ets_MNN_1440_6 from_last 939592 0.0213556 (rank: 4) 0.0001941 (rank: 4) 0.0373323 (rank: 4) 0.0001941 (rank: 4) 0.0013937 (rank: 4)
ts_ets_MNN_1440_60 from_last 939596 0.0627605 (rank: 16) 0.0005708 (rank: 16) 0.1032182 (rank: 16) 0.0005707 (rank: 16) 0.010654 (rank: 16)
ts_ets_MNN_1440_720 from_last 939600 0.22533 (rank: 27) 0.0020542 (rank: 27) 0.3514996 (rank: 27) 0.0020533 (rank: 27) 0.123552 (rank: 27)
ts_ets_MNN_1440_8 from_last 939592 0.0242083 (rank: 6) 0.00022 (rank: 6) 0.0423498 (rank: 6) 0.00022 (rank: 6) 0.0017935 (rank: 6)
ts_ets_MNN_7200_1440 from_last 939600 0.3240886 (rank: 32) 0.0029543 (rank: 32) 0.4914093 (rank: 32) 0.0029522 (rank: 32) 0.2414831 (rank: 32)
ts_ets_MNN_7200_720 from_last 943198 0.2273692 (rank: 30) 0.0020721 (rank: 30) 0.3538666 (rank: 30) 0.0020712 (rank: 30) 0.1252216 (rank: 30)

source : 32 x 8

4.2 2nd Stage (1 Year Dataset)

In order to save the time, here I try to compare if the accuracy of the model by using 1 year dataset good enough.

4.2.1 Read Models

if(!exists('mds_ets_MNN_intraday')) {
  mds_ets_MNN_intraday <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday.rds')) }

mds_ets_MNN_intraday_1y <- mds_ets_MNN_intraday[date <= as_date('2016-12-31')]
saveRDS(mds_ets_MNN_intraday_1y, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y.rds'))

mds_ets_MNN_intraday_1y_cmp <- mds_ets_MNN_intraday_1y %>% 
  #tidyr::unite(model, t_series:part) %>% 
  tidyr::unite(model, t_series:fc_min) %>% 
  as.data.table %>% 
  .[, .(index, model, mk.price, fc.price)] %>% as.data.table

mds_ets_MNN_intraday_1y_cmp <- as.data.table(mds_ets_MNN_intraday_1y_cmp)

## ----------------------------------------
## fromLast = FALSE
mds_ets_MNN_intraday_1y_cmp_fLF <- unique(
  mds_ets_MNN_intraday_1y_cmp[, .(index, model, mk.price, fc.price)], fromLast = FALSE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_1y_cmp_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_cmp_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
mds_ets_MNN_intraday_1y_cmp_fLT <- unique(
  mds_ets_MNN_intraday_1y_cmp[, .(index, model, mk.price, fc.price)], fromLast = TRUE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_1y_cmp_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_cmp_fLT.rds'))

## ----------------------------------------
## convert to long format for plot chart
## fromLast = FALSE
prc <- unique(mds_ets_MNN_intraday_1y_cmp[, .(index, model, mk.price)], fromLast = FALSE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = FALSE)

mds_ets_MNN_intraday_1y_grph <- unique(
  mds_ets_MNN_intraday_1y_cmp[, .(index, model, fc.price)], fromLast = FALSE)
setnames(mds_ets_MNN_intraday_1y_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday_1y_grph <- rbind(mds_ets_MNN_intraday_1y_grph, prc)
mds_ets_MNN_intraday_1y_grph_fLF <- data.table(mds_ets_MNN_intraday_1y_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_1y_grph_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_grph_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
prc <- unique(mds_ets_MNN_intraday_1y_cmp[, .(index, model, mk.price)], fromLast = TRUE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = TRUE)

mds_ets_MNN_intraday_1y_grph <- unique(
  mds_ets_MNN_intraday_1y_cmp[, .(index, model, fc.price)], fromLast = TRUE)
setnames(mds_ets_MNN_intraday_1y_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday_1y_grph <- rbind(mds_ets_MNN_intraday_1y_grph, prc)
mds_ets_MNN_intraday_1y_grph_fLT <- data.table(mds_ets_MNN_intraday_1y_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday_1y_grph_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_grph_fLT.rds'))

4.2.2 Table

4.2.2.1 unique(x, fromLast = FALSE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday_1y_cmp_fLF
if(!exists('mds_ets_MNN_intraday_1y_cmp_fLF')) {
    mds_ets_MNN_intraday_1y_cmp_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_cmp_fLF.rds')) }

if(!is.data.table('mds_ets_MNN_intraday_1y_cmp_fLF')) {
  mds_ets_MNN_intraday_1y_cmp_fLF %<>% as.data.table }

mds_ets_MNN_intraday_1y_cmp_fLF <- unique(
  mds_ets_MNN_intraday_1y_cmp_fLF, fromLast = FALSE, by = c('index', 'model')) %>% 
  na.omit

rp_1y_fLF <- mds_ets_MNN_intraday_1y_cmp_fLF[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp_1y_fLF, paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLF.rds'))

4.2.2.2 unique(x, fromLast = TRUE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday_cmp_fLT
if(!exists('mds_ets_MNN_intraday_1y_cmp_fLT')) {
    mds_ets_MNN_intraday_1y_cmp_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1y_cmp_fLT.rds')) }

if(!is.data.table('mds_ets_MNN_intraday_1y_cmp_fLT')) {
  mds_ets_MNN_intraday_1y_cmp_fLT %<>% as.data.table }

mds_ets_MNN_intraday_1y_cmp_fLT <- unique(
  mds_ets_MNN_intraday_1y_cmp_fLT, fromLast = TRUE, by = c('index', 'model')) %>% 
  na.omit

rp_1y_fLT <- mds_ets_MNN_intraday_1y_cmp_fLT[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp_1y_fLT, paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLT.rds'))

4.2.3 Summary

4.2.3.1 1 Year

rm(list = ls())

## report for rp_fLF and 
if(!exists('rp_fLF')) {
    rp_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_fLF.rds')) %>% 
      as.data.table }

## report for rp_fLT and 
if(!exists('rp_fLT')) {
    rp_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_fLT.rds')) %>% 
      as.data.table }

rp_fLF <- rp_fLF[, arrange := 'from_first'][]
rp_fLT <- rp_fLT[, arrange := 'from_last'][]

rp <- rbindlist(list(rp_fLF, rp_fLT))
rp <- rp[, .(model, arrange, N, mae, mape, rmse, smape, mse)]
rp %<>% unique



## report for rp_1y_fLF and 
if(!exists('rp_1y_fLF')) {
    rp_1y_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLF.rds')) %>% 
      as.data.table }

## report for rp_1y_fLT and 
if(!exists('rp_1y_fLT')) {
    rp_1y_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLT.rds')) %>% 
      as.data.table }

rp_1y_fLF <- rp_1y_fLF[, arrange := 'from_first'][]
rp_1y_fLT <- rp_1y_fLT[, arrange := 'from_last'][]

rp_1y <- rbindlist(list(rp_1y_fLF, rp_1y_fLT))
rp_1y <- rp_1y[, .(model, arrange, N, mae, mape, rmse, smape, mse)]
rp_1y %<>% unique

#sum <- rp[mae == min(mae) | mape == min(mape) | rmse == min(rmse) | smape == min(smape) | mse == min(mse)]

rp_1y %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (1 Year Dataset from "2016-01-04" to "2016-12-31")', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = 'LightSlateGrey') %>% 
  column_spec(4, background = 'Gainsboro') %>% 
  column_spec(5, background = 'LightGray') %>% 
  column_spec(6, background = 'Gainsboro') %>% 
  column_spec(7, background = 'LightGray') %>% 
  column_spec(8, background = 'Gainsboro') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Accurcy Report (1 Year Dataset from “2016-01-04” to “2016-12-31”)
model arrange N mae mape rmse smape mse
ts_ets_MNN_1440_1 from_first 374398 0.0135726 (rank: 2) 0.0001248 (rank: 2) 0.0235634 (rank: 2) 0.0001248 (rank: 2) 0.0005552 (rank: 2)
ts_ets_MNN_1440_10 from_first 374400 0.0310264 (rank: 8) 0.0002852 (rank: 8) 0.0535552 (rank: 8) 0.0002852 (rank: 8) 0.0028682 (rank: 8)
ts_ets_MNN_1440_120 from_first 374400 0.1046746 (rank: 18) 0.0009631 (rank: 18) 0.1716097 (rank: 18) 0.000963 (rank: 18) 0.0294499 (rank: 18)
ts_ets_MNN_1440_15 from_first 374400 0.0373874 (rank: 10) 0.0003437 (rank: 10) 0.064235 (rank: 10) 0.0003437 (rank: 10) 0.0041261 (rank: 10)
ts_ets_MNN_1440_180 from_first 374400 0.129417 (rank: 20) 0.0011914 (rank: 20) 0.2116718 (rank: 20) 0.0011911 (rank: 20) 0.044805 (rank: 20)
ts_ets_MNN_1440_20 from_first 374400 0.0427459 (rank: 12) 0.0003931 (rank: 12) 0.0730338 (rank: 12) 0.0003931 (rank: 12) 0.0053339 (rank: 12)
ts_ets_MNN_1440_240 from_first 374400 0.148679 (rank: 22) 0.0013704 (rank: 22) 0.245548 (rank: 22) 0.00137 (rank: 22) 0.0602938 (rank: 22)
ts_ets_MNN_1440_30 from_first 374400 0.0524834 (rank: 14) 0.0004828 (rank: 14) 0.0890827 (rank: 14) 0.0004827 (rank: 14) 0.0079357 (rank: 14)
ts_ets_MNN_1440_360 from_first 374400 0.1784428 (rank: 24) 0.0016443 (rank: 24) 0.2897381 (rank: 24) 0.0016439 (rank: 24) 0.0839482 (rank: 24)
ts_ets_MNN_1440_480 from_first 374400 0.2263737 (rank: 26) 0.0020871 (rank: 26) 0.3521562 (rank: 26) 0.0020863 (rank: 26) 0.124014 (rank: 26)
ts_ets_MNN_1440_6 from_first 374400 0.0247197 (rank: 4) 0.0002272 (rank: 4) 0.0428744 (rank: 4) 0.0002272 (rank: 4) 0.0018382 (rank: 4)
ts_ets_MNN_1440_60 from_first 374400 0.0738649 (rank: 16) 0.0006797 (rank: 16) 0.1238921 (rank: 16) 0.0006796 (rank: 16) 0.0153493 (rank: 16)
ts_ets_MNN_1440_720 from_first 374400 0.2755691 (rank: 28) 0.0025449 (rank: 28) 0.4395358 (rank: 30) 0.0025432 (rank: 28) 0.1931917 (rank: 30)
ts_ets_MNN_1440_8 from_first 374400 0.0281814 (rank: 6) 0.0002591 (rank: 6) 0.0494359 (rank: 6) 0.0002591 (rank: 6) 0.0024439 (rank: 6)
ts_ets_MNN_7200_1440 from_first 374400 0.4072728 (rank: 32) 0.0037581 (rank: 32) 0.6228677 (rank: 32) 0.0037537 (rank: 32) 0.3879641 (rank: 32)
ts_ets_MNN_7200_720 from_first 374400 0.275585 (rank: 30) 0.0025451 (rank: 30) 0.4395006 (rank: 28) 0.0025434 (rank: 30) 0.1931608 (rank: 28)
ts_ets_MNN_1440_1 from_last 374398 0.0135726 (rank: 2) 0.0001248 (rank: 2) 0.0235634 (rank: 2) 0.0001248 (rank: 2) 0.0005552 (rank: 2)
ts_ets_MNN_1440_10 from_last 374400 0.0310264 (rank: 8) 0.0002852 (rank: 8) 0.0535552 (rank: 8) 0.0002852 (rank: 8) 0.0028682 (rank: 8)
ts_ets_MNN_1440_120 from_last 374400 0.1046746 (rank: 18) 0.0009631 (rank: 18) 0.1716097 (rank: 18) 0.000963 (rank: 18) 0.0294499 (rank: 18)
ts_ets_MNN_1440_15 from_last 374400 0.0373874 (rank: 10) 0.0003437 (rank: 10) 0.064235 (rank: 10) 0.0003437 (rank: 10) 0.0041261 (rank: 10)
ts_ets_MNN_1440_180 from_last 374400 0.129417 (rank: 20) 0.0011914 (rank: 20) 0.2116718 (rank: 20) 0.0011911 (rank: 20) 0.044805 (rank: 20)
ts_ets_MNN_1440_20 from_last 374400 0.0427459 (rank: 12) 0.0003931 (rank: 12) 0.0730338 (rank: 12) 0.0003931 (rank: 12) 0.0053339 (rank: 12)
ts_ets_MNN_1440_240 from_last 374400 0.148679 (rank: 22) 0.0013704 (rank: 22) 0.245548 (rank: 22) 0.00137 (rank: 22) 0.0602938 (rank: 22)
ts_ets_MNN_1440_30 from_last 374400 0.0524834 (rank: 14) 0.0004828 (rank: 14) 0.0890827 (rank: 14) 0.0004827 (rank: 14) 0.0079357 (rank: 14)
ts_ets_MNN_1440_360 from_last 374400 0.1784428 (rank: 24) 0.0016443 (rank: 24) 0.2897381 (rank: 24) 0.0016439 (rank: 24) 0.0839482 (rank: 24)
ts_ets_MNN_1440_480 from_last 374400 0.2263737 (rank: 26) 0.0020871 (rank: 26) 0.3521562 (rank: 26) 0.0020863 (rank: 26) 0.124014 (rank: 26)
ts_ets_MNN_1440_6 from_last 374400 0.0247197 (rank: 4) 0.0002272 (rank: 4) 0.0428744 (rank: 4) 0.0002272 (rank: 4) 0.0018382 (rank: 4)
ts_ets_MNN_1440_60 from_last 374400 0.0738649 (rank: 16) 0.0006797 (rank: 16) 0.1238921 (rank: 16) 0.0006796 (rank: 16) 0.0153493 (rank: 16)
ts_ets_MNN_1440_720 from_last 374400 0.2755691 (rank: 28) 0.0025449 (rank: 28) 0.4395358 (rank: 30) 0.0025432 (rank: 28) 0.1931917 (rank: 30)
ts_ets_MNN_1440_8 from_last 374400 0.0281814 (rank: 6) 0.0002591 (rank: 6) 0.0494359 (rank: 6) 0.0002591 (rank: 6) 0.0024439 (rank: 6)
ts_ets_MNN_7200_1440 from_last 374400 0.4072728 (rank: 32) 0.0037581 (rank: 32) 0.6228677 (rank: 32) 0.0037537 (rank: 32) 0.3879641 (rank: 32)
ts_ets_MNN_7200_720 from_last 374400 0.275585 (rank: 30) 0.0025451 (rank: 30) 0.4395006 (rank: 28) 0.0025434 (rank: 30) 0.1931608 (rank: 28)

source : 32 x 8

4.2.3.2 Comparison between 1 Year & 3.5 Year Dataset

rp_1y_3.5y <- rbind(rp[order(mae, mape, rmse, smape, mse)][1:4], rp_1y[order(mae, mape, rmse, smape, mse)][1:4])

rp_1y_3.5y %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (Comparison between 1 Year & 3.5 Year Dataset)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = 'LightSlateGrey') %>% 
  column_spec(4, background = 'Gainsboro') %>% 
  column_spec(5, background = 'LightGray') %>% 
  column_spec(6, background = 'Gainsboro') %>% 
  column_spec(7, background = 'LightGray') %>% 
  column_spec(8, background = 'Gainsboro') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Accurcy Report (Comparison between 1 Year & 3.5 Year Dataset)
model arrange N mae mape rmse smape mse
ts_ets_MNN_1440_1 from_first 850925 0.0116135 (rank: 1) 0.0001056 (rank: 1) 0.0196293 (rank: 1) 0.0001056 (rank: 1) 0.0003853 (rank: 1)
ts_ets_MNN_1440_1 from_last 853801 0.012137 (rank: 2) 0.0001103 (rank: 2) 0.023317 (rank: 2) 0.0001103 (rank: 2) 0.0005437 (rank: 2)
ts_ets_MNN_1440_6 from_first 936012 0.0208291 (rank: 5) 0.0001894 (rank: 5) 0.0352063 (rank: 5) 0.0001894 (rank: 5) 0.0012395 (rank: 5)
ts_ets_MNN_1440_6 from_last 939592 0.0213556 (rank: 6) 0.0001941 (rank: 6) 0.0373323 (rank: 6) 0.0001941 (rank: 6) 0.0013937 (rank: 6)
ts_ets_MNN_1440_1 from_first 374398 0.0135726 (rank: 4) 0.0001248 (rank: 4) 0.0235634 (rank: 4) 0.0001248 (rank: 4) 0.0005552 (rank: 4)
ts_ets_MNN_1440_1 from_last 374398 0.0135726 (rank: 4) 0.0001248 (rank: 4) 0.0235634 (rank: 4) 0.0001248 (rank: 4) 0.0005552 (rank: 4)
ts_ets_MNN_1440_6 from_first 374400 0.0247197 (rank: 8) 0.0002272 (rank: 8) 0.0428744 (rank: 8) 0.0002272 (rank: 8) 0.0018382 (rank: 8)
ts_ets_MNN_1440_6 from_last 374400 0.0247197 (rank: 8) 0.0002272 (rank: 8) 0.0428744 (rank: 8) 0.0002272 (rank: 8) 0.0018382 (rank: 8)

From the table above, N is the sample data size, 3.5 years dataset is more accurate than 1 year dataset. However due to save the resource and time:

  • we can know the βest model based on 1 year dataset.
  • we can know the βest model based on the unique from_first dataset.

4.3 3rd Stage (Intraday 1 min)

4.3.1 Read Models

4.3.1.1 Grouped Models

## Get all intraday files.
fls <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_1080_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_1200_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_480_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_360_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_240_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_180_1.p_[0-9]{0,}.[0-9]{4}') %>% 
  sort

fls_pth <- paste0(.dtr, 'data/fx/USDJPY/intraday/', fls)

mds_ets_MNN_intraday_1min <- ldply(1:length(fls), function(i) {
  
  nms <- fls[i] %>% 
    str_replace_all('.rds', '') %>% 
    str_split('_|\\.') %>% 
    .[[1]]
  
  nms <- nms[-6]
  names(nms) <- c('t_series', 'model', 'sub_model', 
                  'data_min', 'fc_min', 'part', 'date')
  
  datset2 <- t(nms) %>% 
    data.frame %>% 
    mutate(model =factor(model), sub_model = factor(sub_model), 
           data_min = as.numeric(data_min), 
           fc_min = as.numeric(fc_min), 
           part = as.numeric(part), 
           date = as_date(date))
  
  datset <- read_rds(fls_pth[i])
  
  res <- tibble(datset2, datset) %>% 
    dplyr::select(index, t_series, model, sub_model, data_min, 
                  fc_min, part, date, mk.price, fc.price)
  res <- res[!is.na('mk.price'),]
  cat(i, '/', length(fls), '=', nms, '\n')
  
  return(res)
  
}) %>% 
  as_tibble

## https://tysonbarrett.com/jekyll/update/2019/10/06/datatable_memory/
## http://brooksandrew.github.io/simpleblog/articles/advanced-data-table/
## https://atrebas.github.io/post/2019-03-03-datatable-dplyr/

saveRDS(mds_ets_MNN_intraday_1min, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1min.rds'))

mds_ets_MNN_intraday_1min_1y <- mds_ets_MNN_intraday_1min[date <= as_date('2016-12-31')]
saveRDS(mds_ets_MNN_intraday_1min_1y, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1min_1y.rds'))
## Get all intraday files.
fls <- list.files(paste0(.dtr, 'data/fx/USDJPY/intraday/'), pattern = '^ts_ets_MNN_960_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_840_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_720_1.p_[0-9]{0,}.[0-9]{4}|^ts_ets_MNN_600_1.p_[0-9]{0,}.[0-9]{4}') %>% 
  sort
#'2016-02-14'

fls_pth <- paste0(.dtr, 'data/fx/USDJPY/intraday/', fls)

mds_ets_MNN_intraday2_1min <- ldply(1:length(fls), function(i) {
  
  nms <- fls[i] %>% 
    str_replace_all('.rds', '') %>% 
    str_split('_|\\.') %>% 
    .[[1]]
  
  nms <- nms[-6]
  names(nms) <- c('t_series', 'model', 'sub_model', 
                  'data_min', 'fc_min', 'part', 'date')
  
  datset2 <- t(nms) %>% 
    data.frame %>% 
    mutate(model =factor(model), sub_model = factor(sub_model), 
           data_min = as.numeric(data_min), 
           fc_min = as.numeric(fc_min), 
           part = as.numeric(part), 
           date = as_date(date))
  
  datset <- read_rds(fls_pth[i])
  
  res <- tibble(datset2, datset) %>% 
    dplyr::select(index, t_series, model, sub_model, data_min, 
                  fc_min, part, date, mk.price, fc.price)
  res <- res[!is.na('mk.price'),]
  cat(i, '/', length(fls), '=', nms, '\n')
  
  return(res)
  
}) %>% 
  as_tibble

## https://tysonbarrett.com/jekyll/update/2019/10/06/datatable_memory/
## http://brooksandrew.github.io/simpleblog/articles/advanced-data-table/
## https://atrebas.github.io/post/2019-03-03-datatable-dplyr/

mds_ets_MNN_intraday2_1min %<>% arrange(index, data_min)
saveRDS(mds_ets_MNN_intraday2_1min, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday2_1min.rds'))
#ts_ets_MNN_960_1.p_277.2016-06-14
#ts_ets_MNN_840_1.p_1316.2016-06-14
#ts_ets_MNN_720_1.p_103.2016-06-13
#ts_ets_MNN_600_1.p_839.2016-05-06

mds_ets_MNN_intraday2_1min_1y <- mds_ets_MNN_intraday2_1min[date <= as_date('2016-12-31')]
saveRDS(mds_ets_MNN_intraday2_1min_1y, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday2_1min_1y.rds'))

4.3.1.2 Long Format

rm(list = ls())

if(!exists('mds_ets_MNN_intraday_1min_1y')) {
  mds_ets_MNN_intraday_1min_1y <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday_1min_1y.rds')) }

if(!exists('mds_ets_MNN_intraday2_1min_1y')) {
  mds_ets_MNN_intraday2_1min_1y <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday2_1min_1y.rds')) }

mds_ets_MNN_intraday3_1min_1y <- rbind(mds_ets_MNN_intraday_1min_1y, mds_ets_MNN_intraday2_1min_1y)

saveRDS(mds_ets_MNN_intraday3_1min_1y, paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y.rds'))

mds_ets_MNN_intraday3_1min_1y <- readRDS(paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y.rds'))

mds_ets_MNN_intraday3_1min_1y_cmp <- mds_ets_MNN_intraday3_1min_1y %>% 
  #tidyr::unite(model, t_series:part) %>% 
  tidyr::unite(model, t_series:fc_min) %>% 
  as.data.table %>% 
  .[, .(index, model, mk.price, fc.price)] %>% as.data.table

mds_ets_MNN_intraday3_1min_1y_cmp <- as.data.table(mds_ets_MNN_intraday3_1min_1y_cmp)

## ----------------------------------------
## fromLast = FALSE
mds_ets_MNN_intraday3_1min_1y_cmp_fLF <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, mk.price, fc.price)], fromLast = FALSE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday3_1min_1y_cmp_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_cmp_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
mds_ets_MNN_intraday3_1min_1y_cmp_fLT <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, mk.price, fc.price)], fromLast = TRUE)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday3_1min_1y_cmp_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_cmp_fLT.rds'))

## ----------------------------------------
## convert to long format for plot chart
## fromLast = FALSE
prc <- unique(mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, mk.price)], fromLast = FALSE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = FALSE)

mds_ets_MNN_intraday3_1min_1y_grph <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, fc.price)], fromLast = FALSE)
setnames(mds_ets_MNN_intraday3_1min_1y_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday3_1min_1y_grph <- rbind(mds_ets_MNN_intraday3_1min_1y_grph, prc)
mds_ets_MNN_intraday3_1min_1y_grph_fLF <- data.table(mds_ets_MNN_intraday3_1min_1y_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday3_1min_1y_grph_fLF, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_grph_fLF.rds'))

## ----------------------------------------
## fromLast = TRUE
prc <- unique(mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, mk.price)], fromLast = TRUE)
prc <- prc[, model := 'actual'][]
setnames(prc, old = 'mk.price', new = 'price')
prc <- unique(prc, fromLast = TRUE)

mds_ets_MNN_intraday3_1min_1y_grph <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp[, .(index, model, fc.price)], fromLast = TRUE)
setnames(mds_ets_MNN_intraday3_1min_1y_grph, old = 'fc.price', new = 'price')

mds_ets_MNN_intraday3_1min_1y_grph <- rbind(mds_ets_MNN_intraday3_1min_1y_grph, prc)
mds_ets_MNN_intraday3_1min_1y_grph_fLT <- data.table(mds_ets_MNN_intraday3_1min_1y_grph)[order(index)]
rm(prc)

## save dataset in data.table format
saveRDS(mds_ets_MNN_intraday3_1min_1y_grph_fLT, 
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_grph_fLT.rds'))
if(!exists('mds_ets_MNN_intraday3_1min_1y')) {
  mds_ets_MNN_intraday3_1min_1y <- read_rds(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y.rds')) }

## plot sample data
mds_ets_MNN_intraday3_1min_1y[c(1:3, (nrow(mds_ets_MNN_intraday3_1min_1y)-3):nrow(mds_ets_MNN_intraday3_1min_1y)),] %>% 
  kbl(caption = '1 Year Data Sample (ETS MNN intraday forecast 1min)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  ## https://public.tableau.com/en-us/gallery/100-color-palettes?gallery=votd
  row_spec(0, background = 'DimGrey', color = 'gold', bold = TRUE) %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'Gray') %>% 
  column_spec(3, background = 'DarkGrey') %>% 
  column_spec(4, background = 'Gray') %>% 
  column_spec(5, background = 'DarkGrey') %>% 
  column_spec(6, background = '#4897D8') %>% 
  column_spec(7, background = '#375E97') %>% 
  column_spec(8, background = 'CornflowerBlue') %>% 
  column_spec(9, background = 'Gainsboro', color = 'goldenrod') %>% 
  column_spec(10, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')
1 Year Data Sample (ETS MNN intraday forecast 1min)
.id index t_series model sub_model data_min fc_min part date mk.price fc.price
180 2016-01-04 00:02:00 ts ets MNN 180 1 1 2016-01-04 120.2200 120.2104
180 2016-01-04 00:03:00 ts ets MNN 180 1 2 2016-01-04 120.2200 120.2200
180 2016-01-04 00:04:00 ts ets MNN 180 1 3 2016-01-04 120.2185 120.2200
1200 2016-12-31 23:57:00 ts ets MNN 1200 1 1437 2016-12-31 117.0270 117.0270
1200 2016-12-31 23:58:00 ts ets MNN 1200 1 1438 2016-12-31 117.0270 117.0270
1200 2016-12-31 23:59:00 ts ets MNN 1200 1 1439 2016-12-31 117.0270 117.0270
1200 2017-01-01 00:00:00 ts ets MNN 1200 1 1440 2017-01-01 117.0270 117.0270

source : 3742909 x 11

There has a small mistake in previous paper Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I) but doesn’t affect since I only want to compare the models and here I use the same MNN model and filter unique(fromLast = FALSE) and unique(fromLast = TRUE).

if(!exists('mds_ets_MNN_intraday3_1min_1y_grph_fLF')) {
  mds_ets_MNN_intraday3_1min_1y_grph_fLF <- readRDS(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_grph_fLF.rds')) }

if(!exists('mds_ets_MNN_intraday3_1min_1y_grph_fLT')) {
  mds_ets_MNN_intraday3_1min_1y_grph_fLT <- readRDS(
    paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_grph_fLT.rds')) }
data.frame(mds_ets_MNN_intraday3_1min_1y_grph_fLF)[
  c(1:5, (nrow(mds_ets_MNN_intraday3_1min_1y_grph_fLF)-5):nrow(mds_ets_MNN_intraday3_1min_1y_grph_fLF)),] %>% 
  kbl(caption = '1 Year Data Sample', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = '#556DAC') %>% 
  column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
1 Year Data Sample
index model price
1 2016-01-04 00:01:00 ts_ets_MNN_360_1 120.2080
2 2016-01-04 00:01:00 actual 120.2200
3 2016-01-04 00:02:00 ts_ets_MNN_180_1 120.2104
4 2016-01-04 00:02:00 ts_ets_MNN_240_1 120.2104
5 2016-01-04 00:02:00 ts_ets_MNN_360_1 120.2104
4117208 2016-12-31 23:59:00 ts_ets_MNN_1080_1 117.0270
4117209 2016-12-31 23:59:00 ts_ets_MNN_1200_1 117.0270
4117210 2016-12-31 23:59:00 actual 117.0270
4117211 2017-01-01 00:00:00 ts_ets_MNN_1080_1 117.0270
4117212 2017-01-01 00:00:00 ts_ets_MNN_1200_1 117.0270
4117213 2017-01-01 00:00:00 actual 117.0270

source : 4117213 x 3

data.frame(mds_ets_MNN_intraday3_1min_1y_grph_fLT)[
  c(1:6, (nrow(mds_ets_MNN_intraday3_1min_1y_grph_fLT)-5):nrow(mds_ets_MNN_intraday3_1min_1y_grph_fLT)),] %>% 
  kbl(caption = '1 Year Data Sample', escape = FALSE) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = '#556DAC') %>% 
  column_spec(4, background = 'LightGray', color = 'goldenrod') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
1 Year Data Sample
index model price
1 2016-01-04 00:01:00 ts_ets_MNN_360_1 120.2080
2 2016-01-04 00:01:00 actual 120.2200
3 2016-01-04 00:02:00 ts_ets_MNN_180_1 120.2104
4 2016-01-04 00:02:00 ts_ets_MNN_240_1 120.2104
5 2016-01-04 00:02:00 ts_ets_MNN_360_1 120.2104
6 2016-01-04 00:02:00 ts_ets_MNN_480_1 120.2104
4117208 2016-12-31 23:59:00 ts_ets_MNN_1080_1 117.0270
4117209 2016-12-31 23:59:00 ts_ets_MNN_1200_1 117.0270
4117210 2016-12-31 23:59:00 actual 117.0270
4117211 2017-01-01 00:00:00 ts_ets_MNN_1080_1 117.0270
4117212 2017-01-01 00:00:00 ts_ets_MNN_1200_1 117.0270
4117213 2017-01-01 00:00:00 actual 117.0270

source : 4117213 x 3

4.3.2 Line Chart

4.3.2.1 unique(x, fromLast = FALSE) Dataset

## https://www.r-graph-gallery.com/line-chart-several-groups-ggplot2.html
plt <- mds_ets_MNN_intraday3_1min_1y_grph_fLF %>% 
  ggplot(aes(x = index, y = price, group = model, color = model)) + 
  geom_line() + 

  labs(title = '1 min Open Price Forecasting', 
       subtitle = paste('From', range(unique(mds_ets_MNN_intraday3_1min_1y_grph_fLF$index))[1L], 
                        'to', range(unique(mds_ets_MNN_intraday3_1min_1y_grph_fLF$index))[2L]), 
       caption = "Data source: fxcm") + 
  ylab('Exchange Rates USD/JPY') + 
  theme_economist() + 
  theme(legend.position = 'right')

#ggplotly(plt)
plt

Due to the high volume of data, here I skip the line chart.

4.3.2.2 unique(x, fromLast = TRUE) Dataset

## https://www.r-graph-gallery.com/line-chart-several-groups-ggplot2.html
plt <- mds_ets_MNN_intraday3_1min_1y_grph_fLT %>% 
  ggplot(aes(x = index, y = price, group = model, color = model)) + 
  geom_line() + 

  labs(title = '1 min Open Price Forecasting', 
       subtitle = paste('From', range(unique(mds_ets_MNN_intraday3_1min_1y_grph_fLT$index))[1L], 
                        'to', range(unique(mds_ets_MNN_intraday3_1min_1y_grph_fLT$index))[2L]), 
       caption = "Data source: fxcm") + 
  ylab('Exchange Rates USD/JPY') + 
  theme_economist() + 
  theme(legend.position = 'right')

#ggplotly(plt)
plt

Due to the high volume of data, here I skip the line chart.

4.3.3 Table

4.3.3.1 unique(x, fromLast = FALSE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday3_1min_1y_cmp_fLF
if(!exists('mds_ets_MNN_intraday3_1min_1y_cmp_fLF')) {
    mds_ets_MNN_intraday3_1min_1y_cmp_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_cmp_fLF.rds')) }

if(!is.data.table('mds_ets_MNN_intraday3_1min_1y_cmp_fLF')) {
  mds_ets_MNN_intraday3_1min_1y_cmp_fLF %<>% as.data.table }

mds_ets_MNN_intraday3_1min_1y_cmp_fLF <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp_fLF, fromLast = FALSE, by = c('index', 'model')) %>% 
  na.omit

rp3_1min_1y_fLF <- mds_ets_MNN_intraday3_1min_1y_cmp_fLF[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp3_1min_1y_fLF, paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLF.rds'))
rp3_1min_1y_fLF <- readRDS(paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLF.rds'))

rp3_1min_1y_tbl <- rp3_1min_1y_fLF %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (1 Year Dataset Intraday Forecasted 1 min)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'LightSlateGrey') %>% 
  column_spec(3, background = 'Gainsboro') %>% 
  column_spec(4, background = 'LightGray') %>% 
  column_spec(5, background = 'Gainsboro') %>% 
  column_spec(6, background = 'LightGray') %>% 
  column_spec(7, background = 'Gainsboro') %>%  
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')

rp3_1min_1y_tbl
Accurcy Report (1 Year Dataset Intraday Forecasted 1 min)
model N mae mape rmse smape mse
ts_ets_MNN_1080_1 374296 0.0135525 (rank: 2) 0.0001246 (rank: 2) 0.0233866 (rank: 2) 0.0001246 (rank: 2) 0.0005469 (rank: 2)
ts_ets_MNN_1200_1 374296 0.0135521 (rank: 1) 0.0001246 (rank: 1) 0.0233844 (rank: 1) 0.0001246 (rank: 1) 0.0005468 (rank: 1)
ts_ets_MNN_180_1 374295 0.0135795 (rank: 10) 0.0001248 (rank: 10) 0.0234633 (rank: 10) 0.0001248 (rank: 10) 0.0005505 (rank: 10)
ts_ets_MNN_240_1 374295 0.0135735 (rank: 9) 0.0001248 (rank: 9) 0.0234467 (rank: 9) 0.0001248 (rank: 9) 0.0005497 (rank: 9)
ts_ets_MNN_360_1 374267 0.0135653 (rank: 8) 0.0001247 (rank: 8) 0.0234235 (rank: 8) 0.0001247 (rank: 8) 0.0005487 (rank: 8)
ts_ets_MNN_480_1 374275 0.0135592 (rank: 7) 0.0001247 (rank: 7) 0.0234082 (rank: 7) 0.0001247 (rank: 7) 0.0005479 (rank: 7)
ts_ets_MNN_600_1 374296 0.0135569 (rank: 6) 0.0001246 (rank: 6) 0.0234 (rank: 6) 0.0001246 (rank: 6) 0.0005476 (rank: 6)
ts_ets_MNN_720_1 374297 0.013556 (rank: 5) 0.0001246 (rank: 5) 0.0233952 (rank: 5) 0.0001246 (rank: 5) 0.0005473 (rank: 5)
ts_ets_MNN_840_1 374297 0.0135551 (rank: 4) 0.0001246 (rank: 4) 0.0233913 (rank: 4) 0.0001246 (rank: 4) 0.0005472 (rank: 4)
ts_ets_MNN_960_1 374295 0.0135531 (rank: 3) 0.0001246 (rank: 3) 0.0233885 (rank: 3) 0.0001246 (rank: 3) 0.000547 (rank: 3)

source :

from above models we know the βest model.

4.3.3.2 unique(x, fromLast = TRUE) Dataset

Below table compares the models.

rm(list = ls())

## report for mds_ets_MNN_intraday_1min_1y_cmp_fLT
if(!exists('mds_ets_MNN_intraday3_1min_1y_cmp_fLT')) {
    mds_ets_MNN_intraday3_1min_1y_cmp_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/mds_ets_MNN_intraday3_1min_1y_cmp_fLT.rds')) }

if(!is.data.table('mds_ets_MNN_intraday3_1min_1y_cmp_fLT')) {
  mds_ets_MNN_intraday3_1min_1y_cmp_fLT %<>% as.data.table }

mds_ets_MNN_intraday3_1min_1y_cmp_fLT <- unique(
  mds_ets_MNN_intraday3_1min_1y_cmp_fLT, fromLast = TRUE, by = c('index', 'model')) %>% 
  na.omit

rp3_1min_1y_fLT <- mds_ets_MNN_intraday3_1min_1y_cmp_fLT[, {
  mk.price = mk.price
  fc.price = fc.price
  .SD[, .(.N, 
          mae = MLmetrics::MAE(y_true = mk.price, y_pred = fc.price), 
          mape = MLmetrics::MAPE(y_true = mk.price, y_pred = fc.price), 
          rmse = MLmetrics::RMSE(y_true = mk.price, y_pred = fc.price), 
          smape = Metrics::smape(actual = mk.price, predicted = fc.price), 
          mse = MLmetrics::MSE(y_true = mk.price, y_pred = fc.price)), 
      by=.(model)]}][order(model), ]

## report
saveRDS(rp3_1min_1y_fLT, paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLT.rds'))
rp3_1min_1y_fLT <- readRDS(paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLT.rds'))

rp3_1min_1y_tbl <- rp3_1min_1y_fLT %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (1 Year Dataset Intraday Forecasted 1 mins)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'LightSlateGrey') %>% 
  column_spec(3, background = 'Gainsboro') %>% 
  column_spec(4, background = 'LightGray') %>% 
  column_spec(5, background = 'Gainsboro') %>% 
  column_spec(6, background = 'LightGray') %>% 
  column_spec(7, background = 'Gainsboro') %>%  
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  ##`full_width = FALSE` will auto adjust every single columns width to fit the table full width.
  scroll_box(width = '100%', fixed_thead = TRUE, height = '400px')

rp3_1min_1y_tbl
Accurcy Report (1 Year Dataset Intraday Forecasted 1 mins)
model N mae mape rmse smape mse
ts_ets_MNN_1080_1 374296 0.0135525 (rank: 2) 0.0001246 (rank: 2) 0.0233866 (rank: 2) 0.0001246 (rank: 2) 0.0005469 (rank: 2)
ts_ets_MNN_1200_1 374296 0.0135521 (rank: 1) 0.0001246 (rank: 1) 0.0233844 (rank: 1) 0.0001246 (rank: 1) 0.0005468 (rank: 1)
ts_ets_MNN_180_1 374295 0.0135795 (rank: 10) 0.0001248 (rank: 10) 0.0234633 (rank: 10) 0.0001248 (rank: 10) 0.0005505 (rank: 10)
ts_ets_MNN_240_1 374295 0.0135735 (rank: 9) 0.0001248 (rank: 9) 0.0234467 (rank: 9) 0.0001248 (rank: 9) 0.0005497 (rank: 9)
ts_ets_MNN_360_1 374267 0.0135653 (rank: 8) 0.0001247 (rank: 8) 0.0234235 (rank: 8) 0.0001247 (rank: 8) 0.0005487 (rank: 8)
ts_ets_MNN_480_1 374275 0.0135592 (rank: 7) 0.0001247 (rank: 7) 0.0234082 (rank: 7) 0.0001247 (rank: 7) 0.0005479 (rank: 7)
ts_ets_MNN_600_1 374296 0.0135569 (rank: 6) 0.0001246 (rank: 6) 0.0234 (rank: 6) 0.0001246 (rank: 6) 0.0005476 (rank: 6)
ts_ets_MNN_720_1 374297 0.013556 (rank: 5) 0.0001246 (rank: 5) 0.0233952 (rank: 5) 0.0001246 (rank: 5) 0.0005473 (rank: 5)
ts_ets_MNN_840_1 374297 0.0135551 (rank: 4) 0.0001246 (rank: 4) 0.0233913 (rank: 4) 0.0001246 (rank: 4) 0.0005472 (rank: 4)
ts_ets_MNN_960_1 374295 0.0135531 (rank: 3) 0.0001246 (rank: 3) 0.0233885 (rank: 3) 0.0001246 (rank: 3) 0.000547 (rank: 3)

source :

from above models we know the βest model.

4.3.3.3 Summary

rm(list = ls())

## report for rp_1y_fLF and 
if(!exists('rp_1y_fLF')) {
    rp_1y_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLF.rds')) %>% 
      as.data.table }

## report for rp_1y_fLT and 
if(!exists('rp_1y_fLT')) {
    rp_1y_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp_1y_fLT.rds')) %>% 
      as.data.table }

## report for rp_1min_1y_fLF and 
if(!exists('rp3_1min_1y_fLF')) {
    rp3_1min_1y_fLF <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLF.rds')) %>% 
      as.data.table }

## report for rp_1min_1y_fLT and 
if(!exists('rp3_1min_1y_fLT')) {
    rp3_1min_1y_fLT <- read_rds(
        paste0(.dtr, 'data/fx/USDJPY/rp3_1min_1y_fLT.rds')) %>% 
      as.data.table }


rp_1y_fLF <- rp_1y_fLF[, arrange := 'from_first'][]
rp_1y_fLT <- rp_1y_fLT[, arrange := 'from_last'][]

rp3_1min_1y_fLF <- rp3_1min_1y_fLF[, arrange := 'from_first'][]
rp3_1min_1y_fLT <- rp3_1min_1y_fLT[, arrange := 'from_last'][]

rp_1min_1y <- rbindlist(list(rp_1y_fLF, rp_1y_fLT, rp3_1min_1y_fLF, rp3_1min_1y_fLT))
rp_1min_1y <- rp_1min_1y[, .(model, arrange, N, mae, mape, rmse, smape, mse)]
rp_1min_1y %<>% unique

#sum <- rp_1min_1y[mae == min(mae) | mape == min(mape) | rmse == min(rmse) | smape == min(smape) | mse == min(mse)]

rp_1min_1y %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Accurcy Report (1 Year Dataset Initial Stage Comparison)', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  #column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(1, background = '#556DAC') %>% 
  column_spec(2, background = 'grey') %>% 
  column_spec(3, background = 'LightSlateGrey') %>% 
  column_spec(4, background = 'Gainsboro') %>% 
  column_spec(5, background = 'LightGray') %>% 
  column_spec(6, background = 'Gainsboro') %>% 
  column_spec(7, background = 'LightGray') %>% 
  column_spec(8, background = 'Gainsboro') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Accurcy Report (1 Year Dataset Initial Stage Comparison)
model arrange N mae mape rmse smape mse
ts_ets_MNN_1440_1 from_first 374398 0.0135726 (rank: 18) 0.0001248 (rank: 18) 0.0235634 (rank: 22) 0.0001248 (rank: 18) 0.0005552 (rank: 22)
ts_ets_MNN_1440_10 from_first 374400 0.0310264 (rank: 28) 0.0002852 (rank: 28) 0.0535552 (rank: 28) 0.0002852 (rank: 28) 0.0028682 (rank: 28)
ts_ets_MNN_1440_120 from_first 374400 0.1046746 (rank: 38) 0.0009631 (rank: 38) 0.1716097 (rank: 38) 0.000963 (rank: 38) 0.0294499 (rank: 38)
ts_ets_MNN_1440_15 from_first 374400 0.0373874 (rank: 30) 0.0003437 (rank: 30) 0.064235 (rank: 30) 0.0003437 (rank: 30) 0.0041261 (rank: 30)
ts_ets_MNN_1440_180 from_first 374400 0.129417 (rank: 40) 0.0011914 (rank: 40) 0.2116718 (rank: 40) 0.0011911 (rank: 40) 0.044805 (rank: 40)
ts_ets_MNN_1440_20 from_first 374400 0.0427459 (rank: 32) 0.0003931 (rank: 32) 0.0730338 (rank: 32) 0.0003931 (rank: 32) 0.0053339 (rank: 32)
ts_ets_MNN_1440_240 from_first 374400 0.148679 (rank: 42) 0.0013704 (rank: 42) 0.245548 (rank: 42) 0.00137 (rank: 42) 0.0602938 (rank: 42)
ts_ets_MNN_1440_30 from_first 374400 0.0524834 (rank: 34) 0.0004828 (rank: 34) 0.0890827 (rank: 34) 0.0004827 (rank: 34) 0.0079357 (rank: 34)
ts_ets_MNN_1440_360 from_first 374400 0.1784428 (rank: 44) 0.0016443 (rank: 44) 0.2897381 (rank: 44) 0.0016439 (rank: 44) 0.0839482 (rank: 44)
ts_ets_MNN_1440_480 from_first 374400 0.2263737 (rank: 46) 0.0020871 (rank: 46) 0.3521562 (rank: 46) 0.0020863 (rank: 46) 0.124014 (rank: 46)
ts_ets_MNN_1440_6 from_first 374400 0.0247197 (rank: 24) 0.0002272 (rank: 24) 0.0428744 (rank: 24) 0.0002272 (rank: 24) 0.0018382 (rank: 24)
ts_ets_MNN_1440_60 from_first 374400 0.0738649 (rank: 36) 0.0006797 (rank: 36) 0.1238921 (rank: 36) 0.0006796 (rank: 36) 0.0153493 (rank: 36)
ts_ets_MNN_1440_720 from_first 374400 0.2755691 (rank: 48) 0.0025449 (rank: 48) 0.4395358 (rank: 50) 0.0025432 (rank: 48) 0.1931917 (rank: 50)
ts_ets_MNN_1440_8 from_first 374400 0.0281814 (rank: 26) 0.0002591 (rank: 26) 0.0494359 (rank: 26) 0.0002591 (rank: 26) 0.0024439 (rank: 26)
ts_ets_MNN_7200_1440 from_first 374400 0.4072728 (rank: 52) 0.0037581 (rank: 52) 0.6228677 (rank: 52) 0.0037537 (rank: 52) 0.3879641 (rank: 52)
ts_ets_MNN_7200_720 from_first 374400 0.275585 (rank: 50) 0.0025451 (rank: 50) 0.4395006 (rank: 48) 0.0025434 (rank: 50) 0.1931608 (rank: 48)
ts_ets_MNN_1440_1 from_last 374398 0.0135726 (rank: 18) 0.0001248 (rank: 18) 0.0235634 (rank: 22) 0.0001248 (rank: 18) 0.0005552 (rank: 22)
ts_ets_MNN_1440_10 from_last 374400 0.0310264 (rank: 28) 0.0002852 (rank: 28) 0.0535552 (rank: 28) 0.0002852 (rank: 28) 0.0028682 (rank: 28)
ts_ets_MNN_1440_120 from_last 374400 0.1046746 (rank: 38) 0.0009631 (rank: 38) 0.1716097 (rank: 38) 0.000963 (rank: 38) 0.0294499 (rank: 38)
ts_ets_MNN_1440_15 from_last 374400 0.0373874 (rank: 30) 0.0003437 (rank: 30) 0.064235 (rank: 30) 0.0003437 (rank: 30) 0.0041261 (rank: 30)
ts_ets_MNN_1440_180 from_last 374400 0.129417 (rank: 40) 0.0011914 (rank: 40) 0.2116718 (rank: 40) 0.0011911 (rank: 40) 0.044805 (rank: 40)
ts_ets_MNN_1440_20 from_last 374400 0.0427459 (rank: 32) 0.0003931 (rank: 32) 0.0730338 (rank: 32) 0.0003931 (rank: 32) 0.0053339 (rank: 32)
ts_ets_MNN_1440_240 from_last 374400 0.148679 (rank: 42) 0.0013704 (rank: 42) 0.245548 (rank: 42) 0.00137 (rank: 42) 0.0602938 (rank: 42)
ts_ets_MNN_1440_30 from_last 374400 0.0524834 (rank: 34) 0.0004828 (rank: 34) 0.0890827 (rank: 34) 0.0004827 (rank: 34) 0.0079357 (rank: 34)
ts_ets_MNN_1440_360 from_last 374400 0.1784428 (rank: 44) 0.0016443 (rank: 44) 0.2897381 (rank: 44) 0.0016439 (rank: 44) 0.0839482 (rank: 44)
ts_ets_MNN_1440_480 from_last 374400 0.2263737 (rank: 46) 0.0020871 (rank: 46) 0.3521562 (rank: 46) 0.0020863 (rank: 46) 0.124014 (rank: 46)
ts_ets_MNN_1440_6 from_last 374400 0.0247197 (rank: 24) 0.0002272 (rank: 24) 0.0428744 (rank: 24) 0.0002272 (rank: 24) 0.0018382 (rank: 24)
ts_ets_MNN_1440_60 from_last 374400 0.0738649 (rank: 36) 0.0006797 (rank: 36) 0.1238921 (rank: 36) 0.0006796 (rank: 36) 0.0153493 (rank: 36)
ts_ets_MNN_1440_720 from_last 374400 0.2755691 (rank: 48) 0.0025449 (rank: 48) 0.4395358 (rank: 50) 0.0025432 (rank: 48) 0.1931917 (rank: 50)
ts_ets_MNN_1440_8 from_last 374400 0.0281814 (rank: 26) 0.0002591 (rank: 26) 0.0494359 (rank: 26) 0.0002591 (rank: 26) 0.0024439 (rank: 26)
ts_ets_MNN_7200_1440 from_last 374400 0.4072728 (rank: 52) 0.0037581 (rank: 52) 0.6228677 (rank: 52) 0.0037537 (rank: 52) 0.3879641 (rank: 52)
ts_ets_MNN_7200_720 from_last 374400 0.275585 (rank: 50) 0.0025451 (rank: 50) 0.4395006 (rank: 48) 0.0025434 (rank: 50) 0.1931608 (rank: 48)
ts_ets_MNN_1080_1 from_first 374296 0.0135525 (rank: 4) 0.0001246 (rank: 4) 0.0233866 (rank: 4) 0.0001246 (rank: 4) 0.0005469 (rank: 4)
ts_ets_MNN_1200_1 from_first 374296 0.0135521 (rank: 2) 0.0001246 (rank: 2) 0.0233844 (rank: 2) 0.0001246 (rank: 2) 0.0005468 (rank: 2)
ts_ets_MNN_180_1 from_first 374295 0.0135795 (rank: 22) 0.0001248 (rank: 22) 0.0234633 (rank: 20) 0.0001248 (rank: 22) 0.0005505 (rank: 20)
ts_ets_MNN_240_1 from_first 374295 0.0135735 (rank: 20) 0.0001248 (rank: 20) 0.0234467 (rank: 18) 0.0001248 (rank: 20) 0.0005497 (rank: 18)
ts_ets_MNN_360_1 from_first 374267 0.0135653 (rank: 16) 0.0001247 (rank: 16) 0.0234235 (rank: 16) 0.0001247 (rank: 16) 0.0005487 (rank: 16)
ts_ets_MNN_480_1 from_first 374275 0.0135592 (rank: 14) 0.0001247 (rank: 14) 0.0234082 (rank: 14) 0.0001247 (rank: 14) 0.0005479 (rank: 14)
ts_ets_MNN_600_1 from_first 374296 0.0135569 (rank: 12) 0.0001246 (rank: 12) 0.0234 (rank: 12) 0.0001246 (rank: 12) 0.0005476 (rank: 12)
ts_ets_MNN_720_1 from_first 374297 0.013556 (rank: 10) 0.0001246 (rank: 10) 0.0233952 (rank: 10) 0.0001246 (rank: 10) 0.0005473 (rank: 10)
ts_ets_MNN_840_1 from_first 374297 0.0135551 (rank: 8) 0.0001246 (rank: 8) 0.0233913 (rank: 8) 0.0001246 (rank: 8) 0.0005472 (rank: 8)
ts_ets_MNN_960_1 from_first 374295 0.0135531 (rank: 6) 0.0001246 (rank: 6) 0.0233885 (rank: 6) 0.0001246 (rank: 6) 0.000547 (rank: 6)
ts_ets_MNN_1080_1 from_last 374296 0.0135525 (rank: 4) 0.0001246 (rank: 4) 0.0233866 (rank: 4) 0.0001246 (rank: 4) 0.0005469 (rank: 4)
ts_ets_MNN_1200_1 from_last 374296 0.0135521 (rank: 2) 0.0001246 (rank: 2) 0.0233844 (rank: 2) 0.0001246 (rank: 2) 0.0005468 (rank: 2)
ts_ets_MNN_180_1 from_last 374295 0.0135795 (rank: 22) 0.0001248 (rank: 22) 0.0234633 (rank: 20) 0.0001248 (rank: 22) 0.0005505 (rank: 20)
ts_ets_MNN_240_1 from_last 374295 0.0135735 (rank: 20) 0.0001248 (rank: 20) 0.0234467 (rank: 18) 0.0001248 (rank: 20) 0.0005497 (rank: 18)
ts_ets_MNN_360_1 from_last 374267 0.0135653 (rank: 16) 0.0001247 (rank: 16) 0.0234235 (rank: 16) 0.0001247 (rank: 16) 0.0005487 (rank: 16)
ts_ets_MNN_480_1 from_last 374275 0.0135592 (rank: 14) 0.0001247 (rank: 14) 0.0234082 (rank: 14) 0.0001247 (rank: 14) 0.0005479 (rank: 14)
ts_ets_MNN_600_1 from_last 374296 0.0135569 (rank: 12) 0.0001246 (rank: 12) 0.0234 (rank: 12) 0.0001246 (rank: 12) 0.0005476 (rank: 12)
ts_ets_MNN_720_1 from_last 374297 0.013556 (rank: 10) 0.0001246 (rank: 10) 0.0233952 (rank: 10) 0.0001246 (rank: 10) 0.0005473 (rank: 10)
ts_ets_MNN_840_1 from_last 374297 0.0135551 (rank: 8) 0.0001246 (rank: 8) 0.0233913 (rank: 8) 0.0001246 (rank: 8) 0.0005472 (rank: 8)
ts_ets_MNN_960_1 from_last 374295 0.0135531 (rank: 6) 0.0001246 (rank: 6) 0.0233885 (rank: 6) 0.0001246 (rank: 6) 0.000547 (rank: 6)

source : 52 x 8

5 Conclusion

5.1 Final Conclude

sum <- rp_1min_1y[mae == min(mae) | mape == min(mape) | rmse == min(rmse) | smape == min(smape) | mse == min(mse)]

sum %>% 
  dplyr::mutate(
    mae = ifelse(
      rank(mae) <= 3, 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mae, 7), ' (rank: ', sprintf('%1.f', rank(mae)), ')'), 
        color = 'grey', italic = TRUE)), 
    mape = ifelse(
      rank(mape) <= 3, 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mape, 7), ' (rank: ', sprintf('%1.f', rank(mape)), ')'), 
        color = 'grey', italic = TRUE)), 
    rmse = ifelse(
      rank(rmse) <= 3, 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(rmse, 7), ' (rank: ', sprintf('%1.f', rank(rmse)), ')'), 
        color = 'grey', italic = TRUE)), 
    smape = ifelse(
      rank(smape) <= 3, 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(smape, 7), ' (rank: ', sprintf('%1.f', rank(smape)), ')'), 
        color = 'grey', italic = TRUE)), 
    mse = ifelse(
      rank(mse) <= 3, 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'darkgoldenrod', bold = TRUE), 
      cell_spec(
        paste0(round(mse, 7), ' (rank: ', sprintf('%1.f', rank(mse)), ')'), 
        color = 'grey', italic = TRUE))) %>% 
  kbl(caption = 'Best Model', escape = FALSE) %>% 
  ## https://www.w3schools.com/cssref/css_colors.asp
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue') %>% 
  column_spec(2, background = '#556DAC') %>% 
  column_spec(3, background = 'LightSlateGrey') %>% 
  column_spec(4, background = 'LightGray') %>% 
  column_spec(5, background = 'Gainsboro') %>% 
  column_spec(6, background = 'LightGray') %>% 
  column_spec(7, background = 'Gainsboro') %>% 
  column_spec(8, background = 'LightGray') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  kable_material(full_width = FALSE) %>% 
  scroll_box(width = '100%', fixed_thead = TRUE)
Best Model
model arrange N mae mape rmse smape mse
ts_ets_MNN_1200_1 from_first 374296 0.0135521 (rank: 2) 0.0001246 (rank: 2) 0.0233844 (rank: 2) 0.0001246 (rank: 2) 0.0005468 (rank: 2)
ts_ets_MNN_1200_1 from_last 374296 0.0135521 (rank: 2) 0.0001246 (rank: 2) 0.0233844 (rank: 2) 0.0001246 (rank: 2) 0.0005468 (rank: 2)

source : 2 x 8

From 4.2.3.2 Comparison between 1 Year & 3.5 Year Dataset, we can know the βest model based on the unique from_first dataset.

From table above, we know that ts_ets_MNN_1200_1 from_first is the βest model.

5.2 Future Studies

Next papers will compare tbats, midas, sarimax etc.

Deriv.com - Interday High Frequency Trading Models Comparison Review (Part III)

Beyond the future, will be publish Chinese Language thesis, there as a lot of online website language translator.

近期招聘一览表:*全网Quant都在看!

6 Appendix

6.1 Blooper

There has a small mistake in previous paper Deriv.com - Interday High Frequency Trading Models Comparison Review (Part I) but doesn’t affect since I only want to compare the models and here I use the same MNN model and filter unique(fromLast = FALSE) and unique(fromLast = TRUE).

6.2 Documenting File Creation

It’s useful to record some information about how your file was created.

  • File creation date: 2021-02-03
  • File latest updated date: 2021-04-23
  • R version 4.0.5 (2021-03-31)
  • R version (short form): 4.0.5
  • rmarkdown package version: 2.7
  • File version: 1.0.0
  • Author Profile: ®γσ, Eng Lian Hu
  • GitHub: Source Code
  • Additional session information:
suppressMessages(require('dplyr', quietly = TRUE))
suppressMessages(require('magrittr', quietly = TRUE))
suppressMessages(require('formattable', quietly = TRUE))
suppressMessages(require('knitr', quietly = TRUE))
suppressMessages(require('kableExtra', quietly = TRUE))

sys1 <- devtools::session_info()$platform %>% 
  unlist %>% data.frame(Category = names(.), session_info = .)
rownames(sys1) <- NULL

sys2 <- data.frame(Sys.info()) %>% 
  dplyr::mutate(Category = rownames(.)) %>% .[2:1]
names(sys2)[2] <- c('Sys.info')
rownames(sys2) <- NULL

if (nrow(sys1) == 9 & nrow(sys2) == 8) {
  sys2 %<>% rbind(., data.frame(
  Category = 'Current time', 
  Sys.info = paste(as.character(lubridate::now('Asia/Tokyo')), 'JST🗾')))
} else {
  sys1 %<>% rbind(., data.frame(
  Category = 'Current time', 
  session_info = paste(as.character(lubridate::now('Asia/Tokyo')), 'JST🗾')))
}

sys <- cbind(sys1, sys2) %>% 
  kbl(caption = 'Additional session information:') %>% 
  kable_styling(bootstrap_options = c('striped', 'hover', 'condensed', 'responsive')) %>% 
  row_spec(0, background = 'DimGrey', color = 'yellow') %>% 
  column_spec(1, background = 'CornflowerBlue', color = 'red') %>% 
  column_spec(2, background = 'grey', color = 'black') %>% 
  column_spec(3, background = 'CornflowerBlue', color = 'blue') %>% 
  column_spec(4, background = 'grey', color = 'white') %>% 
  row_spec(9, bold = T, color = 'yellow', background = '#D7261E')

rm(sys1, sys2)
sys
Additional session information:
Category session_info Category Sys.info
version R version 4.0.5 (2021-03-31) sysname Windows
os Windows 10 x64 release 10 x64
system x86_64, mingw32 version build 19042
ui RTerm nodename SCIBROKES-TRADI
language (EN) machine x86-64
collate English_World.1252 login Owner
ctype English_World.1252 user Owner
tz Asia/Tokyo effective_user Owner
date 2021-04-23 Current time 2021-04-23 21:21:36 JST<U+0001F5FE>