High-Frequency Trading and Latency Arbitrage › Cross-Market Arbitrage

Michael BrenndoerferJanuary 1, 20268 min read
Quantitative FinanceAll chapters
Part 12 of 15Market Making and High-Frequency Trading
Chapter 66High-Frequency Trading and Latency Arbitrage › Cross-Market Arbitrage
Reading section 4 of 18 · Cross-Market Arbitrage · 8 minSection 4 of 18 · 8 min

Book contents

Section 4 of 18 · 8 min read

High-Frequency Trading and Latency Arbitrage › Cross-Market ArbitrageOne section · Sections in this chapter4 / 18 ↓
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

Cross-market arbitrage is perhaps the most intuitive HFT strategy: buy an asset where it's cheap and simultaneously sell it where it's expensive. While the concept is simple, the implementation requires sophisticated technology to identify and capture fleeting price discrepancies.

Types of Cross-Market Arbitrage

Cross-market arbitrage opportunities arise in several contexts:

  • Exchange arbitrage: Exploits price differences for the same security listed on multiple exchanges. A stock like Apple trades on NYSE, NASDAQ, and various electronic communication networks (ECNs). Price discrepancies arise due to latency in information propagation, differences in order flow, and temporary imbalances in supply and demand.

  • ETF arbitrage: Exploits discrepancies between an ETF's market price and its net asset value (NAV). ETFs should trade at prices very close to the value of their underlying holdings. When discrepancies arise, arbitrageurs buy the cheaper instrument and sell the more expensive one.

  • Futures-spot arbitrage: Exploits deviations from the theoretical relationship between futures and spot prices. The cost-of-carry model establishes the no-arbitrage relationship between futures and spot prices through a replication argument. Consider an investor deciding between two strategies: (1) buying a futures contract for delivery at time TT, or (2) buying the underlying asset now and holding it until TT. These strategies must have equal cost; otherwise, arbitrage opportunities exist.

To understand why equal cost is necessary, consider what would happen if the strategies had different costs. If buying spot were cheaper, every investor would prefer that route, driving up the spot price. If the futures route were cheaper, investors would flock to futures, driving up the futures price. This competitive pressure ensures that in equilibrium, both paths to owning the asset at time TT must cost the same.

When holding the spot asset, the investor incurs financing costs at rate rr but receives dividend income at rate qq. The net cost of carry is (r−q)(r-q): the difference between financing costs paid and dividend income received. This net cost grows over time, and under continuous compounding, the growth is exponential with time TT. To see why, consider the growth factor for the carrying cost:

e(r−q)Te^{(r-q)T}

This exponential term captures how the net cost (r−q)(r-q) compounds continuously over time period TT. The mathematical function exe^x (the exponential function) is the natural way to express continuous compounding, where interest is reinvested infinitely often within each time period. The futures price must therefore equal the spot price adjusted for this carrying cost:

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

where:

  • F0F_0: futures price at time 0 (dollars per unit)
  • S0S_0: spot price at time 0 (dollars per unit)
  • rr: risk-free interest rate (annualized, continuous compounding, e.g., 0.05 for 5%)
  • qq: dividend yield (annualized, continuous compounding, e.g., 0.02 for 2%)
  • TT: time to expiration (years, e.g., 0.25 for 3 months)
  • e(r−q)Te^{(r-q)T}: continuous compounding factor that grows the spot price forward to account for carrying costs

The exponent (r−q)(r-q) captures the net carrying cost and reveals an important economic insight. This term determines whether futures trade at a premium or discount to spot:

  • When r>qr > q: financing costs exceed dividend income, so futures trade at a premium to spot (contango). In this situation, holding the spot asset is expensive relative to the income it generates, so investors require compensation in the form of higher futures prices.
  • When r<qr < q: dividend income exceeds financing costs, so futures trade at a discount (backwardation). Here, holding the spot asset is attractive because it generates more income than it costs to finance, so investors accept lower futures prices.
  • When r=qr = q: the futures price equals the spot price (no net carry). The benefits and costs of holding the asset exactly offset.

Why does this formula prevent arbitrage? Suppose F0>S0e(r−q)TF_0 > S_0 e^{(r-q)T}, meaning futures are overpriced relative to the theoretical value. You could execute the following strategy:

  1. Short the futures contract at F0F_0 (agree to deliver the asset at expiration for price F0F_0)
  2. Borrow S0S_0 at rate rr to buy the spot asset now
  3. Hold the asset until expiration, collecting dividends at rate qq
  4. Deliver the asset at expiration for price F0F_0

The profit from this arbitrage would be:

Profit=Futures proceeds−Cost of position=F0−S0e(r−q)T>0\begin{aligned} \text{Profit} &= \text{Futures proceeds} - \text{Cost of position} \\ &= F_0 - S_0 e^{(r-q)T} \\ &> 0 \end{aligned}

where:

  • F0F_0: proceeds from delivering the asset via the futures contract
  • S0e(r−q)TS_0 e^{(r-q)T}: total cost of the position after accounting for financing costs (growing at rate rr) and dividend income (reducing costs at rate qq)

Since this profit is risk-free and requires no capital, arbitrageurs would execute this trade until the price discrepancy disappears. Similarly, if F0<S0e(r−q)TF_0 < S_0 e^{(r-q)T}, the reverse arbitrage (buy futures, short spot) would be profitable. Therefore, in equilibrium, F0=S0e(r−q)TF_0 = S_0 e^{(r-q)T} must hold.

  • Cross-listed securities arbitrage: Exploits price differences for securities listed in multiple countries. A company might have shares trading in New York and London, with prices that should be equivalent after adjusting for exchange rates.

Implementing Exchange Arbitrage

Let's examine the mechanics of exchange arbitrage in detail. Suppose Apple stock is trading at $150.00 on NYSE and $150.02 on NASDAQ. You could:

  1. Buy 1,000 shares on NYSE at $150.00 (cost: $150,000)
  2. Simultaneously sell 1,000 shares on NASDAQ at $150.02 (proceeds: $150,020)
  3. Net profit before costs: $20

However, several factors complicate this simple picture.

In[5]:
Code
def analyze_arbitrage_opportunity(
    price_a: float,
    price_b: float,
    shares: int,
    fee_per_share: float = 0.003,
    slippage_bps: float = 0.5,
):
    """
    Analyze profitability of a cross-market arbitrage opportunity.

    Parameters:
    -----------
    price_a : Lower price (buy side)
    price_b : Higher price (sell side)
    shares : Number of shares to trade
    fee_per_share : Exchange fee for removing liquidity
    rebate_per_share : Exchange rebate for providing liquidity
    slippage_bps : Expected slippage in basis points
    """
    # Gross profit from price difference
    gross_spread = price_b - price_a
    gross_profit = gross_spread * shares

    # Transaction costs
    # Assume we take liquidity on both sides (worst case)
    exchange_fees = 2 * fee_per_share * shares

    # Slippage (price moves against us during execution)
    slippage_cost = (
        (slippage_bps / 10000) * (price_a + price_b) / 2 * shares * 2
    )

    # Net profit
    net_profit = gross_profit - exchange_fees - slippage_cost

    # Calculate required spread for profitability
    breakeven_spread = (
        2 * fee_per_share + 2 * slippage_bps / 10000 * (price_a + price_b) / 2
    )

    return {
        "gross_profit": gross_profit,
        "exchange_fees": exchange_fees,
        "slippage_cost": slippage_cost,
        "net_profit": net_profit,
        "profit_per_share": net_profit / shares,
        "breakeven_spread": breakeven_spread,
        "spread_bps": (price_b - price_a) / price_a * 10000,
    }


# Analyze the Apple example
price_a = 150.00
price_b = 150.02
result = analyze_arbitrage_opportunity(
    price_a=price_a,
    price_b=price_b,
    shares=1000,
    fee_per_share=0.003,
    slippage_bps=0.3,
)
Out[6]:
Console
Cross-Market Arbitrage Analysis
=============================================
Price on Exchange A: $150.00
Price on Exchange B: $150.02
Spread: 1.33 basis points

P&L Breakdown (1,000 shares):
  Gross profit:    $   20.00
  Exchange fees:   $    6.00
  Slippage cost:   $    9.00
  Net profit:      $    5.00

Profit per share: $0.0050
Breakeven spread: $0.0150 (1.00 bps)

The analysis demonstrates why speed is critical in cross-market arbitrage. The gross profit on 1,000 shares is reduced by transaction costs and slippage, leaving a small net profit per share. The profitable window exists only while the price discrepancy exceeds the breakeven spread: faster traders see and act on opportunities before prices converge, while slower traders arrive to find the arbitrage has already been captured.

Out[7]:
Visualization
Line chart showing gross and net profit versus price spread in cents for a 1,000-share arbitrage position, with teal shading above zero, coral shading below, and a dashed vertical line marking the breakeven spread.
Net profit from cross-market arbitrage as a function of price spread for a 1,000-share position. The teal-shaded region indicates profitable opportunities where the spread exceeds the 1.50 cent breakeven threshold, while the coral region shows spreads that do not cover costs. Speed is critical because traders must execute before prices converge to unprofitable levels.