Does Nikkei 225 have days, months or hours with a bias you can actually measure? We aggregated 4,117,170 M1 candles of the Japanese Nikkei 225 CFD from February 2012 to October 12, 2026 by day of week, calendar month, session and UTC hour, and ran every result through a significance test. Bottom line: Tuesday survives even a multiple-comparison correction; nearly everything else is noise.
📊 The data behind this article, as tables and CSV: /stats/NIKKEI publishes Nikkei 225 seasonality, sessions and spread as a downloadable reference, and /data has the OHLCV candles (D1 down to M1) so you can replicate every table. This article is the analysis, with its tests; those pages are the raw numbers.
1. Seasonality by day of the week
Each day closes at 06:00 UTC, a fixed hour present in every year of the feed. Test: one-sample t-test against zero; bold marks what survives a Bonferroni correction.
| Day | n | Mean % | Median % | Std % | Win rate | t-stat | p-value |
|---|---|---|---|---|---|---|---|
| Monday | 552 | +0.075% | +0.140% | 1.524% | 54.9% | 1.16 | 0.246 |
| Tuesday | 559 | +0.166% | +0.118% | 1.241% | 57.4% | 3.17 | 0.002 |
| Wednesday | 558 | +0.027% | -0.001% | 1.259% | 50.0% | 0.50 | 0.614 |
| Thursday | 560 | +0.036% | +0.021% | 1.318% | 51.6% | 0.65 | 0.518 |
| Friday | 549 | -0.023% | +0.061% | 1.346% | 52.5% | -0.40 | 0.686 |
Reading: days with p < 0.05:
- Tuesday: +0.166% on average, 57.4% win rate, p=0.002, and it clears the Bonferroni threshold (0.0100). Across the two halves of the sample (2016–2021: +0.164%; 2021–2026: +0.169%) the sign holds.

2. Seasonality by month of the year
128 complete months (the current month is left out). Each month's return = last close of the month against the last close of the previous month.
| Month | n | Mean % | Median % | Std % | Win rate | t-stat | p-value |
|---|---|---|---|---|---|---|---|
| January | 10 | +1.90% | +1.22% | 4.12% | 70.0% | 1.46 | 0.178 |
| February | 11 | -0.35% | +0.35% | 6.49% | 54.5% | -0.18 | 0.863 |
| March | 11 | -1.59% | -0.84% | 5.68% | 45.5% | -0.93 | 0.374 |
| April | 11 | +2.50% | +1.37% | 5.68% | 63.6% | 1.46 | 0.174 |
| May | 11 | +3.00% | +2.29% | 5.66% | 72.7% | 1.75 | 0.110 |
| June | 11 | +1.54% | +2.02% | 4.79% | 72.7% | 1.07 | 0.310 |
| July | 11 | -0.20% | -0.01% | 4.22% | 45.5% | -0.16 | 0.878 |
| August | 11 | +1.14% | +1.31% | 3.01% | 63.6% | 1.25 | 0.239 |
| September | 11 | +0.96% | +1.03% | 4.34% | 63.6% | 0.73 | 0.481 |
| October | 10 | +3.09% | +4.50% | 7.11% | 60.0% | 1.38 | 0.202 |
| November | 10 | +2.65% | +1.83% | 5.81% | 70.0% | 1.44 | 0.183 |
| December | 10 | -0.18% | +0.36% | 4.80% | 70.0% | -0.12 | 0.907 |
Reading: no month reaches p < 0.05. The best on average is October (+3.09%) and the worst March (-1.59%), but with 10 observations per month a single extreme year moves those averages a lot.

Each thin line is one year; the red one is the mean. When the thin lines fan out, a month's average says little about next year.
3. Seasonality by trading session (UTC)
Fixed UTC windows, the same across the whole series. Drift = session close against its open; range = high minus low, as % of the open.
| Session | n | Mean drift % | Win rate | p-value | Mean range % |
|---|---|---|---|---|---|
| Asia (00–07 UTC) | 1,748 | +0.0137% | 52.0% | 0.523 | 1.293% |
| London (07–12 UTC) | 1,749 | +0.0068% | 53.3% | 0.606 | 0.741% |
| New York (12–17 UTC) | 1,746 | +0.0329% | 53.4% | 0.034 | 0.920% |
| NY late (17–22 UTC) | 1,669 | +0.0200% | 55.0% | 0.118 | 0.645% |
- Asia (00–07 UTC) is where it moves: mean range 1.293%, 2.0× that of NY late (17–22 UTC).
- New York (12–17 UTC) drifts up with p=0.034 (+0.0329% per session), though it does not clear Bonferroni. It is a small bias: compare it with the spread before thinking of trading it.
- Sessions from 2020: before that the CFD did not trade nearly 24 h and the windows would not be comparable across years.

4. Day × session heatmap
| Day | Asia (00–07) | London (07–12) | New York (12–17) | NY late (17–22) |
|---|---|---|---|---|
| Monday | +0.006% | +0.034% | +0.126% | +0.074% |
| Tuesday | -0.015% | -0.007% | -0.009% | +0.010% |
| Wednesday | +0.051% | +0.028% | +0.033% | +0.025% |
| Thursday | +0.034% | -0.059% | +0.026% | -0.017% |
| Friday | -0.008% | +0.040% | -0.012% | +0.013% |
- Most bullish cell: Monday × NY (+0.126%, p=<0.001). Most bearish: Thursday × London (-0.059%, p=0.020).
- 3 of 20 cells come out at p < 0.05; chance alone would give about 1.0. That is more than chance would produce, but they still need out-of-sample confirmation.

5. Most volatile hours (UTC)
| UTC hour | Mean range % | Mean range (points) | Std % | Session |
|---|---|---|---|---|
| 00:00 | 0.737% | 269.7 | 0.408 | Asia |
| 01:00 | 0.540% | 194.5 | 0.349 | Asia |
| 14:00 | 0.479% | 173.5 | 0.349 | NY |
| 15:00 | 0.421% | 150.6 | 0.290 | NY |
| 23:00 | 0.418% | 151.1 | 0.275 | Rollover |
| 13:00 | 0.409% | 148.3 | 0.296 | NY |
The busiest hour (00:00 UTC) moves 3.6× more than the quietest (22:00 UTC, 0.205%). Unlike the calendar bias, this is stable year to year: it is the most useful part of this analysis for deciding when to be at the screen or where to place a stop.
6. Why we do not analyse the spread
In this feed's index CFDs the spread is not a market price: it is a margin set by the broker that moves in steps over months. Publishing its "history" would measure one provider's pricing policy, not the cost of trading the index. For cost, check your own broker's spread and commission at the hour you trade.
What this data does not tell you
- Multiple comparisons: this article runs 41 tests (5 days, 12 months, 4 sessions and 20 cells). At a 5% threshold about 2 would come out "significant" by chance. That is why what survives Bonferroni is flagged separately.
- Few years per month: each month has about 10 observations. One extreme year can create or erase a "bullish month".
- An average bias is not a strategy: after spread, commission and swap, a drift of hundredths of a percent per session rarely survives. Before trading it, backtest with real costs and walk-forward.
- This is a Dukascopy CFD (bid price), not the exchange future or cash index: it can differ in rollovers, gaps and trading hours.
- The CFD's trading hours changed several times before 2019. That is why the day closes at a fixed hour (06:00 UTC) present in every year, the daily series starts in 2016 and the intraday analysis in 2020.
Methodology
- Source: Dukascopy ticks aggregated to M1 candles by EV Trading Labs (Nikkei 225, 2012-02-06 → 2026-10-12).
- Total: 4,117,170 M1 candles with at least one tick; 2,778 daily and 128 monthly returns.
- Price: open and close at mid price (bid+ask)/2; high and low on the bid. Where the feed has no ask, bid.
- Daily return: (C[t] − C[t−1]) / C[t−1] × 100, where C is the close at 06:00 UTC. Days with fewer than 60 candles, or whose last candle is more than 3 h before the cut-off, are dropped.
- Monthly return: last daily close of the month against the previous month's; the current month is excluded.
- Sessions: drift = (close − open) / open × 100; range = (high − low) / open × 100; sessions with less than 40% of their minutes are dropped.
- Test: one-sample t-test against zero, p < 0.05; Bonferroni per block (days, months, sessions, cells). Stability: the same mean computed on each half of the sample.
- Software: Python, pandas, scipy, matplotlib.
The full seasonality series
The same method applied to 19 markets. The contrast between them is the most useful part: a pattern that shows up in a single asset is more likely to be noise.

