Cross-Market Spread Arbitrage: From Price Deviation to Controlled Execution
Introduction
The price of the same asset in different markets is not always perfectly consistent. Most of the time, the difference is too small to cover costs; but when the market moves rapidly, liquidity temporarily thins, quote sources update asynchronously, or trading constraints change in one market, the spread can widen briefly.
Spread arbitrage is not about predicting the next candlestick; it is about observing whether the deviation is significant, whether there are historical patterns, whether it can cover transaction costs, and simultaneously establishing positions on both sides under controllable risk. It profits not from a directional move, but from the process of the price relationship returning from "abnormal" to "normal."
For example: suppose the same gold contract is quoted at 4035.54 on Binance and 4031.24 on Exness, with a spread of about 4.30. Normally, this spread might fluctuate around 1-4. If you believe that around 4 is already high, you could consider going long on the relatively cheaper side and short on the relatively more expensive side, waiting for the spread to narrow back to the 1-2 range.
Arbitrage does not necessarily only earn from the spread. If the funding rate on the perpetual contract side is favorable, it could become hidden income; the overnight fee on the broker side may also be low or even zero depending on the instrument, account type, or regional rules. However, these should not be the sole reason to enter a trade; they should only be dynamically evaluated as part of the cost model.
How to Define the Spread
Cross-market spread cannot be simply calculated by subtracting the two latest prices. The price at which you can actually execute depends on the direction: to buy, you must hit the ask; to sell, you can only hit the bid.
Taking the gold quotes on Binance and Exness as an example:
| Market | Bid | Ask |
|---|---|---|
| Binance | 4035.53 | 4035.55 |
| Exness | 4031.23 | 4031.25 |
The entry spread differs for the two directions:
| Direction | Entry Spread | Result |
|---|---|---|
| Long Exness / Short Binance | 4035.53 - 4031.25 | 4.28 |
| Long Binance / Short Exness | 4031.23 - 4035.55 | -4.32 |
Only when the spread is positive does it indicate theoretical room in that direction. The system calculates both directions simultaneously and selects the more favorable side.
In actual trading, three types of spreads are typically maintained:
- Entry spread: Calculated based on the actual buy/sell direction, used to determine whether a position can be opened.
- Exit spread: Calculated based on the reverse operation, used to determine whether the spread has reverted.
- Mid spread: Calculated using the mid price, suitable for research and charting, but not directly used for order placement.

Cost determines feasibility
Arbitrage appears to profit from the spread, but actually profits fromthe net spread after deducting all transaction frictions. If the cost model is too optimistic, the system will misjudge many "seemingly profitable" opportunities as tradable.
Main costs include:
| Cost item | Description |
|---|---|
| Transaction fees | Maker/taker, fixed commission, or tiered rates |
| Bid-ask spread | The bid/ask on both sides is itself an implicit cost |
| Funding rate | Perpetual contract funding rate can be a cost or a gain |
| Overnight fee | Broker swap may exist or may not be charged depending on the rules |
| Slippage | The quoted price you see is not necessarily the final average execution price |
| Exchange rate loss | Different quote currencies require uniform conversion |
Assume the unit spread drops from 4.28 to 1.5, the regression space is 2.78. If trading 10 units, the theoretical spread profit is about 27.8. After deducting fees, spread, slippage, funding rate, and overnight fee, the remainder is the true profit.
Therefore, the system needs acost protection lineA common practice is to take a high percentile of historical costs, such as P90. Only when the current spread exceeds this protection line and there is sufficient net profit margin, proceed to the next step.

When to enter
Fixed thresholds are easily invalidated. The spread of one product may fluctuate between 1 and 4 over the long term, while another product may only have a few minimum tick units; the same threshold applied to different products may be either too loose or never triggered.
A more reasonable approach is to let each product use its own historical distribution to calculate the entry line:
reachable_entry = max(P75(entry_spreads), mean + 1.0 * std)
entry_threshold = max(reachable_entry, min_entry_spread)The meaning is intuitive:
- P75 ensures that the current spread is historically large.
- mean + 1σ ensures that the deviation is not ordinary noise.
- min_entry_spread prevents insufficient statistical samples during the cold start phase.
Suppose the P75 of a certain gold cross-market spread is 3.2, and the cost protection line is 0.8. The current spread is 4.28, then:
- 4.28 is above the entry line of 3.2.
- 4.28 covers the cost protection line of 0.8.
- The theoretical space per unit is about 3.48.
Only then does it become a "executable candidate." It is not yet a final order, because before placing the order, you need to reconfirm market conditions, account status, trading hours, and liquidity.

From signal to order placement
The signal says "you can buy," but it does not mean placing an order immediately. The two trading venues are independent systems, and there is no distributed transaction. If one leg is executed and the other fails, it will result in a single-leg exposure, which is the most dangerous state for an arbitrage system.
At least a few things must be confirmed before placing an order:
| Check | Purpose |
|---|---|
| Whether the signal is still valid | Prevent using outdated opportunities |
| Whether the product mapping is correct | Prevent entering the wrong contract or quantity |
| Whether trading is currently allowed | Trading session, reduce-only, account permissions |
| Whether quotes are synchronized | Prevent false spreads |
| Whether account and order sizes are safe | Prevent excessive margin usage |
| Whether liquidity is sufficient | Prevent target quantity from being unfillable |
The most critical step is to review before execution. During the scanning phase, the spread is seen as 4.28, but by the time you are ready to place the order, the market may have already moved to 2.8. If the entry line is 3.2, this trade should be abandoned. The arbitrage system cannot trust old caches and must recalculate before execution.
Position size should not be roughly calculated based on notional value alone. Different markets often have different contract specifications, minimum order quantities, and tick sizes. The system must first unify both sides to the same USD notional value, then convert each into legal quantities.

When to exit
After opening a position, the system does not wait for price increases or decreases, but for the spread to revert. There are three common exit conditions:
| Exit condition | Description |
|---|---|
| Spread reversion | Close when the spread reaches a historical low percentile or target exit line |
| Timeout exit | If the position has been held too long but profit still meets the target, release capital first |
| Profit Protection | Do not automatically close positions when estimated profit is insufficient |
The exit line can be understood as follows:
退出线 = min(P25(历史平仓价差), 入场价差 - 成本 - 利润缓冲)If the entry spread is 4.28, the cost is 0.8, and the exit line is 1.5, then when the spread returns to 1.5, the unit profit is approximately:
4.28 - 1.5 - 0.8 = 1.98If the holding time is already long and the spread only returns to 2.2, but the profit still meets the target, you can also lock in gains through a timeout exit. Because spread reversion is not guaranteed, and capital occupation, funding fees, and overnight fees accumulate over time.

Risk control is more important than signals.
The biggest fear in spread arbitrage is not the lack of opportunities, but mistaking noise for opportunities and turning small opportunities into big risks.
The risk control module should cover several types of issues:
- Market jitter: When the spread repeatedly crosses the entry line, suspend new position openings.
- Stale quotes: If any market quote is too old, directly reject execution.
- Trading session restrictions: Some markets may only allow closing positions, not opening.
- Single-leg anomaly: When one leg is filled and the other fails, first stop expanding risk, then decide to fill the missing leg, offset, or intervene manually.
- Overheat flag: When the spread exceeds extreme quantiles, flag a warning, but not necessarily block directly.
The circuit breaker is a typical example. When the spread direction reverses frequently within a short period, the system suspends new position openings for that instrument until the market stabilizes. In actual implementation, it is best to separate "prohibit new openings" from "allow risk-reducing closings" to prevent the risk control module from blocking exits during extreme market conditions.
Several trade-offs in engineering
What truly enables an arbitrage system to run long-term is often not the strategy formula, but the engineering details.
Cost estimates should be conservative. Fees, spreads, funding rates, overnight fees, slippage, and exchange rate losses can all eat into profits. Funding rates and overnight fees are directional—sometimes costs, sometimes gains.
Price estimates should be written back to actual fills. When opening a position, you see the quoted price, but what you ultimately get is the average fill price. Slippage, partial fills, and delays can cause discrepancies. Subsequent closing must be based on the actual fill spread, not the estimated spread at the trigger signal.
Hot path and historical data should be separated. High-frequency scanning is suitable for in-memory state, while historical snapshots can be persisted in low-frequency batches. Scanning snapshots can tolerate minor losses, but order, fill, and hedge group states cannot be lost.
Live trading should be progressively validated. First simulate, then use small probes to calibrate actual fill quality, and only then enter protected live trading. Profitability in a simulated environment does not guarantee profitability in real markets.
Summary
The core of cross-market spread arbitrage is not as simple as "buy where it's cheap, sell where it's expensive." What truly needs to be addressed is:
- How to define the executable spread using bid/ask.
- How to use statistical distributions to determine if the current deviation is large enough.
- How to incorporate fees, spreads, funding rates, overnight fees, and slippage into costs.
- How to control single-leg risk when placing orders on both sides.
- How to protect capital during abnormal market conditions rather than blindly chasing opportunities.
Strategy ideas are public, and cost models and signal calculations are not secrets. The key to whether an arbitrage system can run long-term lies in whether it can stably perform high-frequency calculations, control risk in dual-side order placement, and correctly recover under abnormal conditions.