We examine the effectiveness of applying a trend following methodology to global asset allocation between equities, bonds, commodities and real estate. The application of trend following offers a substantial improvement in risk-adjusted performance compared to traditional buy-and-hold portfolios. We also find it to be a superior method of asset allocation than risk parity. We believe the discipline of trend following overcomes many of the behavioural biases investors succumb to, such as regret and herding. The other side of behavioural biases is that they may be exploited by investors: the clearest example of this is momentum investing where herding leads to continuation of returns and has been identified across many asset classes. Also, momentum and trend following have often been used interchangeably although the former is a relative concept and the latter absolute. By combining the two we find that one can achieve the higher return levels associated with momentum portfolios but with much reduced volatility and drawdowns due to trend following. We compare the performance of selected strategies using measures based on the utility function of a representative investor. These results reinforce the superiority of combining trend following with momentum strategies. We observe that a flexible asset allocation strategy that allocates capital to the best performing instruments irrespective of asset class enhances this further.
Keywords: Risk parity, trend following,bhavioral finance, momentum, global asset allocation, equities, bonds, real estate, commodities
- Target assets: Approximately 90 futures/ETFs spanning 5 major asset categories (developed equities, emerging equities, bonds, commodities, REITs).
- Apply a monthly trend analysis using a 10-month indicator on the asset types:
- Declining trend: Set aside 20% to a secure asset (U.S. Treasury Bills) by default.
- Ascending trend: Rank sub-components within asset class using 12-month return data normalized by prior 12-month volatility.
- Allocate to the top-performing 50% of the sub-categories (select the upper half of strong performers).
- Equal weighting: Among the main asset categories (each receiving 20%) and within the subcategories.
- Adjust the portfolio on a monthly basis.
import backtrader as bt import numpy as np class MomentumFilter(bt.Indicator): lines = ('momentum',) params = (('period', 10),) def __init__(self): self.addminperiod(self.params.period) def next(self): returns = (self.data.close / self.data.close[-self.params.period]) - 1 self.lines.momentum = returns class Strategy(bt.Strategy): params = ( ('momentum_period', 10), ('ranking_period', 12), ('risk_off_asset', 'US_T_Bills'), ) def __init__(self): self.investment_universe = self.datas self.inds = dict() for d in self.investment_universe: self.inds[d] = dict() self.inds[d]['momentum'] = MomentumFilter(d.close, period=self.params.momentum_period) def next(self): if self._counter % self.params.ranking_period == 0: risk_off = self.params.risk_off_asset rank_list =  for d in self.investment_universe: rank_list.append((d, self.inds[d]['momentum'])) rank_list.sort(key=lambda x: x, reverse=True) num_winners = len(rank_list) // 2 for i, (data, _) in enumerate(rank_list): if i < num_winners: target_weight = 0.2 / num_winners elif data._name == risk_off: target_weight = 0.2 else: target_weight = 0 self.order_target_percent(data, target_weight) self._counter += 1 # Your Backtrader Cerebro setup, adding data, strategy and running the backtest. cerebro = bt.Cerebro() # Add data, strategy, and run the backtest.