Unit 2 · Markets & Instruments — Session 05 of 07

FX & Commodities

Session 2.4 priced a futures contract as spot plus the cost of carrying the asset. This session runs the same idea through two new markets: for a currency the carry is the gap between two interest rates; for a barrel of oil or a cargo of gas it is storage minus the value of having the thing in hand. The core move: price every forward from the loop that replicates it, then ask who can actually afford to run that loop — the answer explains the cross-currency basis, the carry trade's crashes and the shape of every commodity curve.

DURATION 1.5 h + lab LEVEL Foundations TRACKS QR · QT · QD · IND HANDS-ON Price CIP net of costs; crash-test carry on 10,000 paths; build curves from storage

2.5.1 Reading a currency quote

An exchange rate is the price of one money in another. The quote tells you which is which — get the direction wrong and every number after it flips sign.

A currency pair names two currencies as BASE/QUOTE. The price SS is how many units of the quote currency one unit of the base costs. A dealer showing EUR/USD 1.0850 / 1.0851 buys euros from you at 1.0850 dollars each (the bid) and sells them to you at 1.0851 (the ask); the gap is the bid-ask spread you met in Session 2.1. By convention the euro and sterling are quoted against the dollar (EUR/USD, GBP/USD), while the dollar is the base against the yen, the Swiss franc and the Canadian dollar (USD/JPY, USD/CHF, USD/CAD). So "EUR/USD up" means a stronger euro, but "USD/JPY up" means a weaker yen.

A pip is the conventional smallest step of a quote: the fourth decimal (0.0001) for most pairs, the second (0.01) for yen pairs. Dealers speak only the last two digits, because the leading ones — the big figure — move far less often than the pips.

ANATOMY OF A QUOTE — an illustrative GBP/USD price, as a dealer shows it GBP / USD 1.2745 / 1.2747 BASE the unit being priced: one pound QUOTE the currency the price is written in BID the dealer buys pounds from you at this price ASK the dealer sells pounds to you at this price BIG FIGURE · 1.27 moves far less than the pips, so dealers say just "45–47" PIP · 0.0001 the 4th decimal for most pairs; the 2nd (0.01) for yen pairs SPREAD · 2 PIPS ask − bid: what a round trip costs (buy at the ask, sell at the bid) GBP/USD rising means one pound buys more dollars: the base currency got stronger.
fig 2.5.1 — anatomy of a currency quote: base and quote currency, bid and ask, big figure and pips

On one million units of the base currency, one EUR/USD pip is $100; one USD/JPY pip is 10,000 yen, about $66.66 at a mid of 150.01. A round trip of €10 million across a one-pip EUR/USD spread costs $1,000 — not small for a strategy that trades daily (transaction costs are Session 6.5's subject).

A pair without the dollar, such as EUR/JPY, is a cross. Less-traded crosses are priced through the dollar, which sits on one side of 89% of all FX trades (BIS 2025): to buy, say, Norwegian kroner with yen you buy dollars with yen, then kroner with dollars, paying both spreads. The most-traded crosses (EUR/JPY, EUR/GBP) also trade directly, and arbitrage keeps their spread inside the synthetic one. Built through the dollar from the lab's quotes — USD/JPY 150.00 / 150.02 — the cross comes out at 162.750 / 162.787: a spread of 3.67 pips, or 2.25 bp of the price, the sum of EUR/USD's 0.92 bp and USD/JPY's 1.33 bp, and the widest spread a direct EUR/JPY quote could show.

PairRead asPipOne pip on 1 million of the baseSpot date
EUR/USDdollars per euro0.0001$100T+2
USD/JPYyen per dollar0.0110,000 yen ≈ $66.66T+2
EUR/JPY (a cross)yen per euro0.0110,000 yen ≈ $66.66T+2
USD/CADCanadian dollars per US dollar0.0001100 Canadian dollarsT+1

That last column is FX spot: an exchange of two currencies at an agreed rate, settled on the spot date — two business days after the trade (T+2) for most pairs, one (T+1) for US and Canadian dollars (SIFMA, CCMA & ISDA 2024), and later if a holiday in either currency intervenes. There is no central exchange: the market is over the counter, with dealers — large banks — quoting to clients and to each other, mostly electronically, around the clock on weekdays. The BIS Triennial Survey counted $9.6 trillion of turnover a day in April 2025; 46% of it was between dealers, and sales desks in the United Kingdom booked 38%.

Instrument (BIS, April 2025)What it isDaily turnoverShare
Spotexchange on the spot date$3 trillion31%
Outright forwardsexchange on a later date, rate fixed today$1.8 trillion19%
FX swapsa spot trade plus the opposite forward$4 trillion42%
Optionsthe right, not the obligation, to exchange—7%
Currency swapslong-term exchange of interest and principal—about 2%

Source: BIS Triennial Survey, published 30 September 2025. The largest instrument, the FX swap, is priced by the loop in §2.5.2.

📌 Key idea — read the pair before the number

SS is units of the quote currency per unit of the base; up means the base strengthened. A pip's money value depends on the pair and your size. A cross built through the dollar is two trades glued together, and can cost up to two spreads.

🧭 Margin note — the two legs of a currency trade

An FX trade is two payments, often in different time zones. When the German supervisor closed Bankhaus Herstatt mid-day on 26 June 1974, it had received the Deutsche marks it bought but not delivered the dollars it sold, and its counterparties took the loss (ECB 2007). The industry set up CLS in 2002 to settle both legs of a trade together or not at all — payment versus payment (CLS 2023). Settlement in general is Session 2.1's subject; counterparty risk returns in Session 2.6.

2.5.2 FX forwards & covered interest parity

A currency forward needs no forecast. One loop through two money markets pins it — the cash-and-carry argument of Session 2.4, with a second interest rate where the storage bill used to be.

An FX forward (an outright forward) fixes today the rate at which two currencies will be exchanged on a date beyond spot. A company owed euros in three months sells them forward and knows its dollar revenue today. It is a forward contract in exactly the sense of Session 2.4, and it is priced the same way: by building it from things you can already trade.

The loop in words: you hold dollars and want dollars τ\tau years from now. Route A: deposit them at the dollar rate. Route B: buy euros at spot, deposit them at the euro rate, and — today — sell forward the euros that deposit will pay out. Every price in route B is agreed today, so both routes are riskless and must pay the same; if route B paid more, traders would borrow dollars to run it and push the forward down until the gap closed.

THE CIP LOOP — two ways to turn dollars today into dollars in τ years, both locked in today 1 · DOLLARS TODAY start with $1 (or borrow it) USD rate i$ · EUR rate i€ 2 · EUROS TODAY buy at spot S (dollars per euro): $1 buys 1/S euros 3 · EUROS AT τ the euro deposit pays out (1 + i€·τ) / S euros 4 · DOLLARS AT τ route A: 1 + i$·τ route B: F·(1 + i€·τ) / S route B · convert at spot deposit at the EUR rate deliver into the forward sold today at F route A · deposit at the USD rate NO ARBITRAGE: ROUTE A = ROUTE B F = S·(1 + i$·τ) / (1 + i€·τ) known today · no capital · no currency risk IF ROUTE B PAYS MORE borrow $, run 1→4: buying € spot, selling € forward → F falls IF ROUTE A PAYS MORE borrow €, run the loop backwards → F rises Every step is agreed today, so the forward is arithmetic, not a forecast.
fig 2.5.2 — the covered-interest-parity loop: a dollar deposit (route A) and a hedged euro deposit (route B) must pay the same, which fixes the forward rate F

In symbols, with one convention for the whole session: spot SS and forward FF are units of the quote currency per unit of the base; iqi_q and ibi_b are the quote and base currencies' money-market rates for the term — simple, not compounded, as deposits are quoted — and τ\tau is the term in years. For EUR/USD, iqi_q is the dollar rate, ibi_b the euro rate, and both markets count τ\tau as actual days/360, so a one-year forward is about 365/360 years (other currencies use other conventions; see day count conventions in Session 11.1). Route A turns $1 into 1+iqτ1 + i_q\tau; route B turns it into FS(1+ibτ)\tfrac{F}{S}(1 + i_b\tau). Setting them equal gives covered interest parity (CIP):

F=S1+iqτ1+ibτF = S\,\frac{1 + i_q\,\tau}{1 + i_b\,\tau}

The forward is the spot rate scaled by the ratio of the two currencies' growth factors. The higher-rate currency trades at a forward discount — not because anyone expects it to fall, but because the loop demands it. With continuously compounded rates the same argument gives F=Se(rq−rb)τF = S\,e^{(r_q - r_b)\tau}: exactly the cost of carry formula F0=S0ecτF_0 = S_0e^{c\tau} of Session 2.4 with c=rf−qc = r_f - q, where the financing rate rfr_f is the quote currency's and the income qq is the base currency's interest rate. A currency is an asset that pays its own interest rate.

Dealers quote forwards as forward points: F−SF - S measured in pips, added to spot. With EUR/USD at 1.08505 (the mid of the quote above), a dollar rate of 4% and a euro rate of 2% (illustrative):

TenorActual daysForward F (CIP)Forward points
1 month311.08692+18.7
3 months921.09057+55.2
6 months1831.09597+109.2
1 year3651.10662+215.7

The euro has the lower rate, so it trades at a forward premium. The rule of thumb, points ≈ S(iq−ib)τS\,(i_q - i_b)\,\tau / pip, gives +220.0 at one year; the exact formula's denominator trims it. Mixing conventions is worse: put the same 4% and 2% into the continuous formula and the one-year forward comes out 6.6 pips too high. A rate is not a number until you know its compounding and its day count. The lab's pricer is one line:

def cip_forward(spot: float, i_quote: float, i_base: float, tau: float) -> float:
    """Covered-interest-parity forward: QUOTE per 1 BASE, simple money-market rates, tau in years."""
    return spot * (1 + i_quote * tau) / (1 + i_base * tau)
📌 Key idea — the forward is arithmetic, not a forecast

CIP pins the forward by replication — no-arbitrage pricing, which Session 10.1 generalises. A dealer who sells you a forward hedges it by running the loop, so no view on the euro enters the price. Whether the forward also predicts the future spot rate is a different claim, uncovered interest parity, in Session 11.5 — on average it does not, and that failure is where FX carry (§2.5.4) comes from. Covered parity is enforced by arbitrage; uncovered parity is only a hypothesis.

2.5.3 When the loop costs too much to run

Before the 2008 crisis, covered interest parity held closely. Since then it has not — and the reason is a lesson in who can actually run an arbitrage.

Measure a deviation with the cross-currency basis xx (an interest-rate spread — not the futures basis S−FS - F of Session 2.4): the spread you must add to the non-dollar rate to make CIP hold at market prices. Here the dollar is the quote currency and xx is added to the non-dollar rate, which is Du, Tepper & Verdelhan's (2018) sign convention; they quote foreign currency per dollar, so their formula is the reciprocal of this one:

F=S1+iqτ1+(ib+x)τF = S\,\frac{1 + i_q\,\tau}{1 + (i_b + x)\,\tau}

A negative basis puts the forward above the CIP price: the direct dollar interest rate is lower than the synthetic one you get by swapping another currency into dollars, so borrowing dollars through FX swaps costs more than borrowing them in the cash market. Whoever borrows dollars that way pays the premium — for instance a non-US bank or investor hedging a dollar asset — and Borio, McCauley, McGuire & Sushko (2016) trace the basis to that hedging demand meeting tighter limits on arbitrage.

The facts, dated. DTV find that since 2008 CIP deviations for G10 currencies are large, persistent and systematic, are not explained away by credit risk or transaction costs, and are strongest for forwards that appear on banks' balance sheets at quarter-end. In the working-paper version (NBER w23170, February 2017), the average absolute basis over 2010–2016 was 24 bp a year at three months and 27 bp at five years; the five-year yen basis was close to −90 bp at the end of 2015, larger than the roughly −70 bp gap between Japanese and US five-year Libor rates. Their explanation combines balance sheets made costly by post-crisis regulation with cross-currency imbalances in hedging and investment demand. On the balance-sheet side, with a 3% Basel III leverage ratio and a 10% required return on equity, a bank needs a basis of at least 3% × 10% = 30 bp before a trade that grows its balance sheet is worth doing.

The lab reproduces the mechanism. It puts the market's 3-month forward 8 pips above CIP (1.09137 against 1.09057), a basis of −28.8 bp — DTV's order of magnitude. At mid prices, borrowing $100,000,000 and running the loop locks in $74,106 (29.0 bp a year) — the same in all 10,000 simulated end-of-period exchange rates, while the position without its forward is a currency bet with a standard deviation of about $4.0 million. Now pay for the trade. Buying at the ask, selling at the bid, borrowing above and lending below mid turns the single CIP price into a no-arbitrage band:

Sbid1+iqlendτ1+ibborrowτ≤F≤Sask1+iqborrowτ1+iblendτS^{\text{bid}}\,\frac{1 + i_q^{\text{lend}}\,\tau}{1 + i_b^{\text{borrow}}\,\tau} \;\le\; F \;\le\; S^{\text{ask}}\,\frac{1 + i_q^{\text{borrow}}\,\tau}{1 + i_b^{\text{lend}}\,\tau}
Who runs the loop (illustrative costs)Spot / points half-spreadBorrow $ above / lend € below midBalance-sheet chargeTop of the band, pips above CIPP&L after costs, 3 months
Bank desk0.10 / 0.10 pip2 / 2 bp30 bp a year9.5−$15,597
Fund, via a prime broker0.25 / 0.25 pip25 / 10 bp—9.9−$22,446
Individual, via a broker1.00 / 1.00 pip300 / 150 bp—125.8−$1,105,861

The loop pays only if the forward's bid clears the top of your band (fig 2.5.3). (In practice the loop is done as one FX swap, which pays only the forward-points spread; the lab charges the spot spread twice, which slightly overstates costs without changing who profits.) Look at the bank: its spreads alone would put the top of its band only 1.2 pips above CIP, and after spreads the trade still earns $61,070 — then the balance-sheet charge of $76,667 takes it negative. The balance sheet is the cost — DTV's argument in miniature: the institutions best placed to close the gap find it costs about as much as it pays, most of all across quarter-ends. It is the textbook case of limits to arbitrage, which Session 7.1 develops.

ONE PRICE BECOMES A BAND — each trader's costs widen CIP into a no-arbitrage zone (not to scale) INDIVIDUAL retail spreads and rates FUND prime-broker spreads and rates BANK DESK green: spreads · dashed: + balance sheet CIP price at mid rates market forward: inside every band forward price F → A deviation is an arbitrage only for a trader whose band it escapes.
fig 2.5.3 — the no-arbitrage band: costs turn CIP's single price into a zone that differs by trader; for the bank most of the width is the balance-sheet charge (sketch, not to scale)
def no_arb_band(spot_mid: float, t: dict, i_q: float, i_b: float, tau: float) -> tuple[float, float]:
    """Lower and upper forward prices between which no covered loop is profitable for this trader."""
    s_bid = spot_mid - t["spot_half"] * PIP["EURUSD"]
    s_ask = spot_mid + t["spot_half"] * PIP["EURUSD"]
    bs = t["balance_sheet"]                                   # borrowing expands the balance sheet
    upper = s_ask * (1 + (i_q + t["borrow"] + bs) * tau) / (1 + (i_b - t["lend"]) * tau)
    lower = s_bid * (1 + (i_q - t["lend"]) * tau) / (1 + (i_b + t["borrow"] + bs) * tau)
    return lower, upper
⚠️ Pitfall — "the forward is off CIP, so there is free money"

A deviation is an arbitrage only for someone whose costs sit inside it. Price the loop at your bid, ask, borrowing and lending rates, add what your capital costs, and check the dates: DTV find that a one-month deviation widens exactly when the contract starts to span a quarter-end. The same holds for every "riskless" basis trade, including the crypto ones in Session 2.6.

2.5.4 FX carry: a first look

Borrow where money is cheap, hold where it pays: the trade collects the interest gap month after month — until the month the currency falls further than a year of carry.

FX carry is the interest differential you earn by holding a higher-rate currency funded in a lower-rate one. Under CIP the same position is a forward purchase of the high-rate currency at its forward discount, so the carry is the forward discount: the roll yield of Session 2.4 in FX clothing. If exchange rates moved to cancel the differential on average, as uncovered parity says, carry would earn nothing. That they do not is the forward premium puzzle of Session 11.5 — the "uncovered interest rate puzzle" that Brunnermeier, Nagel & Pedersen (2008) link to crash risk. The carry trade and its crash risk are Session 8.4's subject; this is a first look at the shape of its returns.

The lab simulates a stylised carry position — a 5% interest differential, exchange-rate volatility of 9% a year, and crashes of about −10% that arrive on average once every 5 years — over 10,000 paths of 20 years, next to a Gaussian twin with the same mean and volatility and no crashes. The returns are already excess returns (you borrow one currency to hold the other), so no risk-free rate is subtracted, and every statistic is asserted against its closed form at 4 standard errors (Monte Carlo, Session 3.5).

Monthly excess returnsCarry with crashesGaussian twin
Sharpe ratio (annualised)0.31 (theory 0.31)0.31
Skewness−0.74 (theory −0.73)0.00
Share of months worse than −3 sd (−8.5%)0.95% (theory 0.95%)0.13%
Median worst month in 20 years−13.2%−7.8%
MONTHS PER CENTURY WORSE THAN EACH LOSS: CARRY WITH CRASHES VS ITS GAUSSIAN TWIN carry with crashes Gaussian twin 0.0 20.0 40.0 60.0 80.0 100.0 worse than −4% · carry with crashes: 68.2 68.2 worse than −4% · Gaussian twin: 86.4 86.4 worse than −4% worse than −8% · carry with crashes: 12.5 12.5 worse than −8% · Gaussian twin: 2.8 2.8 worse than −8% worse than −12% · carry with crashes: 5.2 5.2 worse than −12% · Gaussian twin: 0.0 0.0 worse than −12% worse than −16% · carry with crashes: 1.1 1.1 worse than −16% · Gaussian twin: 0.0 0.0 worse than −16%
fig 2.5.4 — months per century worse than each loss: mild losing months are no more common with crashes (68 against the twin's 86 worse than −4%), but months worse than −12% arrive 5.2 times a century against 0.02

Same Sharpe ratio, very different danger: the crash model has fewer mildly bad months than its twin and far more severe ones (fig 2.5.4) — a difference that volatility and the Sharpe ratio cannot see but skewness (Session 3.2) can. A short track record hides it. A window of YY years contains no crash with probability e−λYe^{-\lambda Y}, where λ\lambda is the crash rate (a rate here, not Kyle's lambda). For YY = 5 that is 36.8% (simulated: 36.5%), and in those calm windows the Sharpe ratio is 0.56 (theory 0.55), nearly double the true 0.31.

⚠️ Pitfall — "the currency pays more interest, so I earn the difference"

The interest is certain; the exchange rate is not, and its losses arrive in lumps. Judge carry by its skewness and worst months rather than a calm-window Sharpe ratio, and size it for the crash you have not yet seen (leverage, Session 2.3). Session 8.4 returns to carry and its crash risk across asset classes.

2.5.5 Storage & convenience yield

A barrel of oil pays no interest and costs money to keep. So why does anyone hold one when a futures contract would do — and why does the answer bend the whole curve?

Commodities trade in two linked markets: a physical one that moves actual barrels, bushels and cargoes, where grade, location and delivery window matter, and a financial one of standardised futures and swaps, mostly closed or rolled before delivery. Delivery ties the two together — an expiring contract must converge to the physical price at its delivery point (Session 2.4) — and storage ties today's physical to every later contract.

The first link is the storage cost: tank or warehouse rent, insurance and losses, written uu as a fraction of spot per year or UU in dollars per unit per year. It caps contango: if a later contract traded above full carry, you would buy spot, store it and deliver — the cash-and-carry of Session 2.4 — so

F≤Se(rf+u)τF \le S\,e^{(r_f + u)\tau}

The second link is the convenience yield yy: the benefit of holding the physical rather than a claim on it — a refinery that does not stop, a surprise order you can fill, a shortage you are not caught in. Nobody pays it in cash; you read it off prices:

y=rf+u−1τln⁡FSy = r_f + u - \frac{1}{\tau}\,\ln\frac{F}{S}
WHY HOLD THE PHYSICAL? — costs against the convenience of having it COSTS OF HOLDING financing r_f cash tied up in the barrel storage u tanks, insurance, losses BENEFIT OF HOLDING convenience yield y keep the plant running, fill a surprise order, never be caught short net carry c = r_f + u − y c > 0 · CONTANGO ample stocks; capped at full carry (buy spot, store, sell forward) c < 0 · BACKWARDATION scarce stocks; no floor: nobody lends you a barrel to sell THE WORKING CURVE price of storage (later − nearer) against inventories 0 full carry r_f + u contango, capped backwardation, no floor inventories → Storage caps how steep contango can get; nothing caps backwardation.
fig 2.5.5 — storage cost against convenience yield: their balance sets the sign of net carry, and Working's curve shows why contango has a ceiling and backwardation has no floor

This is the theory of storage. Kaldor (1939) introduced the convenience yield. Working (1949) turned it into a "price of storage": when stocks are ample, the later contract sits above the nearer one by about the cost of storage; when they are scarce, the spread goes negative. Brennan (1958) cast it as a supply of storage: firms hold inventory until the spread between later and earlier prices equals the marginal cost of storage net of the convenience yield, plus a risk premium. So the price of storage traces a curve against inventories, capped above at full carry and unbounded below, because reversing cash-and-carry needs someone to lend you a scarce barrel to sell. The evidence fits: Fama & French (1987) find the basis varies with interest rates and with seasonals in convenience yields, and Gorton, Hayashi & Rouwenhorst (2013), using 31 commodity futures from 1971 to 2010, find the convenience yield is a decreasing, nonlinear function of inventories.

The lab turns that finding into a model: convenience yield falls exponentially with inventory II (1 = normal), y(I)=ymax⁡e−I/I0y(I) = y_{\max}\,e^{-I/I_0}, and inventories are expected to drift back to normal with a half-life of 0.75 years. Financing is 4% and storage 5%, the same as the crude-oil rows of Session 2.4, so full carry is 9%. Each futures price integrates the net carry along the expected inventory path, F(τ)=Sexp⁡(∫0τ[rf+u−y(Is)]ds)F(\tau) = S\exp\!\big(\int_0^\tau [\,r_f + u - y(I_s)\,]\,ds\big):

def convenience_yield(inv: float) -> float:
    """Convenience yield per year as a function of inventory relative to normal (Working-curve shape)."""
    return Y_MAX * np.exp(-inv / I_SCALE)
  • Glut (inventories 1.8× normal): yy = 0.4%, and the front of the curve rises at +8.6% a year — nearly full carry.
  • Normal: yy = 3.4%; a steady contango of +5.6% a year.
  • Scarce (0.3× normal): yy = 25.5%, and the front falls at −14.6% a year; the curve bottoms at month 10 and turns up as inventories are expected to recover.
STORAGE MODEL: FUTURES PREMIUM OVER SPOT BY MONTHS TO EXPIRY, THREE INVENTORY STATES full-carry ceiling glut normal scarce −10% 0% 10% 20% 30% 40% 0 10 20 30 full-carry ceiling full-carry ceiling: 31% glut glut: 24% normal normal: 18% scarce scarce: 3% ceiling: 31% glut: 24% normal: 18% scarce: 3%
fig 2.5.6 — the storage model's futures curves (premium over spot by months to expiry): a glut hugs the full-carry ceiling, scarcity inverts the front and the curve recovers as inventories are expected to rebuild

The front inverts once inventories fall below about 0.66 of normal, where y=rf+uy = r_f + u (the one-month spread crosses zero at a slightly lower level, 0.65, because inventories recover a little within the month). Session 2.4's two crude examples, a 1% and a 21% convenience yield, are two points on this curve, at inventories of 1.43 and 0.37 of normal. Plot the front spread against inventory and you get Working's curve (fig 2.5.7).

PRICE OF STORAGE VS INVENTORY (1 = NORMAL): ANNUALISED 1-MONTH SPREAD, STORAGE MODEL −40% −30% −20% −10% 0% 10% 0.5 1 1.5 2 2.5 full carry (r_f + u) 1-month calendar spread
fig 2.5.7 — the price of storage against inventories in the storage model: it approaches full carry when stocks are ample and falls steeply as they run short (the model's exponential bounds it; the real curve has no floor)

Connect this to Session 2.4: a long front-month position's roll yield is minus the front spread, +14.6% a year when stocks are scarce and −8.6% in a glut. It becomes return only if spot does not move to meet the curve — and scarcity is exactly when spot is high and apt to fall. Gorton, Hayashi and Rouwenhorst find futures risk premiums vary with inventories, so inventory data matter to anyone trading commodity carry.

📌 Key idea — inventories set the slope

Ample stocks mean contango, capped at full carry by cash-and-carry; scarce stocks mean backwardation, with no floor because nobody lends the physical. A commodity futures curve is a picture of inventories.

2.5.6 Commodity curves: shapes & seasons

Every commodity's curve is the theory of storage run through its own physics: how cheaply it stores, how steadily it is produced and how seasonally it is used.

The commodity term structure is the curve of one commodity's futures prices across expiries. Its slope is net carry — financing plus storage minus convenience yield — so it inherits every physical fact about the commodity. Fig 2.5.8 sketches the families.

SHAPES BY STORABILITY — typical curves, sketched (price by months to expiry; dashed = spot; not data) PRECIOUS METALS gentle contango near full carry: stocks are huge next to use, and storage is cheap CRUDE OIL, BASE METALS flips with inventories: contango in a glut (orange), backwardation in a shortage (green) NATURAL GAS winter humps: storage caps the climb into winter, not the fall after it GRAINS (CORN, WHEAT) carry within a crop year, then a drop at the new-crop harvest POWER & LIVESTOCK barely storable: each contract is its own forecast, with no carry link to spot The cheaper and steadier the storage, the closer the curve sits to full carry.
fig 2.5.8 — typical term-structure shapes by commodity family, sketched: storability decides how tightly cash-and-carry ties the curve to spot
FamilyStorable?Typical curveWhy
Precious metalscheaply, for yearsclose to full carrylarge stocks relative to use make shortages rare, so the convenience yield stays small
Crude oil, base metalsyes, at a real costswitches between contango and backwardationinventories swing between glut and shortage (§2.5.5)
Natural gasyes, but capacity is limited and costlyseasonal, with a winter premiumburned mostly in winter, produced all year
Grainswithin a crop yearcarry within a season, a break at the new harvestsupply arrives once a year
Electricity, livestockpower barely; animals not for longeach expiry priced on its ownno cash-and-carry link between dates

Seasonality: a natural-gas-style curve

Natural gas is the cleanest case of seasonality. In the US it is injected into storage from April to October and withdrawn from November to March (EIA 2026), so winter delivery trades at a premium. The lab builds a stylised curve: a deseasonalised level of $3.50/MMBtu, a smooth carry of 2% a year and a seasonal swing of 7% either way, peaking in January. January delivery comes out at $3.81 and July at $3.28.

A NATURAL-GAS-STYLE FUTURES CURVE ($/MMBTU) BY MONTHS TO DELIVERY; FRONT = MAY no seasonality futures curve winter winter winter $3.20 $3.40 $3.60 $3.80 $4.00 10 20 30 no seasonality futures curve futures curve: $3.72 curve: $3.72
fig 2.5.9 — a stylised natural-gas curve: winter deliveries (shaded) sit above the smooth carry line, summer deliveries below it

Storage limits how fast such a curve may rise. Buy the month-ii contract, take delivery, store the gas and deliver it into month jj; with Δ=(j−i)/12\Delta = (j - i)/12 years and UU the dollar cost of storage per MMBtu per year,

Fj≤FierfΔ+UΔF_j \le F_i\,e^{r_f\Delta} + U\,\Delta

With storage at $1.80 per MMBtu a year (illustrative, including the rent on scarce capacity; paid at delivery here, where Session 2.4's (S0+U)erfτ(S_0 + U)e^{r_f\tau} prepays it) the lab's curve has 0 violations, and the bound allows a seasonal swing of up to 8.3%. Push past it and the first trade to become riskless is the steepest single step of the autumn climb — buying Oct gas to deliver into Nov — while the July-to-January spread ($0.53) stays well inside its own bound ($0.97). Nothing limits the fall after winter: you cannot store gas backwards in time. Real storage also has finite capacity and injection limits; when it is full, the marginal cost of storage is the price of scarce capacity, not the tank rent — the lesson of WTI on 20 April 2020 (Session 2.4).

def storage_violations(F: np.ndarray, r: float = GAS_RF, U: float = GAS_STORAGE) -> int:
    """Pairs (i < j) where buying month i, storing and delivering into month j is a riskless profit."""
    i, j = np.triu_indices(len(F), k=1)
    dt = (j - i) / 12
    return int(np.sum(F[j] > F[i] * np.exp(r * dt) + U * dt + 1e-12))

Now read the gas curve through the roll-yield lens of Session 2.4 and you get nonsense. Month by month, the annualised roll between neighbouring contracts swings from −44% to +40%. Over any twelve consecutive months the seasonal part cancels exactly, and the average is −2.0% a year: the roll yield of the smooth 2% contango. The lab asserts that identity for every twelve-month window.

⚠️ Pitfall — "gas is in steep contango, so a long position bleeds"

In October the December contract sits above November because winter is coming, not because the market is glutted or bearish. A seasonal contango is a calendar, not a carry signal: compare a contract with the same month a year later before reading carry into the slope. Session 8.4 returns to measuring carry across commodities.

2.5.7 Try it

Open the companion lab, predict before you run, and move one number at a time.

🔧 Try it (20 min, in the lab)

1. A bigger gap. In section 3 set DEVIATION_PIPS = 12.0. Predict from the band edges in the table (you sell at the forward's bid, below mid) which traders now profit.
2. Rarer, bigger crashes. In section 4 set CRASH_RATE = 0.10 and CRASH_MEAN, CRASH_SD = -0.20, 0.04. The expected crash loss per year barely changes; predict the skewness, the Sharpe ratio and the chance of a calm five-year window.
3. Too much seasonality. In section 6 set GAS_AMP = 0.10. How many storage-arbitrage violations appear — on the climb into winter, or the fall after it?
4. Slow recovery. In section 5 set HALF_LIFE = 2.0. The scarce curve bottoms at month 10 by default; where does it bottom now, and does the lab's analytic check agree?
Success: in step 1 the bank and the fund profit and the individual does not; in step 2 skewness grows much more negative while the Sharpe ratio barely moves, and the calm-window probability is e−λYe^{-\lambda Y}; in step 3 every violation is on a rising stretch; in step 4 the bottom moves out by more than a year.


2.5.8 Glossary · Check yourself · Go deeper

Currency pair — two currencies written BASE/QUOTE; the price is how many units of the quote currency one unit of the base costs.
Pip — the conventional smallest step of an exchange rate: 0.0001 for most pairs, 0.01 for yen pairs.
FX spot — an exchange of two currencies at an agreed rate, settled on the spot date: T+2 for most pairs, T+1 for USD/CAD.
FX forward — an agreement today to exchange two currencies at a fixed rate on a date beyond spot; priced by covered interest parity.
Forward points — the forward rate minus spot, F−SF - S, quoted in pips and added to spot; positive when the base currency has the lower interest rate.
Covered interest parity — the no-arbitrage rule F=S(1+iqτ)/(1+ibτ)F = S\,(1 + i_q\tau)/(1 + i_b\tau): a deposit in one currency and a hedged deposit in the other must pay the same.
Cross-currency basis — the spread xx added to the non-dollar interest rate that makes covered interest parity hold at market prices; negative when borrowing dollars through FX swaps costs more than in the cash market.
FX carry — the interest differential earned by holding a higher-rate currency funded in a lower-rate one; under CIP, the forward discount.
Convenience yield — the benefit of holding a physical commodity rather than a futures contract, inferred from prices as y=rf+u−ln⁡(F/S)/τy = r_f + u - \ln(F/S)/\tau.
Commodity term structure — one commodity's futures prices across expiries; its slope is net carry, set by inventories, storage and seasonality.
Storage cost — the cost of keeping a physical commodity (rent, insurance, losses) per unit per year; it caps contango at full carry.

Check yourself

1. A screen shows USD/JPY 150.00 / 150.02. You must sell 300,000,000 yen for dollars. Which side of the quote do you deal on, and what does crossing the spread cost you?
Selling yen means buying dollars, and the dollar is the base, so you pay the ask: you receive $1,999,733, about $133 less than at mid. The quote prices the base currency: read the pair first.
2. EUR/USD is 1.08505, the dollar rate 4% and the euro rate 2% (simple, ACT/360). A client wants a one-year forward and adds, "we expect the euro to weaken, so quote us lower". What do you quote?
The CIP forward, 1.10662 (+215.7 points). You hedge it by running the loop, so no forecast enters the price, and quoting lower hands the client a riskless profit. Whether forwards predict spot is uncovered parity (Session 11.5).
3. The 3-month EUR/USD forward trades 8 pips above CIP, a basis of −28.8 bp. You run a bank desk whose balance sheet costs 30 bp a year. Do you put the trade on?
No. After spreads the loop earns $61,070 on $100,000,000, but the balance-sheet charge is $76,667, so the desk ends at −$15,597; the top of its band is 9.5 pips. That is why the basis persists (DTV), and why it widens across quarter-ends.
4. A currency-carry fund shows 5 years with a Sharpe ratio of 0.56 and a maximum drawdown of −13%. What do you ask before you invest?
Whether the window contained a crash. In the lab 36.5% of five-year windows are crash-free, and they typically show those numbers while the true Sharpe ratio is 0.31 and the same paths' twenty-year maximum drawdown has a median of −28%. Ask for the skewness, the worst months and the record through known crashes such as October 1998.
5. Crude's one-month spread is −15%, annualised. Financing costs 4% and storage 5%. What is the implied convenience yield, and why can't cash-and-carry close the gap?
y=rf+u−ln⁡(F/S)/τy = r_f + u - \ln(F/S)/\tau = 4% + 5% + 15% = 24% a year: inventories are scarce. Closing a backwardation means running cash-and-carry in reverse — sell the physical now, buy it back forward — which needs someone to lend you a scarce barrel. Contango has a ceiling; backwardation has no floor.
6. In October the December gas contract trades well above November. A colleague says: "steep contango — longs bleed". What is wrong?
The slope is the calendar: December is winter gas. In the lab the month-to-month roll swings from −44% to +40% a year but averages exactly −2.0% over any twelve months — the roll yield of the smooth 2% contango. Compare a contract with the same month next year before reading carry.
🔧 Homework (~1 h before Session 2.6)

1. Find each trader's break-even. In section 3, bisect on DEVIATION_PIPS for the smallest deviation at which each tier profits. Show it equals the top of that tier's band plus the forward's two half-spreads, and explain why.
2. Same crash loss, different shapes. In section 4, keep CRASH_RATE × CRASH_MEAN at −2% a year and run (0.4, −0.05), (0.2, −0.10), (0.1, −0.20) and (0.05, −0.40). Tabulate skewness, Sharpe ratio, calm-window Sharpe and P(no crash in five years). Which looks best over five years, and which is most dangerous?
3. Imply a convenience yield from real prices. From the exchange's website take today's settlements for the front and twelfth crude-oil futures (WTI or Brent). With a current Treasury-bill yield as rfr_f and storage at 5% a year, compute yy and say which inventory state it suggests. Date every number.
4. Read sections I–II of Du, Tepper & Verdelhan (2018), or Borio et al. (2016) for a shorter tour. Session 2.6 meets perpetual futures, which never expire and are tied to spot by a funding rate instead of convergence; keep the CIP loop in mind.

📚 Go deeper

  1. Du, W., Tepper, A. & Verdelhan, A. (2018). "Deviations from Covered Interest Rate Parity." Journal of Finance 73(3), 915–957. Figures quoted here are from the working-paper version, NBER w23170 (February 2017). doi:10.1111/jofi.12620
  2. Borio, C., McCauley, R. N., McGuire, P. & Sushko, V. (2016). "Covered interest parity lost: understanding the cross-currency basis." BIS Quarterly Review, September 2016, pp. 45–64. https://www.bis.org/publ/qtrpdf/r_qt1609e.htm
  3. Brunnermeier, M. K., Nagel, S. & Pedersen, L. H. (2008). "Carry Trades and Currency Crashes." NBER Macroeconomics Annual 23, 313–347. doi:10.1086/593088
  4. Working, H. (1949). "The Theory of Price of Storage." American Economic Review 39(6), 1254–1262. https://www.jstor.org/stable/1816601
  5. Brennan, M. J. (1958). "The Supply of Storage." American Economic Review 48(1), 50–72. https://www.jstor.org/stable/1812340
  6. Gorton, G. B., Hayashi, F. & Rouwenhorst, K. G. (2013). "The Fundamentals of Commodity Futures Returns." Review of Finance 17(1), 35–105. doi:10.1093/rof/rfs019
  7. Geman, H. (2005). Commodities and Commodity Derivatives: Modeling and Pricing for Agriculturals, Metals and Energy. Wiley. ISBN 978-0-470-01218-5
  8. Hull, J. C. (2021). Options, Futures, and Other Derivatives, 11th ed., ch. 5 "Determination of forward and futures prices" (currencies; commodities, storage costs and convenience yields). Pearson. ISBN 978-0-13-693997-9

Sources for the numbers

  1. Kaldor, N. (1939). "Speculation and Economic Stability." Review of Economic Studies 7(1), 1–27. doi:10.2307/2967593
  2. Fama, E. F. & French, K. R. (1987). "Commodity Futures Prices: Some Evidence on Forecast Power, Premiums, and the Theory of Storage." Journal of Business 60(1), 55–73. doi:10.1086/296385
  3. Bank for International Settlements (2025). "Global FX trading hits $9.6 trillion per day in April 2025 …: Triennial Survey", 30 September 2025, and "OTC foreign exchange turnover in April 2025". https://www.bis.org/media-releases/20250930-global-fx-trading-hits-96-trillion-day-april-2025-and-otc-interest-rate-derivatives-surge-79 · https://www.bis.org/statistics/rpfx25_fx.htm
  4. SIFMA, CCMA & ISDA (2024). "T+1 Settlement Cycle Booklet" (FX spot convention T+2; CAD/USD T+1). https://www.isda.org/a/fFwgE/T1-Settlement-Cycle-Booklet.pdf
  5. CLS Group (2023). "FX settlement risk: to PvP or not to PvP?" ShapingFX series, 31 May 2023. https://www.cls-group.com/insights/the-fx-ecosystem/fx-ecosystem-02-fx-settlement-risk-to-pvp-or-not-to-pvp-shapingfx-series/
  6. European Central Bank (2007). "More than thirty years after the 'Herstatt' case, foreign exchange settlement risk is still an issue." Financial Stability Review, December 2007, Box 19. https://www.ecb.europa.eu/press/financial-stability-publications/fsr/focus/2007/pdf/ecb~ccda416def.fsrbox200712_19.pdf
  7. U.S. Energy Information Administration (2026). "Natural gas inventories at the end of winter heating season were near five-year average." Today in Energy, 21 April 2026. https://www.eia.gov/todayinenergy/detail.php?id=67524