Overall Statistics
Total Orders
1498
Average Win
0.17%
Average Loss
-0.41%
Compounding Annual Return
6.003%
Drawdown
29.700%
Expectancy
0.094
Start Equity
100000
End Equity
133853.46
Net Profit
33.853%
Sharpe Ratio
0.106
Sortino Ratio
0.099
Probabilistic Sharpe Ratio
5.205%
Loss Rate
23%
Win Rate
77%
Profit-Loss Ratio
0.42
Alpha
-0.016
Beta
0.376
Annual Standard Deviation
0.126
Annual Variance
0.016
Information Ratio
-0.44
Tracking Error
0.144
Treynor Ratio
0.036
Total Fees
$2538.27
Estimated Strategy Capacity
$3600000.00
Lowest Capacity Asset
GSG TKH7EPK7SRC5
Portfolio Turnover
6.48%
Drawdown Recovery
106
#region imports
from AlgorithmImports import *

import numpy as np
from datetime import datetime
#endregion
# https://quantpedia.com/Screener/Details/1
# Use 5 ETFs (SPY - US stocks, EFA - foreign stocks, BND - bonds, VNQ - REITs, 
# GSG - commodities), equal weight the portfolio. Hold asset class ETF only when 
# it is over its 10 month (220 days) Simple Moving Average, otherwise stay in cash.

class AssetClassTrendFollowingAlgorithm(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.sma = self.sma(equity.symbol, 220, Resolution.DAILY)

    def on_data(self, data):
        symbols = [
            symbol for symbol, equity in self.securities.items() 
            if equity.price > equity.sma.current.value
        ]
        targets = [PortfolioTarget(s, 1/len(symbols)) for s in symbols]
        self.set_holdings(targets, True)