| Overall Statistics |
|
Total Orders 896 Average Win 0.63% Average Loss -1.31% Compounding Annual Return 6.041% Drawdown 29.400% Expectancy 0.236 Start Equity 100000 End Equity 421221.68 Net Profit 321.222% Sharpe Ratio 0.243 Sortino Ratio 0.239 Probabilistic Sharpe Ratio 0.050% Loss Rate 17% Win Rate 83% Profit-Loss Ratio 0.48 Alpha 0.012 Beta 0.304 Annual Standard Deviation 0.104 Annual Variance 0.011 Information Ratio -0.118 Tracking Error 0.144 Treynor Ratio 0.083 Total Fees $3101.02 Estimated Strategy Capacity $370000.00 Lowest Capacity Asset IEF SGNKIKYGE9NP Portfolio Turnover 1.09% |
# https://quantpedia.com/strategies/asset-class-trend-following/
#
# Use 5 ETFs (SPY - US stocks, EFA - foreign stocks, IEF - bonds, VNQ - REITs,
# GSG - commodities), equal weight the portfolio. Hold asset class ETF only when
# it is over its 10 month Simple Moving Average, otherwise stay in cash.
#
# QC implementation changes:
# - SMA with period of 210 days is used.
#region imports
from AlgorithmImports import *
#endregion
class AssetClassTrendFollowing(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
tickers: List[str] = ["SPY", "EFA", "IEF", "VNQ", "GSG"]
period: int = 10 * 21
self.sma: Dict[Symbol, SimpleMovingAverage] = {
self.AddEquity(ticker, Resolution.Minute).Symbol : self.SMA(ticker, period, Resolution.Daily) for ticker in tickers
}
self.recent_month: int = -1
self.SetWarmUp(period, Resolution.Daily)
self.Settings.MinimumOrderMarginPortfolioPercentage = 0.
def OnData(self, data: Slice) -> None:
if self.IsWarmingUp: return
if not (self.Time.hour == 9 and self.Time.minute == 31):
return
# rebalance once a month
if self.Time.month == self.recent_month:
return
self.recent_month = self.Time.month
long: List[Symbol] = [ symbol for symbol, sma in self.sma.items()
if symbol in data
and data[symbol]
and sma.IsReady
and data[symbol].Value > sma.Current.Value
]
portfolio: List[PortfolioTarget] = [PortfolioTarget(symbol, 1. / len(long)) for symbol in long]
self.SetHoldings(portfolio, True)