| Overall Statistics |
|
Total Trades 290 Average Win 0.11% Average Loss -0.11% Compounding Annual Return 23.103% Drawdown 1.900% Expectancy 0.219 Net Profit 3.473% Sharpe Ratio 2.276 Probabilistic Sharpe Ratio 71.667% Loss Rate 39% Win Rate 61% Profit-Loss Ratio 0.99 Alpha 0.028 Beta 0.24 Annual Standard Deviation 0.08 Annual Variance 0.006 Information Ratio -3.767 Tracking Error 0.122 Treynor Ratio 0.759 Total Fees $992.95 Estimated Strategy Capacity $32000000.00 Lowest Capacity Asset AMD R735QTJ8XC9X |
from datetime import datetime, timedelta
class DynamicOptimizedContainmentField(QCAlgorithm):
def Initialize(self):
self.stopMarketTicket = None
self.stopMarketOrderFillTime = datetime.min
self.highestPrice = 0
self.SetStartDate(2021, 2, 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.symbols = {}
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(13,30), self.ClosePositions)
self.AddRiskManagement(TrailingStopRiskManagementModel(0.05))
def SelectCoarse(self, coarse):
sortedByDollarVolume = sorted(coarse, key=lambda c: c.DollarVolume, reverse=True)
filteredByPrice = [c.Symbol for c in sortedByDollarVolume if c.Price > 10 ]
return filteredByPrice[: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):
if self.Time.time()<time(11,0) or self.Time.time()>time(11,30):return
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.18) # orders 18% 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 == 9 and bar.Time.minute == 30:
self.openingBar = bar