Do stocks do worse on Mondays? Finding daily/monthly patterns in stock returns [2021]

Do stocks do worse on Mondays? Finding daily/monthly patterns in stock returns [2021]

We will look at two ETFs as a proxy for the market: SPY and QQQ.

Do stocks do worse on Mondays? Daily patterns in stock returns

Lets load the data for QQQ first. First, let’s add percent change (from yesterday’s close), and the intraday percent change (close-open)/close:

data['intraday_change'] = (data.adj_close-data.adj_open)/data.adj_open
data['pct'] = data['adj_close'].pct_change()

We also add the day of week to the data table:

data['dayofweek'] = data.index.day_name()

Now, let’s look at intraday returns. Which weekday has the highest average returns?

data.groupby('dayofweek')['intraday_change'].mean()


Out[592]: 
dayofweek
Friday      -0.000918
Monday      -0.000095
Thursday     0.000340
Tuesday     -0.000227
Wednesday    0.000064
Name: intraday_change, dtype: float64

So there appears to be a clear winner — Thursday. However, when we run the same query on the S&P 500, the best day for intraday returns is Wednesday, with Thursday being one of the worst days.

We can go further by checking the percentage of up days by day of week:

data.groupby('dayofweek')['intraday_change'].apply(lambda x: x[x>0].count()/x.count()).reset_index(name='count')


Out[594]: 
   dayofweek     count
0     Friday  0.486071
1     Monday  0.524590
2   Thursday  0.539197
3    Tuesday  0.535278
4  Wednesday  0.521617

So if you invest in QQQ from open to close on Thursday, you have a slightly higher likelihood of making a positive return, compared to other days. This is not consistent with SPY, which does the best on Thursdays.

Do the same rules hold true for daily returns (from close the night before to today’s close)?


data.groupby('dayofweek')['pct'].mean()


Out[596]: 
dayofweek
Friday      -0.000411
Monday       0.000202
Thursday     0.000930
Tuesday      0.000633
Wednesday    0.000592
Name: pct, dtype: float64

data.groupby('dayofweek')['pct'].apply(lambda x: x[x>0].count()/x.count()).reset_index(name='count')


Out[595]: 
   dayofweek     count
0     Friday  0.506244
1     Monday  0.556352
2   Thursday  0.544933
3    Tuesday  0.549389
4  Wednesday  0.555451

From these results for QQQ, it looks like although you have the highest returns on Thursdays, you have a higher likelihood of a positive return on Monday. Both results for QQQ suggest that the worst day is Friday.

SPY, meanwhile, has its best mean day on Tuesdays, and its best likelihood of a positive return on Wednesdays.

Do stocks do better in January? Monthly patterns in stock returns

Now, let’s examine months. There is a general belief that January has the highest returns on average. We add a month field to test that:

data['month'] = data.index.month_name()

We can then calculate the mean return by month. The results show that October is actually the best month to invest in QQQ, followed by April and July. January is toward the middle.

data.groupby('month')['pct'].mean()


Out[604]: 
month
April        0.001175
August       0.000374
December    -0.000191
February    -0.000255
January      0.000523
July         0.000830
June         0.000022
March        0.000457
May          0.000384
November     0.000579
October      0.001441
September   -0.000773
Name: pct, dtype: float64

January is also not a particularly great month for the S&P 500, although its best month is April.

We can test whether certain days of the month or year are more likely to be profitable. When we look at median returns by day of month, we find that the first day of the month has the highest average return for both QQQ and SPY.

The outsized return on the first day of the month is statistically significant.

data.groupby('dom')['pct'].median().sort_values()


Out[707]: 
dom
7    -0.000658
19   -0.000308
30   -0.000172
20   -0.000161
23    0.000030
28    0.000046
31    0.000047
24    0.000050
22    0.000162
9     0.000273
27    0.000343
21    0.000531
3     0.000547
13    0.000599
26    0.000658
6     0.000704
14    0.000787
12    0.000796
17    0.000832
11    0.000945
29    0.000953
25    0.001021
2     0.001040
8     0.001166
5     0.001181
15    0.001221
4     0.001568
16    0.001718
18    0.001763
10    0.001819
1     0.003126
Name: pct, dtype: float64

When we look at days of the year, we find no statistically significant results.

What about other times of year: is the “Santa Claus rally” a real thing?

Beyond monthly and daily patterns, there are certain additional patterns that investors bet on. One is the so-called “Santa Claus rally,” which happens during the last week of December and the two days of January. But does the “Santa Claus rally” really exist? Is buying stock during this period a profitable strategy?

We can start analyzing this by looking at the weekly returns of the major indices. For this analysis we look at data since January 2000. Let’s resample and add a week field to our data.

spy = table.resample('W').last().pct_change()[['SPY']]
spy['WOY'] = spy.index.weekofyear
spy.groupby('WOY').mean()

Here’s the result for the S&P ETF (SPY):

          SPY
WOY          
1    0.009032
2    0.002079
3   -0.004822
4   -0.004442
5    0.003826
6   -0.000978
7    0.009332
8   -0.005509
9   -0.002385
10  -0.000836
11  -0.000708
12  -0.000066
13   0.009149
14   0.004950
15   0.001655
16   0.015118
17   0.002102
18  -0.000040
19   0.000328
20  -0.000354
21   0.000552
22   0.005868
23   0.004463
24  -0.002372
25  -0.005008
26   0.000244
27   0.007107
28  -0.000569
29   0.004474
30  -0.002378
31   0.000524
32   0.000118
33   0.000299
34   0.005563
35   0.004794
36  -0.007971
37   0.008827
38  -0.006442
39  -0.005050
40   0.000614
41  -0.001444
42   0.006348
43   0.003243
44   0.007170
45   0.006211
46  -0.000556
47  -0.004473
48   0.016324
49   0.003464
50  -0.008530
51   0.006218
52   0.001936
53  -0.000998

These results show that the last week of December and the first week of January do tend to be profitable, but they are not the most profitable weeks of the year. That said, if you purchase stocks right before the last week of December and sell in early January, you make an average of approximately 2% return, which is quite good.

0

No Comments

No comments yet

Leave a Reply

Your email address will not be published.