| Overall Statistics |
|
Total Trades 204 Average Win 0.26% Average Loss -0.22% Compounding Annual Return 1.451% Drawdown 1.400% Expectancy 0.360 Net Profit 8.491% Sharpe Ratio 0.991 Probabilistic Sharpe Ratio 48.373% Loss Rate 37% Win Rate 63% Profit-Loss Ratio 1.17 Alpha 0.014 Beta 0.004 Annual Standard Deviation 0.015 Annual Variance 0 Information Ratio -0.669 Tracking Error 0.185 Treynor Ratio 3.351 Total Fees $4271.17 |
# Research question: Is there a bias after a significant close in a bull market?
# Sourced from https://www.youtube.com/watch?v=HdOgW8YobCE
class BullMarketGapDownReboundAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetCash(1000000)
self.symbol = self.AddEquity("SPY", Resolution.Minute).Symbol
self.sma_short = SimpleMovingAverage(50)
self.sma_long = SimpleMovingAverage(200)
self.max = Maximum(50)
closes = self.History(self.symbol, 200, Resolution.Daily).loc[self.symbol].close
for time, close in closes.iteritems():
self.sma_short.Update(time, close)
self.sma_long.Update(time, close)
self.max.Update(time, close)
self.last_close = None
self.quantity = 0
self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.AfterMarketOpen(self.symbol, 1), self.Open)
self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.BeforeMarketClose(self.symbol, 15), self.Close)
def Open(self):
if self.last_close is None:
return
# Enter if:
# - Gapped down this morning
# - Yesterday closed at the highest close in the last 50 bars
# - Short MA > Long MA
if self.Securities[self.symbol].Open < self.last_close and \
self.max.Current.Value == self.last_close and \
self.sma_short > self.sma_long:
self.quantity = self.CalculateOrderQuantity(self.symbol, 1)
self.MarketOrder(self.symbol, self.quantity)
def Close(self):
if self.quantity > 0:
self.MarketOrder(self.symbol, -self.quantity)
self.quantity = 0
def OnEndOfDay(self):
self.last_close = self.Securities[self.symbol].Price
self.sma_short.Update(self.Time, self.last_close)
self.sma_long.Update(self.Time, self.last_close)
self.max.Update(self.Time, self.last_close)