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 |
from QuantConnect.Data.UniverseSelection import * import pandas as pd import numpy as np from scipy import stats import decimal as d import random class BasicTemplateAlgorithm(QCAlgorithm): def Initialize(self): self.Debug("%%%%%%%%%%%%% Initialize") self.my_universe = [] # Set the initial cash, start, and end dates for backtesting self.mycash = 30000 self.mycash = 5000 self.cash_per_trade = 5000 self.SetCash(self.mycash) self.SetStartDate(2011,1,4) self.SetEndDate(2011,1,5) self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) # Or override account type # Subscribe to data for securities returned in my universe self.UniverseSettings.Resolution = Resolution.Minute self.UniverseSettings.MinimumTimeInUniverse = 0 self.AddUniverse(self.universe_filter_course, self.universe_filter_fine) # Schedule the 'trade' method to run # Add SPY to our data subscription so we can schedule from it (use defaults) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9, 31), Action(self.setup_trade)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9, 32), Action(self.my_stocks)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(15, 50), Action(self.liquidate_portfolio)) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(11, 00), Action(self.cancel_orders)) overlayPlot = Chart("Overlay Plot") ZscorePlot = Chart("ZScore") self.AddChart(overlayPlot) self.AddChart(ZscorePlot) self.contractsAdded = set() #self.Schedule.On( # self.DateRules.EveryDay('SPY'), # self.TimeRules.AfterMarketOpen('SPY', 1), # Action(self.my_trade)) def universe_filter_fine(self, fine_data): columns = ['SecurityType', 'ShareClassStatus', 'ExchangeId', 'IsDepositaryReceipt', 'IsPrimaryShare'] data_df = pd.DataFrame.from_records( [[getattr(s.SecurityReference, name) for name in columns] for s in fine_data], #[[s.ValuationRatios.PERatio, s.ValuationRatios.SalesYield] for s in fine_data], index=[s.Symbol for s in fine_data], columns=columns,) data_df = data_df.query("(SecurityType == 'ST00000001') and (IsDepositaryReceipt == False) and (IsPrimaryShare)") #data_df = data_df.sort_values(data_df.columns[0], ascending = True) data_df.sort_index(inplace=True) #data_df = data_df[:10] #self.Debug(data_df) #self.Debug("data is: {}".format(data_df.EVToEBITDA.values)) self.universe = data_df.index.tolist() self.my_universe = data_df.index.tolist() #self.Debug("fine size is: {}".format(len(self.universe))) return self.universe def universe_filter_course(self, coarse_data): # With data_df already initialized globally, this should now just # populate securities for values matching query instead. columns = ['Price', 'DollarVolume', 'HasFundamentalData', 'Volume'] data_df = pd.DataFrame.from_records( [[getattr(s, name) for name in columns] for s in coarse_data], index=[s.Symbol for s in coarse_data], columns=columns, coerce_float=True) data_df = data_df.sort_values(by='Volume', ascending=False) data_df = data_df.query("HasFundamentalData " \ "and (DollarVolume > @data_df.DollarVolume.quantile(.99))" \ "and (DollarVolume < @data_df.DollarVolume.quantile(1.00))") ''' data_df = data_df.query("HasFundamentalData ") data_df = data_df.sort_values('DollarVolume') data_df = data_df[data_df.DollarVolume > 1000000] data_df = data_df[50:100] ''' self.StocksDailyData =data_df if len(data_df) == 0: return self.my_universe = data_df.index.tolist() return data_df.index.tolist() def setup_trade(self): # See how many securities we have in our Securities list ''' for universe in self.UniverseManager.Keys: self.Debug("universe name: {}". format(universe)) ''' self.Debug("%%%%%%%%%%%%% setup_trade {}".format(self.Time)) self.sym_buylist = [] self.otm_calls = set() self.buyList = [] self.stock_list = [] self.contract = [] self.addedStocks = [] #for universe in self.UniverseManager.Values: #self.Debug("universe count: {}". # format(universe.Members.Count)) if len(self.my_universe) == 0: #self.Debug('Empty universe') return for stock in self.my_universe: stockID = self.AddEquity(stock.Value, Resolution.Minute) stockID.SetDataNormalizationMode(DataNormalizationMode.Raw) self.addedStocks.append(stockID) def my_stocks(self): self.Debug("%%%%%%%%%%%%% my_stocks {}".format(self.Time)) for stockID in self.addedStocks: if self.Securities[stockID.Symbol].Price != 0: self.stock_list.append(stockID.Symbol) self.Debug(stockID.Symbol) self.Debug(self.Securities[stockID.Symbol].Price) def liquidate_portfolio(self): #self.Debug('Checking Holdings 2222222222222...') for kvp in self.Portfolio: holdings = kvp.Value symbol = holdings.Symbol #if (holdings.Invested): #self.Debug("Symbol: {} -> Price: {}".format(symbol, holdings.AveragePrice)) for symbol in self.Portfolio.Keys: self.SetHoldings(symbol, 0) def cancel_orders(self): #self.Debug('=====================================================================') openOrders = self.Transactions.GetOpenOrders() if len(openOrders)> 0: for x in openOrders: self.Transactions.CancelOrder(x.Id) ################https://www.quantconnect.com/docs/algorithm-reference/overview def returnNotMatches(a, b): return [[x for x in a if x not in b], [x for x in b if x not in a]] def to_dataframe(data_c, properties, labels): # Helper function to make a dataframe from the coarse object. # Then we can use all the handy dataframe methods. # Set the 'coerce_float' parameter to get meaningful datatypes # otherwise all the fields will be un-useful generic objects. data = [[getattr(stock, name) for name in properties] for stock in data_c] symbols = [stock.Symbol for stock in data_c ] data_df = pd.DataFrame.from_records( data, index=symbols, columns=labels, coerce_float=True) return data_df