We demonstrate a novel and striking annual cycle in the US Treasury market, with a variation of over 80 basis points from peak to trough in monthly returns. The Treasury return seasonal pattern is opposite to that evident in equity returns, and the opposing patterns are not due to unconditional negative correlation between Treasury and stock returns. We show that the seasonal Treasury and equity return patterns are unlikely to arise from macroeconomic seasonalities, seasonal variation in risk, cross-hedging between equity and Treasury markets, investor sentiment, seasonalities in the Treasury market auction schedule, seasonalities in the Treasury debt supply, seasonalities in the FOMC cycle, or peculiarities of the sample period considered. The seasonal cycles become more pronounced during periods of high market volatility, consistent with the notion that the seasonal cycles are a result of time-varying risk aversion among market participants. The seasonal patterns in equity and Treasury returns are coincident with the incidence of seasonal depression observed clinically in North American populations, and depression has been shown to be associated with reduced risk tolerance. The White (2000) reality test confirms that the correlation between returns and the clinical incidence of seasonal depression cannot be easily dismissed as the simple result of data snooping. Our findings are all the more remarkable given that it is expert traders who dominate the Treasury market.
Keywords: time-varying risk aversion, Treasury bills, return seasonality
- Hold stocks from December through May.
- From June until November, invest in government bonds.
- Use instruments like ETFs, mutual funds, futures, or alternative derivatives for investments.
import backtrader as bt class SeasonalityStrategy(bt.Strategy): params = ( ('equity_symbol', 'SPY'), ('treasury_symbol', 'TLT'), ) def __init__(self): self.equity = self.datas[self.data_names.index(self.params.equity_symbol)] self.treasury = self.datas[self.data_names.index(self.params.treasury_symbol)] def next(self): current_month = self.datetime.date(ago=0).month if current_month in [12, 1, 2, 3, 4, 5]: # Hold equities from December to May if not self.getposition(self.equity).size: self.order_target_percent(self.equity, target=1.0) self.order_target_percent(self.treasury, target=0.0) else: # Hold Treasuries from June to November if not self.getposition(self.treasury).size: self.order_target_percent(self.treasury, target=1.0) self.order_target_percent(self.equity, target=0.0) cerebro = bt.Cerebro() cerebro.addstrategy(SeasonalityStrategy) # Add your data feeds for equity_symbol and treasury_symbol here cerebro.run()
Please note that you’ll need to add the data feeds for the equity and treasury symbols that you would like to use in this strategy. The code provided assumes you are using the ‘SPY’ ETF as a proxy for equities and the ‘TLT’ ETF as a proxy for treasuries. Adjust the symbols as needed for your chosen investment vehicles.