| Overall Statistics |
|
Total Trades 35 Average Win 0.88% Average Loss -1.02% Compounding Annual Return 7.031% Drawdown 9.600% Expectancy -0.123 Net Profit 5.108% Sharpe Ratio 0.505 Probabilistic Sharpe Ratio 32.245% Loss Rate 53% Win Rate 47% Profit-Loss Ratio 0.86 Alpha 0.078 Beta -0.092 Annual Standard Deviation 0.126 Annual Variance 0.016 Information Ratio -0.581 Tracking Error 0.174 Treynor Ratio -0.692 Total Fees $89.20 |
# Monthly ETF Rollover Strategy
# Use 11 Sector ETFs (XLB, XLC, XLE, XLF, XLI, XLK, XLP, XLRE, XLU, XLV, and XLY), equal weight the TOP3 ETF’s on 1st Day of the Month. Hold asset class Sector ETF’s for 1 month.
# If ETF is still in the TOP3 at month end, Keep It
import numpy as np
import pandas as pd
from datetime import datetime
class EmmausAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 5, 1)
self.SetCash(100000)
# choose 11 sector ETFs
tickers = [ "XLB", # Materials
"XLC", # Communication Services
"XLE", # Energy
"XLF", # Financials
"XLI", # Industrials
"XLK", # Technology
"XLP", # Staples
"XLRE", # Real Estate
"XLU", # Utilities
"XLV", # Health Care
"XLY"] # Discretionary
self.data = {}
for ticker in tickers:
symbol = self.AddEquity(ticker, Resolution.Daily).Symbol
self.data[symbol] = RateOfChangePercent(1)
consolidator = TradeBarConsolidator(CalendarType.Monthly)
self.RegisterIndicator(symbol, self.data[symbol], consolidator)
self.SetWarmUp(30)
# shcedule the function to fire at the month start
self.Schedule.On(
self.DateRules.MonthStart("XLB"),
self.TimeRules.AfterMarketOpen("XLB", 10),
self.Rebalance)
def Rebalance(self):
if self.IsWarmingUp:
return
func = lambda x: x[1].Current.Value
top3 = {x[0]: x[1].Current.Value
for x in sorted(self.data.items(), key=func, reverse=True)[:3]}
for kvp in self.Portfolio:
symbol = kvp.Key
if symbol in top3:
continue
# liquidate the security which is no longer in the top3 momentum list
if kvp.Value.Invested:
self.Liquidate(symbol, 'Not selected')
for symbol, value in top3.items():
self.SetHoldings(symbol, 1/3)