| 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