Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
class SymbolData(object): def __init__(self, symbol): self.symbol = symbol self.sma_fast = SimpleMovingAverage(10) self.sma_slow = SimpleMovingAverage(30) self.is_ready = False self.has_fundamentals = False self.pct_diff = None def update_warmup(self, time, price): self.is_ready = all([ self.sma_fast.Update(time, price), self.sma_slow.Update(time, price) ]) def update(self, stock): self.has_fundamentals = stock.HasFundamentalData self.update_warmup(stock.EndTime, stock.Price) if self.is_ready: sma_fast = float(self.sma_fast.Current.Value) sma_slow = float(self.sma_slow.Current.Value) self.pct_diff = (sma_fast - sma_slow) / sma_slow class TimeoutProblemAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2016, 12, 29) self.SetEndDate(2016, 12, 30) self.SetCash(100000) self.WarmUp = 30 self.MaxCandidates = 100 self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction) self.warmed_up = False self.symbol_data = {} self.AddEquity("SPY", Resolution.Daily) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", -10), self.before_trading_start) def CoarseSelectionFunction(self, coarse): if not self.warmed_up: for stock in coarse: self.AddEquity(stock.Symbol.Value) history = self.History([stock.Symbol for stock in coarse], self.WarmUp, Resolution.Daily) history_tickers = history.index.get_level_values(0) for stock in coarse: if stock.Symbol.Value in history_tickers: self.symbol_data[stock.Symbol] = SymbolData(stock.Symbol) data = history.loc[stock.Symbol.Value] for time in data.index: close_price = data.loc[time]['close'] self.symbol_data[stock.Symbol].update_warmup(time, close_price) self.RemoveSecurity(stock.Symbol) self.Securities.Remove(stock.Symbol) self.Debug("Warmed up {} stocks".format(len(self.symbol_data))) self.warmed_up = True coarse_symbols = [stock.Symbol for stock in coarse] for symbol in list(self.symbol_data.keys()): if symbol not in coarse_symbols: del self.symbol_data[symbol] for stock in coarse: if stock.Symbol not in self.symbol_data: self.symbol_data[stock.Symbol] = SymbolData(stock.Symbol) self.symbol_data[stock.Symbol].update(stock) return [data.symbol for data in self.symbol_data.values() if \ data.is_ready and \ data.has_fundamentals] def FineSelectionFunction(self, fine): self.Debug('Fine collection is {} long'.format(len(fine))) security_filter = [self.symbol_data[x.Symbol] for x in fine if \ x.SecurityReference.IsPrimaryShare and \ x.SecurityReference.SecurityType == 'ST00000001' and \ x.SecurityReference.ExchangeId != 'OTC' and \ not x.CompanyReference.IsLimitedPartnership and \ not x.SecurityReference.IsDepositaryReceipt] stock_data = sorted([data for data in security_filter], key=lambda x: x.pct_diff) todays_universe = [data.symbol for data in stock_data[:self.MaxCandidates]] self.Debug('Today\'s universe: {}'.format(', '.join([sym.Value for sym in todays_universe]))) return todays_universe def before_trading_start(self): if not self.warmed_up: return self.Debug('before_trading_start: {}'.format(self.Securities.Count))