Overall Statistics |
Total Trades 159 Average Win 1.21% Average Loss -0.76% Compounding Annual Return 1.293% Drawdown 18.900% Expectancy 0.127 Net Profit 6.733% Sharpe Ratio 0.19 Probabilistic Sharpe Ratio 3.383% Loss Rate 57% Win Rate 43% Profit-Loss Ratio 1.60 Alpha -0.023 Beta 0.357 Annual Standard Deviation 0.086 Annual Variance 0.007 Information Ratio -0.834 Tracking Error 0.112 Treynor Ratio 0.046 Total Fees $599.76 |
from clr import AddReference AddReference("QuantConnect.Algorithm.Framework") AddReference("QuantConnect.Indicators") AddReference("QuantConnect.Common") from QuantConnect import * from QuantConnect.Indicators import * from QuantConnect.Algorithm.Framework.Alphas import * from datetime import timedelta class MomentumBasedTacticalAllocation(QCAlgorithm): def Initialize(self): self.SetStartDate(2014, 10, 1) #self.SetEndDate(2010, 8, 1) self.SetCash(100000) self.SetBrokerageModel(BrokerageName.AlphaStreams) self.spy = self.AddEquity("SPY", Resolution.Daily) self.bnd = self.AddEquity("BND", Resolution.Daily) self.spyMomentum = self.MOMP("SPY", 50, Resolution.Daily) self.bndMomentum = self.MOMP("BND", 50, Resolution.Daily) self.reference = "SPY" self.SetBenchmark("SPY") self.SetWarmUp(50) def Update(self, algorithm, data): insights = [] for symbol, symbolData in self.symbolDataBySymbol.items(): if symbolData.CanEmit: direction = InsightDirection.Flat magnitude = symbolData.Return if magnitude > 0: direction = InsightDirection.Up if magnitude < 0: direction = InsightDirection.Down insights.append(Insight.Price(symbol, self.predictionInterval, direction, magnitude, None)) self.EmitInsights(insights) return insights def OnData(self, data): # Don't place trades until our indicators are warmed up: if self.IsWarmingUp: return #1. If SPY has more upward momentum than BND, then we liquidate our holdings in BND and allocate 100% of our equity to SPY if self.spyMomentum.Current.Value > self.bndMomentum.Current.Value: self.Liquidate("BND") self.SetHoldings("SPY",1) #2. Otherwise we liquidate our holdings in SPY and allocate 100% to BND else: self.Liquidate("SPY") self.SetHoldings("BND",1)