Overall Statistics
Total Trades
447
Average Win
0.14%
Average Loss
-0.14%
Compounding Annual Return
4.239%
Drawdown
26.500%
Expectancy
0.693
Net Profit
42.713%
Sharpe Ratio
0.447
Probabilistic Sharpe Ratio
5.397%
Loss Rate
15%
Win Rate
85%
Profit-Loss Ratio
0.99
Alpha
-0.035
Beta
0.591
Annual Standard Deviation
0.109
Annual Variance
0.012
Information Ratio
-1.119
Tracking Error
0.083
Treynor Ratio
0.083
Total Fees
$454.27
'''An implementation of Meb Faber's base model: Global Tactical Asset Allocation model (GTAA)(5) 
Buy&Hold portfolio (monthly rebalance), as found in the paper: 
"A Quantitative Approach to Tactical Asset Allocation" published May 2006.
'''
class GlobalTacticalAssetAllocationBase(QCAlgorithm):
    def Initialize(self):
        backtestDuration = 365*10
        self.SetStartDate(2011, 10, 29) # (datetime.now() - timedelta(backtestDuration))
        self.SetEndDate(2020, 5, 20) # (datetime.now())
        self.SetCash(100000) 
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin)
        self.UniverseSettings.Resolution = Resolution.Minute
        symbols = [Symbol.Create(ticker, SecurityType.Equity, Market.USA) 
                    for ticker in [ "SPY", # US Large Cap ETF
                                    "VEA", # Developed Foreign Stocks (TradedSince: 2007/8)ETF 
                                    "IEF", # US 10Y Gov.Bonds ETF 
                                    "DBC", # GSCI Commodities ETF (TradedSince: 2006/3)
                                    "VNQ"  # US RealEstate ETF
                                    ]]
        self.AddUniverseSelection(ManualUniverseSelectionModel(symbols))
        self.AddAlpha(ConstantAlphaModel(InsightType.Price, InsightDirection.Up, timedelta(days = backtestDuration), None, None))
        self.Settings.RebalancePortfolioOnInsightChanges = False
        self.Settings.RebalancePortfolioOnSecurityChanges = False
        self.SetPortfolioConstruction( EqualWeightingPortfolioConstructionModel(self.DateRules.MonthStart("SPY")) )
        self.SetExecution( ImmediateExecutionModel() ) 
        self.AddRiskManagement( NullRiskManagementModel() )