Forex on a retail CFD account: 3,100 tests, no edge after costs
Intraday patterns, cross-pair lead-lag, carry, positioning data, FOMC days and yield momentum. Several of these are documented premia. On a retail CFD account the commission and the swap mark-up remove every one of them.
Key findings
- 1,442 intraday and cross-pair configurations on nine instruments (1-minute bars, 2016–2026): none passed the multiple-testing filter, and the average trade before commission was about zero.
- The one intraday idea we took to a sealed hold-out, the USD/JPY Tokyo-fix “gotobi” trade, went from +0.66 bp per trade in training to +3.19 bp in validation and −1.11 bp in the hold-out.
- Carry is a real premium, and the broker keeps most of it. A G10 plus emerging-market carry basket earned 5.0% a year before mark-ups over 2001–2026 (Sharpe 0.48, t 2.34). With the broker’s overnight swaps it earned 2.1% a year (Sharpe 0.20) with a −56% drawdown. The mark-up is 1.0–1.8% a year per side on the majors.
- Published anomalies faded. FOMC-day dollar weakness: +5.2 bp in 2000–10, −1.2 bp in 2016–26. Month-end hedge flows: Sharpe 0.33, then −0.41. Currency trend: net Sharpe −0.52 and −0.57 in 2016–26. In AQR’s own data the currency multi-style factor fell from a Sharpe of 0.70 (1976–2015) to 0.11 since 2016.
- The best candidate, 2-year yield-gap momentum, had a Sharpe of 0.35 and 0.25 before costs in two periods, and 0.16 and 0.02 after them.
This post covers the daily, weekly and intraday currency studies. Together with the tick-level scalping grid and the exit tests in the scalping post, we tested more than 3,100 currency configurations. None passed an out-of-sample test after costs.
What a retail CFD account costs
Three costs matter for currency trading through a CFD broker.
- Spread: on the raw-pricing account we used, the median EUR/USD spread was 0.1 pip in every hour except the daily rollover.
- Commission: 6 USD per lot per round trip, about 0.6 pip or 0.5 bp.
- Overnight swap: the broker credits or charges the interest-rate differential, minus a mark-up. Comparing the long and the short swap rate gives the mark-up directly.
EURUSD spread by hour of day (UTC)
The quoted spread is ~0.1 pip all day and jumps around the 21:00 UTC rollover (17:00 New York).
Show data · values in pips
| Hour of day (UTC) | median | 90th percentile |
|---|---|---|
| 00:00 | 0.10 | 0.40 |
| 01:00 | 0.10 | 0.40 |
| 02:00 | 0.10 | 0.30 |
| 03:00 | 0.10 | 0.30 |
| 04:00 | 0.10 | 0.40 |
| 05:00 | 0.10 | 0.40 |
| 06:00 | 0.10 | 0.20 |
| 07:00 | 0.10 | 0.20 |
| 08:00 | 0.10 | 0.20 |
| 09:00 | 0.10 | 0.20 |
| 10:00 | 0.10 | 0.20 |
| 11:00 | 0.10 | 0.20 |
| 12:00 | 0.10 | 0.20 |
| 13:00 | 0.10 | 0.20 |
| 14:00 | 0.10 | 0.20 |
| 15:00 | 0.10 | 0.10 |
| 16:00 | 0.10 | 0.30 |
| 17:00 | 0.10 | 0.30 |
| 18:00 | 0.10 | 0.30 |
| 19:00 | 0.10 | 0.30 |
| 20:00 | 0.10 | 0.30 |
| 21:00 | 3.80 | 7.40 |
| 22:00 | 0.10 | 0.40 |
| 23:00 | 0.10 | 0.40 |
| Pair | Long swap, % a year | Short swap, % a year | Mark-up per side, % a year |
|---|---|---|---|
| EUR/USD | −2.63 | +0.48 | 1.08 |
| GBP/USD | −1.35 | −0.88 | 1.12 |
| USD/JPY | +1.88 | −3.92 | 1.02 |
| AUD/USD | −1.56 | −2.08 | 1.82 |
| NZD/USD | −2.64 | +0.06 | 1.29 |
| USD/CAD | +0.82 | −2.83 | 1.00 |
| USD/CHF | +2.68 | −5.70 | 1.51 |
| USD/MXN | −4.53 | +0.81 | 1.86 |
| USD/TRY | −28.66 | +22.86 | 2.90 |
The mark-up is paid on whichever side you hold. One to two percent a year is about the size of the premia that published currency strategies earn, which is why so many of them end up near zero on this account.
Intraday patterns: 788 configurations
We wrote down eight families of intraday hypotheses before the run and tested them on cTrader 1-minute bars for nine instruments: opening-range breakouts and fades around the London, New York and Tokyo opens (360 configurations), hour-of-day seasonality (189), Donchian breakouts during London hours (81), the London 16:00 and Tokyo 9:55 fixes (41), overnight mean reversion (36), 5-minute bursts (36), breaks of the previous day’s high or low (27) and weekend-gap fades (18).
The simulator enters at the next bar’s open, buys at the ask and sells at the bid using the measured spread for that hour, checks the stop before the target within a bar and exits before the rollover. Commission was 1 bp per round trip. The data was split into training (2016–2022), validation (2023–2024) and a vault (2025–2026) reserved for finalists. All configurations were corrected together with Benjamini–Hochberg.
1,442 intraday FX configurations: the edge before commission is about zero
Average result per trade after the spread but before the 1 bp commission, pooled over all trades of each strategy family.
Show data · values in bp
| training 2016–2022 | validation 2023–2024 | |
|---|---|---|
| Session opening-range break/fade (360) | -0.15 | -0.18 |
| Hour-of-day seasonality (189) | -0.23 | -0.26 |
| Intraday Donchian breakout (81) | -0.38 | -0.20 |
| London/Tokyo fix (41) | 0.10 | -0.25 |
| Overnight mean reversion (36) | -0.02 | -0.11 |
| M5 burst follow/fade (36) | -0.20 | -0.17 |
| Previous-day high/low break (27) | -0.16 | -0.63 |
| Weekend-gap fade (18) | -1.38 | -0.46 |
| Lead-lag catch-up (cross-pair) (360) | -0.11 | -0.12 |
| Idiosyncratic move (cross-pair) (160) | -0.20 | -0.15 |
| Pairs-spread reversion (cross-pair) (80) | -0.66 | -0.24 |
| USD-basket laggard (cross-pair) (48) | -0.06 | -0.18 |
| Triangular cross deviation (cross-pair) (6) | -0.13 | -0.19 |
40 configurations (5.1%) were profitable in training and none passed the false-discovery filter. Ten were profitable in both training and validation, against about three expected by chance, all with t-statistics below 2. The average trade lost 1.2 bp after costs, which puts the gross edge at about −0.15 bp. No family had an edge before commission.
The gotobi test
On gotobi days, the 5th, 10th, 15th, 20th, 25th and 30th of the month, Japanese importers are said to buy dollars into the 9:55 Tokyo fix. The trade is long USD/JPY from 08:00 to 09:55 Tokyo time. It was the only intraday hypothesis declared in advance for the vault.
| Period | Trades | Net per trade | t |
|---|---|---|---|
| Training 2016–22 | 351 | +0.66 bp | 0.79 |
| Validation 2023–24 | 100 | +3.19 bp | 1.95 |
| Vault 2025–26 | 87 | −1.11 bp | −0.69 |
The same trade on every day lost in all three periods.
Cross-pair lead-lag: 654 configurations
The second grid watched one pair (or a basket of dollar pairs) and traded another: catch-up trades when one pair moves and a correlated pair lags (360 configurations), fades of moves that happen without the related pair (160), pairs trading on the spread between two pairs (80), a dollar basket against a lagging dollar pair (48) and triangular deviations between the crosses and their legs (6). Betas came from 2016–2022 data, and entries were at the next bar of the traded pair so that asynchronous closes could not create a fake lag.
16 configurations (2.4%) were profitable in training and none passed the filter. The average trade lost 1.2 bp after costs, about −0.2 bp before commission. On 1-minute bars there is no tradeable lead-lag between currency pairs. Lead-lag at the sub-second level exists, but it belongs to high-frequency firms, and our measured order latency was 286 ms.
Carry
Carry means holding high-interest currencies against low-interest ones. We ranked 16 currencies at every month-end by the previous month’s 3-month interbank rate from FRED and held the portfolio for a month, with the actual rate differential, rebalancing costs (3 bp for G10, 10 bp for emerging markets, 30 bp for the Turkish lira) and, in a second version, the broker’s swap mark-up.
| Strategy | 2001–09 | 2010–19 | 2020–26 | 2001–26 |
|---|---|---|---|---|
| G10 carry, 3 long / 3 short, no mark-up | 5.8% (Sharpe 0.67) | 0.1% (0.01) | 1.5% (0.30) | 2.5% (0.33) |
| G10 carry, with the broker’s swaps | 3.5% (0.40) | −2.1% (−0.28) | −0.4% (−0.07) | 0.3% (0.04) |
| G10 + EM carry, no mark-up | 9.9% (0.86) | 0.9% (0.09) | 4.7% (0.49) | 5.0% (0.48) |
| G10 + EM carry, with the broker’s swaps | 7.0% (0.61) | −2.0% (−0.20) | 1.6% (0.17) | 2.1% (0.20) |
| G10 + EM carry with a momentum filter, with swaps | 5.7% (0.73) | −0.5% (−0.07) | 1.9% (0.25) | 2.3% (0.30) |
Returns are per year and per unit of gross exposure on each side. Carry earned well in the 2000s and about nothing in the 2010s, which matches the literature. The best version after swaps earned 2.3% a year with a t-statistic of 1.6 and a −29% drawdown. Carry is real, and it needs cheap funding, such as currency futures, to be worth holding.
Positioning, trend, FOMC days and month-end flows
- CFTC positioning (8 currencies, 2006–2026, weekly): leveraged-fund extremes, asset-manager positioning and 4-week position changes, with the sign fixed in advance. All three had negative net Sharpe ratios in 2016–26 (−0.15, −0.61 and −0.74).
- Time-series trend over 4, 13 and 52 weeks: mildly positive before costs in 2006–15 (t at most 1.25), negative in 2016–26 (net Sharpe −0.36, −0.52 and −0.57).
- FOMC days: Mueller, Tahbaz-Salehi and Vedolin (2017) found that a basket short the dollar earned about 12 bp on FOMC announcement days in 1994–2010. We measured +5.2 bp in 2000–10 and −1.2 bp in 2016–26 (t −0.16).
- Month-end equity hedging (Melvin and Prins, 2015): when US stocks outperform foreign stocks over a month, hedgers buy dollars into the month-end fix. Sharpe +0.33 in 2001–13 and −0.41 in 2014–26, no better than the same rule on random days.
2-year yield-gap momentum
Changes in short-term rate differentials are one of the better-documented currency predictors (Ang and Chen; AQR’s macro momentum). We built daily 2-year yields for seven currencies from central-bank sources and FRED and went long a currency against the dollar when its 20-day change in the yield gap was above +5 bp, short below −5 bp, rebalanced weekly. The success criteria were fixed in advance: a net Sharpe of at least 0.3 over the full period, positive in 2016–26 and a HAC t-statistic of at least 2.64.
The best FX candidate, before and after the swap mark-up
2-year yield-gap momentum (7 currencies vs. USD, weekly), growth of 1 scaled to 10 % annual volatility, 2001-2026.
Show data · values in x
| Date | before costs | after the broker's costs (0.6 bp turnover + swap mark-up) |
|---|---|---|
| 2001-01-05 | 0.99 | 0.99 |
| 2001-02-02 | 0.95 | 0.95 |
| 2001-03-02 | 0.96 | 0.96 |
| 2001-03-30 | 0.93 | 0.93 |
| 2001-04-27 | 0.91 | 0.91 |
| 2001-05-25 | 0.87 | 0.87 |
| 2001-06-22 | 0.87 | 0.86 |
| 2001-07-20 | 0.89 | 0.88 |
| 2001-08-17 | 0.90 | 0.89 |
| 2001-09-14 | 0.89 | 0.88 |
| 2001-10-12 | 0.88 | 0.86 |
| 2001-11-09 | 0.87 | 0.86 |
| 2001-12-07 | 0.86 | 0.84 |
| 2002-01-04 | 0.86 | 0.85 |
| 2002-02-01 | 0.84 | 0.82 |
| 2002-03-01 | 0.84 | 0.82 |
| 2002-03-29 | 0.84 | 0.82 |
| 2002-04-26 | 0.83 | 0.81 |
| 2002-05-24 | 0.85 | 0.82 |
| 2002-06-21 | 0.91 | 0.88 |
| 2002-07-19 | 0.92 | 0.89 |
| 2002-08-16 | 0.92 | 0.89 |
| 2002-09-13 | 0.92 | 0.89 |
| 2002-10-11 | 0.90 | 0.87 |
| 2002-11-08 | 0.91 | 0.87 |
| 2002-12-06 | 0.91 | 0.88 |
| 2003-01-03 | 0.89 | 0.85 |
| 2003-01-31 | 0.89 | 0.85 |
| 2003-02-28 | 0.89 | 0.86 |
| 2003-03-28 | 0.92 | 0.88 |
| 2003-04-25 | 0.96 | 0.91 |
| 2003-05-23 | 0.95 | 0.91 |
| 2003-06-20 | 0.96 | 0.91 |
| 2003-07-18 | 0.97 | 0.92 |
| 2003-08-15 | 1.02 | 0.96 |
| 2003-09-12 | 1.04 | 0.98 |
| 2003-10-10 | 1.08 | 1.02 |
| 2003-11-07 | 1.09 | 1.03 |
| 2003-12-05 | 1.09 | 1.03 |
| 2004-01-02 | 1.04 | 0.98 |
| 2004-01-30 | 1.08 | 1.02 |
| 2004-02-27 | 1.11 | 1.04 |
| 2004-03-26 | 1.13 | 1.06 |
| 2004-04-23 | 1.14 | 1.07 |
| 2004-05-21 | 1.10 | 1.03 |
| 2004-06-18 | 1.09 | 1.02 |
| 2004-07-16 | 1.05 | 0.97 |
| 2004-08-13 | 1.02 | 0.95 |
| 2004-09-10 | 1.02 | 0.94 |
| 2004-10-08 | 1.04 | 0.96 |
| 2004-11-05 | 0.96 | 0.89 |
| 2004-12-03 | 0.95 | 0.87 |
| 2004-12-31 | 0.96 | 0.89 |
| 2005-01-28 | 0.98 | 0.90 |
| 2005-02-25 | 0.95 | 0.87 |
| 2005-03-25 | 0.98 | 0.90 |
| 2005-04-22 | 0.98 | 0.90 |
| 2005-05-20 | 1.00 | 0.92 |
| 2005-06-17 | 1.02 | 0.93 |
| 2005-07-15 | 1.04 | 0.95 |
| 2005-08-12 | 1.02 | 0.93 |
| 2005-09-09 | 0.98 | 0.89 |
| 2005-10-07 | 0.96 | 0.87 |
| 2005-11-04 | 0.99 | 0.90 |
| 2005-12-02 | 1.01 | 0.92 |
| 2005-12-30 | 1.01 | 0.91 |
| 2006-01-27 | 1.03 | 0.93 |
| 2006-02-24 | 1.03 | 0.93 |
| 2006-03-24 | 1.04 | 0.94 |
| 2006-04-21 | 0.98 | 0.87 |
| 2006-05-19 | 0.95 | 0.85 |
| 2006-06-16 | 0.96 | 0.85 |
| 2006-07-14 | 0.94 | 0.83 |
| 2006-08-11 | 0.94 | 0.84 |
| 2006-09-08 | 0.93 | 0.82 |
| 2006-10-06 | 0.91 | 0.81 |
| 2006-11-03 | 0.93 | 0.82 |
| 2006-12-01 | 0.97 | 0.86 |
| 2006-12-29 | 0.93 | 0.82 |
| 2007-01-26 | 0.94 | 0.83 |
| 2007-02-23 | 0.94 | 0.83 |
| 2007-03-23 | 0.95 | 0.84 |
| 2007-04-20 | 0.96 | 0.85 |
| 2007-05-18 | 0.97 | 0.85 |
| 2007-06-15 | 0.98 | 0.86 |
| 2007-07-13 | 1.02 | 0.89 |
| 2007-08-10 | 1.00 | 0.87 |
| 2007-09-07 | 1.03 | 0.89 |
| 2007-10-05 | 1.06 | 0.92 |
| 2007-11-02 | 1.06 | 0.92 |
| 2007-11-30 | 1.02 | 0.89 |
| 2007-12-28 | 1.01 | 0.88 |
| 2008-01-25 | 1.03 | 0.89 |
| 2008-02-22 | 1.07 | 0.92 |
| 2008-03-21 | 1.12 | 0.96 |
| 2008-04-18 | 1.13 | 0.97 |
| 2008-05-16 | 1.11 | 0.95 |
| 2008-06-13 | 1.13 | 0.97 |
| 2008-07-11 | 1.16 | 0.99 |
| 2008-08-08 | 1.17 | 1.00 |
| 2008-09-05 | 1.18 | 1.01 |
| 2008-10-03 | 1.27 | 1.08 |
| 2008-10-31 | 1.25 | 1.06 |
| 2008-11-28 | 1.29 | 1.10 |
| 2008-12-26 | 1.30 | 1.11 |
| 2009-01-23 | 1.36 | 1.16 |
| 2009-02-20 | 1.43 | 1.21 |
| 2009-03-20 | 1.30 | 1.10 |
| 2009-04-17 | 1.31 | 1.11 |
| 2009-05-15 | 1.25 | 1.05 |
| 2009-06-12 | 1.24 | 1.04 |
| 2009-07-10 | 1.23 | 1.04 |
| 2009-08-07 | 1.21 | 1.01 |
| 2009-09-04 | 1.20 | 1.00 |
| 2009-10-02 | 1.25 | 1.04 |
| 2009-10-30 | 1.20 | 1.00 |
| 2009-11-27 | 1.19 | 0.99 |
| 2009-12-25 | 1.18 | 0.98 |
| 2010-01-22 | 1.20 | 0.99 |
| 2010-02-19 | 1.21 | 1.00 |
| 2010-03-19 | 1.24 | 1.03 |
| 2010-04-16 | 1.24 | 1.03 |
| 2010-05-14 | 1.26 | 1.04 |
| 2010-06-11 | 1.29 | 1.06 |
| 2010-07-09 | 1.39 | 1.14 |
| 2010-08-06 | 1.40 | 1.14 |
| 2010-09-03 | 1.40 | 1.15 |
| 2010-10-01 | 1.48 | 1.21 |
| 2010-10-29 | 1.48 | 1.21 |
| 2010-11-26 | 1.40 | 1.14 |
| 2010-12-24 | 1.37 | 1.12 |
| 2011-01-21 | 1.41 | 1.15 |
| 2011-02-18 | 1.42 | 1.15 |
| 2011-03-18 | 1.42 | 1.15 |
| 2011-04-15 | 1.40 | 1.13 |
| 2011-05-13 | 1.35 | 1.09 |
| 2011-06-10 | 1.34 | 1.08 |
| 2011-07-08 | 1.31 | 1.06 |
| 2011-08-05 | 1.30 | 1.04 |
| 2011-09-02 | 1.27 | 1.02 |
| 2011-09-30 | 1.28 | 1.02 |
| 2011-10-28 | 1.20 | 0.96 |
| 2011-11-25 | 1.25 | 1.00 |
| 2011-12-23 | 1.27 | 1.02 |
| 2012-01-20 | 1.30 | 1.03 |
| 2012-02-17 | 1.32 | 1.05 |
| 2012-03-16 | 1.33 | 1.06 |
| 2012-04-13 | 1.34 | 1.07 |
| 2012-05-11 | 1.36 | 1.08 |
| 2012-06-08 | 1.35 | 1.06 |
| 2012-07-06 | 1.37 | 1.08 |
| 2012-08-03 | 1.38 | 1.09 |
| 2012-08-31 | 1.40 | 1.10 |
| 2012-09-28 | 1.39 | 1.09 |
| 2012-10-26 | 1.41 | 1.11 |
| 2012-11-23 | 1.44 | 1.12 |
| 2012-12-21 | 1.46 | 1.14 |
| 2013-01-18 | 1.44 | 1.13 |
| 2013-02-15 | 1.47 | 1.14 |
| 2013-03-15 | 1.46 | 1.14 |
| 2013-04-12 | 1.46 | 1.13 |
| 2013-05-10 | 1.43 | 1.11 |
| 2013-06-07 | 1.40 | 1.09 |
| 2013-07-05 | 1.40 | 1.08 |
| 2013-08-02 | 1.48 | 1.14 |
| 2013-08-30 | 1.46 | 1.13 |
| 2013-09-27 | 1.46 | 1.13 |
| 2013-10-25 | 1.51 | 1.16 |
| 2013-11-22 | 1.52 | 1.17 |
| 2013-12-20 | 1.51 | 1.16 |
| 2014-01-17 | 1.53 | 1.17 |
| 2014-02-14 | 1.51 | 1.15 |
| 2014-03-14 | 1.52 | 1.16 |
| 2014-04-11 | 1.52 | 1.15 |
| 2014-05-09 | 1.51 | 1.15 |
| 2014-06-06 | 1.53 | 1.16 |
| 2014-07-04 | 1.53 | 1.16 |
| 2014-08-01 | 1.56 | 1.17 |
| 2014-08-29 | 1.58 | 1.19 |
| 2014-09-26 | 1.61 | 1.21 |
| 2014-10-24 | 1.54 | 1.16 |
| 2014-11-21 | 1.57 | 1.17 |
| 2014-12-19 | 1.62 | 1.22 |
| 2015-01-16 | 1.61 | 1.20 |
| 2015-02-13 | 1.68 | 1.25 |
| 2015-03-13 | 1.74 | 1.29 |
| 2015-04-10 | 1.80 | 1.34 |
| 2015-05-08 | 1.82 | 1.35 |
| 2015-06-05 | 1.74 | 1.29 |
| 2015-07-03 | 1.77 | 1.31 |
| 2015-07-31 | 1.75 | 1.29 |
| 2015-08-28 | 1.75 | 1.29 |
| 2015-09-25 | 1.74 | 1.28 |
| 2015-10-23 | 1.72 | 1.26 |
| 2015-11-20 | 1.78 | 1.30 |
| 2015-12-18 | 1.72 | 1.25 |
| 2016-01-15 | 1.73 | 1.26 |
| 2016-02-12 | 1.79 | 1.31 |
| 2016-03-11 | 1.70 | 1.24 |
| 2016-04-08 | 1.67 | 1.21 |
| 2016-05-06 | 1.66 | 1.20 |
| 2016-06-03 | 1.64 | 1.19 |
| 2016-07-01 | 1.65 | 1.19 |
| 2016-07-29 | 1.59 | 1.15 |
| 2016-08-26 | 1.54 | 1.11 |
| 2016-09-23 | 1.57 | 1.12 |
| 2016-10-21 | 1.66 | 1.19 |
| 2016-11-18 | 1.67 | 1.19 |
| 2016-12-16 | 1.71 | 1.22 |
| 2017-01-13 | 1.67 | 1.19 |
| 2017-02-10 | 1.64 | 1.17 |
| 2017-03-10 | 1.61 | 1.15 |
| 2017-04-07 | 1.61 | 1.14 |
| 2017-05-05 | 1.65 | 1.17 |
| 2017-06-02 | 1.60 | 1.13 |
| 2017-06-30 | 1.56 | 1.10 |
| 2017-07-28 | 1.56 | 1.10 |
| 2017-08-25 | 1.58 | 1.11 |
| 2017-09-22 | 1.52 | 1.07 |
| 2017-10-20 | 1.56 | 1.09 |
| 2017-11-17 | 1.53 | 1.07 |
| 2017-12-15 | 1.54 | 1.08 |
| 2018-01-12 | 1.52 | 1.06 |
| 2018-02-09 | 1.49 | 1.04 |
| 2018-03-09 | 1.54 | 1.07 |
| 2018-04-06 | 1.56 | 1.08 |
| 2018-05-04 | 1.63 | 1.13 |
| 2018-06-01 | 1.65 | 1.14 |
| 2018-06-29 | 1.65 | 1.14 |
| 2018-07-27 | 1.70 | 1.17 |
| 2018-08-24 | 1.70 | 1.17 |
| 2018-09-21 | 1.69 | 1.16 |
| 2018-10-19 | 1.73 | 1.19 |
| 2018-11-16 | 1.73 | 1.18 |
| 2018-12-14 | 1.74 | 1.19 |
| 2019-01-11 | 1.74 | 1.19 |
| 2019-02-08 | 1.71 | 1.16 |
| 2019-03-08 | 1.69 | 1.15 |
| 2019-04-05 | 1.67 | 1.14 |
| 2019-05-03 | 1.69 | 1.14 |
| 2019-05-31 | 1.72 | 1.16 |
| 2019-06-28 | 1.70 | 1.15 |
| 2019-07-26 | 1.69 | 1.14 |
| 2019-08-23 | 1.65 | 1.11 |
| 2019-09-20 | 1.69 | 1.13 |
| 2019-10-18 | 1.68 | 1.13 |
| 2019-11-15 | 1.68 | 1.12 |
| 2019-12-13 | 1.68 | 1.12 |
| 2020-01-10 | 1.65 | 1.10 |
| 2020-02-07 | 1.60 | 1.07 |
| 2020-03-06 | 1.57 | 1.04 |
| 2020-04-03 | 1.58 | 1.05 |
| 2020-05-01 | 1.60 | 1.06 |
| 2020-05-29 | 1.68 | 1.11 |
| 2020-06-26 | 1.63 | 1.08 |
| 2020-07-24 | 1.54 | 1.01 |
| 2020-08-21 | 1.55 | 1.02 |
| 2020-09-18 | 1.54 | 1.01 |
| 2020-10-16 | 1.48 | 0.97 |
| 2020-11-13 | 1.45 | 0.95 |
| 2020-12-11 | 1.38 | 0.90 |
| 2021-01-08 | 1.38 | 0.90 |
| 2021-02-05 | 1.42 | 0.92 |
| 2021-03-05 | 1.41 | 0.92 |
| 2021-04-02 | 1.39 | 0.90 |
| 2021-04-30 | 1.35 | 0.88 |
| 2021-05-28 | 1.36 | 0.88 |
| 2021-06-25 | 1.41 | 0.91 |
| 2021-07-23 | 1.41 | 0.91 |
| 2021-08-20 | 1.40 | 0.90 |
| 2021-09-17 | 1.42 | 0.91 |
| 2021-10-15 | 1.42 | 0.91 |
| 2021-11-12 | 1.43 | 0.91 |
| 2021-12-10 | 1.42 | 0.91 |
| 2022-01-07 | 1.39 | 0.89 |
| 2022-02-04 | 1.41 | 0.90 |
| 2022-03-04 | 1.45 | 0.92 |
| 2022-04-01 | 1.45 | 0.92 |
| 2022-04-29 | 1.52 | 0.96 |
| 2022-05-27 | 1.49 | 0.94 |
| 2022-06-24 | 1.46 | 0.92 |
| 2022-07-22 | 1.46 | 0.92 |
| 2022-08-19 | 1.43 | 0.90 |
| 2022-09-16 | 1.40 | 0.88 |
| 2022-10-14 | 1.43 | 0.90 |
| 2022-11-11 | 1.33 | 0.84 |
| 2022-12-09 | 1.32 | 0.83 |
| 2023-01-06 | 1.37 | 0.85 |
| 2023-02-03 | 1.38 | 0.86 |
| 2023-03-03 | 1.44 | 0.89 |
| 2023-03-31 | 1.43 | 0.89 |
| 2023-04-28 | 1.47 | 0.91 |
| 2023-05-26 | 1.47 | 0.91 |
| 2023-06-23 | 1.49 | 0.92 |
| 2023-07-21 | 1.44 | 0.89 |
| 2023-08-18 | 1.48 | 0.92 |
| 2023-09-15 | 1.50 | 0.93 |
| 2023-10-13 | 1.50 | 0.92 |
| 2023-11-10 | 1.50 | 0.92 |
| 2023-12-08 | 1.51 | 0.93 |
| 2024-01-05 | 1.53 | 0.94 |
| 2024-02-02 | 1.51 | 0.92 |
| 2024-03-01 | 1.49 | 0.91 |
| 2024-03-29 | 1.53 | 0.93 |
| 2024-04-26 | 1.56 | 0.95 |
| 2024-05-24 | 1.57 | 0.95 |
| 2024-06-21 | 1.57 | 0.95 |
| 2024-07-19 | 1.59 | 0.96 |
| 2024-08-16 | 1.68 | 1.01 |
| 2024-09-13 | 1.68 | 1.01 |
| 2024-10-11 | 1.66 | 1.00 |
| 2024-11-08 | 1.75 | 1.05 |
| 2024-12-06 | 1.75 | 1.05 |
| 2025-01-03 | 1.77 | 1.06 |
| 2025-01-31 | 1.75 | 1.05 |
| 2025-02-28 | 1.82 | 1.09 |
| 2025-03-28 | 1.82 | 1.08 |
| 2025-04-25 | 1.88 | 1.12 |
| 2025-05-23 | 1.87 | 1.11 |
| 2025-06-20 | 1.86 | 1.10 |
| 2025-07-18 | 1.85 | 1.09 |
| 2025-08-15 | 1.82 | 1.07 |
| 2025-09-12 | 1.82 | 1.07 |
| 2025-10-10 | 1.79 | 1.05 |
| 2025-11-07 | 1.77 | 1.04 |
| 2025-12-05 | 1.80 | 1.05 |
| 2026-01-02 | 1.79 | 1.05 |
| 2026-01-30 | 1.80 | 1.05 |
| 2026-02-27 | 1.77 | 1.03 |
| 2026-03-27 | 1.74 | 1.01 |
| 2026-04-24 | 1.81 | 1.05 |
| 2026-05-22 | 1.85 | 1.07 |
| 2026-06-19 | 1.94 | 1.12 |
| 2026-07-17 | 1.92 | 1.11 |
| 2026-08-14 | 1.94 | 1.12 |
| 2026-09-11 | 1.94 | 1.12 |
| 2026-09-25 | 1.94 | 1.12 |
It is the only currency signal that was positive before costs in both halves: Sharpe 0.35 in 2001–13 and 0.25 in 2014–26. After the broker’s costs it fell to 0.16 and 0.02, and the full-period t-statistic after costs was 0.51. The cross-sectional and 60-day versions were weaker. On futures, where the interest differential is in the price and there is no swap mark-up, it might be worth a closer look; even before costs its full-period t-statistic was only 1.7.
Daily mean reversion and an 11-predictor lab
- Daily mean reversion, the one indicator family that looked better than random in the indicator atlas, was tested again on 2000–2015 data the atlas never used: net Sharpe −0.33 (t −1.26), with eight of nine pairs negative.
- An 11-predictor lab (carry, policy-rate changes, 4/13/52-week momentum, value, one-week reversal, Bollinger position, equity risk, oil for commodity currencies and VIX changes) on G10 currencies with weekly rebalancing. The rule was to keep only predictors with |t| ≥ 2 in 2001–13. The largest was 1.52, so no composite was built.
Where the FX edge disappears: Sharpe before and after retail CFD costs
Pre-registered FX tests from the literature, each in an older and a newer period; costs = spread/commission plus the broker's swap mark-up.
Show data · values in Sharpe
| older period, before costs | older period, after costs | newer period, before costs | newer period, after costs | |
|---|---|---|---|---|
| 2Y yield-gap momentum (2001-13 | 2014-26) | 0.35 | 0.16 | 0.25 | 0.02 |
| Month-end equity-hedge flows (2001-13 | 2014-26) | 0.33 | 0.26 | -0.41 | -0.50 |
| D1 mean reversion, 16 rules (2000-15 | 2016-26) | -0.17 | -0.33 | 0.28 | 0.07 |
| Carry G10 3/3 (2010-19 | 2020-26) | 0.01 | -0.28 | 0.30 | -0.07 |
| Carry G10+EM + momentum filter (2010-19 | 2020-26) | 0.11 | -0.07 | 0.43 | 0.25 |
| CFTC COT leveraged-fund extremes (2006-15 | 2016-26) | – | -0.44 | – | -0.15 |
| Currency trend 13 weeks (2006-15 | 2016-26) | – | 0.08 | – | -0.52 |
| Currency trend 52 weeks (2006-15 | 2016-26) | – | 0.11 | – | -0.57 |
What the literature says
We compared every approach with published work before testing it. Where a paper reports an effect, our tests usually show the same effect weakening after publication and then disappearing after retail costs.
| Approach | Literature | Our result |
|---|---|---|
| Exchange-rate direction in general | Models do not beat a random walk at 1–12 months (Meese and Rogoff 1983; Rossi 2013) | Intraday, cross-pair and 1-second scalping grids: nothing after costs |
| Carry | A real premium with crash risk (Menkhoff et al. 2012); AQR Sharpe 0.46 before 2016, 0.35 after | 2–5% a year before mark-ups, 0–2% with the broker’s swaps |
| Yield-gap momentum | Short-rate changes predict currencies (Ang and Chen) | Sharpe 0.35 and 0.25 before costs, 0.09 after |
| Value | Real exchange rates predict the cross-section (Menkhoff et al. 2017); AQR 0.67 before 2016, −0.06 after | Positive before costs, negative after costs in 2014–26 |
| Time-series trend | Strong until 2009, about zero since 2016 (Moskowitz, Ooi and Pedersen 2012) | 4, 13 and 52 weeks all lose in 2016–26 |
| Technical rules | Stopped working in currencies in the early 1990s (Neely, Weller and Ulrich 2009) | 162 rules, nothing better than random after costs |
| FOMC days | Dollar weakness on announcement days, 1994–2010 (Mueller, Tahbaz-Salehi and Vedolin 2017) | +5 bp in 2000–10, −1.2 bp in 2016–26 |
| Speculator positioning | Position changes coincide with moves and do not predict them (Klitgaard and Weir 2004) | No signal in 2006–26 |
| Retail CFD trading | 74–89% of retail CFD accounts in the EU lose money (ESMA, 2018) | Consistent with everything above |
AQR’s public factor data tells the same story at the style level. Its currency value, momentum, carry and multi-style factors had Sharpe ratios of 0.67, 0.23, 0.46 and 0.70 in 1976–2015, and −0.06, −0.16, 0.35 and 0.11 from 2016 to February 2026, before any costs.
What we would do instead
- Do not trade currency direction with CFDs. A random strategy loses exactly its costs, so the more often a strategy trades, the faster it loses.
- If you want currency exposure to a documented premium, use futures, where there is no swap mark-up.
- Treat any backtest that ignores the swap mark-up as optimistic by one to two percent a year per side.
Caveats
- The currency bars and spreads come from a cTrader demo feed, and the spreads were measured recently and applied to all years. Historical spreads were probably wider, which only strengthens the conclusion.
- The swap mark-ups are a single snapshot from September 2026 applied to 2000–2026.
- Some data was incomplete: Swiss 2-year yields end in July 2025, Australian ones start in September 2013, and there were no free histories for New Zealand and Norway.
- The FOMC result for 2011–15 (−30 bp per event) looks anomalous and was not investigated.
- The literature column summarises the cited papers. We re-checked the AQR figures ourselves, not the others.