“每年一月初投资小盘股,其余时间投资大盘股。这一现象与税收敏感的个人投资者有关,他们年底出售小盘股并在新年重新投资。尽管研究表明一月效应有效,Haug和Hirschey的研究指出其未受税制改革影响,而Gu的研究显示该效应自1988年以来显著下降,近期难以获利。”
资产类别:差价合约、ETF、基金、期货 | 地区:全球 | 频率:每月 | 市场:股票 | 关键词:一月,日历
策略概述
每年一月初投资于小盘股。全年其余时间投资于大盘股。
策略合理性
对这一现象最常见的解释与税收敏感的个人投资者(针对所得税)有关。如果这些投资者主要持有小盘股,他们往往会在年底为税务目的卖出这些股票(以申报资本损失),并在下一年年初重新投资。这篇论文总体上认为这种异常现象应该是有效且显著的;然而,如果我们结合其他研究,结论就会变得复杂。例如,Haug 和 Hirschey 在《一月效应》中指出:“小盘股回报中的一月效应在时间上非常一致,似乎并未受到1986年税制改革法案通过的影响。这一发现为传统的税损抛售假说提供了新的视角,并表明行为解释的潜在相关性。在经过一代人的深入研究后,一月效应依然存在,并继续对有效市场假说构成严峻挑战。”
但 Anthony Yanxiang Gu 的研究《日益减弱的一月效应:来自美国股票市场的证据》则指出:“自1988年以来,一月效应在大公司和小公司股票指数中的表现呈显著下降趋势,这一效应在罗素指数中正在消失。对于包含小盘股的指数而言,这一下降趋势比大盘股指数更为明显。”结合上述内容与交易成本,可以得出结论,近期一月效应已经变得难以通过交易获利。
论文来源
The Persistence of the Small Firm/January Effect: Is it Consistent With Investors’ Learning and Arbitrage Efforts? [点击浏览原文]
- Kathryn E. Easterday,美国怀特州立大学
- Pradyot K. Sen,美国华盛顿大学博瑟尔分校
- Jens Stephan,独立研究员
<摘要>
通过改进的方法和扩展的研究设计,我们研究了小公司/一月效应是否由于市场效率而逐渐减弱。首先,我们发现1963-1979年后的一月回报较小,但只是恢复到那个时间之前的水平。其次,我们表明,一月效应不仅限于成熟市场,还出现在20世纪70年代相对较新的纳斯达克交易公司中。第三,小公司的12月和1月交易量与其他月份没有显著差异,表明交易者没有积极进行套利。综上所述,我们的结果表明,这种异常现象在一个有效市场中依然难以用理性解释。


回测表现
| 年化收益率 | 12.7% |
| 波动率 | N/A |
| Beta | 0.972 |
| 夏普比率 | 0.263 |
| 索提诺比率 | 0.277 |
| 最大回撤 | 55.7% |
| 胜率 | 60% |
完整python代码
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()
