← GRAPH·ATLAS

What a Hormuz closure does to the JGB curve, modelled end-to-end

financelong-form · May 14, 2026 · 16 min read

The question

If the Strait of Hormuz closed tomorrow, what would the Bank of Japan actually do?

The standard answer is familiar: a supply shock raises inflation, weakens growth, and gives the BoJ a reason to look through the price spike rather than tighten into it. That was broadly the logic after earlier oil shocks, and it was still the default interpretation in 2022.

Japan's starting point now makes that answer less straightforward.

The issue is not simply that Japan imports a large share of its oil through Hormuz. It is that a new energy shock would arrive when JGB yields are already materially higher than they were during the long era of ultra-cheap funding, while public debt remains extremely large.

So I built a deterministic scenario engine to stress-test that combination.

The model follows one transmission chain:

Hormuz disruption → oil price shock → CPI pass-through → yen weakness → modified BoJ reaction function → JGB stress

It is not a forecast. It does not claim to predict the next BoJ meeting or the exact level of the 10-year yield.

Its purpose is narrower: given a set of transparent assumptions, what does the policy problem look like if oil rises sharply while Japan is already entering the event with a more fragile bond-market backdrop?

Every input is inspectable, and the same inputs always produce the same output.

Why Japan is the interesting case

Japan is one of the clearest macro victims of a Hormuz disruption.

It imports roughly 91% of its oil, and a large share of that supply passes through the Strait of Hormuz. A prolonged closure would therefore hit Japan through both price and physical-availability channels.

But the more interesting part of the story is on the liability side.

In the market snapshot used for this model:

Historically, the BoJ could afford to treat a supply-driven inflation shock as temporary. It could hold policy steady, tolerate the overshoot, and wait for growth to absorb the shock.

That option becomes harder when the bond market is already demanding higher yields.

In the model, I call this a triple trap:

1. Higher oil prices push inflation higher and put pressure on the BoJ not to ease. 2. The same shock weakens growth and creates pressure to support the economy. 3. High debt means that both policy choices are costly: hikes worsen debt-service dynamics, while cuts risk intensifying yen weakness and long-end selling.

That does not mean the BoJ is literally unable to act. It means that the range of policy choices becomes unusually unattractive.

What the model does

The core function is:

calculate_impact(
    oil_price,
    days_blocked,
    days_since_start,
    country
)

For each scenario, it runs five steps.

1. Debt context

The model first checks whether Japan is already above a predefined JGB-yield threshold.

if current_jgb >= triple_trap_threshold:
    jgb_overshoot = current_jgb - triple_trap_threshold
    debt_amplifier = 1.0 + (jgb_overshoot / 0.50) * 0.30
    triple_trap = True

The threshold is set at a 10-year JGB yield of 2.0%.

At 2.509%, the model produces a debt amplifier of 1.305. That does not mean Japan is in a formally defined economic regime called a "triple trap." It means that, under this model's assumptions, higher yields make the interaction between inflation, FX and fiscal stress more sensitive than it would be in a low-yield environment.

The key point is that the vulnerability exists before the oil shock arrives.

The shock does not create the underlying constraint. It exposes it.

2. Strategic petroleum reserves

Japan has substantial strategic reserves, estimated here at roughly 150 days.

That matters because a short disruption is primarily a price shock. A long disruption becomes a physical-supply problem.

While reserves still cover the disruption, the model assumes that only 60% of the oil shock passes through immediately:

if days_since_start < reserves_days:
    effective_shock = oil_shock_pct * 0.6

This is why duration matters as much as price.

A one-week disruption may produce a sharp market reaction without immediately damaging the physical economy. A 90- or 150-day disruption is different: inventories begin to matter, rationing risk rises, and the shock becomes harder to absorb.

3. Oil to CPI

The inflation module uses country-specific input-output assumptions.

For Japan, the model includes:

direct = effective_shock * io["energy_cpi_weight"] * io["industrial_passthrough"]
indirect = effective_shock * io["transport_weight"] * 0.4

cpi_delta = (
    direct
    + indirect
    + duration_factor
) * (1 - io["subsidy_buffer"]) * 100

The result is not a claim about the exact CPI print Japan would see in a future crisis.

It is a structured estimate of how much additional inflation pressure the oil shock could create under a fixed set of pass-through assumptions.

4. Oil to FX

Japan's energy-import dependence means that oil shocks also matter through the yen.

The model uses a JPY sensitivity of 0.19 per $1 increase in Brent. If the debt-stress condition is active and the oil shock is large, the FX effect is amplified:

if triple_trap and oil_shock_pct > 0.2:
    fx_delta *= debt_amplifier

The intuition is simple.

A large oil shock weakens Japan's terms of trade. If investors are also concerned about the fiscal and bond-market consequences of that shock, the yen can weaken more than the oil price alone would imply.

That currency move then feeds back into imported inflation.

This feedback loop is central to the model. A bond-market problem becomes a currency problem, and a currency problem increases the inflation pressure that the BoJ is trying to manage.

5. A constrained BoJ reaction function

The final step is a modified Taylor-rule-style reaction function.

The model gives the BoJ a relatively low inflation weight and a higher output weight, reflecting its historically dovish bias in supply-driven shocks.

Under the old logic, a large oil shock would generally push the BoJ toward holding or easing rather than hiking aggressively.

The model adds a debt-sensitive constraint:

if override == "dovish" and oil_shock_pct > threshold:
    if triple_trap:
        taylor_delta = taylor_delta * (1 - 1 / debt_amplifier)
    else:
        taylor_delta = min(taylor_delta, 0)

This is not a claim that the BoJ mechanically follows this formula.

It is a way of representing a policy environment in which the central bank faces unattractive trade-offs in both directions.

A hike may deepen the growth shock and increase debt-service pressure.

A cut may intensify yen weakness, imported inflation and long-end JGB stress.

The model therefore drives the recommended rate response closer to zero as the debt amplifier rises.

I describe that outcome as policy paralysis. It is better understood as a constrained-optimal result inside this model than as a literal prediction of what the BoJ will do.

The scenario outputs

The table below shows four canonical runs from the API.

Baseline Brent is $75.

ScenarioBrentBlockadeCPI ΔJPY ΔBoJ rate ΔModel verdictStress score
base$750d0.0pp0.0%~0bpHold15.8 — Normal
shock_30d$11530d+2.61pp−9.9%0bpTriple Trap60.1 — Elevated
shock_90d$15090d+5.5pp−24.9%−3bpTriple Trap97.4 — Crisis
extreme$185120d+8.5pp−36.7%−5bpTriple Trap100.0 — Crisis

The most important column is the rate response.

In the 30-day scenario, Brent rises by more than 50%, and the model produces a CPI impulse of roughly +2.6 percentage points. Yet the policy-rate output is still close to zero.

That is not because inflation has become irrelevant.

It is because the model sees both exits as expensive:

By the 90-day scenario, the tension becomes much more severe. Inflation is materially above target, the yen is sharply weaker, and the model still produces almost no policy-rate movement.

A conventional rule focused mostly on inflation would likely point toward significant tightening. This model does not, because it is explicitly trying to account for the debt and FX constraints around that decision.

Note also the base row: triple_trap is already true at $75 Brent with an amplifier of 1.305. The trap is pre-loaded. The blockade doesn't create it; it detonates it.

What this implies for the JGB curve

This is not a full term-structure model.

It does not estimate the exact 10s30s spread, the fair level of the 10-year yield, or the timing of a Bank of Japan intervention.

But it does suggest a directional risk.

A serious Hormuz disruption could create the conditions for a bear steepener that the BoJ struggles to offset.

The front end is constrained because policy cannot move freely in either direction.

The long end has to absorb several pressures at once:

That is the core risk.

The problem is not simply that oil rises.

The problem is that oil rises at a point when the policy response itself may become a source of market uncertainty.

Turning OSINT signals into macro scenarios

The live version of the model does not require someone to manually type days_blocked = 30.

It accepts observable signals through:

POST /api/osint/signal

For example, a sharp AIS vessel-count drop in the Strait of Hormuz can be converted into an initial disruption-duration estimate:

if signal.signal_type == "ais_traffic_drop" and signal.vessel_count_change_pct:
    drop = abs(signal.vessel_count_change_pct)

    if drop > 60:
        est_days = max(est_days, 30)
    elif drop > 30:
        est_days = max(est_days, 15)
    elif drop > 15:
        est_days = max(est_days, 7)

This should not be read as: "an AIS collapse proves a 30-day blockade."

It is a scenario trigger.

A collapse in vessel traffic, a spike in escalation events, or evidence of sustained disruption can raise the duration assumption. That assumption then runs through the same oil, inflation, FX and policy chain.

The point of the pipeline is not to turn ship-tracking data into a false prediction of central-bank behaviour.

The point is to create a transparent bridge from observable events to a structured macro stress test.

Compressing the result into a stress score

The dashboard also needs a single scalar output.

The stress score combines four components:

score = (
    oil_component * 0.35
    + cpi_component * 0.30
    + fx_component * 0.20
    + trap_component * 0.15
)

Each component is normalized against a ceiling:

The resulting bands are:

The 30-day scenario scores 60.1: elevated, but not yet a full crisis.

That initially looked conservative to me. But it reflects an important distinction: Japan's reserves are still cushioning the physical shock at that stage.

The 90-day scenario is different. The disruption has lasted long enough for duration risk, reserve depletion and FX pressure to dominate. The score rises sharply because the system becomes nonlinear as the disruption persists.

What the model is not

This is a deterministic scenario engine, not a forecast.

Several limitations matter:

The model recalibrates inflation targets from live IMF WEO data at startup, with a hardcoded fallback if the API is unavailable.

It also exposes the debt assumptions through:

GET /api/imf/debt

That allows the model's hardcoded context to be checked against current IMF data rather than silently drifting out of date.

Where it runs

The implementation is a FastAPI service with endpoints for both arbitrary and canonical scenarios:

/api/simulate
/api/scenario/{base|shock_30d|shock_90d|extreme}
/api/ai/stress
/api/ai/thesis
/api/osint/signal

Nine countries are currently wired into the framework.

The same engine can produce a more hawkish ECB response, an India-style FX-defence trigger, or a revenue-disruption scenario for Gulf exporters.

Japan is the most interesting case because debt conditions do not merely change the size of the output.

They change the logic of the policy problem itself.

The conclusion is not that a Hormuz closure guarantees a JGB crisis. It is that Japan may enter such a shock with fewer clean policy exits than it had during previous oil shocks.

The uncomfortable output of the model, and the reason I trust it more after building it than before: the JGB curve doesn't need a Hormuz closure to be in trouble. The closure just removes the last exit.

WEEKLY SIGNAL BRIEF

AI agents, markets, geospatial intel — a short email when the signals move. No noise, unsubscribe anytime.

Powered by Buttondown