| Overall Statistics |
|
Total Trades 8 Average Win 0% Average Loss 0% Compounding Annual Return 69.677% Drawdown 0.900% Expectancy 0 Net Profit 0% Sharpe Ratio 7.037 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.763 Beta 1.005 Annual Standard Deviation 0.104 Annual Variance 0.011 Information Ratio 64.241 Tracking Error 0.012 Treynor Ratio 0.731 Total Fees $10.26 |
# QuantConnect Basic Template:
# Fundamentals to using a QuantConnect algorithm.
#
# You can view the QCAlgorithm base class on Github:
'''
error at
Runtime Error: Python.Runtime.PythonException: KeyNotFoundException : 'TMF' wasn't found in the Slice object, likely because there was no-data at this moment in time and it wasn't possible to fillforward historical data. Please check the data exists before accessing it with data.ContainsKey("TMF")
'''
import numpy as np
import pandas as pd
from datetime import datetime
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Indicators")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Data import *
from QuantConnect.Indicators import *
from QuantConnect.Orders import *
from QuantConnect.Securities import *
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
# Set the cash we'd like to use for our backtest
# This is ignored in live trading
self.SetCash(100000)
# Start and end dates for the backtest.
# These are ignored in live trading.
self.SetStartDate(2016,7,1)
self.SetEndDate(2017,1,1)
# Add assets you'd like to see
self.spy = self.AddEquity("SPY", Resolution.Minute).Symbol
self.bullish_stock = self.AddEquity("TQQQ", Resolution.Minute).Symbol
self.bearish_stock = self.AddEquity("TMF", Resolution.Minute).Symbol
self.small_cap_stock = self.AddEquity("TNA", Resolution.Minute).Symbol
self.mid_cap_stock = self.AddEquity("IJH", Resolution.Minute).Symbol
self.vxx = self.AddEquity("VXX", Resolution.Minute).Symbol
self.xiv= self.AddEquity("XIV", Resolution.Minute).Symbol
self.spy = self.AddEquity("TQQQ", Resolution.Minute).Symbol
self.shortSpy = self.AddEquity("TLT", Resolution.Minute).Symbol
self.stocks = [self.bullish_stock,
self.bearish_stock,
self.small_cap_stock,
self.mid_cap_stock,
self.xiv]
self.skippedSecurities = [
self.AddEquity("AGG", Resolution.Minute).Symbol,
self.AddEquity("TIPS", Resolution.Minute).Symbol
]
self.permanentStocks= [
self.AddEquity("AGG", Resolution.Minute).Symbol,
self.AddEquity("TIPS", Resolution.Minute).Symbol,
self.AddEquity("TLT", Resolution.Minute).Symbol,
self.AddEquity("SDY", Resolution.Minute).Symbol
]
self.enableProfitTaking = True
for i in range(20, 390, 60): # (low, high, every i minutes)
if not self.enableProfitTaking:
continue # uncomment to deactivate
self.Schedule.On(self.DateRules.EveryDay(),self.TimeRules.AfterMarketOpen("SPY"),Action(self.take_profit))
#error here
'''
for i in range(20, 390, 60): # (low, high, every i minutes)
if not self.enableProfitTaking:
continue # uncomment to deactivate
self.Schedule.On(self.DateRules.EveryDay(),self.TimeRules.AfterMarketOpen("SPY"),Action(self.limit_losses))
#following enables trading every Monday or other day if Monday holiday
self.DateRules.WeekStart(),self.TimeRules.BeforeMarketOpen("SPY",10),Action(self.set_is_first_of_week))
self.DateRules.WeekStart(),self.TimeRules.BeforeMarketOpen("SPY",10),Action(self.set_is_trading_day))
'''
# Event handler for the slice method
def OnData(self, slice): # Simple buy and hold template
self.data = slice
if not self.Portfolio.Invested:
pLen=len(self.permanentStocks)
for s in self.permanentStocks:
self.SetHoldings(s, 0.5/pLen)
for s in self.stocks:
self.SetHoldings(s, 0.10)
self.Debug("numpy test >>> print numpy.pi: " + str(np.pi))
def take_profit(self): # Close some positions to take profit
#pos = self.portfolio.positions
#if len(pos)== 0:
#return
for s in self.stocks:
if not self.Portfolio.ContainsKey(s):
continue
if self.Portfolio[s].Invested:
# Get last 10 bars of any positioin held , at specific resolution.
#history = self.PullHistory(s,10,Resolution.Daily,'close')
history = self.PullHistory(s,10,Resolution.Minute,'close')
#if self.slope(history) > 0: continue
#if self.slope(history[-5:]) > 0: continue
if history[-1] > history[-2]: continue
prc = history[-1]
amt = self.Portfolio[s].Quantity
'''
if (amt / abs(amt)) * ((prc / pos[s].cost_basis) - 1) > self.profit_threshhold:
self.log("taking profit at price of {0} above threshhold of {1} for symbol {2}".format(prc,self.profit_threshhold, s.symbol ))
limitprice= pos[s].cost_basis + ( (self.profit_threshhold *0.80) * prc)
#limitprice= pos[s].cost_basis + ( (self.profit_threshhold/2) * prc)
order_target_percent(s, 0.0, limit_price= limitprice)
self.maxprice[s.symbol] = 0
wait(self, s, 1) # start wait
'''
def PullHistory(self, syl, periods, resolution, pricetype):
open,close,high,low =[],[],[],[]
history = self.History(periods, resolution)
for slice in history:
bar = slice[syl]
open.append(bar.Open)
close.append(bar.Close)
high.append(bar.High)
low.append(bar.Low)
histdict = {'open':open,'close':close,'high':high,'low':low}
self.Log(str(history))
return histdict[pricetype]
import statsmodels.api as sm
def slope(in_list): # Return slope of regression line. [Make sure this list contains no nans]
return sm.OLS(in_list, sm.add_constant(range(-len(in_list) + 1, 1))).fit().params[-1] # slope