Overall Statistics |
Total Trades 2171 Average Win 0.03% Average Loss 0.00% Compounding Annual Return -11.189% Drawdown 2.200% Expectancy -0.749 Net Profit -1.292% Sharpe Ratio -2.179 Probabilistic Sharpe Ratio 9.218% Loss Rate 98% Win Rate 2% Profit-Loss Ratio 14.53 Alpha -0.077 Beta -0.03 Annual Standard Deviation 0.041 Annual Variance 0.002 Information Ratio -1.994 Tracking Error 0.245 Treynor Ratio 2.969 Total Fees $2333.76 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Common") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Indicators") AddReference("QuantConnect.Algorithm.Framework") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Indicators import * from QuantConnect.Algorithm.Framework import * from QuantConnect.Algorithm.Framework.Risk import * from QuantConnect.Algorithm.Framework.Alphas import * from QuantConnect.Algorithm.Framework.Execution import * from QuantConnect.Algorithm.Framework.Portfolio import * from QuantConnect.Algorithm.Framework.Selection import * from QuantConnect.Algorithm.Framework.Selection import * from QuantConnect.Indicators import RollingWindow, SimpleMovingAverage import numpy as np from datetime import timedelta from Execution.ImmediateExecutionModel import ImmediateExecutionModel from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel from Risk.MaximumDrawdownPercentPerSecurity import MaximumDrawdownPercentPerSecurity #from HealthcareUniverse import HealthcareUniverse class SMACrossAlphaModel(AlphaModel): def __init__(self): # Initialize Indicators self.smaslow = [] self.smafast = [] # Create Rolling Windows self.checkWindow = RollingWindow[float](2) self.smaslowWindow = None self.smafastWindow = None def OnSecuritiesChanged(self, algorithm, changes): # Modify data if securities changed for security in changes.AddedSecurities: symbol = security.Symbol self.smaslow.append({'symbol':symbol, 'indicator':algorithm.SMA(symbol, 21, Resolution.Daily)}) self.smafast.append({'symbol':symbol, 'indicator':algorithm.SMA(symbol, 9, Resolution.Daily)}) self.numSecurities = len(self.smaslow) # Works appropriately for manual universe, health universe fails with half empty dictionary {'symbol':symbol, } def Update(self, algorithm, data): insights = [] if not self.smaslow[0]['indicator'].IsReady: return insights self.UpdateWindows(data) if not self.checkWindow.IsReady: return insights insights += self.CrossIndicator(data) algorithm.Debug(len(insights)) return insights def UpdateWindows(self, data): if self.smaslowWindow is None: self.InitializeWindows() self.checkWindow.Add(1) self.smaslowWindow[1, :] = self.smaslowWindow[0, :] self.smafastWindow[1, :] = self.smafastWindow[0, :] for i in range(self.numSecurities): self.smaslowWindow[0, i] = self.smaslow[i]['indicator'].Current.Value self.smafastWindow[0, i] = self.smafast[i]['indicator'].Current.Value def InitializeWindows(self): self.smaslowWindow = np.zeros(shape=(2, self.numSecurities)) self.smafastWindow = np.zeros(shape=(2, self.numSecurities)) def CrossIndicator(self, data): insights = [] for i in range(self.numSecurities): if (self.smafastWindow[0, i] < self.smaslowWindow[0, i]) or (self.smaslowWindow[0, i] < self.smaslowWindow[1, i]): insights.append(Insight.Price(self.smaslow[i]['symbol'], timedelta(days=5), InsightDirection.Down)) else: insights.append(Insight.Price(self.smaslow[i]['symbol'], timedelta(days=5), InsightDirection.Up)) return insights class SMACrossFramework(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 6, 1) # Set Start Date self.SetCash(1000000) # Set Strategy Cash self.SetBrokerageModel(AlphaStreamsBrokerageModel()) #self.spy = self.AddEquity('SPY') self.SetBenchmark(self.AddEquity('SPY').Symbol) self.UniverseSettings.Resolution = Resolution.Daily tickers = ['SPY', 'BND'] symbols = [ Symbol.Create(ticker, SecurityType.Equity, Market.USA) for ticker in tickers ] self.SetUniverseSelection(ManualUniverseSelectionModel(symbols)) #self.SetUniverseSelection(HealthcareUniverse()) self.SetAlpha(SMACrossAlphaModel()) self.SetExecution(ImmediateExecutionModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.01))