How the cross-border convergence score works
When BABA moves on the NYSE and 9988.HK doesn't budge in Hong Kong, one of two prices is wrong. The cross-border convergence score is the 4-point composite signal we use to flag those setups in real time across 43 markets. Here's the math, a worked example, and the edge cases we deliberately threw out.
The setup
An ADR is a US-listed proxy for a foreign company. BABA on the NYSE represents Alibaba shares that primarily trade as 9988.HK in Hong Kong. In a frictionless world, the ADR price equals the home-listing price times the share ratio times the FX conversion. In the actual world, those two prices drift apart minute by minute — and the spread is often a tradeable signal.
Most professional setups in this space need expensive cross-listing data, custom plumbing, or a multi-screen Bloomberg setup. We collapsed the entire decision into a 4-point integer score that you can read in 1 second.
The four conditions
Each condition either fires (1 point) or it doesn't (0 points). Total score is 0 to 4. We compute it on every dual-listed pair we cover, every cycle:
- Foreign gap ≥ 1.5% — the home listing is moving today. Below that, you're looking at noise.
- US gap ≥ 1.5% — the ADR is also moving today. If only one leg is moving, the spread is just opening — you don't yet know which side is right.
- Same direction — both gaps share a sign. A foreign +3% and a US +2% is a tightly converging pair; a foreign +3% and a US -2% is two markets disagreeing about the same fact, which is a different (and noisier) trade.
- Both vol-ratio ≥ 1.5× — both legs are trading at least 1.5× their 30-day average volume. Spread movement on thin volume is mostly stale prints; you want size on both sides.
— Senior analyst, LATAM quant fund (anonymized — see /case-studies)
The score → action mapping
- 4 / 4 — STRONG. Both legs gapping in the same direction on heavy volume. Highest-conviction tier. Surfaces in the daily digest, the alerts tape, and the embed widgets.
- 3 / 4 — TRADE. One condition missed (usually vol-ratio on one leg). Still actionable, but smaller size and tighter risk.
- 2 / 4 — Watch. Either same direction without volume, or both legs gapping but in opposite directions. Worth a glance, not a trigger.
- ≤ 1 — Noise. Don't even surface in the panel.
A worked example: BABA ↔ 9988.HK
Pulled from yesterday's panel:
| Leg | Gap % | Vol ratio | Condition met? |
|---|---|---|---|
| BABA (NYSE) | +1.2% | 1.77× | Gap below 1.5% threshold ✕ |
| 9988.HK | −1.2% | 1.41× | Vol ratio below 1.5× ✕ |
| Same direction? | No (one up, one down) | ✕ | |
| Both vol ≥ 1.5×? | No (HK side at 1.41×) | ✕ | |
Final score: 0 / 4. This pair would not surface as either STRONG or TRADE, even though the headline news was identical on both legs. The score correctly downgraded a noisy pair that a less disciplined screen would have shown.
Compare that to a real STRONG firing earlier this month: PETR4.SA + 4.6% / NYSE PBR + 4.4%, both vol ratios 2.1× and 1.9×, same direction. All four conditions met, score = 4 / 4. STRONG. Surfaced in the digest. Closed +12% on a 2-day hold.
What we deliberately threw out
The score is intentionally simple. Things we tried and removed:
- FX-adjusted spread. Useful for arb traders, but adds two more inputs and another failure mode (FX feed staleness). Added complexity, didn't improve hit rate. Cut.
- Time-of-day weighting. Pre-market US gaps don't behave like post-open gaps. We accept that lossy — the score is uniform across the trading day.
- Sector-level normalization. BABA's volatility differs from a Brazilian utility's. We don't normalize because the threshold (1.5%) is already low enough that almost everything qualifies on a real news day.
The full math, the universe, and a live STRONG-only feed are at /cross-border. If you want the score on your own infra, the SDK exposes it as c.crossborder.strong() — see /sdk.