| Overall Statistics |
|
Total Trades 208 Average Win 0.91% Average Loss -0.65% Compounding Annual Return 0.885% Drawdown 16.400% Expectancy -0.001 Net Profit 4.425% Sharpe Ratio 0.13 Probabilistic Sharpe Ratio 1.737% Loss Rate 58% Win Rate 42% Profit-Loss Ratio 1.40 Alpha 0.012 Beta -0.01 Annual Standard Deviation 0.082 Annual Variance 0.007 Information Ratio -0.595 Tracking Error 0.148 Treynor Ratio -1.106 Total Fees $693.44 |
class UncoupledModulatedPrism(QCAlgorithm):
stopMarketTicket = None
stopMarketOrderFillTime = datetime.min
highestSPYPrice = -1
highestBNDPrice = -1
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetEndDate(2019, 12, 1)
self.SetCash(100000)
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):
self.Plot("SPY Data Chart", "Asset Price", self.Securities["SPY"].Price)
self.Plot("BND Data Chart", "Asset Price", self.Securities["BND"].Price)
if self.IsWarmingUp:
return
if (self.Time - self.stopMarketOrderFillTime).days < 1:
return
if self.spyMomentum.Current.Value > self.bondMomentum.Current.Value:
self.Liquidate("BND")
self.SetHoldings("SPY", 1)
self.stopMarketTicket = self.StopMarketOrder("SPY", -100, 0.9 * self.Securities["SPY"].Close)
elif self.spyMomentum.Current.Value < self.bondMomentum.Current.Value:
self.Liquidate("SPY")
self.SetHoldings("BND", 1)
self.stopMarketTicket = self.StopMarketOrder("BND", -100, 0.9 * self.Securities["BND"].Close)
else:
self.Plot("SPY Data Chart", "Stop Price", self.Securities["SPY"].Price * 0.90)
self.Plot("BND Data Chart", "Stop Price", self.Securities["BND"].Price * 0.90)
if self.Portfolio["SPY"].Invested and self.Securities["SPY"].Close > self.highestSPYPrice:
self.highestSPYPrice = self.Securities["SPY"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestSPYPrice * 0.9
self.stopMarketTicket.Update(updateFields)
elif self.Portfolio["BND"].Invested and self.Securities["BND"].Close > self.highestBNDPrice:
self.highestBNDPrice = self.Securities["BND"].Close
updateFields = UpdateOrderFields()
updateFields.StopPrice = self.highestBNDPrice * 0.9
self.stopMarketTicket.Update(updateFields)
def OnOrderEvent(self, orderEvent):
if orderEvent.Status != OrderStatus.Filled:
return
if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId:
self.stopMarketOrderFillTime = self.Time