← All Articles

Is there empirical evidence of a “Santa Claus Rally”?

A Warning About Market Truisms

6 min read

As an investor, I’m absolutely sick of market myths and unverified beliefs.

Other investors seem to be allergic to critical thinking and analysis. Myths such as “a stock having a low P/E ratio means it’s good” are pervasive in the industry, and newcomers who want to get started are deafened and defeated by all of the noise from people that don’t know better.

For example, if you’re an investor, you have probably heard of the “Santa Claus Rally”.

Investopedia defines it as “a sustained increase in the stock market that occurs around the Christmas holiday on Dec 25”.

The existence (or lack thereof) of this phenomenon is another example of stock market truism. While it “makes sense” that the market might go up for Christmas, is there any actual evidence of such a rally actually existing?

My job is to find out.

Performing quantitative analysis

To find out whether the Santa Claus rally is a real thing, I’m going to perform statistical analysis. Here’s exactly what I’m doing.

Gathering and Preparing the Data

To perform this analysis, we will do the following:

  1. Gather daily returns data for Dec 25 to Jan 2 from 2020 to 2023.
  2. Separate the daily returns into two groups: holiday period and non-holiday period for each year.
  3. Compute the number of trading days, mean return, and standard deviation for both periods.

To gather this data, we can use an online platform like NexusTrade, to query and compute the data using natural language.

Using NexusTrade to fetch and compute the data

NexusTrade is an AI-Powered financial analysis tool. Using its AI-Powered Stock Screener, we can fetch and compute all of the data needed to perform our analysis.

Behind the scenes, NexusTrade runs an advanced SQL query to perform the computation. If we wanted to be more confident in our results, we could analyze the SQL query to make sure its fetching the correct data.

WITH 
years AS (
SELECT year
FROM UNNEST(GENERATE_ARRAY(2000, 2023)) AS year
),
daily_returns AS (
SELECT
EXTRACT(YEAR FROM DATE(date)) AS year,
date,
adjustedClosingPrice,
LAG(adjustedClosingPrice) OVER (ORDER BY date) AS prev_price,
CASE
WHEN (EXTRACT(MONTH FROM date) = 12 AND EXTRACT(DAY FROM date) >= 25)
OR (EXTRACT(MONTH FROM date) = 1 AND EXTRACT(DAY FROM date) <= 2)
THEN TRUE
ELSE FALSE
END AS is_holiday_period,
SAFE_DIVIDE(
(adjustedClosingPrice - LAG(adjustedClosingPrice) OVER (ORDER BY date)),
LAG(adjustedClosingPrice) OVER (ORDER BY date)
) * 100 AS daily_return
FROM `nexustrade-io.universalstockfundamentals.price_data`
WHERE
symbol = 'SPY'
AND DATE(date) >= '2000-01-01'
AND DATE(date) <= '2023-12-31'
),
period_stats AS (
SELECT
year,
is_holiday_period,
COUNT(*) AS trading_days,
AVG(daily_return) AS avg_daily_return,
STDDEV(daily_return) AS stddev_daily_return,
SAFE_DIVIDE(
AVG(daily_return),
NULLIF(STDDEV(daily_return), 0)
) AS return_per_risk
FROM daily_returns
WHERE daily_return IS NOT NULL
GROUP BY year, is_holiday_period
)
SELECT
y.year,
MAX(CASE WHEN is_holiday_period THEN trading_days END) AS holiday_trading_days,
MAX(CASE WHEN NOT is_holiday_period THEN trading_days END) AS non_holiday_trading_days,
MAX(CASE WHEN is_holiday_period THEN avg_daily_return END) AS holiday_avg_return,
MAX(CASE WHEN NOT is_holiday_period THEN avg_daily_return END) AS non_holiday_avg_return,
MAX(CASE WHEN is_holiday_period THEN stddev_daily_return END) AS holiday_stddev,
MAX(CASE WHEN NOT is_holiday_period THEN stddev_daily_return END) AS non_holiday_stddev,
MAX(CASE WHEN is_holiday_period THEN return_per_risk END) AS holiday_return_per_risk,
MAX(CASE WHEN NOT is_holiday_period THEN return_per_risk END) AS non_holiday_return_per_risk
FROM
years y
LEFT JOIN
period_stats ps
ON
y.year = ps.year
GROUP BY
y.year
ORDER BY
y.year;

Once we have our data ready, we can continue our analysis by forming our hypothesis.

Our Initial Hypotheses

In order to determine whether there is evidence of a Christmas rally, we have to perform a statistical test.

In statistical testing, we have two hypothesis: the null hypothesis and the alternative hypothesis.

The null hypothesis is a statement asserting that there is no difference between variables, and any observed result is due to random chance. In this case, it would be the following:

The mean returns for the holiday period are equal to the mean returns for the non-holiday period

In contrast, the alternative hypothesis is the opposite. It is a statement that contradicts the null hypothesis, asserting that there is a difference between variables that is not due to random chance. In this case, the alternative hypothesis would be:

The mean returns for the holiday period are different from the mean returns for the non-holiday period.

In order to determine if our returns are different, we need to perform a statistical test.

Performing the Two-Sample T-Test

To evaluate the existence of a Santa Claus Rally, we apply a two-sample t-test comparing the mean returns of the holiday period (Dec 25–Jan 2) to the non-holiday period within the same timeframe for each year.

A table with the mean return, standard deviation, and sample size during the holiday and non-holiday period

Steps:

  1. Utilize Key Metrics: Retrieve the mean, standard deviation, and sample size for each group (holiday and non-holiday) from earlier.
  2. Conduct the Test: Use Python to compute the t-statistic, comparing the mean differences relative to the variation in returns.
  3. Assess Significance: Determine the p-value to assess whether observed differences are statistically significant at a chosen confidence level (e.g., 95%).

Once we have the data from the LLM, we can finish this analysis using a simple Python script.

import pandas as pd
from scipy.stats import ttest_ind

# Data from NexusTrade
data = {
"year": list(range(2000, 2024)),
"holiday_avg_return": [0.0541, -0.4332, -0.0310, 0.9496, 0.0055, -0.4470, 0.1552, -0.5075, 0.6417, 0.4176,
0.0226, -0.1741, 0.0161, 0.7062, -0.4062, -0.1861, -0.2410, -0.0604, 1.4561, 0.0605,
0.4514, 0.1868, -0.0252, 0.0881],
"non_holiday_avg_return": [-0.0269, -0.0326, -0.0837, 0.0869, 0.0437, 0.0283, 0.0591, 0.0336, -0.1637, 0.1006,
0.0628, 0.0210, 0.0633, 0.1016, 0.0619, 0.0136, 0.0530, 0.0814, -0.0427, 0.1120,
0.0816, 0.1020, -0.0690, 0.0966],
"holiday_trading_days": [4, 5, 5, 5, 6, 4, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 5, 4, 4],
"non_holiday_trading_days": [247, 243, 247, 247, 246, 248, 247, 247, 248, 247, 247, 248, 246, 247, 247, 247, 248,
247, 246, 247, 248, 247, 247, 246]
}

# Convert data to a DataFrame
df = pd.DataFrame(data)

# Perform the two-sample t-test
holiday_returns = df["holiday_avg_return"]
non_holiday_returns = df["non_holiday_avg_return"]

t_stat, p_value = ttest_ind(holiday_returns, non_holiday_returns, equal_var=False)

# Display results
print(t_stat, p_value)

With this script, let’s analyze our results.

Interpreting the Results

The output of our two-sample t-test is as follows:

(0.8277042939072898, 0.41598212361269926)
  • T-Statistic: This value measures the size of the difference relative to the variation in your sample data. A higher absolute value indicates a greater difference between the groups.
  • P-Value: This indicates the probability of observing the results, or something more extreme, if the null hypothesis is true.

In our case:

  • P-Value (0.4160) > Significance Level (0.05): This means we fail to reject the null hypothesis.

What Does This Mean?

The statistical analysis shows that there is no significant difference between the mean returns during the holiday period (Dec 25–Jan 2) and the non-holiday period in the years from 2000 to 2023.

In other words, the supposed “Santa Claus Rally” does not have a statistically significant impact on stock returns during this period.

This is extremely important because it highlights an important fact with investing – just because something seems true does not mean it is.

Discussion

Now, let me be clear. Just because we failed to reject the hypothesis does not mean the Santa Claus rally does not exist. All it means is that based on the data, we don’t have any evidence to suggest that it does exist.

The perceived increase in market returns during this period can easily just be due to chance or other factors. Investors should be wary of buying stocks just because they think that stocks are supposed to go up in December.

This leads to the main point of this article – in investing, don’t believe everything you read online.

Just because something appears to be true does not mean it is. This analysis shows that there is little evidence for a Christmas rally, and that investors should be wary of making decisions based on its existence.

This article also shows the power of using objective data for stock market analysis. By using NexusTrade, we can gather objective data in order to better inform out stock trading decisions.

I hope that this article has taught you something — if you hear advice and it seems sound, it’s all over the internet, and has “reasoning” for being true, it doesn’t mean that it actually is. You should always conduct your own research when making financial decisions.

Follow me: LinkedIn | X (Twitter) | TikTok | Instagram | Newsletter

Listen to me: Spotify | Amazon Music | Apple Podcasts

Discussion

Sign in or create a free account to join the discussion.

No comments yet.