Overall Statistics Total Trades 87 Average Win 11.41% Average Loss -4.39% Compounding Annual Return 8.674% Drawdown 77.000% Expectancy 0.482 Net Profit 174.827% Sharpe Ratio 0.426 Loss Rate 59% Win Rate 41% Profit-Loss Ratio 2.60 Alpha 0.177 Beta -2.669 Annual Standard Deviation 0.294 Annual Variance 0.086 Information Ratio 0.359 Tracking Error 0.294 Treynor Ratio -0.047 Total Fees \$885.21
```# https://quantpedia.com/Screener/Details/2
# Use 5 ETFs (SPY - US stocks, EFA - foreign stocks, BND - bonds, VNQ - REITs, GSG - commodities).
# Pick 3 ETFs with strongest 12 month momentum into your portfolio and weight them equally.
# Hold for 1 month and then rebalance.

import pandas as pd
from datetime import datetime

class AssetClassMomentumAlgorithm(QCAlgorithm):

def Initialize(self):

self.SetStartDate(2007, 5, 1)
self.SetEndDate(datetime.now())
self.SetCash(100000)
# create a dictionary to store momentum indicators for all symbols
self.data = {}
period = 12*21
self.symbols = ["SPY", "EFA", "BND", "VNQ", "GSG"]
# warm up the MOM indicator
self.SetWarmUp(period)
for symbol in self.symbols:
self.data[symbol] = self.MOM(symbol, period, Resolution.Daily)
# shcedule the function to fire at the month start
self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY"), self.Rebalance)

def OnData(self, data):
pass

def Rebalance(self):
if self.IsWarmingUp: return
top3 = pd.Series(self.data).sort_values(ascending = False)[:3]
for kvp in self.Portfolio:
security_hold = kvp.Value
# liquidate the security which is no longer in the top3 momentum list
if security_hold.Invested and (security_hold.Symbol.Value not in top3.index):
self.Liquidate(security_hold.Symbol)