Quant BuffetRelax, Not Over Thinking

January Small-Cap Entry, Large-Cap Hold Strategy

Log in to collect

Academic 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

Annualised return12.7%
Beta0.972
Sharpe ratio0.263
Sortino ratio0.277
Maximum drawdown55.7%
Win rate60%

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()