Trading Dev AcademyFree quant education

Free lesson · Rates, credit & macro

Carry, forward prices, and macro surprises

Open interactive lessonPractice calculationsExplore labs

Start with the idea

Forward prices link spot, financing and distributions through an idealised replication argument. The difference between forward and spot can be a carry price even when no one expects spot to rise.

Symbols, units & horizon
  • F₀,T: forward delivery price at maturity T
  • S₀: current spot price
  • r: continuous financing rate
  • q: continuous holding yield
  • T: years
  • F_FX: FX forward in domestic currency per foreign unit
  • r_d,r_f: domestic and foreign continuous rates
  • r_nominal,r_real: effective nominal and real rates
  • π: inflation rate over the same period, not profit here

When and why to use this

Use carry relations to compare cash and derivative positions, understand basis trades and distinguish financing effects from an outright directional forecast.

F0,T=S0e(r−q)T,FFX=S0e(rd−rf)T
Algebra and arithmetic

Replicate forward delivery with funded spot

  1. For an equity index with continuous yield q, reinvest distributions so a prepaid claim to one unit at T costs S0e−qT. Finance that amount at r to obtain delivery cost S0e(r−q)T.
  2. For FX quoted domestic per foreign, the foreign asset earns r_f while domestic funding costs r_d. Replace q with r_f and r with r_d. Solve for a rate difference using rd−rf=ln⁡(FS)T.
Work it by hand

S=100,r=.05,q=.02,T=.5 gives forward≈101.5113. It is a carry-consistent delivery price, not a forecast.

For an equity index, r is funding and q is continuous dividend yield. For FX quoted in domestic currency per unit of foreign currency, r_d and r_f are the two funding rates. These are idealised no-arbitrage forward relations with consistent compounding, not predictions of the future spot price.

Commodity carry also includes storage and convenience yield. Futures roll return, collateral income, and spot return are different components. An upward-sloping curve is not automatically a forecast of rising prices or a profitable short.

1+rnominal=(1+rreal)(1+π)
Algebra and arithmetic

Separate nominal growth from inflation

  1. Nominal wealth grows by 1+rnom while the price level grows by 1+π. Real purchasing power factor is (1+rnom)(1+π).
  2. Set this equal to 1+rreal and cross-multiply. Solving gives rreal=(1+rnom)(1+π)−1. The subtraction approximation rnom−π omits the product term.
Work it by hand

Nominal 8%, inflation 3% → real return=1.08/1.03−1≈4.8544%, not exactly 5%.

The exact ex-post Fisher identity separates nominal return, real return, and realised inflation π. Expectations and premia matter for ex-ante rates. Markets respond to surprises relative to what was priced, not merely to whether the published growth or inflation number is high.

Further reading: CME Group: futures fair value, with a simple-interest convention ↗

Research sources, review dates and limitations

Extend the research question

Compare Treasury basis, swap spreads and curve positions. A shared duration exposure does not imply the same settlement, funding or convergence mechanism.

Continue with the connected research module →

Connect the ideas: Sensitivity and approximation

Retrieve: A local sensitivity describes how a model responds near a specified input.

Check the change: The input, its units and what is held fixed differ across slope, duration and option sensitivities.

Differential calculus → Partial derivatives → Stochastic calc → Options → Volatility

Explain it yourself: What must you check before using a small-move approximation for a large scenario?

Self-assessed. Write your explanation before opening this comparison.

Check the expansion point, units, held-fixed inputs, curvature and model domain; compare with a full repricing under the same scenario.

Python implementation

Self-contained teaching example. Python 3.10+; dependencies and input conventions are shown in the code and notation. Run in your own Python environment.

from math import exp

def forward_price(spot, financing_rate, holding_yield, years):
    return spot*exp((financing_rate-holding_yield)*years)

def fx_forward(spot_domestic_per_foreign, domestic_rate, foreign_rate, years):
    return spot_domestic_per_foreign*exp((domestic_rate-foreign_rate)*years)

def real_rate(nominal_rate, inflation):
    if inflation <= -1:
        raise ValueError("Inflation must exceed -100%")
    return (1+nominal_rate)/(1+inflation)-1

print(forward_price(100,.05,.02,1), real_rate(.06,.03))

Continue learning

Rates, Credit & Macro — all lessons
  1. Price a bond from its cash flows
  2. Duration, convexity, and curve hedges
  3. Credit spreads compensate more than expected default
  4. Carry, forward prices, and macro surprises

Quantitative finance and development glossary · Python resources and libraries · Research sources and limitations