Forward and Futures Pricing and Hedging › Cost-of-Carry Pricing

Michael BrenndoerferNovember 14, 202513 min read
Quantitative FinanceAll chapters
Part 3 of 15Forwards, Futures, and Options
Chapter 15Forward and Futures Pricing and Hedging › Cost-of-Carry Pricing
Reading section 3 of 11 · Cost-of-Carry Pricing · 13 minSection 3 of 11 · 13 min

Book contents

Section 3 of 11 · 13 min read

Forward and Futures Pricing and Hedging › Cost-of-Carry PricingOne section · Sections in this chapter3 / 11 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

The forward price is determined by a no-arbitrage argument based on the cost of carrying the underlying asset until the delivery date. The core insight is deceptively simple: there are two ways to obtain an asset at a future date. You can either buy it forward, committing today to purchase at a predetermined price when you need it, or you can buy it today in the spot market and store it until you need it. Since both approaches deliver the same outcome, namely possession of the asset at the future date, they must cost the same in present value terms. If they didn't, you could profit risklessly by buying the cheaper approach and selling the more expensive one.

The Fundamental Pricing Equation

Consider an asset with current spot price S0S_0 and a forward contract expiring at time TT (measured in years). If the continuously compounded risk-free interest rate is rr, the forward price must satisfy:

F0=S0erTF_0 = S_0 e^{rT}

where:

  • F0F_0: forward price
  • S0S_0: current spot price
  • rr: continuously compounded risk-free interest rate
  • TT: time to expiration in years

This elegant formula states that the forward price equals the spot price grown at the risk-free rate for the time until delivery. The intuition is straightforward: if you choose to buy the asset today rather than forward, you must finance that purchase. The cost of that financing, accumulated over the contract period, is exactly what makes the two approaches equivalent.

Cost of Carry

The cost of carry represents all costs and benefits associated with holding an asset over time. For financial assets, this includes financing costs (interest paid to fund the position), minus any income received (dividends, coupons). For physical commodities, it also includes storage costs and may be offset by convenience yield, which is the benefit of having physical possession.

To understand why this formula holds, and why it must hold in a well-functioning market, consider what happens if the forward price deviates from this value. Any deviation creates an arbitrage opportunity, which market participants will exploit until prices realign. Let us examine both cases.

Arbitrage: Cash-and-Carry

Suppose the forward price is too high: F0>S0erTF_0 > S_0 e^{rT}. You can lock in a riskless profit through the following cash-and-carry strategy. The name reflects the mechanics: you use cash to buy the asset and carry it until delivery.

  1. Borrow S0S_0 at the risk-free rate rr
  2. Buy the asset in the spot market for S0S_0
  3. Enter a short forward contract to sell at F0F_0 at time TT

At expiration, we unwind all positions:

  • Deliver the asset under the forward contract, receiving F0F_0
  • Repay the loan: S0erTS_0 e^{rT}
  • Profit: F0−S0erT>0F_0 - S_0 e^{rT} > 0

This profit is guaranteed regardless of where the spot price ends up at expiration. You hold the physical asset, so there is no market risk; delivery is simply a matter of handing over what you already own. The profit requires zero initial investment because the borrowed funds exactly cover the spot purchase. This is the definition of arbitrage: riskless profit with no capital at risk.

Such opportunities cannot persist in competitive markets. Arbitrageurs would flood the market with this trade, selling forwards (pushing forward prices down) and buying spot (pushing spot prices up), until the price discrepancy disappears. The market quickly converges to F0=S0erTF_0 = S_0 e^{rT}.

Arbitrage: Reverse Cash-and-Carry

Conversely, if F0<S0erTF_0 < S_0 e^{rT}, the reverse cash-and-carry strategy yields arbitrage profits. The logic is symmetric but the positions are reversed.

  1. Short-sell the asset, receiving S0S_0
  2. Invest S0S_0 at the risk-free rate rr
  3. Enter a long forward contract to buy at F0F_0 at time TT

At expiration:

  • Receive S0erTS_0 e^{rT} from the investment
  • Pay F0F_0 under the forward, receive the asset
  • Return the asset to close the short position
  • Profit: S0erT−F0>0S_0 e^{rT} - F_0 > 0

Again, this is riskless profit with no initial investment. The forward contract guarantees you can acquire the asset at F0F_0 to close the short, eliminating any market risk. Arbitrageurs executing this strategy would buy forwards (pushing forward prices up) and sell spot (pushing spot prices down), eliminating the discrepancy.

The forward price is squeezed between these two arbitrage bounds, leaving only F0=S0erTF_0 = S_0 e^{rT} as the equilibrium. Any other price invites profitable trading that moves the market toward this value.

Out[5]:
Visualization
Line chart showing fair forward price with upper and lower arbitrage bounds across different maturities.
No-arbitrage bounds on forward prices accounting for transaction costs. The fair forward price (blue) sits exactly between the cash-and-carry upper bound (red) and reverse cash-and-carry lower bound (green). Prices within the shaded grey region cannot be arbitraged profitably due to transaction costs.

Pricing Assets with Income

Many assets generate income while you hold them. Stocks pay dividends, bonds pay coupons, and foreign currencies earn interest in their home country. This income reduces the cost of carry because the holder benefits from owning the asset. As a forward buyer, you do not receive the asset until expiration. Because you forgo this income, you pay a lower forward price to compensate.

Discrete dividend case:

If the underlying pays a known cash dividend DD at time tD<Tt_D < T, the forward price becomes:

F0=(S0−De−rtD)erTF_0 = (S_0 - D e^{-r t_D}) e^{rT}

where:

  • F0F_0: forward price
  • S0S_0: current spot price
  • DD: cash dividend amount
  • tDt_D: time until the dividend payment (in years)
  • rr: risk-free interest rate
  • TT: time to expiration
  • e−rtDe^{-r t_D}: discount factor

The term De−rtDD e^{-r t_D} is the present value of the dividend. You subtract it from the spot price because you don't receive this dividend; only the current holder does. Think of it this way: if you buy the asset today, you get both the asset at expiration and the dividend along the way. If you buy forward, you only get the asset at expiration. The forward price must be lower to account for this missing benefit, and the reduction equals exactly the present value of what you forgo.

Continuous dividend yield:

For assets like equity indices where dividends are paid frequently by many constituents, it's convenient to model dividends as a continuous yield qq. Rather than tracking hundreds of discrete payments, we approximate the aggregate dividend stream as a constant percentage of the index value paid continuously over time:

F0=S0e(r−q)TF_0 = S_0 e^{(r-q)T}

where:

  • F0F_0: forward price
  • S0S_0: current spot price
  • rr: risk-free interest rate
  • qq: continuous dividend yield (annualized)
  • TT: time to expiration

The dividend yield qq reduces the forward price because the spot holder earns income that you forgo. The formula has an elegant interpretation: the "net" cost of carry is r−qr - q, representing financing costs minus income received. When dividends are high relative to interest rates, this net cost can be small or even negative. The following function implements the general cost-of-carry model:

In[6]:
Code
def forward_price(spot, rate, time, div_yield=0, storage_cost=0):
    """
    Calculate forward price under cost-of-carry model.

    Parameters:
    - spot: Current spot price
    - rate: Continuously compounded risk-free rate (annualized)
    - time: Time to expiration in years
    - div_yield: Continuous dividend yield (annualized)
    - storage_cost: Continuous storage cost rate (annualized)
    """
    return spot * np.exp((rate - div_yield + storage_cost) * time)


# Example: S&P 500 index forward
spot_price = 5000
risk_free_rate = 0.05  # 5% annual rate
dividend_yield = 0.015  # 1.5% dividend yield
time_to_expiry = 0.5  # 6 months

index_forward = forward_price(
    spot_price, risk_free_rate, time_to_expiry, dividend_yield
)
Out[7]:
Console
S&P 500 Index Forward Pricing
========================================
Spot price:        $5,000.00
Risk-free rate:    5.0%
Dividend yield:    1.5%
Time to expiry:    0.5 years
Forward price:     $5,088.27
Forward premium:   $88.27

The forward trades at a premium to spot because the interest cost of carrying the position (r×T=2.5%r \times T = 2.5\%) exceeds the dividend income (q×T=0.75%q \times T = 0.75\%). This net cost of carry is reflected in the forward price. In market terminology, we say the forward is trading at a premium or that the curve is in contango.

Out[9]:
Visualization
Waterfall chart showing how spot price, financing costs, and dividends combine to determine forward price.
Decomposition of the S&P 500 forward price into its constituent drivers. Starting from the spot price of 5,000 dollars, financing costs add value while dividend income subtracts value, resulting in a forward price of approximately 5,088 dollars. This waterfall chart illustrates how the net cost of carry determines the forward premium.

Commodity Forwards and Storage Costs

Physical commodities introduce additional complexity beyond what we encounter with financial assets. Unlike stocks or currencies, commodities incur real storage costs: warehousing, insurance, and potential spoilage. A barrel of oil doesn't sit for free; it requires tanks, security, and protection from the elements. Gold must be vaulted and insured against theft. Agricultural commodities may deteriorate over time or require climate-controlled storage. These costs increase the forward price because you must cover them:

F0=S0e(r+u)TF_0 = S_0 e^{(r + u)T}

where:

  • F0F_0: forward price
  • S0S_0: current spot price
  • rr: risk-free interest rate
  • uu: continuous storage cost rate (annualized)
  • TT: time to expiration

However, commodities also exhibit a phenomenon rarely seen in financial assets: convenience yield. Holding physical inventory can be valuable during supply disruptions or production bottlenecks. A manufacturer might pay a premium for immediate access to raw materials rather than waiting for a forward delivery. A refinery that runs out of crude oil must shut down production, incurring massive costs. The option to avoid such disruptions has real economic value.

Convenience Yield

Convenience yield represents the non-monetary benefits of holding physical inventory. It arises from the option value of having the commodity available for immediate use or sale during supply shortages. Convenience yield is typically unobservable directly and is inferred from observed forward prices.

Including convenience yield yy, the pricing formula becomes:

F0=S0e(r+u−y)TF_0 = S_0 e^{(r + u - y)T}

where:

  • F0F_0: forward price
  • S0S_0: current spot price
  • rr: risk-free interest rate
  • uu: continuous storage cost rate
  • yy: continuous convenience yield
  • TT: time to expiration

When convenience yield is high, typically during supply disruptions or low inventory periods, forward prices can fall below spot prices. This condition is called backwardation, which reflects that the market "backs" into lower future prices because immediate possession is so useful. When forward prices exceed spot prices (the normal case for non-yielding assets), the market is in contango. Understanding these term structure shapes is needed for commodity traders and hedgers, as they affect rolling strategies and storage economics.

In[10]:
Code
import numpy as np

# Compare term structures: contango vs backwardation
maturities = np.array([0.25, 0.5, 1.0, 1.5, 2.0])  # Years
spot = 100

# Contango: gold (storage cost dominates, no convenience yield)
gold_forwards = forward_price(
    spot, rate=0.05, time=maturities, storage_cost=0.005
)

# Backwardation: crude oil with high convenience yield
oil_forwards = forward_price(
    spot, rate=0.05, time=maturities, storage_cost=0.02, div_yield=0.08
)
Out[11]:
Visualization
Line chart comparing two forward curves, one in contango rising over time and one in backwardation falling.
Forward term structures for gold and crude oil contrasting contango and backwardation. The gold curve (blue) slopes upward in contango due to storage and financing costs, while the oil curve (red) slopes downward in backwardation, which reflects a high convenience yield that exceeds the cost of carry.