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.
Replicate forward delivery with funded spot
- For an equity index with continuous yield q, reinvest distributions so a prepaid claim to one unit at T costs . Finance that amount at r to obtain delivery cost .
- 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 .
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.
Separate nominal growth from inflation
- Nominal wealth grows by 1+rnom while the price level grows by 1+π. Real purchasing power factor is .
- Set this equal to 1+rreal and cross-multiply. Solving gives . The subtraction approximation rnom−π omits the product term.
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
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.Explain it yourself: What must you check before using a small-move approximation for a large 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- Price a bond from its cash flows
- Duration, convexity, and curve hedges
- Credit spreads compensate more than expected default
- Carry, forward prices, and macro surprises
Quantitative finance and development glossary · Python resources and libraries · Research sources and limitations