Overall Statistics
Total Orders
1429
Average Win
0.12%
Average Loss
-0.27%
Compounding Annual Return
8.655%
Drawdown
21.400%
Expectancy
0.162
Start Equity
100000
End Equity
151466.34
Net Profit
51.466%
Sharpe Ratio
0.269
Sortino Ratio
0.3
Probabilistic Sharpe Ratio
13.253%
Loss Rate
20%
Win Rate
80%
Profit-Loss Ratio
0.45
Alpha
-0.019
Beta
0.627
Annual Standard Deviation
0.109
Annual Variance
0.012
Information Ratio
-0.579
Tracking Error
0.082
Treynor Ratio
0.047
Total Fees
$2202.33
Estimated Strategy Capacity
$2000000.00
Lowest Capacity Asset
GSG TKH7EPK7SRC5
Portfolio Turnover
4.37%
Drawdown Recovery
804
#region imports
from AlgorithmImports import *

import pandas as pd
from datetime import datetime
#endregion
# 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 (252 days) momentum into your portfolio and weight them equally. 
# Hold for 1 month and then rebalance.

class AssetClassMomentumAlgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(self.end_date - timedelta(5*365))
        self.set_cash(100000)
        self.settings.automatic_indicator_warm_up = True

        for ticker in ["SPY", "EFA", "BND", "VNQ", "GSG"]:
            equity = self.add_equity(ticker, Resolution.DAILY)
            equity.momp = self.momp(equity.symbol, 252, Resolution.DAILY)

    def on_data(self, slice):
        # Pick 3 ETFs with strongest momentum and weight them equally.
        to_long = [x.symbol for x in sorted(self.securities.values(), key=lambda s: s.momp)[-3:]]
        targets = [PortfolioTarget(symbol, 1/3) for symbol in to_long]
        self.set_holdings(targets, liquidate_existing_holdings=True)