Overall Statistics |
Total Orders 1 Average Win 0% Average Loss 0% Compounding Annual Return 247.407% Drawdown 0.100% Expectancy 0 Start Equity 100000 End Equity 101720.56 Net Profit 1.721% Sharpe Ratio 16.656 Sortino Ratio 0 Probabilistic Sharpe Ratio 98.933% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.536 Beta 1.038 Annual Standard Deviation 0.116 Annual Variance 0.013 Information Ratio -31.32 Tracking Error 0.014 Treynor Ratio 1.855 Total Fees $1.34 Estimated Strategy Capacity $920000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X Portfolio Turnover 19.88% |
# region imports from AlgorithmImports import * from gplearn.genetic import SymbolicRegressor, SymbolicTransformer import joblib # endregion class GPlearnExampleAlgorithm(QCAlgorithm): def initialize(self): self.set_start_date(2022, 7, 4) self.set_end_date(2022, 7, 8) self.set_cash(100000) self.symbol = self.add_equity("SPY", Resolution.DAILY).symbol training_length = 252*2 self.training_data = RollingWindow[float](training_length) history = self.history[TradeBar](self.symbol, training_length, Resolution.DAILY) for trade_bar in history: self.training_data.add(trade_bar.close) transformer_model_key = "Transformer" regressor_model_key = "Regressor" if self.object_store.contains_key(transformer_model_key) and self.object_store.contains_key(regressor_model_key): transformer_file_name = self.object_store.get_file_path(transformer_model_key) regressor_file_name = self.object_store.get_file_path(regressor_model_key) self.gp_transformer = joblib.load(transformer_file_name) self.model = joblib.load(regressor_file_name) else: function_set = ['add', 'sub', 'mul', 'div', 'sqrt', 'log', 'abs', 'neg', 'inv', 'max', 'min'] self.gp_transformer = SymbolicTransformer(function_set=function_set) self.model = SymbolicRegressor() self.train(self.my_training_method) self.train(self.date_rules.every(DayOfWeek.SUNDAY), self.time_rules.at(8,0), self.my_training_method) def get_features_and_labels(self, n_steps=5): training_df = list(self.training_data)[::-1] daily_pct_change = ((np.roll(training_df, -1) - training_df) / training_df)[:-1] features = [] labels = [] for i in range(len(daily_pct_change)-n_steps): features.append(daily_pct_change[i:i+n_steps]) labels.append(daily_pct_change[i+n_steps]) features = np.array(features) labels = np.array(labels) return features, labels def my_training_method(self): features, labels = self.get_features_and_labels() # Feature engineering self.gp_transformer.fit(features, labels) gp_features = self.gp_transformer.transform(features) new_features = np.hstack((features, gp_features)) # Fit the regression model with transformed and raw features. self.model.fit(new_features, labels) def on_data(self, slice): features, _ = self.get_features_and_labels() # Get transformed features gp_features = self.gp_transformer.transform(features) new_features = np.hstack((features, gp_features)) # Get next prediction prediction = self.model.predict(new_features) prediction = float(prediction.flatten()[-1]) if prediction > 0: self.set_holdings(self.symbol, 1) elif prediction < 0: self.set_holdings(self.symbol, -1) def on_end_of_algorithm(self): transformer_model_key = "Transformer" regressor_model_key = "Regressor" transformer_file_name = self.object_store.get_file_path(transformer_model_key) regressor_file_name = self.object_store.get_file_path(regressor_model_key) joblib.dump(self.gp_transformer, transformer_file_name) joblib.dump(self.model, regressor_file_name) self.object_store.save(transformer_model_key) self.object_store.save(regressor_model_key)