Posted By: Dalla
How to ensamble multiple algos with advise calls? - 01/01/18 20:39
I have in my script defined four different algos, three that are trained using different timeframes but using the same input data and neural network classifier.
What I want to do in my script is to use the COMBO algo as an ensemble for the other three algos. The script runs just fine, but I would expect that the performance of the individual components remains the same regardsless of including the COMBO algo or not. But this is not the case. If I exclude the COMBO algo, the indivudual performance of the other algos change, leading me to believe that I´ve misunderstood how the ensemble multiple algos.
Please advise!
What I want to do in my script is to use the COMBO algo as an ensemble for the other three algos. The script runs just fine, but I would expect that the performance of the individual components remains the same regardsless of including the COMBO algo or not. But this is not the case. If I exclude the COMBO algo, the indivudual performance of the other algos change, leading me to believe that I´ve misunderstood how the ensemble multiple algos.
Please advise!
Code:
#include <r.h> #define HourLong AssetVar[0] #define HourShort AssetVar[1] #define FourHourLong AssetVar[2] #define FourHourShort AssetVar[3] #define EightHourLong AssetVar[4] #define EightHourShort AssetVar[5] var range(int n) { return (HH(n) - LL(n))/priceClose(0); } // Trend trading function from Workshop 4 function advise() { vars Close = series(priceClose()); // signals int ScalePeriod = 200; var change1 = scale(ROCP(Close, 1), ScalePeriod); var change2 = scale(ROCP(Close, 2), ScalePeriod); var change3 = scale(ROCP(Close, 3), ScalePeriod); var change4 = scale(ROCP(Close, 4), ScalePeriod); var change5 = scale(ROCP(Close, 5), ScalePeriod); var change6 = scale(ROCP(Close, 6), ScalePeriod); var change7 = scale(ROCP(Close, 7), ScalePeriod); var change8 = scale(ROCP(Close, 8), ScalePeriod); var change9 = scale(ROCP(Close, 9), ScalePeriod); var change10 = scale(ROCP(Close, 10), ScalePeriod); var range1 = scale(range(1), ScalePeriod); var range2 = scale(range(2), ScalePeriod); var range3 = scale(range(3), ScalePeriod); var range4 = scale(range(4), ScalePeriod); var range5 = scale(range(5), ScalePeriod); var range6 = scale(range(6), ScalePeriod); var range7 = scale(range(7), ScalePeriod); var range8 = scale(range(8), ScalePeriod); var range9 = scale(range(9), ScalePeriod); var range10 = scale(range(10), ScalePeriod); if(Train) { Hedge = 2; //NumSampleCycles = 5; //LifeTime = 8; if(adviseLong(NEURAL+BALANCED, 0, change1, change2, change3, change4, change5, change6, change7, change8, change9, change10, range1, range2, range3, range4, range5, range6, range7, range8, range9,range10) > 0.5) { enterLong(); } if(adviseShort() > 0.5) { enterShort(); } } if(!Train) { var LongPrediction = adviseLong(NEURAL, 0, change1, change2, change3, change4, change5, change6, change7, change8, change9, change10, range1, range2, range3, range4, range5, range6, range7, range8, range9,range10); var ShortPrediction = adviseShort(); if(Algo == "HOUR") { HourLong = LongPrediction; HourShort = ShortPrediction; } else if(Algo == "4HOUR") { FourHourLong = LongPrediction; FourHourShort = ShortPrediction; } else if(Algo == "8HOUR") { EightHourLong = LongPrediction; EightHourShort = ShortPrediction; } var EntryThrehsold = 0.5; var ExitThreshold = 0.5; if(LongPrediction > ExitThreshold) { exitShort(); if(ShortPrediction < EntryThrehsold) { reverseLong(1); } } if(ShortPrediction > ExitThreshold) { exitLong(); if(LongPrediction < EntryThrehsold) { reverseShort(1); } } plot("LongPred", LongPrediction, NEW|BARS, BLUE+TRANSP); plot("ShortPred", ShortPrediction, 0|BARS, RED+TRANSP); } } function adviseCombo() { if(!Train) { var LongPrediction = (HourLong + FourHourLong + EightHourLong)/3; var ShortPrediction = (HourShort + FourHourShort + EightHourShort)/3; var EntryThrehsold = 0.5; var ExitThreshold = 0.5; if(LongPrediction > ExitThreshold) { exitShort(); if(ShortPrediction < EntryThrehsold) { reverseLong(1); } } if(ShortPrediction > ExitThreshold) { exitLong(); if(LongPrediction < EntryThrehsold) { reverseShort(1); } } plot("LongPred", LongPrediction, NEW|BARS, BLUE+TRANSP); plot("ShortPred", ShortPrediction, 0|BARS, RED+TRANSP); } } var neural(int mode, int model, int numSignals, void* Data) { if(!wait(0)) return 0; // open an R script with the same name as the strategy script if(mode == NEURAL_INIT) { if(!Rstart(strf("%s.r",Script),2)) return 0; Rx("neural.init()"); return 1; } // export batch training samples to a file to be read by R if(mode == NEURAL_TRAIN) { string name = strf("Data\signals%i.csv",Core); file_write(name,Data,0); Rx(strf("XY <- read.csv('%s%s',header = F)",slash(ZorroFolder),slash(name))); if(!Rx(strf("neural.train(%i,XY)",model+1),2)) return 0; return 1; } // predict the target if(mode == NEURAL_PREDICT) { Rset("X",(double*)Data,numSignals); Rx(strf("Y <- neural.predict(%i,X)",model+1)); var pred = Rd("Y[1]"); return pred; } // save all trained models if(mode == NEURAL_SAVE) { print(TO_ANY,"nStore %s",strrchr(Data,'\')+1); return Rx(strf("neural.save('%s')",slash(Data)),3); } // load all trained models if(mode == NEURAL_LOAD) { printf("nLoad %s",strrchr(Data,'\')+1); return Rx(strf("neural.load('%s')",slash(Data)),3); } return 1; } function run() { set(RULES|TESTNOW|PLOTNOW); StartDate = 20160101; EndDate = 20171201; BarPeriod = 60; //LookBack = 1600; LifeTime = 8; NumCores = -1; PlotWidth = 900; WFOPeriod = WFOPeriod = 125*1440/BarPeriod; Spread = Commission = Slippage = RollLong = RollShort = 0; while(algo(loop("HOUR","4HOUR","8HOUR","COMBO"))) { if(Algo == "HOUR") { TimeFrame = 1; LookBack = 200; advise(); } else if(Algo == "4HOUR") { TimeFrame = 4; LookBack = 800; advise(); } else if(Algo == "8HOUR") { TimeFrame = 8; LookBack = 1600; advise(); } else if(Algo == "COMBO") { TimeFrame = 1; LookBack = 200; adviseCombo(); } } }