Overall Statistics |
Total Trades 22 Average Win 1.27% Average Loss -0.75% Compounding Annual Return 31.157% Drawdown 6.400% Expectancy 0.922 Net Profit 4.327% Sharpe Ratio 1.348 Probabilistic Sharpe Ratio 53.932% Loss Rate 29% Win Rate 71% Profit-Loss Ratio 1.69 Alpha 0.064 Beta 0.487 Annual Standard Deviation 0.168 Annual Variance 0.028 Information Ratio -0.635 Tracking Error 0.171 Treynor Ratio 0.466 Total Fees $42.94 Estimated Strategy Capacity $540000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
# region imports from AlgorithmImports import * from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV import joblib # endregion class ScikitLearnExampleAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 7, 4) self.SetCash(100000) self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol training_length = 252*2 self.training_data = RollingWindow[TradeBar](training_length) history = self.History[TradeBar](self.symbol, training_length, Resolution.Daily) for trade_bar in history: self.training_data.Add(trade_bar) if self.ObjectStore.ContainsKey("model"): file_name = self.ObjectStore.GetFilePath("model") self.model = joblib.load(file_name) else: param_grid = {'C': [.05, .1, .5, 1, 5, 10], 'epsilon': [0.001, 0.005, 0.01, 0.05, 0.1], 'gamma': ['auto', 'scale']} self.model = GridSearchCV(SVR(), param_grid, scoring='neg_mean_squared_error', cv=5) self.Train(self.my_training_method) self.Train(self.DateRules.Every(DayOfWeek.Sunday), self.TimeRules.At(8,0), self.my_training_method) def get_features_and_labels(self, n_steps=5): training_df = self.PandasConverter.GetDataFrame[TradeBar](list(self.training_data)[::-1]) daily_pct_change = training_df.pct_change().dropna() features = [] labels = [] for i in range(len(daily_pct_change)-n_steps): features.append(daily_pct_change.iloc[i:i+n_steps].values.flatten()) labels.append(daily_pct_change['close'].iloc[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() if isinstance(self.model, GridSearchCV): self.model = self.model.fit(features, labels).best_estimator_ else: self.model = self.model.fit(features, labels) def OnData(self, slice: Slice) -> None: if self.symbol in slice.Bars: self.training_data.Add(slice.Bars[self.symbol]) features, _ = self.get_features_and_labels() prediction = self.model.predict(features[-1].reshape(1, -1)) prediction = float(prediction) if prediction > 0: self.SetHoldings(self.symbol, 1) elif prediction < 0: self.SetHoldings(self.symbol, -1) def OnEndOfAlgorithm(self): model_key = "model" file_name = self.ObjectStore.GetFilePath(model_key) joblib.dump(self.model, file_name) self.ObjectStore.Save(model_key)