Overall Statistics |
Total Trades 2 Average Win 0% Average Loss -0.01% Compounding Annual Return -0.029% Drawdown 0.000% Expectancy -1 Net Profit -0.014% Sharpe Ratio -1.414 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.001 Beta 0.012 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -25.673 Tracking Error 0.001 Treynor Ratio -0.024 Total Fees $2.00 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Data import SubscriptionDataSource from QuantConnect.Python import PythonData import datetime from System.Collections.Generic import List from QuantConnect.Algorithm import QCAlgorithm from QuantConnect.Data.UniverseSelection import * import decimal as d import numpy as np import math import json class DropboxBaseDataUniverseSelectionAlgorithm(QCAlgorithm): def Initialize(self): self.SetCash(10000.00) self._changes = None self.UniverseSettings.Resolution = Resolution.Minute; #self.SetStartDate(2018,1,1) #self.SetEndDate(2018,3,31) start_date_str = '2018-01-04' end_date_str = '2018-01-04' start_datetime = datetime.datetime.strptime(start_date_str,'%Y-%m-%d') end_datetime = datetime.datetime.strptime(end_date_str,'%Y-%m-%d') window_size = 90 start_datetime = start_datetime - datetime.timedelta(days=window_size*2+1) self.SetStartDate(start_datetime) self.SetEndDate(end_datetime) self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Cash) self.AddUniverse(StockDataSource, "my-stock-data-source", self.stockDataSource) # Add SPY just to get access to the AfterMarketOpen and BeforeMarketClose calls. self._spy = self.AddEquity("SPY", Resolution.Minute) self._blacklist = [self._spy] self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY",1), Action(self.on_market_opened)) self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY",16), Action(self.on_before_market_closes)) def stockDataSource(self, data): list = [] for item in data: for symbol in item["Symbols"]: list.append(symbol) return list def OnData(self, slice): #for key in slice.Keys: # self.Log('{} Data for symbol: {}'.format(str(self.Time), key)) if slice.Bars.Count == 0: return if self._changes == None: return # start fresh #self.Liquidate() #percentage = 1 / d.Decimal(slice.Bars.Count) #for tradeBar in slice.Bars.Values: # self.SetHoldings(tradeBar.Symbol, percentage) # reset changes self._changes = None def OnSecuritiesChanged(self, changes): self._changes = changes self.Debug('{} Universe Changes: {}'.format(str(self.Time), changes)) def on_market_opened(self): #self.Debug('{} on_market_open'.format(str(self.Time))) if self._changes == None: return for security in self._changes.AddedSecurities: if self.trading_criteria_met(security): self.SetHoldings(security.Symbol, 0.01) def trading_criteria_met(self, security): if 'CMC' not in security.Symbol.Value: return False if security.Invested: return False if security in self._blacklist: return False if not self.criteria3(security): return False return True def criteria3(self, security): self.Debug('security.Symbol: {}'.format(security.Symbol)) self.Debug('security.Open: {}'.format(security.Open)) # Create list of symbols to load history. # The symbols can be one or multiple, one in this case syms = [] syms.append(security.Symbol) #for sec in self._changes.AddedSecurities: # syms.append(sec.Symbol) # Get a multi index dataframe history_df = self.History( syms , 90, Resolution.Daily) self.Debug('{}'.format(history_df)) # Select the security close and get a single index dataframe # Must reference by str(security.Symbol) sym = str(security.Symbol) self.Debug('sym to get: {}'.format(sym)) #sym_df = history_df.loc[sym] # optional, select everything for one symbol close_df = history_df.loc[sym]['close'] # select date & closing prices for one sym self.Debug('{}'.format(close_df)) return True def on_before_market_closes(self): for holding in self.Portfolio.Values: if holding.HoldStock: #self.SetHoldings(s,0.0, tag="ScheduledEvent EOD Liquidate") self.MarketOnCloseOrder(holding.Symbol, -holding.Quantity) def OnOrderEvent(self, orderEvent): self.Log(str(orderEvent)) class StockDataSource(PythonData): def GetSource(self, config, date, isLiveMode): if isLiveMode: url = None else: url = "https://www.dropbox.com/s/e5jyy6w5rsk03cf/e0007f.csv?dl=1" return SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, isLiveMode): if not (line.strip() and line[0].isdigit()): return None stocks = StockDataSource() stocks.Symbol = config.Symbol csv = line.split(',') if isLiveMode: stocks.Time = date stocks["Symbols"] = csv else: stocks.Time = datetime.datetime.strptime(csv[0], "%Y-%m-%d") stocks["Symbols"] = csv[1:] return stocks