def run(self): filenames = self.gen_find() if self._data_mode == 'Insample': start_time = '2016-7-1 09:00:00.0' end_time = '2016-10-1 09:00:00.0' else: start_time = '2016-10-1 09:00:00.0' end_time = '2016-12-31 23:59:59.0' for filename in filenames: data = pd.read_csv(self._data_dir + '/' + filename, index_col=0) data = data[(pd.to_datetime(data.index) >= start_time) & (pd.to_datetime(data.index) < end_time)] if len(data) == 0: continue else: signals = [ SLMStrategy(data, self._slm, m).generatingsignal() for m in np.arange(1, self._max_order + 1) ] tcas = [self._tca for m in np.arange(1, self._max_order + 1)] opts = [self._opt for m in np.arange(1, self._max_order + 1)] validator_ensemble = ensembler(vectorizedbacktest, signals, tcas, opts) validator_ensemble.build() validator_ensemble.run() performance = validator_ensemble.calperformance() performance.to_csv(self._valid_dir + '/performance_' + filename) validator_ensemble.plot() plt.savefig(self._valid_dir + '/performance_' + re.sub('.csv', '.png', filename)) plt.close()
def build(self, model_order=8, freq='5min', start='20161001', end='20161221', offset=0, tca=None, fixed_cost=0.0002): """ Read in Data and the probability table Args: model_order: int or list. Number of model orders """ self.test_data = self.test_data[(self.test_data.index >= start) & (self.test_data.index < end)] self.signals = self.compile_signal(self.test_data, self.prob_table, model_orders=model_order) self.ensemble = ensembler(vectorizedbacktest, self.signals, price=self.test_price, tcas=[tca] * (model_order - 1), fixed_cost=fixed_cost) self.ensemble.build()
def build(self, commodity, exp_date, model_order=7, freq='5min', offset=0, start='20160701', end='20161031', tca=None): self.test_data = self.compile_data(commodity, exp_date, start=start, end=end) self.signals = self.compile_signal(self.test_data, self.prob_table, max_order=model_order) self.ensemble = ensembler(vectorizedbacktest, self.signals, tcas=tca) self.ensemble.build()
def build(self, commodity, exp_date, model_order=4, freq=['{}min' for i in range(1, 5)], offset=0, start='20160701', end='20161031', tca=None): self.test_data = self.compile_data(commodity, exp_date, freq=freq, start=start, end=end) self.signals = self.compile_signal(self.test_data, self.prob_table, model_order) self.ensemble = ensembler(vectorizedbacktest, self.signals, tcas=tca, labels=freq) self.ensemble.build()
def build(self, model_order=7, freq='5min', start='20161001', end='20161221', offset=0): """ Read in Data and the probability table Args: model_order: int or list. Number of model orders """ self.test_data = self.test_data[(self.test_data.index >= start) & (self.test_data.index < end)] self.signals = self.compile_signal(self.test_data, self.prob_table, model_orders=model_order) self.ensemble = ensembler(vectorizedbacktest, self.signals, tcas=self._tca, window=self._rollback_window) self.ensemble.build()
def build(self, model_order=7, freq='5min', start='20161001', end='20161221', offset=0, tca=None, labels=None): """ Read in Data and the probability table Args: model_order: int or list. Number of model orders """ self.test_data = self.test_data[(self.test_data.index >= start) & (self.test_data.index < end)] self.signals = self.compile_signal(self.test_data, self.prob_table, price=self.price, model_orders=model_order) all_signals = pd.concat( [df[['signal', 'max_pct']] for df in self.signals], axis=0, keys=range(1, model_order + 1)) all_signals = all_signals.fillna(0) all_signals = all_signals.unstack(level=0) max_pct_signal = self.signals[0].copy() max_pct_signal['signal'] = all_signals.apply( lambda x: x.signal[x.max_pct.idxmax(axis=1)], axis=1) self.signals.append(max_pct_signal) self.ensemble = ensembler(vectorizedbacktest, self.signals, tcas=tca, labels=labels, price=self.price) self.ensemble.build()
def run(self): filenames = self.gen_find() for filename in filenames: data = pd.read_csv(self._data_dir + '/' + filename, index_col=0) data = data[(pd.to_datetime(data.index) >= '2016-7-1 09:00:00.0') & (pd.to_datetime(data.index) < '2016-10-1 09:00:00.0')] if len(data) == 0: continue else: signals = [ SLMStrategy(data, self._slm, m).generatingsignal() for m in np.arange(1, self._max_order + 1) ] validator_ensemble = ensembler(vectorizedbacktest, signals) validator_ensemble.build() validator_ensemble.run() performance = validator_ensemble.calperformance() performance.to_csv(self._valid_dir + '/performance_' + filename) validator_ensemble.plot() plt.savefig(self._valid_dir + '/performance_' + re.sub('.csv', '.png', filename)) plt.close() # validator_ensemble.plot(target_col="benchmark") # plt.savefig(self._valid_dir + '/benchmark_' + re.sub('.csv', '.png', filename)) # plt.close() fig = plt.figure() #benchmark = validator_ensemble.results[0]['return'].cumsum() + 1 benchmark = validator_ensemble.results[0]['benchmark'] #print(len(benchmark.index)) #initial_value = benchmark[0] #benchmark = benchmark/initial_value benchmark.plot() plt.title('Benchmark') fig.savefig(self._valid_dir + '/benchmark_' + re.sub('.csv', '.png', filename)) plt.close() if self._offsets_average: if not self._average_return: self._average_return = [ df['strategy'] for df in validator_ensemble.results ] average_performance = performance average_benchmark = validator_ensemble.results[0][ 'LastPrice'] else: self._average_return = [ df1.add(df2['strategy'], fill_value=0) for (df1, df2) in zip(self._average_return, validator_ensemble.results) ] average_performance = average_performance.add( performance, fill_value=0) average_benchmark = average_benchmark.add( validator_ensemble.results[0]['LastPrice'], fill_value=0) ''' average return of all offsets ''' if self._offsets_average and (self._average_return is not None): self._average_return = [(1 + df.divide(self._n_offsets)).cumprod() for df in self._average_return] average_benchmark = average_benchmark / average_benchmark[0] average_benchmark = average_benchmark.to_frame() average_benchmark['Date'] = pd.to_datetime(average_benchmark.index) #print(average_benchmark) fig = plt.figure() plt.plot(average_benchmark.Date, average_benchmark.LastPrice, label='benchmark') for avg_return, label in zip( self._average_return, np.arange(2, 2 + len(self._average_return))): #avg_return.plot(label=label) df = avg_return.to_frame() df['Date'] = pd.to_datetime(df.index) plt.plot(df.Date, df.strategy, label=label) fig.autofmt_xdate() plt.legend(loc='upper left') plt.title('Equity Curve') plt.show() fig.savefig(self._valid_dir + '/performance_' + self._symbol + '.png') plt.close() average_performance = average_performance.divide(self._n_offsets) print(average_performance) average_performance.to_csv(self._valid_dir + '/performance_' + self._symbol + '.csv')