| Overall Statistics |
|
Total Trades 270 Average Win 0.03% Average Loss -0.05% Compounding Annual Return -9.180% Drawdown 1.400% Expectancy -0.128 Net Profit -0.841% Sharpe Ratio -2.436 Probabilistic Sharpe Ratio 13.459% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 0.71 Alpha -0.147 Beta 0.119 Annual Standard Deviation 0.027 Annual Variance 0.001 Information Ratio -8.853 Tracking Error 0.084 Treynor Ratio -0.551 Total Fees $561.46 Estimated Strategy Capacity $48000000.00 Lowest Capacity Asset EEM SNQLASP67O85 |
class DynamicOptimizedContainmentField(QCAlgorithm):
def Initialize(self):
self.stopMarketTicket = None
self.stopMarketOrderFillTime = datetime.min
self.highestPrice = 0
self.SetStartDate(2021, 3, 26) # Set Start Date\
self.SetEndDate(2021, 4, 26)
self.SetCash(1000000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Minute
self.AddUniverse(self.SelectCoarse)
self.UniverseSettings.Leverage = 2
self.AddEquity("SPY")
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.At(13,30), self.ClosePositions)
self.symbols = {}
self.AddRiskManagement(TrailingStopRiskManagementModel(0.05))
self.stopPrice = self.GetParameter("stop")
def SelectCoarse(self, coarse):
sortedCoarse = sorted(coarse, key=lambda c:c.DollarVolume, reverse=True)
return [c.Symbol for c in sortedCoarse][:10]
def OnSecuritiesChanged(self, changes):
for security in changes.AddedSecurities:
symbol = security.Symbol
if symbol not in self.symbols:
self.symbols[symbol] = SymbolData(self, symbol)
for security in changes.RemovedSecurities:
symbol = security.Symbol
if symbol in self.symbols:
symbolData = self.symbols.pop(symbol, None)
self.SubscriptionManager.RemoveConsolidator(symbol, symbolData.consolidator)
def OnData(self, data):
for symbol, symbol_data in self.symbols.items():
if symbol_data.openingBar is None: continue
if not data.Bars.ContainsKey(symbol):
continue
if data.Bars[symbol].Close > symbol_data.openingBar.High and not self.Securities[symbol].Invested:
quantity = self.CalculateOrderQuantity(symbol, 0.08) # orders 8% of portfolio
self.MarketOrder(symbol, quantity)
continue
def OnOrderEvent(self, orderEvent):
if orderEvent.Status != OrderStatus.Filled:
self.symbols[orderEvent.Symbol].openingBar = None
return
def ClosePositions(self):
for symbolData in self.symbols.values():
symbolData.openingBar = None
self.Liquidate() # liquidate entire portfolio
class SymbolData:
def __init__(self, algorithm, symbol):
self.algorithm = algorithm
self.symbol = symbol
self.consolidator = TradeBarConsolidator(timedelta(minutes = 30))
self.consolidator.DataConsolidated += self.OnDataConsolidated
self.openingBar = None
algorithm.SubscriptionManager.AddConsolidator(symbol, self.consolidator)
def OnDataConsolidated(self, sender, bar):
if bar.Time.hour == 10 and bar.Time.minute == 0:
self.openingBar = bar