| Overall Statistics |
|
Total Trades 71 Average Win 17.40% Average Loss -4.85% Compounding Annual Return 160.454% Drawdown 47.300% Expectancy 2.337 Net Profit 2759.819% Sharpe Ratio 1.825 Loss Rate 27% Win Rate 73% Profit-Loss Ratio 3.59 Alpha 0.992 Beta 0.355 Annual Standard Deviation 0.635 Annual Variance 0.403 Information Ratio 0.795 Tracking Error 0.866 Treynor Ratio 3.264 Total Fees $762.40 |
from math import ceil,floor
from datetime import datetime
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
class TrendFollowingAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetEndDate(2018, 7, 2)
self.SetCash(10000)
self.AddEquity("SPY", Resolution.Minute)
self.load_symbols()
self.SetBenchmark("DGAZ")
for symbol in self.symbols:
symbol.weight = 0
symbol.stopprice = None
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 5), Action(self.exit))
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 30), Action(self.symbol_weighting))
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 31), Action(self.trade))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 120), Action(self.exit))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 150), Action(self.symbol_weighting))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 151), Action(self.trade))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 250), Action(self.exit))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 280), Action(self.symbol_weighting))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 281), Action(self.trade))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 350), Action(self.exit))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 380), Action(self.symbol_weighting))
#self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 381), Action(self.trade))
def OnData(self, data):
pass
def symbol_weighting(self):
for symbol in self.symbols:
hist1 = self.History(self.symbols, 120, Resolution.Minute)
hist2 = self.History(self.symbols, 15, Resolution.Daily)
hist3 = self.History(self.symbols, 120, Resolution.Minute)
hist4 = self.History(self.symbols, 80, Resolution.Daily)
hist5 = self.History(self.symbols, 60, Resolution.Daily)
hist6 = self.History(self.symbols, 9, Resolution.Daily)
mean_price1 = (hist1.loc[symbol.Value]['close']).mean()
mean_price2 = (hist2.loc[symbol.Value]['close']).mean()
mean_price3 = (hist3.loc[symbol.Value]['close']).mean()
mean_price4 = (hist4.loc[symbol.Value]['close']).mean()
mean_price5 = (hist3.loc[symbol.Value]['close']).mean()
mean_price6 = (hist6.loc[symbol.Value]['close']).mean()
delta1 = ((hist2.loc[symbol.Value]['close']).mean()) - ((hist1.loc[symbol.Value]['close']).mean())
delta2 = ((hist3.loc[symbol.Value]['close']).mean()) - ((hist4.loc[symbol.Value]['close']).mean())
if mean_price2 > (mean_price4 * 1.6) and symbol.weight > 0:
self.Liquidate(symbol)
symbol.weight = 0
elif mean_price1 > (mean_price2 * 1.09) and symbol.weight > 0:
#if mean_price3 > mean_price4 and symbol.weight > 0:
#symbol.weight = 0
self.Liquidate(symbol)
symbol.weight = 0
elif mean_price3 < (mean_price4 * .4) and symbol.weight > 0:
self.Liquidate(symbol)
symbol.weight = 0
#elif mean_price1 < (mean_price5 * .3) and symbol.weight > 0:
# self.Liquidate(symbol)
# symbol.weight = 0
#elif mean_price3 > (mean_price4 * 1.2):
# self.Liquidate(symbol)
# symbol.weight = 0
elif mean_price1 < (mean_price2 * .9) and symbol.weight == 0:
if mean_price1 > (mean_price2 * .85) and symbol.weight == 0:
if mean_price1 < mean_price4 and symbol.weight == 0 :
#if mean_price3 > (mean_price4 * .75) and symbol.weight == 0:
#if mean_price3 < (mean_price4 * 1.25) and symbol.weight ==0:
#if mean_price3 < mean_price4 and symbol.weight == 0:
#if mean_price2 > (mean_price4 * -1.2):
symbol.weight = 1
elif mean_price2 > (mean_price4 * 1.5) and symbol.weight == 0:
if mean_price6 > mean_price2 and symbol.weight == 0:
symbol.weight = 1
def trade(self):
for symbol in self.symbols:
if symbol.weight == 0:
self.Liquidate(symbol)
elif symbol.weight != 0:
self.SetHoldings(symbol, symbol.weight)
else:
self.Liquidate(symbol)
def exit(self):
hist1 = self.History(self.symbols, 120, Resolution.Minute)
hist2 = self.History(self.symbols, 15, Resolution.Daily)
for symbol in self.symbols:
mean_price1 = (hist1.loc[symbol.Value]['close']).mean()
mean_price2 = (hist2.loc[symbol.Value]['close']).mean()
stoploss = abs(1.4) # percent change per period
if symbol.weight > 0 and symbol.stopprice is not None:
#symbol.stopprice = max(mean_price / stoploss, symbol.stopprice)
if mean_price1 < symbol.stopprice:
symbol.weight = 0
self.Liquidate(symbol)
if symbol.weight > 0 and symbol.stopprice is None:
symbol.stopprice = (mean_price2 / stoploss)
if mean_price1 < symbol.stopprice:
symbol.weight = 0
self.Liquidate(symbol)
#elif symbol.weight < 0 and symbol.stopprice is not None:
# symbol.stopprice = min(mean_price * stoploss, symbol.stopprice)
# if mean_price > symbol.stopprice:
# symbol.weight = 0
# self.Liquidate(symbol)
#elif symbol.weight < 0 and symbol.stopprice is None:
# symbol.stopprice = (mean_price * stoploss)
# if mean_price > symbol.stopprice:
# symbol.weight = 0
# self.Liquidate(symbol)
else:
symbol.stopprice = None
def load_symbols(self) :
syl_list = [
# Equity
#'SPY',
#'DIA',
#'VOO',
'DGAZ',
]
self.symbols = []
for i in syl_list:
self.symbols.append(self.AddEquity(i, Resolution.Minute).Symbol)