January Small-Cap Entry, Large-Cap Hold Strategy
Log in to collectAcademic paper
Strategy in a nutshell
Invest in small-cap stocks at the beginning of each January. Stay invested in large-cap stocks for the rest of the year.
Economic rationale
The most common explanation of this phenomenon is connected with the tax-sensitive individual investors (to income taxes). If those investors disproportionately hold small stocks, they tend to sell those stocks for tax reasons at the end of the year (to claim a capital loss) and reinvest during the first month of the next year. This paper overall states that this anomaly should work and is significant; however, if we would also consider another research, the conclusions become mixed. For example, Haug and Hirschey in the “The January Effect” say that: “The January effect in small-cap stock returns is remarkably consistent over time, and does not appear to have been affected by the passage of the Tax Reform Act of 1986. This finding adds a new perspective to the traditional tax-loss selling hypothesis and suggests the potential relevance of behavioral explanations. After a generation of intensive study, the January effect is alive and well, and continues to present a daunting challenge to the Efficient Market Hypothesis.”
But the research of Anthony Yanxiang Gu – “The Declining January Effect: Evidence from the U.S. Equity Markets” says that: “The January effect exhibits a pronounced declining trend for both large and small firm stock indices since 1988 and the effect is disappearing for the Russell indices. The downward trend is more apparent for indices containing small stocks than for indices of large stocks.”. Connecting the aforementioned with the transaction costs leads to a conclusion that in the recent period, the January effect is becoming impossible to trade.
Backtest performance
Full Python code
from AlgoLib import *
class JanuaryEffectInStocks(XXX):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
data = self.AddEquity("SPY", Resolution.Daily)
data.SetLeverage(10)
self.large_cap = data.Symbol
data = self.AddEquity("IWM", Resolution.Daily)
data.SetLeverage(10)
self.small_cap = data.Symbol
self.start_price = None
self.recent_month = -1
def OnData(self, data):
if self.recent_month == self.Time.month:
return
self.recent_month = self.Time.month
if self.Securities[self.large_cap].GetLastData() and self.Securities[self.small_cap].GetLastData():
if (self.Time.date() - self.Securities[self.large_cap].GetLastData().Time.date()).days < 5 and (self.Time.date() - self.Securities[self.small_cap].GetLastData().Time.date()).days < 5:
if self.Time.month == 1:
if self.Portfolio[self.large_cap].Invested:
self.Liquidate(self.large_cap)
self.SetHoldings(self.small_cap, 1)
else:
if self.Portfolio[self.small_cap].Invested:
self.Liquidate(self.small_cap)
self.SetHoldings(self.large_cap, 1)
else:
self.Liquidate()
else:
self.Liquidate()