Foreign Exchange Markets and Currency Forwards › Interest Rate Parity

Michael BrenndoerferNovember 14, 202513 min read
Quantitative FinanceAll chapters
Part 3 of 15Forwards, Futures, and Options
Chapter 17Foreign Exchange Markets and Currency Forwards › Interest Rate Parity
Reading section 5 of 12 · Interest Rate Parity · 13 minSection 5 of 12 · 13 min

Book contents

Section 5 of 12 · 13 min read

Foreign Exchange Markets and Currency Forwards › Interest Rate ParityOne section · Sections in this chapter5 / 12 ↓
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

Interest rate parity (IRP) is the fundamental relationship connecting spot exchange rates, forward exchange rates, and interest rates across countries. It explains why currencies with higher interest rates tend to trade at forward discounts. Understanding this relationship is essential because it reveals why forward rates are not forecasts of future spot rates but rather mathematical consequences of interest rate differentials.

The No-Arbitrage Argument

A simple thought experiment explains interest rate parity. Consider a situation where you have $1 to invest for a period TT (in years). You have two strategies available, each starting with the same capital and ending at the same future date. For markets to be in equilibrium, both strategies must produce identical returns, otherwise arbitrage would be possible.

Strategy A: Invest domestically

  • Invest in a US dollar deposit earning rdr_d (domestic rate)
  • After period TT: 1×(1+rd×T)1 \times (1 + r_d \times T) dollars

This is the straightforward approach. You keep your money in dollars and earn the US interest rate.

Strategy B: Invest abroad

  • Convert dollars to euros at spot rate SS (USD per EUR, so you get 1/S1/S euros)
  • Invest in a euro deposit earning rfr_f (foreign rate)
  • Lock in a forward contract to convert back to dollars at forward rate FF
  • After period TT: (1/S)×(1+rf×T)×F(1/S) \times (1 + r_f \times T) \times F dollars

This alternative path requires more steps but involves no exchange rate risk because the forward contract locks in the conversion rate for the return journey.

For no arbitrage, both strategies must yield the same return. If they didn't, investors would pile into the superior strategy, driving rates until equality was restored. By equating the returns and solving for FF, we derive the fundamental pricing relationship:

1+rd×T=1S×(1+rf×T)×F(equate returns)F=S×1+rd×T1+rf×T(solve for F)\begin{aligned} 1 + r_d \times T &= \frac{1}{S} \times (1 + r_f \times T) \times F && \text{(equate returns)} \\ F &= S \times \frac{1 + r_d \times T}{1 + r_f \times T} && \text{(solve for F)} \end{aligned}
  • FF: forward exchange rate
  • SS: spot exchange rate (domestic per foreign)
  • rdr_d: domestic interest rate
  • rfr_f: foreign interest rate
  • TT: time to maturity in years

This is the covered interest rate parity (CIP) condition. The word "covered" refers to the fact that exchange rate risk is eliminated (covered) by the forward contract.

Covered Interest Rate Parity

Covered interest rate parity states that the forward exchange rate must equal the spot rate adjusted for the interest rate differential between two currencies. When the forward is locked in, exchange rate risk is "covered," hence the name.

Forward Premium and Discount

The relationship between spot and forward rates is expressed as:

F=S×1+rd×T1+rf×TF = S \times \frac{1 + r_d \times T}{1 + r_f \times T}

where:

  • FF: forward exchange rate
  • SS: spot exchange rate
  • rdr_d: domestic interest rate
  • rfr_f: foreign interest rate
  • TT: time to maturity in years

This formula has important implications for understanding currency markets. When rd>rfr_d > r_f, the forward rate F>SF > S, meaning the foreign currency trades at a forward premium (it will be worth more in terms of domestic currency in the forward market than spot). Intuitively, this makes sense: if you can earn more interest in the domestic currency, the market compensates by making the foreign currency relatively more valuable in forward transactions.

Conversely, when rd<rfr_d < r_f, the forward rate F<SF < S, meaning the foreign currency trades at a forward discount. The higher foreign interest rate is offset by expected currency depreciation embedded in the forward rate.

The forward premium or discount can be annualized to express it as a comparable rate:

Forward Premium (annualized)=F−SS×360D\text{Forward Premium (annualized)} = \frac{F - S}{S} \times \frac{360}{D}

where:

  • FF: forward exchange rate
  • SS: spot exchange rate
  • DD: number of days to forward settlement
  • F−SS\frac{F - S}{S}: the percentage return (yield) locked in by the forward contract
  • 360D\frac{360}{D}: scaling factor to convert the period return to an annualized rate

The annualization allows comparison across different tenor forwards and against interest rate differentials.

In[11]:
Code
def forward_rate_cip(spot, r_domestic, r_foreign, T_years):
    """
    Calculate forward exchange rate using covered interest rate parity.

    Parameters:
    -----------
    spot : float
        Spot exchange rate (domestic per foreign)
    r_domestic : float
        Domestic interest rate (annualized, simple)
    r_foreign : float
        Foreign interest rate (annualized, simple)
    T_years : float
        Time to forward settlement in years

    Returns:
    --------
    forward : float
        Forward exchange rate
    """
    forward = spot * (1 + r_domestic * T_years) / (1 + r_foreign * T_years)
    return forward


def forward_premium_annualized(spot, forward, T_days):
    """Calculate annualized forward premium/discount."""
    return (forward - spot) / spot * (360 / T_days)


# Define market parameters
spot_eurusd = 1.0850
r_usd = 0.0525
r_eur = 0.0400

# Calculate 3-month forward (90 days)
T_3m = 0.25
forward_3m = forward_rate_cip(spot_eurusd, r_usd, r_eur, T_3m)
premium_3m = forward_premium_annualized(spot_eurusd, forward_3m, 90)

# Calculate 1-year forward (360 days)
T_1y = 1.0
forward_1y = forward_rate_cip(spot_eurusd, r_usd, r_eur, T_1y)
premium_1y = forward_premium_annualized(spot_eurusd, forward_1y, 360)

# Convert to percentages for display
r_usd_pct = r_usd * 100
r_eur_pct = r_eur * 100
premium_3m_pct = premium_3m * 100
premium_1y_pct = premium_1y * 100
Out[12]:
Console
EUR/USD Forward Rate Calculation
=============================================
Spot rate:           1.0850 USD/EUR
US interest rate:    5.25%
EUR interest rate:   4.00%

3-month forward:     1.0884 USD/EUR
  Premium (annual):  1.24%

1-year forward:      1.0980 USD/EUR
  Premium (annual):  1.20%

Since US rates exceed eurozone rates, the euro trades at a forward premium; it costs more dollars to buy euros forward than spot. This makes intuitive sense: if you can earn more investing in dollars, the forward rate compensates by making the euro relatively more expensive in the future. The market is essentially saying that earning the higher US rate is exactly offset by paying more for euros when the forward matures.

Out[13]:
Visualization
Line chart of EUR/USD forward rates from 1 to 24 months showing an upward sloping forward curve above the spot rate.
Forward exchange rates for EUR/USD across maturities. The upward sloping curve indicates a forward premium, driven by the positive interest rate differential between the US and the Eurozone.
Line chart of EUR/USD forward points from 1 to 24 months showing a linearly increasing forward premium in pips.
Forward points for EUR/USD across maturities. The points increase linearly with time, representing the cumulative cost of carry embedded in the forward contracts.

Forward Points

In practice, forward rates are often quoted as "forward points," the difference between the forward rate and spot rate, multiplied by 10,000 (for most pairs) or 100 (for JPY pairs). This convention exists because forward points change more frequently than spot rates and allow dealers to quote forward adjustments without constantly updating full prices.

In[14]:
Code
# Forward points calculation
spot = spot_eurusd
# forward_3m is available from previous block

# Forward points (typically quoted in pips × 10)
forward_points = (forward_3m - spot) * 10000
check_val = spot + forward_points / 10000
Out[15]:
Console
Spot:           1.0850
3M Forward:     1.0884
Forward points: 33.6
Forward = Spot + Points/10000 = 1.0850 + 33.6/10000 = 1.0884

The calculated value of {python} f'{forward_points:+.1f}' points means the 3-month forward rate is approximately {python} f'{forward_points:.0f}' pips (or points) above the spot rate. Positive forward points indicate a forward premium on the base currency, while negative points indicate a forward discount.

Out[16]:
Visualization
Scatter plot with a linear trend line showing that forward premium rises proportionally with the interest rate differential (domestic minus foreign), with a highlighted EUR/USD data point and shaded regions for premium and discount zones.
Relationship between interest rate differentials and forward premiums. The linear correlation demonstrates interest rate parity: as the domestic interest rate exceeds the foreign rate (positive differential), the foreign currency trades at a forward premium to offset the lower foreign yield.

Covered Interest Arbitrage

When CIP is violated, arbitrage opportunities arise. The arbitrage mechanism ensures CIP holds in well-functioning markets. Constructing this arbitrage shows how trading pressure restores the interest rate parity relationship.

Suppose the forward rate is "too high" relative to CIP (i.e., the euro is overpriced in the forward market). You can exploit this mispricing through the following sequence of transactions:

  1. Borrow dollars at rUSDr_{USD}
  2. Convert to euros at spot rate SS
  3. Invest euros at rEURr_{EUR}
  4. Sell euros forward at the (overpriced) rate FF
  5. At maturity: receive euros, convert to dollars, repay dollar loan
  6. Pocket the risk-free profit

This arbitrage is "covered" because the forward contract eliminates exchange rate risk. You know exactly how many dollars you will receive when you convert your euro proceeds at maturity.

In[17]:
Code
def covered_interest_arbitrage(
    spot, forward_market, r_domestic, r_foreign, T_years, notional=1_000_000
):
    """
    Calculate arbitrage profit when forward rate deviates from CIP.

    Returns profit (if positive) or indicates no arbitrage (if negative).
    """
    # Fair forward rate from CIP
    forward_fair = spot * (1 + r_domestic * T_years) / (1 + r_foreign * T_years)

    # If market forward > fair forward, foreign currency overpriced in forward
    # Strategy: Borrow domestic, invest foreign, sell foreign forward
    if forward_market > forward_fair:
        # Borrow domestic currency
        domestic_borrowed = notional
        # Convert to foreign at spot
        foreign_received = domestic_borrowed / spot
        # Invest foreign
        foreign_at_maturity = foreign_received * (1 + r_foreign * T_years)
        # Sell forward at market rate
        domestic_at_maturity = foreign_at_maturity * forward_market
        # Repay domestic loan
        domestic_owed = domestic_borrowed * (1 + r_domestic * T_years)
        profit = domestic_at_maturity - domestic_owed
        strategy = "Borrow USD, invest EUR, sell EUR forward"
    else:
        # Opposite: borrow foreign, invest domestic, buy foreign forward
        foreign_borrowed = notional / spot
        domestic_invested = notional
        domestic_at_maturity = domestic_invested * (1 + r_domestic * T_years)
        foreign_owed = foreign_borrowed * (1 + r_foreign * T_years)
        foreign_to_buy = domestic_at_maturity / forward_market
        profit = (
            foreign_to_buy - foreign_owed
        ) * spot  # Convert profit to domestic terms
        strategy = "Borrow EUR, invest USD, buy EUR forward"

    return forward_fair, profit, strategy


# Parameters for arbitrage check
spot = 1.0850
r_usd = 0.0525
r_eur = 0.0400
T_years = 0.25  # 3 months

# Case 1: Consistent rates
fair_1 = spot * (1 + r_usd * T_years) / (1 + r_eur * T_years)
forward_correct = fair_1
fair_1_calc, profit_1, strategy_1 = covered_interest_arbitrage(
    spot, forward_correct, r_usd, r_eur, T_years
)

# Case 2: Mispriced forward (50 pips too high)
forward_overpriced = fair_1 + 0.0050
fair_2, profit_2, strategy_2 = covered_interest_arbitrage(
    spot, forward_overpriced, r_usd, r_eur, T_years
)
Out[18]:
Console
Case 1: CIP holds (no arbitrage)
  Fair forward:    1.0884
  Market forward:  1.0884
  Profit on $1M:   $0.00

Case 2: Forward overpriced by 50 pips
  Fair forward:    1.0884
  Market forward:  1.0934
  Strategy:        Borrow USD, invest EUR, sell EUR forward
  Profit on $1M:   $4,654.38

The positive profit in Case 2 confirms that when the market forward rate is higher than the theoretical CIP rate, a risk-free arbitrage is possible by borrowing domestic currency and investing in the foreign currency. The arbitrage activity itself pushes rates back toward equilibrium: borrowing pressure raises domestic rates, selling euros forward pushes the forward rate down, until no profit remains.

Uncovered Interest Parity

While covered interest parity uses forward contracts to eliminate exchange rate risk, uncovered interest parity (UIP) makes a prediction about future spot rates based on economic theory rather than arbitrage:

E[ST]=S×1+rd×T1+rf×TE[S_T] = S \times \frac{1 + r_d \times T}{1 + r_f \times T}

where:

  • E[ST]E[S_T]: expected future spot rate
  • SS: current spot exchange rate
  • rdr_d: domestic interest rate
  • rfr_f: foreign interest rate
  • TT: time to maturity in years

UIP states that the expected future spot rate equals the current forward rate. In other words, high-yielding currencies are expected to depreciate against low-yielding currencies, exactly offsetting the interest rate advantage. The intuition is that if a currency offered both higher interest rates and appreciation, capital would flood in until one or both advantages disappeared.

Unlike CIP (which is a no-arbitrage condition and holds tightly), UIP is an equilibrium hypothesis that doesn't hold well empirically. The "forward premium puzzle" refers to the finding that high-yield currencies tend to appreciate rather than depreciate, contrary to UIP. This anomaly underlies the popular "carry trade" strategy, where investors borrow low-yielding currencies to invest in high-yielding ones, profiting from both the interest differential and (often) favorable currency movements.