The Question

Traders love calendar patterns: “Buy Monday, sell Friday.” “Crypto dumps on weekends.”

Bitcoin trades 24/7, including weekends when stock markets are closed, which makes it a natural place to look for day-of-week effects.

Using 2,921 daily returns (2018–2025):

Do Bitcoin’s average daily returns depend on the day of the week?

And the deeper question: if we find a “significant” day, should we believe it?

The Statistical Idea

A p-value answers: if there were truly no effect, how likely is data at least this extreme?

The trap: we will test seven days, not one.

  • Each single test has a 5% chance of a false alarm.
  • Seven tests give seven chances to be fooled.
  • Finding one “significant” day is expected even if no pattern exists.

This is the multiple testing problem, one of the most common ways people (and trading strategies) fool themselves with p-values.

The Mathematics: Returns and Hypotheses

Daily log return on day \(t\), from closing price \(P_t\):

\[ r_t = 100 \cdot \ln\!\left(\frac{P_t}{P_{t-1}}\right) \quad (\%) \]

For each weekday \(d\), compare its mean return \(\mu_d\) to the mean of all other days \(\mu_{-d}\):

\[ H_0:\ \mu_d = \mu_{-d} \qquad \text{vs.} \qquad H_1:\ \mu_d \neq \mu_{-d} \]

Welch’s test statistic and two-sided p-value:

\[ t = \frac{\bar r_d - \bar r_{-d}}{\sqrt{s_d^2/n_d + s_{-d}^2/n_{-d}}}, \qquad p = P\big(|T| \ge |t_{\text{obs}}| \mid H_0\big) \]

The Data: Eight Years of Bitcoin

Daily returns have a standard deviation of about 3.4%. Any day-of-week signal has to be detected through that noise.

Average Return by Day of Week

Every interval crosses or comes close to zero. Visually, the “pattern” is weak.

Running the Tests in R

day_labels <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

results <- lapply(day_labels, function(d) {
  t <- t.test(btc$ret[btc$day == d], btc$ret[btc$day != d])  # Welch
  data.frame(day = d, mean_ret = mean(btc$ret[btc$day == d]),
             t = unname(t$statistic), p = t$p.value)
}) |> dplyr::bind_rows()

# Correct for running 7 tests at once
results$p_bonf <- p.adjust(results$p, method = "bonferroni")

One test per weekday, then a Bonferroni correction for running seven tests.

Results

Day Mean return (%) t Raw p Bonferroni p Significant (raw)? Significant (corrected)?
Mon 0.199 0.77 0.4400 1.000 No No
Tue -0.041 -0.67 0.5010 1.000 No No
Wed 0.292 1.40 0.1630 1.000 No No
Thu -0.311 -2.01 0.0451 0.316 Yes No
Fri 0.165 0.67 0.5030 1.000 No No
Sat 0.148 0.76 0.4460 1.000 No No
Sun -0.006 -0.54 0.5920 1.000 No No
  • Smallest raw p-value: Thu (p = 0.0451)
  • Days significant before correction: 1; after Bonferroni: 0

The Mathematics of Getting Fooled

If each of \(m\) independent tests has false-positive rate \(\alpha\), the chance of at least one false alarm (the family-wise error rate) is

\[ \text{FWER} = 1 - (1 - \alpha)^m \]

With \(m = 7\) and \(\alpha = 0.05\):

\[ 1 - 0.95^7 \approx 0.302 \]

That’s about a 30% chance of finding a “significant” day even if no effect exists.

Bonferroni fix: test each day at \(\alpha / m = 0.05/7 \approx 0.0071\), or equivalently use \(p_{\text{adj}} = \min(1,\ m \cdot p)\).

Proof by Shuffling: A Permutation Experiment

We scrambled the weekday labels so no real pattern can exist, yet “winners” keep appearing. Real-data p-value for Thu: 0.0451.

Does the Pattern Hold Year to Year?

Drag to rotate. A real effect would show a ridge running across every year. Instead, the “best day” moves around from year to year.

What Did We Learn?

  • Before correction, 1 weekday(s) looked significant; after accounting for 7 tests, 0 remained. There is no reliable evidence of a day-of-week effect in Bitcoin returns.
  • Testing many patterns guarantees some “discoveries.” With 7 tests, there’s a 30% chance of a false alarm.
  • The permutation experiment showed that pure noise produces “significant” weekdays regularly.
  • Takeaway for finance: a backtested pattern with p < 0.05 means little until you ask how many patterns were tried. Corrections, out-of-sample checks, and stability over time matter as much as the p-value itself.


Data: BTC-USD daily closing prices, Yahoo Finance via the quantmod R package, 2018–2025.