Overall Statistics |
Total Trades 206 Average Win 6.28% Average Loss -1.42% Compounding Annual Return 17.724% Drawdown 31.800% Expectancy 1.650 Net Profit 126.373% Sharpe Ratio 0.823 Probabilistic Sharpe Ratio 27.845% Loss Rate 51% Win Rate 49% Profit-Loss Ratio 4.43 Alpha 0.168 Beta -0.007 Annual Standard Deviation 0.204 Annual Variance 0.042 Information Ratio 0.422 Tracking Error 0.313 Treynor Ratio -23.923 Total Fees $206.00 |
from math import floor class MomentumBasedTacticalAllocation(QCAlgorithm): def Initialize(self): self.SetStartDate(2007, 8, 1) self.SetEndDate(2012, 8, 1) self.SetCash(3000) self.spy = self.AddEquity("SPY", Resolution.Daily) self.bnd = self.AddEquity("BND", Resolution.Daily) self.spyMomentum = self.MOMP("SPY", 50, Resolution.Daily) self.bondMomentum = self.MOMP("BND", 50, Resolution.Daily) self.SetBenchmark(self.spy.Symbol) self.SetWarmUp(50) def OnData(self, data): if self.IsWarmingUp: return #1. Limit trading to happen once per week if self.Time.weekday() != 1: return if self.spyMomentum.Current.Value > self.bondMomentum.Current.Value: if self.Securities["SPY"].Close == 0: return self.Liquidate(self.bnd.Symbol) self.MarketOrder(self.spy.Symbol, floor(self.Portfolio.MarginRemaining/self.Securities["SPY"].Close)) #2. Otherwise we liquidate our holdings in SPY and allocate 100% to BND else: if self.Securities["BND"].Close == 0: return self.Liquidate(self.spy.Symbol) self.MarketOrder(self.bnd.Symbol, floor(self.Portfolio.MarginRemaining/self.Securities["BND"].Close))