Yen -> Treasuries Backtest Report
Origin
From the 1000x podcast episode "MARKET UPDATE: FED Backstops The Yen, Metals Rip, And Neoclouds Rebound" (2026-08-05): USD/JPY suggested as a leading indicator for US Treasuries, signal = spot minus a moving average, rationale being Japan's status as the largest foreign holder of Treasuries and the yen carry trade. This report tests that claim honestly on free data; a null result is reported as a null result.
Data and sign conventions
| Series | Source | Range used |
|---|---|---|
| USD/JPY spot | FRED DEXJPUS (fallback yfinance JPY=X) | 1971-01-04 to 2026-07-31 |
| 10Y Treasury yield (DGS10) | FRED DGS10 | 1962-01-02 to 2026-08-06 |
| IEF (7-10Y Treasury ETF, adjusted close) | yfinance | 2002-07-30 to 2026-08-07 |
Sign conventions (stated explicitly, load-bearing throughout this report):
- DGS10 is a yield. A falling yield means a rising Treasury price, i.e. a positive
return for a Treasury holder. Where DGS10 is used directly (premise test only), the
Treasury-return proxy is -delta(DGS10) (sign-flipped daily yield change, percentage
points) -- an approximation, not duration-scaled.
- USDJPY up = yen weakening (more yen per dollar). USDJPY down = yen strengthening.
- The backtest itself trades IEF's real adjusted-close return (dividends/interest included),
not the DGS10 proxy.
FRED CSV missing-value markers (.) are dropped, never backfilled. Series are aligned on
common trading days (inner join), not forward-filled across gaps. MA warm-up NaNs are dropped.
Premise test: does USD/JPY lead Treasury returns?
No-lookahead alignment: the predictor is known at close of day T; the forward Treasury-return
window spans T+1 to T+1+horizon, matching the backtest's execution lag. Overlapping windows
(horizon > 1) inflate naive OLS significance roughly 4x at 20 days, so all regressions below
use Newey-West/HAC standard errors (statsmodels, maxlags = horizon).
Two predictor specifications are reported: the raw daily USDJPY log return (the most literal
reading of "USD/JPY moves"), and the MA(50) signal level (spot - MA(50), the middle of the
four windows used in the backtest grid) as a robustness check.
n = 13861 aligned observations, 1971-01-04 to 2026-07-31. Subperiod cutoff: 2022-01-01 (the carry-trade/largest-holder story is largely a post-2022 phenomenon; a full-sample null could bury a real recent regime, and conversely a strong recent result must not be sold as a stable decades-long edge).
Full sample
Predictor: raw daily USDJPY log return
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 13859 | 0.081970 | 0.103813 | 0.79 | 0.4298 | |
| 5 | 13855 | -0.006701 | 0.240215 | -0.03 | 0.9777 | |
| 10 | 13850 | 0.192257 | 0.341786 | 0.56 | 0.5738 | |
| 20 | 13840 | 0.401150 | 0.505507 | 0.79 | 0.4275 |
Predictor: signal = spot - MA(50)
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 13811 | 0.000203 | 0.000155 | 1.31 | 0.1895 | |
| 5 | 13807 | 0.001064 | 0.000664 | 1.60 | 0.1092 | |
| 10 | 13802 | 0.002334 | 0.001323 | 1.76 | 0.0778 | |
| 20 | 13792 | 0.003912 | 0.002629 | 1.49 | 0.1367 |
Pre-2022 (before 2022-01-01)
Predictor: raw daily USDJPY log return
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 12718 | 0.071291 | 0.109605 | 0.65 | 0.5154 | |
| 5 | 12718 | 0.064824 | 0.256592 | 0.25 | 0.8006 | |
| 10 | 12718 | 0.404742 | 0.367153 | 1.10 | 0.2703 | |
| 20 | 12718 | 0.661356 | 0.538855 | 1.23 | 0.2197 |
Predictor: signal = spot - MA(50)
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 12670 | 0.000267 | 0.000162 | 1.65 | 0.0990 | |
| 5 | 12670 | 0.001344 | 0.000699 | 1.92 | 0.0545 | |
| 10 | 12670 | 0.002802 | 0.001396 | 2.01 | 0.0447 | * |
| 20 | 12670 | 0.004404 | 0.002771 | 1.59 | 0.1121 |
Post-2022 (from 2022-01-01, the carry-trade regime the podcast describes)
Predictor: raw daily USDJPY log return
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 1141 | 0.217258 | 0.322885 | 0.67 | 0.5010 | |
| 5 | 1137 | -0.616307 | 0.612095 | -1.01 | 0.3140 | |
| 10 | 1132 | -1.744672 | 0.695963 | -2.51 | 0.0122 | * |
| 20 | 1122 | -1.807026 | 1.205379 | -1.50 | 0.1338 |
Predictor: signal = spot - MA(50)
| Horizon (days) | n | beta | HAC se | t-stat | p-value | sig |
|---|---|---|---|---|---|---|
| 1 | 1141 | -0.000580 | 0.000540 | -1.07 | 0.2831 | |
| 5 | 1137 | -0.002253 | 0.001929 | -1.17 | 0.2429 | |
| 10 | 1132 | -0.002706 | 0.003558 | -0.76 | 0.4470 | |
| 20 | 1122 | 0.001152 | 0.005977 | 0.19 | 0.8472 |
p < 0.05, *p < 0.01, HAC/Newey-West standard errors. Beta sign: positive means the predictor and the (sign-corrected) forward Treasury return proxy move together, i.e. yen weakening this period predicts falling yields (positive Treasury returns) at that horizon.
Backtest grid (16 configurations)
Signal: signal = USDJPY_spot - MA(N), N in {20, 50, 100, 200}. Both possible directions are
tested since the podcast didn't specify a sign: yen-weakening -> long Treasuries and
yen-strengthening -> long Treasuries. Two position variants: long-or-cash (position in
{0, 1}) and long-or-short (position in {-1, 1}). 4 windows x 2 directions x 2 variants = 16
configs, run on IEF (7-10Y Treasury ETF, adjusted close -- chosen over TLT for duration match to
the DGS10-based premise test).
No lookahead: signal on close T, trade executes at close T+1, position earns the T+1 -> T+2 return. Transaction cost: 5 bps per unit of position change. Benchmark: buy-and-hold IEF over the same period. In-sample 2002-2017 is used only to pick a config (highest in-sample Sharpe); out-of-sample 2018-present is the only verdict that counts.
Full out-of-sample grid (all 16 configs, never just the winner):
| Config | MA window | Direction | Variant | OOS CAGR | OOS Sharpe | OOS Max DD | OOS Trades |
|---|---|---|---|---|---|---|---|
| MA20_yen_weak_long_long_or_cash | 20 | yen-weakening -> long Treasuries | long-or-cash | -1.62% | -0.28 | -27.31% | 267 |
| MA20_yen_weak_long_long_or_short | 20 | yen-weakening -> long Treasuries | long-or-short | -4.27% | -0.59 | -38.13% | 267 |
| MA20_yen_strong_long_long_or_cash | 20 | yen-strengthening -> long Treasuries | long-or-cash | -0.60% | -0.11 | -14.44% | 265 |
| MA20_yen_strong_long_long_or_short | 20 | yen-strengthening -> long Treasuries | long-or-short | -2.36% | -0.31 | -30.21% | 265 |
| MA50_yen_weak_long_long_or_cash | 50 | yen-weakening -> long Treasuries | long-or-cash | -0.37% | -0.04 | -20.43% | 161 |
| MA50_yen_weak_long_long_or_short | 50 | yen-weakening -> long Treasuries | long-or-short | -1.80% | -0.23 | -24.57% | 161 |
| MA50_yen_strong_long_long_or_cash | 50 | yen-strengthening -> long Treasuries | long-or-cash | -0.64% | -0.13 | -13.93% | 161 |
| MA50_yen_strong_long_long_or_short | 50 | yen-strengthening -> long Treasuries | long-or-short | -2.46% | -0.32 | -23.31% | 161 |
| MA100_yen_weak_long_long_or_cash | 100 | yen-weakening -> long Treasuries | long-or-cash | 0.18% | 0.06 | -21.52% | 80 |
| MA100_yen_weak_long_long_or_short | 100 | yen-weakening -> long Treasuries | long-or-short | -0.72% | -0.07 | -22.38% | 80 |
| MA100_yen_strong_long_long_or_cash | 100 | yen-strengthening -> long Treasuries | long-or-cash | -0.22% | -0.03 | -9.59% | 80 |
| MA100_yen_strong_long_long_or_short | 100 | yen-strengthening -> long Treasuries | long-or-short | -1.64% | -0.20 | -19.29% | 80 |
| MA200_yen_weak_long_long_or_cash (in-sample winner) | 200 | yen-weakening -> long Treasuries | long-or-cash | 0.41% | 0.10 | -21.21% | 66 |
| MA200_yen_weak_long_long_or_short | 200 | yen-weakening -> long Treasuries | long-or-short | -0.25% | -0.00 | -21.33% | 66 |
| MA200_yen_strong_long_long_or_cash | 200 | yen-strengthening -> long Treasuries | long-or-cash | -0.29% | -0.05 | -12.99% | 66 |
| MA200_yen_strong_long_long_or_short | 200 | yen-strengthening -> long Treasuries | long-or-short | -1.77% | -0.22 | -22.90% | 66 |
| Buy & hold benchmark | - | - | - | 0.96% | 0.17 | -23.92% | 1 |
In-sample-chosen config vs. benchmark
In-sample winner (by Sharpe): MA200_yen_weak_long_long_or_cash -- MA(200), yen-weakening -> long Treasuries, long-or-cash.
| In-sample (2002-2017) | Out-of-sample (2018-present) | |
|---|---|---|
| MA200_yen_weak_long_long_or_cash CAGR | 2.87% | 0.41% |
| MA200_yen_weak_long_long_or_cash Sharpe | 0.76 | 0.10 |
| MA200_yen_weak_long_long_or_cash Max DD | -9.08% | -21.21% |
| MA200_yen_weak_long_long_or_cash Trades | 155 | 66 |
| Buy & hold CAGR | 5.03% | 0.96% |
| Buy & hold Sharpe | 0.76 | 0.17 |
| Buy & hold Max DD | -10.40% | -23.92% |
Equity curve (out-of-sample, 2018-present)
Bottom line
- The in-sample-chosen config (MA200_yen_weak_long_long_or_cash) did not beat buy-and-hold on out-of-sample Sharpe (0.10 vs 0.17).
- Across the full 16-config grid, 0 of 16 configs beat the buy-and-hold Sharpe out-of-sample -- inconsistent with a broad, robust edge across the family, which is the deciding evidence (not the single winner in isolation).
- The post-2022 premise test found 1 statistically significant result out of 8 post-2022 regressions. The strongest: raw daily USDJPY log return at horizon 10 days, beta=-1.7447 (p=0.0122, HAC) -- negative, i.e. yen weakening predicted negative forward Treasury returns in this window. This is the opposite direction of the pre-2022 significant result (signal = spot - MA(50), horizon 10, beta=0.0028) -- a sign flip, not a confirmation. It does not replicate at other horizons or under the other predictor specification within the post-2022 window, so it should not be read as a confirmed post-2022 regime shift.
- Across all periods, predictors, and horizons, 2 of 24 premise-test regressions were significant at p<0.05 -- close to the ~1.2 expected by chance alone at a 5% significance threshold with no real relationship present, so the premise test as a whole reads as a null result, not a confirmed edge.
This is a curiosity/research project, not a trading recommendation. The methodology guards above (no lookahead, HAC errors, full-grid disclosure, pre/post-2022 split) are there specifically so a lucky single config can't be mistaken for a real edge.