| Overall Statistics |
|
Total Trades 61 Average Win 4.58% Average Loss -1.63% Compounding Annual Return 0.212% Drawdown 32.200% Expectancy 0.016 Net Profit 0.638% Sharpe Ratio 0.086 Probabilistic Sharpe Ratio 2.824% Loss Rate 73% Win Rate 27% Profit-Loss Ratio 2.81 Alpha 0.054 Beta -0.21 Annual Standard Deviation 0.153 Annual Variance 0.023 Information Ratio -0.675 Tracking Error 0.266 Treynor Ratio -0.063 Total Fees $191.44 Estimated Strategy Capacity $1300000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
#region imports
from AlgorithmImports import *
#endregion
from itertools import groupby
from collections import deque
class AdaptableSkyBlueHornet(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1)
self.SetEndDate(2022, 1, 1)
self.SetCash(100000)
self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
self.AddRiskManagement(MaximumDrawdownPercentPerSecurity(0.05))
# self.sma = self.SMA(self.spy, 30, Resolution.Daily)
# History warm up for shortcut helper SMA indicator
# closing_prices = self.History(self.spy, 30, Resolution.Daily)["close"]
# for time, price in closing_prices.loc[self.spy].items():
# self.sma.Update(time, price)
# Custom SMA indicator
self.sma = CustomSimpleMovingAverage("CustomSMA", 30)
self.RegisterIndicator(self.spy, self.sma, Resolution.Daily)
def OnData(self, data):
if not self.sma.IsReady:
return
# Save high, low, and current price
hist = self.History(self.spy, timedelta(90), Resolution.Daily)
low = min(hist["low"])
high = max(hist["high"])
price = self.Securities[self.spy].Price
# Go short if near high and downtrending
#if price >= high*0.95 and self.sma.Current.Value > price:
if self.sma.Current.Value > price:
if not self.Portfolio[self.spy].IsShort:
self.SetHoldings(self.spy, -1)
# Go long if near low and uptrending
#elif price <= low*1.05 and self.sma.Current.Value < price:
elif self.sma.Current.Value < price:
if not self.Portfolio[self.spy].IsLong:
self.SetHoldings(self.spy, 1)
# Otherwise, go flat
else:
return
#self.Liquidate()
self.Plot("Benchmark", "90d-High", high)
self.Plot("Benchmark", "90d-Low", low)
self.Plot("Benchmark", "SMA", self.sma.Current.Value)
class CustomSimpleMovingAverage(PythonIndicator):
def __init__(self, name, period):
self.Name = name
self.Time = datetime.min
self.Value = 0
self.queue = deque(maxlen=period)
def Update(self, input):
self.queue.appendleft(input.Close)
self.Time = input.EndTime
count = len(self.queue)
self.Value = sum(self.queue) / count
# returns true if ready
return (count == self.queue.maxlen)