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