| Overall Statistics |
|
Total Trades 353 Average Win 2.96% Average Loss -0.55% Compounding Annual Return -9.995% Drawdown 23.300% Expectancy 0.093 Net Profit -2.450% Sharpe Ratio 0.241 Probabilistic Sharpe Ratio 35.257% Loss Rate 83% Win Rate 17% Profit-Loss Ratio 5.41 Alpha -0.41 Beta -1.187 Annual Standard Deviation 0.748 Annual Variance 0.559 Information Ratio 0.529 Tracking Error 1.283 Treynor Ratio -0.152 Total Fees $814.55 |
import decimal as d
from datetime import timedelta
import numpy
from datetime import datetime
class MovingAverageCrossAlgorithm(QCAlgorithm):
def Initialize(self):
'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
self.SetStartDate(2020, 1, 1) #Set Start Date
self.SetEndDate(2020, 3, 26) #Set End Date
self.SetCash(60000) #Set Strategy Cash
self.AddEquity("SPY", Resolution.Minute).Symbol
self.AddEquity("SPXS", Resolution.Minute).Symbol
self.AddEquity("SDOW", Resolution.Minute).Symbol
self.AddEquity("EDZ", Resolution.Minute).Symbol
self.AddEquity("UDOW", Resolution.Minute).Symbol
self.AddEquity("TQQQ", Resolution.Minute).Symbol
self.AddEquity("SPXL", Resolution.Minute).Symbol
self.AddEquity("DIA", Resolution.Minute).Symbol
self.AddEquity("VOO", Resolution.Minute).Symbol
#Simple moving average
self.sma = {}
equity = self.AddEquity("SPY")
self.sma[equity.Symbol] = self.SMA(equity.Symbol, 60, Resolution.Minute)
self.smas = {}
equity = self.AddEquity("SPY")
self.smas[equity.Symbol] = self.SMA(equity.Symbol, 100, Resolution.Minute)
self.fastest = self.TEMA("DIA", 15, Resolution.Minute)
# create a 13 day exponential moving average
self.fast = self.EMA("VOO", 5, Resolution.Daily)
# create a 48 day exponential moving average
self.slow = self.EMA("VOO", 10, Resolution.Daily)
self.SetWarmUp(timedelta(days=20))
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.EveryDayAfterMarketOpen)
def EveryDayAfterMarketOpen(self):
# wait for our slow ema to fully initialize
if self.IsWarmingUp: return
# define a small tolerance on our checks to avoid bouncing
tolerance = 0.00015
if self.fast.Current.Value > self.slow.Current.Value:
# if the fast is greater than the slow, we'll go long
self.SetHoldings("SPXL", .3, True)
self.SetHoldings("TQQQ", .5, True)
self.SetHoldings("UDOW", .2, True)
print("bull")
if self.slow.Current.Value > self.fast.Current.Value:
self.SetHoldings("SPXS", .3, True)
self.SetHoldings("SDOW", .2, True)
self.SetHoldings("EDZ", .5, True)
print("bear")