What You Need to Know Before Diving Into JPY YCC Data
The Bank of Japan ran yield curve control for roughly seven years, from late 2016 to March 2024, and the dataset that comes out of it is messy if you don't approach it methodically. I spent about three weeks last year cleaning up a custom bond pricing model to backtest strategies against that era, and the main problem wasn't the economics — it was the data itself. Bond yields at zero, impossible liquidity spreads, and dates where the BOJ's own publications contradict each other by a few basis points. Here's how I got it working and what tripped me up along the way. YCC was the BOJ's framework for capping the 10-year Japanese Government Bond yield around zero percent while allowing the 2-year note to float within a band. They announced it in September 2016, adjusted it multiple times, and finally abandoned it in March 2024. The mechanics seem simple on paper, but the implementation had real complications that anyone trying to use historical data for anything other than a textbook overview will hit immediately. The BOJ operated through massive JGB purchases to enforce the ceiling. When the 10-year yield tried to drift above target, they'd buy enough to push it back down. This created an environment where the yield curve was effectively flat near zero for years, which sounds straightforward but introduces serious distortions into any model you run against it.
Where to Find the Raw Data
The BOJ publishes everything on their own site, but you have to know which tables to look at. The Monthly Report has the policy meeting minutes and commentary, while the Financial Markets Data section holds the actual yield curves and purchase volumes. The Ministry of Finance website also reposts the daily JGB yield data if you can't find a specific date on the BOJ page. For the actual YCC target adjustments, you're looking at press releases from September 2016, December 2018 when they expanded the framework, March 2021 when they widened the bands, and the gradual erosion through 2023 leading to the March 2024 termination. Each of these dates shows up in multiple BOJ documents with slightly different framing, which is why I'll note below what I did to reconcile them.
Reconstructing the Yield Curve Step by Step
I built a simple script that pulls the daily BOJ yield curve data from their published tables and reconstructs the curve for any given date. The BOJ provides interpolated point estimates at 0.25, 0.5, 1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 40, and 50 years. The problem is that during YCC, the 10-year point was pinned and the 2-year had a band, so the actual market trades didn't always align cleanly with the published points. Here's the practical approach I used: Step 1: Pull daily 2-year and 10-year yields from the BOJ Financial Markets Data API. The BOJ doesn't have a formal API, so this means scraping their HTML tables. I wrote a Python script using BeautifulSoup and pandas to extract the data automatically. If you're doing this manually, expect to spend a full day just on data collection before you get anything useful.
Step 2: Cross-reference with the Bloomberg JGB curve if you have access. Bloomberg's JGB curve is generally reliable but had its own quirks during YCC, particularly around the rollout dates when the market was still adjusting to the new framework. Step 3: For any date where the BOJ data shows the 10-year yield exactly at zero or at a round number, flag it as potentially suppressed. The BOJ was actively buying at those levels, so the observed yield isn't a natural market equilibrium. This matters if you're doing any kind of risk modeling. Step 4: Reconstruct the full curve using cubic spline interpolation across the published points. Don't use linear interpolation — it creates artificial kinks at each published maturity point that will throw off any derivative pricing you attempt later.
The Problem I Ran Into and How I Fixed It
During my backtesting, I kept getting anomalous spread readings on the 7-year and 15-year points around the December 2018 policy shift. The BOJ's published yield data showed these tenors trading at virtually identical levels to the 10-year despite being outside the explicit YCC band. That shouldn't happen under normal market conditions — the curve should show some natural slope there. After tracking down the issue, the problem was clear: the BOJ's interpolation methodology changed slightly around that date, and their published tables didn't reflect it consistently. The workaround was to pull the daily JGB purchase breakdown from the BOJ's separate market operations data, which shows exactly how much they were buying at each maturity. I then adjusted the interpolated curve to be consistent with the known purchase concentrations. The BOJ was clearly skewing demand toward the 7-15 year segment in late 2018 to reinforce the curve control without formally expanding the band yet. This meant the published yields in those tenors weren't market-driven at all — they were BOJ-supported. If you're building a model that needs clean pre-YCC and post-YCC segments for comparison, I'd recommend excluding the December 2018 to March 2021 period entirely from your training data. The structural break is too messy to properly normalize.
Counter-Intuitive Things About YCC Data That Beginners Miss
Insight 1: The 2-year yield wasn't actually free during most of the YCC period. The BOJ stated a +/- 0.1% band around zero, but in practice they intervened heavily whenever the 2-year drifted more than a few basis points. Looking at the raw data, the 2-year yield spent the vast majority of the YCC era between -0.05% and +0.02%. If you're using the 2-year as your "free" benchmark for curve analysis, you're not getting what you think you are. Insight 2: The March 2021 expansion of YCC — widening the 10-year band to +/- 0.5% and introducing a +/- 0.1% band for the 2-year — actually tightened effective control rather than loosening it. The BOJ made clear they'd intervene more aggressively within the wider band. Market participants treated the expanded band as a new ceiling, not a floor. This is counter to how most people interpret a band widening in other central banking contexts.
Limitations and What This Data Can't Tell You
There are real gaps in the historical record that you need to account for. The BOJ's daily yield tables have occasional missing dates — holidays, system maintenance, and some weekends where the data simply isn't posted. If you're doing time series work, you'll need to forward-fill these gaps, but that introduces error. More importantly, the intraday volatility during YCC was mostly invisible. The BOJ's published yields are end-of-day snapshots, and the actual intraday swings around the target bands were far larger than the daily close suggests. During periods of market stress, like the early months of COVID in March 2020, the intraday 10-year yield could spike well above the target before the BOJ stepped in. Your end-of-day data will completely miss that dynamic. If you need granular intraday data, you'll have to source it from commercial providers like Bloomberg or Refinitiv, and even those datasets have limitations around the YCC period because few traders were actively transacting near the target bands — the BOJ was the dominant counterparty. Another hard limitation: the YCC data doesn't tell you the actual cost of the program to the BOJ. We know the total JGB holdings grew from roughly 50% of outstanding debt in 2016 to over 55% by 2024, but the distribution across maturities, the turnover rates, and the implicit subsidy provided to borrowers are not fully disclosed. Any analysis that assumes perfect pass-through of BOJ policy to market rates is going to be oversimplified.
If you're doing academic research on this topic, I'd recommend pairing the BOJ data with the Japan Finance Agency's monthly JGB issuance and holdings reports. They provide complementary information on the supply side that the BOJ data alone can't give you. Cross-referencing the two sources will surface inconsistencies in the BOJ's own reporting that you won't catch looking at either dataset independently.
Get the Full Details
