Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -8.894 Tracking Error 0.108 Treynor Ratio 0 Total Fees $0.00 |
class TransdimensionalOptimizedChamber(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 12, 10) # Set Start Date # self.SetEndDate(2020, 6, 16) self.SetCash(100000) # Set Strategy Cash self.AddEquity("SPY", Resolution.Hour) history = self.History(self.Symbol("SPY"), 3640, Resolution.Hour) self.TrainOnHistory(history) self.Log("test"); def OnData(self, data): # if not self.Portfolio.Invested: # self.SetHoldings("SPY", 1) pass def TrainOnHistory(self, history): rsiLevelsToTest = [35, 30, 25, 20, 15, 10] targetPointsCombination = [5, 10, 20] stoplossPointsCombination = [5, 10, 20] analysis = [] for rsiLevel in rsiLevelsToTest: #---------------Data gathering------------------ for targetPoints in targetPointsCombination: for stoplossPoints in stoplossPointsCombination: self.rsi = self.RSI("SPY", 14, MovingAverageType.Wilders, Resolution.Hour) positions = {} openPositions = [] profitable = [] losses = [] profitPoints = [] drawdownPoints = [] for bar in history.itertuples(): self.rsi.Update(bar.Index[1], bar.close) if self.rsi.IsReady: #create a fake position when rsi is below 30 if self.rsi.Current.Value < rsiLevel and len(openPositions) == 0: positions[bar.Index[1]] = TrainModel(bar, self.rsi.Current.Value) openPositions.append(bar.Index[1]) for time in openPositions: trainModel = positions[time] trainModel.priceTracker.append(bar.close) if(trainModel.startingBar.close > bar.close): if(trainModel.startingBar.close - bar.close >= stoplossPoints): #loss losses.append(time) drawdownPoints.append(trainModel.startingBar.close - bar.close) openPositions.remove(time) continue if(trainModel.startingBar.close < bar.close): if(bar.close - trainModel.startingBar.close >= targetPoints): #win profitable.append(time) profitPoints.append(bar.close - trainModel.startingBar.close) openPositions.remove(time) continue self.Log("--------------- " + str(rsiLevel) + "-------------------") self.Log("Training tracked " + str(len(positions)) + " positions") if len(positions) > 0 : self.Log("STOPLOSS: " + str(stoplossPoints) + " - Target : " + str(targetPoints)) strikeRate = len(profitable) / (len(profitable) + len(losses)) self.Log("Strikerate: " + str(strikeRate * 100)) maxProfit = max(profitPoints) self.Log("Maximum profit: " + str(maxProfit)) minProfit = min(profitPoints) self.Log("Minimum profit: " + str(minProfit)) averageProfit = sum(profitPoints) / len(profitPoints) self.Log("Average profit: " + str(averageProfit)) maxDrawdown = max(drawdownPoints) self.Log("Maximum drawdown: " + str(maxDrawdown)) # averageHoldingPeriod = sum(holdingPeriod) / len(holdingPeriod) # self.Log("Average holding period: " + str(averageHoldingPeriod)) strategyScore = ( averageProfit * (len(positions) * strikeRate) ) - ( maxDrawdown * (len(positions) * (1-strikeRate)) ) self.Log("STRATEGY SCORE: " + str(strategyScore)) self.Log("---------------------------------------------------") # strategyScore = ( averageProfit * (len(positions) * strikeRate) ) - ( maxDrawdown * (len(positions) * (1-strikeRate)) ) analysis.append(AnalyseModel(rsiLevel, strategyScore)) self.bestSettings = sorted(analysis, key=lambda f: f.strategyScore, reverse=True)[0] class TrainModel: def __init__(self, bar, startingRsi): self.startingBar = bar self.startingRsi = startingRsi self.priceTracker = [] #close prices [int] class AnalyseModel: def __init__(self, rsi, strategyScore): self.rsi = rsi self.strategyScore = strategyScore