Seasonality IV: bi-annual (momentum)

Following my value studies I ran momentum sensitivity studies in Amibroker on trade exit dates for bi-annual seasonal trading.  Data used was the daily Fama-French small momentum portfolio from 1984 to 2014.  Entry date is calendar day 300 (~ Nov 1).


Annual return peaks at 23% with exposure of 70% and a stable optima.


As with the value portfolio, the highest Sharpe Ratio is achieved from selling earlier in the year: day 90 and 210 for even and odd years respectively.  Annual return is reduced by 2% to achieve these higher risk-adjusted returns.

I plan to look at the addition of a trend-following filter (e.g. Faber 10 month average) and combining value and momentum to realize the portfolio benefits of negative correlation.

See previous post for Amibroker code.

Seasonality IV: bi-annual (value)

I ran some sensitivity studies in Amibroker on trade exit dates for bi-annual seasonal trading.  Data used was the daily Fama-French small value portfolio.  Entry date is calendar day 300 (~ Nov 1).

The profit maps show smooth, stable profiles with large regions near the optima.


Maximum annual return is 19% from 1984-2014 with 70% exposure (1 trade per year).  Return is less sensitive to exit date in even years relative to odd years.  Holding to calendar day 260 is best in odd years, showing an average tendency to rally until August.  ‘Sell in May’ reduces profits by a third!

These dates should be used as a guide only.  More accurate triggers, such as an oversold condition to buy could be used.  However, the average gain is 24% therefore extreme accuracy on entry and exit is not necessary.


Sharpe Ratio shows a similar and stable picture but with earlier exits: day 80 in even years and day 210 in odd years.  Again, real-time triggers could be overlaid on this road map.

Note that doubling the length of these tests (back to 1954) produces very similar results, implying that the phenomena is fairly reliable although the cause is a subject of debate.

Amibroker code:

os = Optimize(“odd year sell day,260,60,300,10);

es = Optimize(“even year sell day,120,60,200,10);

Buy = DayOfYear() > 300;

Sell = DayOfYear() > IIf(Year()%2,os,es) && 1Buy;

Bi-annual seasonality

There is a marked difference in characteristics between even and odd years.  To illustrate, plotting 30 years of monthly returns from Ken French’s small value portfolio against a 24 month index:


Poor performance in even years (months 1-12) starts earlier and lasts longer.  The trendline exhibits a much narrower and later trough in odd years (months 13-24).


The market return, in excess of the risk-free rate, is plotted in blue.  Excluding months 4-7 in even years, 8-10 in odd years and St. Louis Fed Recessions (brown) produces the red equity curve.  Annual excess return is 10.2% with negligible drawdown (i.e. big losses typically occur in certain months).

Note that we are in currently in month 5 of an even year.

In the next post I will investigate the sensitivity of this simple approach to parameter changes.