Overall Statistics |
Total Trades 8 Average Win 0% Average Loss 0% Compounding Annual Return 42.589% Drawdown 3.200% Expectancy 0 Net Profit 6.933% Sharpe Ratio 3.433 Probabilistic Sharpe Ratio 83.431% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.286 Beta 0.138 Annual Standard Deviation 0.102 Annual Variance 0.011 Information Ratio -1.001 Tracking Error 0.13 Treynor Ratio 2.556 Total Fees $11.05 |
class LiquidUniverseSelection(QCAlgorithm): filteredByPrice = None def Initialize(self): self.SetStartDate(2019, 1, 11) self.SetEndDate(2019, 3, 20) self.SetCash(100000) self.stateData = { } self.AddUniverse(self.CoarseSelectionFilter) # Ignore this for now, we'll cover it in the next task. self.UniverseSettings.Resolution = Resolution.Daily def CoarseSelectionFilter(self, coarse): sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) filteredByPrice = [x for x in sortedByDollarVolume if x.Price > 1 and x.Price < 100] for c in filteredByPrice: if c.Symbol not in self.stateData: self.stateData[c.Symbol] = SelectionData(c.Symbol, 10) avg = self.stateData[c.Symbol] avg.update(c.EndTime, c.AdjustedPrice, c.DollarVolume) self.values = [symbol for symbol, sd in self.stateData.items() if sd.sma.Current.Value > 3500000] return self.values[:8] def OnSecuritiesChanged(self, changes): #self.changes = changes #self.Log(f"OnSecuritiesChanged({self.UtcTime}):: {changes}") #1. Liquidate removed securities #for security in changes.RemovedSecurities: # if security.Invested: # self.Liquidate(security.Symbol) #2. We want 10% allocation in each security in our universe for security in changes.AddedSecurities: self.SetHoldings(security.Symbol, 0.1) class SelectionData(object): def __init__(self, symbol, period): self.symbol = symbol self.volume = 0 self.sma = SimpleMovingAverage(period) #self.vol_greater = False def update(self, time, price, volume): self.volume = volume self.sma.Update(time, volume) #self.vol_greater = self.sma > 3500000