| Overall Statistics |
|
Total Trades 399 Average Win 0.10% Average Loss -0.06% Compounding Annual Return -83.947% Drawdown 3.600% Expectancy -0.196 Net Profit -2.475% Sharpe Ratio -11.416 Loss Rate 69% Win Rate 31% Profit-Loss Ratio 1.55 Alpha -1.285 Beta -0.31 Annual Standard Deviation 0.11 Annual Variance 0.012 Information Ratio -9.933 Tracking Error 0.116 Treynor Ratio 4.047 Total Fees $2646.93 |
from QuantConnect.Data.Market import TradeBar
from datetime import timedelta
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
import decimal as d
class MyAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 9, 14) # Set Start Date
self.SetEndDate(2017, 9, 18)
self.SetCash(100000) # Set Strategy Cash
self.symbolData = dict()
for ticker in ["NVDA", "AAPL", "NVDA", "FB", "BABA", "MU", "MYL", "JD", "TEVA", "TVIX", "AMD"]:
symbol = self.AddEquity(ticker, Resolution.Second).Symbol
consolidator_daily = TradeBarConsolidator(timedelta(1))
consolidator_daily.DataConsolidated += self.OnDailyData
self.SubscriptionManager.AddConsolidator(symbol, consolidator_daily)
consolidator_minute = TradeBarConsolidator(60)
consolidator_minute.DataConsolidated += self.OnMinuteData
self.SubscriptionManager.AddConsolidator(symbol, consolidator_minute)
#consolidator_tensec = TradeBarConsolidator(10)
#consolidator_tensec.DataConsolidated += self.OnTenSecondData
#self.SubscriptionManager.AddConsolidator(symbol, consolidator_tensec)
self.symbolData[symbol] = SymbolData()
#self.Schedule.On(self.DateRules.EveryDay(),
# self.TimeRules.AfterMarketOpen('SPY', 1),
# Action(self.one_minute_after_open_market))
#self.Schedule.On(self.DateRules.EveryDay(),
# self.TimeRules.AfterMarketOpen('SPY', 5),
# Action(self.before_close_market))
self.Schedule.On(self.DateRules.EveryDay(),
self.TimeRules.Every(timedelta(seconds=10)),
Action(self.Tensec))
# Add daily bar to daily rolling window
def OnDailyData(self, sender, bar):
self.symbolData[bar.Symbol].daily_rw.Add(bar)
def OnMinuteData(self, sender, bar):
self.symbolData[bar.Symbol].minute_rw.Add(bar)
#def OnTenSecondData(self, sender, bar):
# self.symbolData[bar.Symbol].tensec_rw.Add(bar)
def OnData(self, data):
for symbol in data.Keys:
if data[symbol] is None: continue
# Create local variable to readability
window = self.symbolData[symbol].window
# Update the window. If not ready, continue
window.Add(data[symbol])
minute = self.symbolData[symbol].minute_rw
if not (window.IsReady and minute.IsReady): continue
#self.Log(str(window[0].Close))
#if not (window[0].Close > 200):
def Tensec(self):
for symbol in self.symbolData:
# Create local variable to readability
window = self.symbolData[symbol].window
# Update the window. If not ready, continue
minute = self.symbolData[symbol].minute_rw
if not (window.IsReady and minute.IsReady): continue
if not self.Portfolio[symbol].Invested and self.Securities[symbol].Exchange.ExchangeOpen:
last_bar = minute[0].Close - minute[0].Open
l_high_div_open = minute[0].High / minute[0].Open
l_low_div_close = minute[0].Low / minute[0].Close
second_bar = minute[1].Close - minute[1].Open
third_bar = minute[2].Close - minute[2].Open
last_close = window[0].Close
last_min_open = minute[0].Open
last_min_close = minute[0].Close
sec_min_open = minute[1].Open
sec_min_close = minute[1].Close
if (last_bar < 0 and second_bar < 0 and
d.Decimal(0.9) < l_high_div_open < d.Decimal(1.1) and d.Decimal(0.9) < l_low_div_close < d.Decimal(1.1) and
last_close *d.Decimal(1.001) < minute[0].Close):
self.SetHoldings(symbol, -1.0/3.0)
self.Log('shorting')
self.Log(str(symbol)+", "+str(last_bar)+", "+str(second_bar)+", "+str(last_min_open)+
", "+str(last_min_close)+", "+str(sec_min_open)+", "+str(sec_min_close)+", "+str(last_close))
if self.Portfolio[symbol].Invested:
last_close = window[0].Close
last_min_open = minute[0].Open
last_min_close = minute[0].Close
last_bar = minute[0].Close - minute[0].Open
second_bar = minute[1].Close - minute[1].Open
if (last_close > last_min_close *d.Decimal(1.001)):
#self.Log(str(last_min_open)+", "+str(last_close))
self.Liquidate(symbol)
#self.Log('LIQUIDATE AT THRESHOLD REACHED.')
class SymbolData(object):
def __init__(self):
self.daily_rw = RollingWindow[TradeBar](5)
self.minute_rw = RollingWindow[TradeBar](5)
#self.tensec_rw = RollingWindow[TradeBar](5)
self.window = RollingWindow[TradeBar](5)