Overall Statistics |
Total Trades 49 Average Win 0.91% Average Loss -0.81% Compounding Annual Return -17.667% Drawdown 9.500% Expectancy -0.131 Net Profit -2.818% Sharpe Ratio -0.53 Probabilistic Sharpe Ratio 24.040% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.13 Alpha -0.132 Beta 0.937 Annual Standard Deviation 0.205 Annual Variance 0.042 Information Ratio -0.736 Tracking Error 0.182 Treynor Ratio -0.116 Total Fees $485.67 Estimated Strategy Capacity $450000.00 Lowest Capacity Asset TMF UBTUG7D0B7TX Portfolio Turnover 37.51% |
from AlgorithmImports import * import math import pandas as pd from cmath import sqrt from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Data.Custom import * from QuantConnect.Python import PythonData class IntelligentSkyDoge(QCAlgorithm): def Initialize(self): self.cash = 100000 self.buffer_pct = 0.06 # CHANGE YOUR THRESHOLD HERE self.SetStartDate(2023, 4, 1) self.SetEndDate(2023, 5, 24) self.SetCash(self.cash) self.equities = ['VCIT', 'UDN', 'SARK','AMD','FNGU','TSLL','AEHR','MSTR','TARK','XLY','QQQE','VOOG','VOOV','VTV','HIBL','XLK','XLP','SVXY','QID','TBF','TSLA','LQD','VTIP','EDV','STIP','SPTL','IEI','USDU','SQQQ','VIXM','SPXU','QQQ','BSV','TQQQ','SPY','DBC','SHV','IAU','VEA','UTSL','UVXY','UPRO','EFA','EEM','TLT','SHY','GLD','SLV','USO','WEAT','CORN','SH','DRN','PDBC','COMT','KOLD','BOIL','ESPO','PEJ','UGL','URE','VXX','UUP','BND','BIL','DUST','JDST','JNUG','GUSH','DBA','DBB','COM','PALL','AGQ','BAL','WOOD','URA','SCO','UCO','DBO','TAGS','CANE','REMX','COPX','IEF','SPDN','CHAD','DRIP','SPUU','INDL','BRZU','ERX','ERY','CWEB','CHAU','KORU','MEXX','EDZ','EURL','YINN','YANG','TNA','TZA','SPXL','SPXS','MIDU','TYD','TYO','TMF','TMV','TECL','TECS','SOXL','SOXS','LABU','LABD','RETL','DPST','DRV','PILL','CURE','FAZ','FAS','EWA','EWGS','EWG','EWP','EWQ','EWU','EWJ','EWI','EWN','ECC','NURE','VNQI','VNQ','VDC','VIS','VGT','VAW','VPU','VOX','VFH','VHT','VDE','SMH','DIA','UDOW','PSQ','SOXX','VTI','COST','UNH','SPHB','BTAL','VIXY','WEBL','WEBS','UBT','PST','TLH','QLD','SQM','SSO','SD','DGRO','SCHD','SGOL','TIP','DUG','EWZ','TBX','VGIT','VGLT','CCOR','LBAY','NRGD','PHDG','SPHD','COWZ','CTA','DBMF','GDMA','VIGI','AGG','NOBL','FAAR','BITO','FTLS','MORT','FNDX','GLL','NTSX','RWL','VLUE','IJR','SPYG','VXUS','AAL','AEP','AFL','C','CMCSA','DUK','EXC','F','GM','GOOGL','INTC','JNJ','KO','MET','NWE','OXY','PFE','RTX','SNY','SO','T','TMUS','VZ','WFC','WMT','AMZN','MSFT','NVDA','TSM','BA','CB','COKE','FDX','GE','LMT','MRK','NVEC','ORCL','PEP','V','DBE','BRK-B','CRUS','INFY','KMLM','NSYS','SCHG','SGML','SLDP','ARKQ','XLU','XLV','ULTA','AAPL','AMZU','BAD','DDM','IYH','JPM','PM','XOM'] self.MKT = self.AddEquity("SPY", Resolution.Daily).Symbol self.mkt = [] for equity in self.equities: self.AddEquity(equity, Resolution.Minute) self.Securities[equity].SetDataNormalizationMode(DataNormalizationMode.Adjusted) self.PT1 = 0.72 self.PT2 = 0.0 self.PT3 = 0.22 self.HT50 = {str(i).zfill(2): 0 for i in range(1, 21)} self.HTS50 = {str(i).zfill(2): [] for i in range(1, 21)} self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY", 2), self.FunctionBeforeMarketClose) def RSI(self, equity, period): extension = min(period*5, 250) r_w = RollingWindow[float](extension) history = self.History(equity, extension - 1, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < extension: current_price = self.Securities[equity].Price r_w.Add(current_price) if r_w.IsReady: average_gain = 0 average_loss = 0 gain = 0 loss = 0 for i in range(extension - 1, extension - period -1, -1): gain += max(r_w[i-1] - r_w[i], 0) loss += abs(min(r_w[i-1] - r_w[i], 0)) average_gain = gain/period average_loss = loss/period for i in range(extension - period - 1, 0, -1): average_gain = (average_gain*(period-1) + max(r_w[i-1] - r_w[i], 0))/period average_loss = (average_loss*(period-1) + abs(min(r_w[i-1] - r_w[i], 0)))/period if average_loss == 0: return 100 else: rsi = 100 - (100/(1 + average_gain / average_loss)) return rsi else: return None def CumReturn(self, equity, period): history = self.History(equity, period, Resolution.Daily) closing_prices = pd.Series([bar.Close for bar in history]) current_price = self.Securities[equity].Price closing_prices = closing_prices.append(pd.Series([current_price])) first_price = closing_prices.iloc[0] if first_price == 0: return None else: return_val = (current_price / first_price) - 1 return return_val def STD(self, equity, period): r_w = RollingWindow[float](period + 1) r_w_return = RollingWindow[float](period) history = self.History(equity, period, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < period + 1: current_price = self.Securities[equity].Price r_w.Add(current_price) for i in range (period, 0, -1): daily_return = (r_w[i-1]/r_w[i] - 1) r_w_return.Add(daily_return) dfstd = pd.DataFrame({'r_w_return':r_w_return}) if r_w.IsReady: std = dfstd['r_w_return'].std() if std == 0: return 0 else: return std else: return 0 def MaxDD(self, equity, period): history = self.History(equity, period - 1, Resolution.Daily) closing_prices = pd.Series([bar.Close for bar in history]) current_price = self.Securities[equity].Price closing_prices = closing_prices.append(pd.Series([current_price])) rolling_max = closing_prices.cummax() drawdowns = (rolling_max - closing_prices) / rolling_max max_dd = drawdowns.min() return max_dd def SMA(self, equity, period): r_w = RollingWindow[float](period) history = self.History(equity, period - 1, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < period: current_price = self.Securities[equity].Price r_w.Add(current_price) if r_w.IsReady: sma = sum(r_w) / period return sma else: return 0 def IV(self, equity, period): r_w = RollingWindow[float](period + 1) r_w_return = RollingWindow[float](period) history = self.History(equity, period, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < period + 1: current_price = self.Securities[equity].Price r_w.Add(current_price) for i in range (period, 0, -1): if r_w[i] == 0: return 0 else: daily_return = (r_w[i-1]/r_w[i] - 1) r_w_return.Add(daily_return) dfinverse = pd.DataFrame({'r_w_return':r_w_return}) if r_w.IsReady: std = dfinverse['r_w_return'].std() if std == 0: return 0 else: inv_vol = 1 / std return inv_vol else: return 0 def SMADayRet(self, equity, period): r_w = RollingWindow[float](period + 1) r_w_return = RollingWindow[float](period) history = self.History(equity, period, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < period + 1: current_price = self.Securities[equity].Price r_w.Add(current_price) for i in range (period, 0, -1): if r_w[i] == 0: return None daily_return = (r_w[i-1]/r_w[i] - 1) r_w_return.Add(daily_return) if r_w.IsReady: smareturn = sum(r_w_return) / period return smareturn else: return 0 def EMA(self, equity, period): extension = period + 50 r_w = RollingWindow[float](extension) history = self.History(equity, extension - 1, Resolution.Daily) for historical_bar in history: r_w.Add(historical_bar.Close) while r_w.Count < extension: current_price = self.Securities[equity].Price r_w.Add(current_price) if r_w.IsReady: total_price = 0 for i in range(extension - 1, extension - period - 2, -1): total_price += r_w[i] average_price = total_price/period for i in range(extension - period - 2, -1, -1): average_price = r_w[i]*2/(period+1) + average_price*(1-2/(period+1)) return average_price else: return None def OnData (self, data): pass def FunctionBeforeMarketClose(self): mkt_price = self.History(self.MKT, 2, Resolution.Daily)['close'].unstack(level= 0).iloc[-1] self.mkt.append(mkt_price) mkt_perf = self.cash * self.mkt[-1] / self.mkt[0] self.Plot('Strategy Equity', self.MKT, mkt_perf) self.HolyGrailSimplified() #self.V15A() self.v41Pops() self.ExecuteTrade() def HolyGrailSimplified(self): if self.Securities['SPY'].Price > self.SMA('SPY', 200): if self.RSI('QQQ', 10) > 79: equities = ["UVXY", "SQQQ"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('SPY', 10) > 79: equities = ["UVXY", "SPXS"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: equities = ["TECL", "STIP"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('TQQQ', 10) < 31: equities = ["TECL", "SHY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('UPRO', 10) < 31: equities = ["UPRO", "SHY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: if self.CumReturn('TQQQ', 6) < -0.11: self.BuythedipsV2() else: if self.Securities['QLD'].Price > self.SMA('QLD', 20): equities = ["TECL", "STIP"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break else: self.Substrategy5() self.Substrategy6() def BuythedipsV2(self): if self.CumReturn('TQQQ', 5) > 0.055: equities = ["UVXY", "SQQQ"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 self.HTS50[i].append(t3e[0][0]) break if self.CumReturn('SQQQ', 1) > 0.028: self.Substrategy1() self.Substrategy2() else: self.HoldStocksBondsSOXLSHVTECLSTIP() def Substrategy1(self): equities = ["TECL", "UDN"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.5 self.HTS50[i].append(t3e[0][0]) break def Substrategy2(self): equities = ["TECL", "TMV"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.5 self.HTS50[i].append(t3e[0][0]) break def HoldStocksBondsSOXLSHVTECLSTIP(self): self.Substrategy3() self.Substrategy4() def Substrategy3(self): equities = ["SOXL", "SHV"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.68 self.HTS50[i].append(t3e[0][0]) break def Substrategy4(self): equities = ["TECL", "STIP"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.32 self.HTS50[i].append(t3e[0][0]) break def Substrategy5(self): if self.SMADayRet('TLT', 20) > self.SMADayRet('UDN', 20): equities = ["TLT", "SQQQ"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 11) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.5 self.HTS50[i].append(t3e[0][0]) break else: equities = ["UUP", "SQQQ"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 10) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.5 self.HTS50[i].append(t3e[0][0]) break def Substrategy6(self): equities = ["UGL", "SQQQ"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 12) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT1 * 0.5 self.HTS50[i].append(t3e[0][0]) break def V15A(self): if self.RSI('SPY', 6) > 75: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 5) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT2 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('BIL', 5) < self.RSI('VCIT', 4): for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT2 self.HTS50[i].append('SOXL') break else: if self.SMADayRet('VIXY', 5) > self.SMADayRet('BND', 5): equities = ["UVXY", "VIXY", "IEF"] returns = {} for equity in equities: returns[equity] = self.MaxDD(equity, 3) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT2 self.HTS50[i].append(t3e[0][0]) break else: if self.SMADayRet('EDV', 11) < 0: equities = ["SVXY", "TMF"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 21) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT2 self.HTS50[i].append(t3e[0][0]) break else: equities = ["SVXY", "TMV"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 21) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT2 self.HTS50[i].append(t3e[0][0]) break def v41Pops(self): if self.RSI('QQQE', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('VTV', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('VOX', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.MaxDD('SPY', 9) < 0: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('TECL', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('VOOG', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('VOOV', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('XLP', 10) > 75: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('TQQQ', 10) > 79: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('XLY', 10) > 80: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('FAS', 10) > 80: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('SPY', 10) > 80: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.CumReturn('TQQQ', 6) < -0.12: if self.CumReturn('QQQ', 1) > 0.018: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 13) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: self.V15B() else: self.V15B() def V15B(self): if self.RSI('SPY', 6) > 75: equities = ["UVXY", "VIXY"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 5) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.RSI('BIL', 5) < self.RSI('VCIT', 5): for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append('SOXL') break else: if self.RSI('SVXY', 11) > 60: equities = ["TMF", "BIL"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 10) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.SMADayRet('VIXM', 10) > self.SMADayRet('SVXY', 5): equities = ["UVXY", "VIXY", "IEF"] returns = {} for equity in equities: returns[equity] = self.MaxDD(equity, 3) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = True) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: if self.SMADayRet('EDV', 11) < 0: equities = ["SVXY", "TMF"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 21) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break else: equities = ["SVXY", "TMV"] returns = {} for equity in equities: returns[equity] = self.RSI(equity, 21) s_e = sorted([item for item in returns.items() if item[1] is not None], key = lambda x: x[1], reverse = False) t3e = s_e[:1] for i in self.HT50.keys(): if self.HT50[i] == 0: self.HT50[i] = self.PT3 self.HTS50[i].append(t3e[0][0]) break def ExecuteTrade(self): group = { 'HTS': [self.HTS50[i][0] if len(self.HTS50[i]) == 1 else self.HTS50[i] for i in self.HTS50], 'HT': [self.HT50[i] for i in self.HT50] } df = pd.DataFrame(group) df = pd.concat([df]) df['HTS'] = df['HTS'].astype(str) result = df.groupby(['HTS']).sum().reset_index() for equity in self.equities: if all(not pd.isnull(result.iloc[i, 0]) and not equity == result.iloc[i, 0] for i in range(len(result))): if self.Portfolio[equity].HoldStock: self.Liquidate(equity) output = "*****" for i in range(len(result)): if result.iloc[i, 0]: percentage = round(result.iloc[i, 1] * 100, 2) output += "{}: {}% - ".format(result.iloc[i, 0], percentage) output = output.rstrip(" - ") self.Log(output) for i in range(len(result)): if not result.iloc[i, 1] == 0 and not result.iloc[i, 0] == 'BIL': percentage_equity = self.Portfolio[result.iloc[i, 0]].HoldingsValue / self.Portfolio.TotalPortfolioValue quantity = (result.iloc[i, 1] - percentage_equity) * self.Portfolio.TotalPortfolioValue / self.Securities[result.iloc[i, 0]].Price if result.iloc[i, 1] < percentage_equity and abs(result.iloc[i, 1] / percentage_equity - 1) > self.buffer_pct: self.SetHoldings(result.iloc[i, 0], result.iloc[i, 1]) #self.MarketOnCloseOrder(result.iloc[i, 0], quantity) else: pass for i in range(len(result)): if not result.iloc[i, 1] == 0 and not result.iloc[i, 0] == 'BIL': percentage_equity = self.Portfolio[result.iloc[i, 0]].HoldingsValue / self.Portfolio.TotalPortfolioValue quantity = (result.iloc[i, 1] - percentage_equity) * self.Portfolio.TotalPortfolioValue / self.Securities[result.iloc[i, 0]].Price if result.iloc[i, 1] > percentage_equity and abs(percentage_equity / result.iloc[i, 1] - 1) > self.buffer_pct: self.SetHoldings(result.iloc[i, 0], result.iloc[i, 1]) #self.MarketOnCloseOrder(result.iloc[i, 0], quantity) else: pass self.HT50 = {str(i).zfill(2): 0 for i in range(1, 21)} self.HTS50 = {str(i).zfill(2): [] for i in range(1, 21)}