| Overall Statistics |
|
Total Trades 4 Average Win 1.85% Average Loss 0% Compounding Annual Return 11.025% Drawdown 12.500% Expectancy 0 Net Profit 5.010% Sharpe Ratio 0.642 Probabilistic Sharpe Ratio 38.756% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0.103 Beta -0.024 Annual Standard Deviation 0.159 Annual Variance 0.025 Information Ratio 0.162 Tracking Error 0.447 Treynor Ratio -4.29 Total Fees $11.22 |
#take the paper "Leverage For The Long Run", use a 200 SMA on SPY to generate weekly buy/sell signals to either go long SPX futures or cash.
class LeverageForTheLongRunDiversifiedWeekly(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020,1, 1) #Set Start Date
self.SetEndDate(2020,6,20) #Set End Date
self.SetCash(100000) #Set Strategy Cash
self.shy = self.AddEquity("SHY", Resolution.Minute).Symbol
self.spy = self.AddEquity("SPY", Resolution.Minute).Symbol
self.futureSP500 = self.AddFuture(Futures.Metals.Gold)
self.futureSP500 .SetFilter(10, 120) # Get contracts from 10 days to 120 days out
self.sma = self.SMA("SPY", 200, Resolution.Daily)
self.SetWarmUp(200, Resolution.Daily) # warm up the indicator
self.Settings.FreePortfolioValuePercentage = 0.05
self.rebalance = True # Flag to initate trades
# Increment rebalance timer at every week start
self.Schedule.On(self.DateRules.WeekStart("SPY"), self.TimeRules.AfterMarketOpen("SPY", 30), self.Rebalance)
self.contract = None
def OnData(self, data):
if not (self.sma.IsReady and \
data.ContainsKey(self.shy) and data[self.shy] is not None and \
data.ContainsKey(self.spy) and data[self.spy] is not None and \
self.rebalance):
return
if data[self.spy].Close > self.sma.Current.Value:
for contracts in data.FutureChains.Values:
sorted_contracts = sorted(contracts, key=lambda c: c.Expiry, reverse = True)
if len(sorted_contracts) == 0 or \
(self.contract is not None and sorted_contracts[0].Symbol == self.contract.Symbol):
continue
self.contract = sorted_contracts[0]
self.MarketOrder(sorted_contracts[0].Symbol, 1)
else:
self.SetHoldings("SHY", 1, True)
self.contract = None
self.rebalance = False # Reset rebalance timer
def Rebalance(self):
self.rebalance = True