Overall Statistics |
Total Trades 9977 Average Win 0.29% Average Loss -0.16% Compounding Annual Return 56.194% Drawdown 2.800% Expectancy 0.193 Net Profit 355.681% Sharpe Ratio 6.789 Probabilistic Sharpe Ratio 100% Loss Rate 57% Win Rate 43% Profit-Loss Ratio 1.79 Alpha 0.369 Beta -0.012 Annual Standard Deviation 0.054 Annual Variance 0.003 Information Ratio 2.445 Tracking Error 0.145 Treynor Ratio -30.437 Total Fees $145926.82 |
# Your New Python File Try = [("DXD","DDM",-1,.5,.5,1200)]
from Execution.ImmediateExecutionModel import ImmediateExecutionModel import pandas as pd from collections import deque import numpy as np TradeablePairs = [ ("TQQQ","SQQQ",-1,.5,.5), #Proshares Nasdaq 3x ("QQQ","PSQ",-1,.5,.5), ("QLD","QID",-1,.5,.5), #Proshares Nasdaq 2x ("SDD", "SAA", -1,.5,.5), #Proshares SP Small Cap ("MZZ", "MVV", -1,.5,.5), #Proshares SP Mid Cap 2x ("UMDD", "SMDD", -1,.5,.5), #Proshares SP Mid Cap 3x ("SDOW","UDOW",-1,.5,.5),#Proshares Dow 3x ("DDM","DXD",-1,.5,.5), #Proshares Dow 2x ("SDS","SSO",-1,.5,.5),#Proshares SP500 2x ("UPRO","SPXU",-1,.5,.5),#Proshares SP500 3x ("SPXL","SPXS",-1,.5,.5),#Direxion SP500 3x ("URTY","SRTY",-1,.5,.5), #Proshares Russel 3x ("RWM","IWM",-1,.5,.5), #Proshares Russel 1x ("UWM","TWM",-1,.5,.5),#Proshares Russel 2x ("UYM","SMN",-1,.5,.5), #Proshares Dow Jones U.S. Basic Materials ("UBIO","ZBIO",-1,.5,.5), #Proshares Nasdaq Biotech 3x ("BIB","BIS",-1,.5,.5), #Proshares Nasdaq Biotech 2x ("SCOM","UCOM",-1,.5,.5), #Proshares S&P Communication Services Select Sector 3x ("SKF","UYG",-1,.5,.5), #Proshares Dow Jones U.S. Financials ("FINU","FINZ",-1,.5,.5), #Proshares S&P Financial Select Sector ("RXD","RXL",-1,.5,.5), #Proshares Dow Jones U.S. Health Care ("UXI","SIJ",-1,.5,.5), #Proshares Dow Jones U.S. Industrials ("DIG","DUG",-1,.5,.5), #Proshares Dow Jones U.S. Oil & Gas ("SRS","URE",-1,.5,.5), #Proshares Dow Jones Real Estate ("USD","SSG",-1,.5,.5), #Proshares Dow Jones U.S. Semiconductors ("ROM","REW",-1,.5,.5), #Proshares Dow Jones U.S. Technology ("SDP","UPW",-1,.5,.5), #Proshares Dow Jones U.S. Utilities ("OILU","OILD",-1,.5,.5), #Proshares Bloomberg WTI Crude Oil Subindex 3x ("UCO","SCO",-1,.5,.5),#Proshares Bloomberg WTI Crude Oil Subindex 2x ("GLL","UGL",-1,.5,.5),#Proshares Bloomberg Gold Subindex ("AGQ","ZSL",-1,.5,.5),#Proshares Bloomberg Silver Subindex ("YCS","YCL",-1,.5,.5),#Proshares #JPY/USD ("DSLV","USLV",-1,.5,.5), ("UGLD","DGLD",-1,.5,.5), ("EET","EEV",-1,.5,.5), #Proshares MSCI Emerging Markets ("EFO","EFU",-1,.5,.5), #Proshares MSCI EAFE ("UPV","EPV",-1,.5,.5), #Proshares MSCI Developed EU ("FXP","XPP",-1,.5,.5), #Proshares MSCI China ("EWV","EZJ",-1,.5,.5), #Proshares MSCI Japan ("TBT","UBT",-1,.5,.5), #Proshares ICE U.S. Treasury 20+ Year Bond ("PST","UST",-1,.5,.5), #Proshares ICE U.S. Treasury 7 Year Bond ("TECL","TECS",-1,.5,.5),#Direxion Tech 3x ("TNA","TZA",-1,.5,.5), #Direxion Small Cap 3x ("GUSH","DRIP",-1,.5,.5), #Direxion Oils and Gas Exploration ("LABU","LABD",-1,.5,.5), #Direxion Biotech ("RUSL","RUSS",-1,.5,.5), #Direxion Russia ("GASL","GASX",-1,.5,.5), #Direxion Natural Gas ("FAZ","FAS",-1,.5,.5), #Direxion Financials ("NUGT","DUST",-1,.5,.5), #Direxion Gold Miners ("JNUG","JDST",-1,.5,.5), #Direxion Junior Gold Miners ("ERY","ERX",-1,.5,.5), #Direxion Energy ("YINN","YANG",-1,.5,.5), #Direxion China ] info = TradeablePairs[4] class LETFArb(QCAlgorithm): def Initialize(self): self.SetStartDate(2014, 1, 1) # Set Start Date self.SetEndDate(2019, 12, 21) self.SetCash(100000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.AlphaStreams) self.AddEquity(info[0], Resolution.Minute) self.AddEquity(info[1], Resolution.Minute) self.SetExecution(ImmediateExecutionModel()) self.SetBenchmark("GLD") symbols = [ Symbol.Create(info[0], SecurityType.Equity, Market.USA),Symbol.Create(info[1], SecurityType.Equity, Market.USA) ] self.SetUniverseSelection( ManualUniverseSelectionModel(symbols)) self.lr = info[2] self.bb = 3 self.ub = 3 self.index_prices= deque(maxlen=2) self.letf_prices = deque(maxlen=2) self.spreads = deque(maxlen=3000) self.counter = 0 def OnData(self, data): if (self.counter <= 300): if (data.Bars.ContainsKey(info[0])) & (data.Bars.ContainsKey(info[1])): self.index_prices.append(data.Bars[info[0]].Close) self.letf_prices.append(data.Bars[info[1]].Close) self.counter+=1 if (self.counter >2): index_returns = pd.Series(self.index_prices).pct_change().iloc[-1] exp_returns = np.log(1 + self.lr*index_returns) letf_returns = pd.Series(self.letf_prices).pct_change().iloc[-1] letf_returns = np.log(1+letf_returns) spread = float(letf_returns - exp_returns) self.spreads.append(spread) else: if (data.Bars.ContainsKey(info[0])) & (data.Bars.ContainsKey(info[1])): self.index_prices.append(data.Bars[info[0]].Close) self.letf_prices.append(data.Bars[info[1]].Close) index_returns = pd.Series(self.index_prices).pct_change().iloc[-1] exp_returns = np.log(1+self.lr*index_returns) letf_returns = pd.Series(self.letf_prices).pct_change().iloc[-1] letf_returns = np.log(1+letf_returns) spread = float(letf_returns - exp_returns) self.spreads.append(spread) spread_stds = pd.Series(self.spreads).std() lower_bb = -1*spread_stds*self.bb if (spread <= lower_bb): self.SetHoldings([PortfolioTarget(info[0], info[3]), PortfolioTarget(info[1], info[4])]) elif(spread >= self.ub* spread_stds): self.Liquidate() elif(spread == 0): pass else: pass