Triangular FX Residuals on a Retail Feed Are Real, Measurable, and a Fourteenth of Their Cost: A preregistered census, a rejected thin-cross hypothesis, and three unforced choices
Authors/Creators
Description
We measure triangular deviations on a retail foreign-exchange feed (OANDA's v20 practice stream) under a protocol whose hypotheses, decision gate, and synchronization tolerance were fixed before the data were collected. Over ten London–New York sessions of EUR/USD, GBP/USD and EUR/GBP (1.18 million ticks, 103,650 synchronized observations at τ = 250 ms) there is no moment at which the three legs could be traded at their quoted prices for a profit: the best executable cycle observed is -0.77 bp. The residual between the quoted cross and the cross implied by the majors is real — a +0.07 pip wedge with σ = 0.093 pip after removing its drifting level, reverting with a half-life near five seconds — but one standard deviation of it is 7.2% of the cost of a round trip in the cross, about one-fourteenth, and less on the thin crosses. Every 30-second reversion bin loses between 1.1 and 1.6 pip per trade at the spread quoted at the time. A preregistered follow-up tested whether thinner crosses are priced more independently, requiring the ratio k of round-trip cost to residual σ to fall below EUR/GBP's 13.7. It did not: AUD/NZD reads k = 14.7 and EUR/CZK 17.3 on the residual the signal trades, with zero executable cycles in 155,110 further synchronized observations. Thinner crosses charge more than their extra inefficiency is worth.
The negative result is expected, and consistent with interdealer evidence that triangular opportunities were competed away by the late 2000s. What we report in full is how nearly it was not reported. The decision gate, as first computed, returned PASS. That verdict needed three choices, none fixed by the protocol and each reasonable in isolation: judging reversion against the median spread rather than the spread quoted at the time, which lets news-time dislocations clear the bar while losing 1.3 pip per trade; measuring σ on the raw residual, whose between-hour level drift grows with sample length; and pooling a calibration session declared throwaway in advance, which lifted raw σ across the gate's threshold. The second choice alone would also have reversed the thin-cross test, passing both arms. A fourth hazard, ordering ticks on a monotonic clock that restarts at reboot, corrupted rate statistics fifteen-fold while leaving the census count within 0.4%. This note is a companion to a daily-frequency ETF pairs study and reaches the same structural verdict at tick frequency.
Files
Triangular_FX_Residuals_on_a_Retail_Feed.pdf
Additional details
Software
- Repository URL
- https://github.com/michaelmross/stat-arb/tree/main/FX
- Programming language
- Python