Idea Streams #9 – Seasonal Investing Strategy
In this episode of Idea Streams, we look at a seasonal investing strategy. The rationale behind this investment strategy is that consumer cyclical stocks like e-commerce websites or retailers are typically undervalued before the Christmas season. So our expectation is that these stocks will increase in value between November and March.
We designed our trading strategy to have two states. The portfolio is either invested in the general market or in consumer cyclical stocks. To invest in the general market, we selected the SPY ETF because it tracks the S&P 500 index. To invest in consumer cyclical stocks, we set up universe selection methods to return all of the stocks that are trading above $5/share and are classified by MorningStar as being in the consumer cyclical sector.
def SelectCoarse(self, coarse): return [c.Symbol for c in coarse if c.Price > 5] def SelectFine(self, fine): return [x.Symbol for x in fine if x.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.ConsumerCyclical]
We set our data resolution to daily, so the orders are filled at the market open when the algorithm switches between the two states. On the first day of March each year, we enter the market state, so we invest our entire portfolio into SPY.
def into_market(self): self.Liquidate() self.SetHoldings(self.market, 1)
On the first day of November each year, we enter the consumer cyclical state, so we liquidate our SPY holdings and create an equal-weighted portfolio of all the consumer cyclical stocks in our universe.
def into_consumer(self, securities): self.Liquidate() for s in securities: self.SetHoldings(s, 1 / len(securities))
After entering the consumer cyclical stocks in November, the portfolio isn’t rebalanced. This way, the portfolio isn’t always equally weighted, but we avoid fees by reducing the number of trades.
This strategy adjusts the portfolio holdings only twice each year, so we wanted a long time period to run the backtest. We set the backtest start date to January 1, 2000. To judge the performance of our trading strategy, we compared its results to a backtest of just buying and holding SPY since January 1, 2000. After running both backtests, we noticed the following results:
|Strategy||Buy and Hold|
From these results, it seems our initial strategy rationale has some truth behind it. The Sharpe ratio for this strategy isn’t as high as other strategies, but it does beat the market benchmark. Either way, these results should be taken with a pinch of salt since the strategy trades so infrequently.
We hope you now have a better idea of how to create a seasonal investing strategy and how to use the fundamental universe selection methods to filter your universe by sector. To view the strategy code, clone the backtest below.