Overall Statistics |
Total Trades 2204 Average Win 0.62% Average Loss -0.41% Compounding Annual Return 45.537% Drawdown 44.500% Expectancy 0.619 Net Profit 772.182% Sharpe Ratio 1.334 Probabilistic Sharpe Ratio 66.430% Loss Rate 35% Win Rate 65% Profit-Loss Ratio 1.50 Alpha 0 Beta 0 Annual Standard Deviation 0.254 Annual Variance 0.064 Information Ratio 1.334 Tracking Error 0.254 Treynor Ratio 0 Total Fees $2260.51 Estimated Strategy Capacity $120000.00 Lowest Capacity Asset TRXT V4JPUDG8NECL |
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor class Zenith(QCAlgorithm): def Initialize(self): self.SetStartDate(2016, 1, 1) self.SetCash(10000) self.tickers = ["SPY", "QQQ", "SCHA", "VBK", "BOND", "BLV", "BSV", "GLD", "IAU"] self.stocks = [] self.leverage = 4 for i in self.tickers: security = self.AddEquity(i, Resolution.Hour) self.Securities[i].SetLeverage(self.leverage) self.Securities[i].SetDataNormalizationMode(DataNormalizationMode.Raw) security.SetDataNormalizationMode(DataNormalizationMode.Raw) self.stocks.append(security.Symbol) risk1 = self.GetParameter("risk-up") risk2 = self.GetParameter("risk-down") self.UniverseSettings.Resolution = Resolution.Hour # self.UniverseSettings.Leverage = self.leverage self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) #self.AddRiskManagement(TrailingStopRiskManagementModel(0.03)) self.lookback = 60 self.Trade = True self.risk_up = float(risk1) self.risk_down = float(risk2) self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday), self.TimeRules.At(10, 0), self.TradeSet) self.Schedule.On(self.DateRules.Every(DayOfWeek.Thursday), self.TimeRules.At(10, 0), self.Manage) def Manage(self): for symbol in self.stocks: confidence = 1.0 weight = 0.1 #Takeprofit and Stop Loss if self.Portfolio[symbol].Invested and (self.Securities[symbol].Holdings.UnrealizedProfitPercent > self.risk_up or self.Securities[symbol].Holdings.UnrealizedProfitPercent < -(self.risk_down)): self.Liquidate(symbol) def OnData(self, data): if self.Trade == True: history = self.History(self.stocks, self.lookback, Resolution.Daily) self.historical_prices = {} self.predicted_prices = {} for symbol in self.stocks: if not history.empty and data.ContainsKey(symbol): self.historical_prices[symbol] = list(history.loc[symbol.Value]['close']) for symbol in self.stocks: if symbol in self.historical_prices: Y = [] X = [] for price in self.historical_prices[symbol]: Y.append([price]) X.append([price]) train_X, val_X, train_y, val_y = train_test_split(X, Y, random_state=1) price_model = RandomForestRegressor(random_state=1) price_model.fit(train_X, train_y) val_predictions = price_model.predict(val_X) self.predicted_prices[symbol] = val_predictions[4] else: return if not self.predicted_prices: return for symbol in self.stocks: if data.ContainsKey(symbol): magnitude = (self.predicted_prices[symbol] - self.Securities[symbol].Price) / self.Securities[symbol].Price confidence = 1.0 weight = 0.1 if magnitude > 0.001: confidence = 0.75 elif magnitude <= 0.001 and magnitude >= -0.001: confidence = 0.5 elif magnitude < -0.001: confidence = 0.25 if not self.predicted_prices[symbol] > (self.Securities[symbol].Price)*1.15: self.SetHoldings(symbol, weight*self.leverage) elif self.predicted_prices[symbol] < self.Securities[symbol].Price: self.Liquidate(symbol) elif self.predicted_prices[symbol]*1.1 < (self.Securities[symbol].Price): self.SetHoldings(symbol, -weight*self.leverage) self.Trade = False def TradeSet(self): self.Trade = True