Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 2 additions & 67 deletions benchmarks/tokenized-stock-arb-latency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ slug: tokenized-stock-arb-latency
number: "080"
title: Tokenized stock arb latency, how fast pools catch a Nasdaq move
seo_title: "Tokenized stock arb latency 2026"
seo_description: "When Nasdaq moves 25 bps, how fast does the onchain pool follow? Live measurement across 11 tokenized equities on Robinhood Chain."
seo_description: "When Nasdaq moves 25 bps, how fast does the onchain pool follow? Live measurement across 6 liquid tokenized equities on Robinhood Chain."
subtitle: "Median seconds between a 25 bps one-minute move on the reference market and the onchain pool coming back within 20 bps, per tokenized equity, regular hours only."

category: RWA
Expand Down Expand Up @@ -38,7 +38,7 @@ methodology:
- "Convergence: the pool-to-reference deviation drops back below 20 bps. The bench observes seconds from trigger to convergence into a histogram bucket, tagged per asset."
- "Publication: p50, p90 and p99 of the event distribution over 24 hours, per asset. Events that never converge before regular hours end are counted as still_open on a separate counter, not as latency samples."
- "Data source: the tsp_price_reference_usd and tsp_price_onchain_usdg series emitted by the tokenized-stock-peg harness at 60s cadence. The event tracker is in-process; no new external calls."
- "Cohort: the 11 tokenized equities the peg bench measures. Arb latency is a first-order signal of pool quality; the peg deviation number is the second-order signal (how close it stays between moves)."
- "Cohort: the 6 liquid tokenized equities the peg bench measures. Arb latency is a first-order signal of pool quality; the peg deviation number is the second-order signal (how close it stays between moves)."
- "Caveat: the 25 bps trigger filters out normal market chop while catching real moves. Symbols with fewer than 3 events per 24h during quiet market days will show sparse data; the sample_size column is the honest read of statistical weight."

findings:
Expand Down Expand Up @@ -77,19 +77,6 @@ providers:
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="nvda", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="nvda"}[1h])))

- slug: tsla
name: TSLA
tag: "Tesla, most active pool of the cohort"
formula: "Median seconds until the TSLA pool on Robinhood Chain came back within 20 bps of the Yahoo reference after a 25 bps one-minute move, regular hours only, over 24h."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="tsla"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="tsla"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="tsla"}[24h])))
mean: sum(rate(tsp_arb_latency_seconds_sum{issuer="robinhood", asset="tsla"}[24h])) / sum(rate(tsp_arb_latency_seconds_count{issuer="robinhood", asset="tsla"}[24h]))
success: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="tsla", outcome="converged"}[24h])) / clamp_min(sum(increase(tsp_arb_event_total{issuer="robinhood", asset="tsla"}[24h])), 1)
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="tsla", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="tsla"}[1h])))

- slug: aapl
name: AAPL
tag: "Apple, 1% fee"
Expand All @@ -103,19 +90,6 @@ providers:
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="aapl", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="aapl"}[1h])))

- slug: googl
name: GOOGL
tag: "Alphabet, 1% fee"
formula: "Median seconds until the GOOGL pool on Robinhood Chain came back within 20 bps of the Yahoo reference after a 25 bps one-minute move, regular hours only, over 24h."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="googl"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="googl"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="googl"}[24h])))
mean: sum(rate(tsp_arb_latency_seconds_sum{issuer="robinhood", asset="googl"}[24h])) / sum(rate(tsp_arb_latency_seconds_count{issuer="robinhood", asset="googl"}[24h]))
success: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="googl", outcome="converged"}[24h])) / clamp_min(sum(increase(tsp_arb_event_total{issuer="robinhood", asset="googl"}[24h])), 1)
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="googl", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="googl"}[1h])))

- slug: meta
name: META
tag: "Meta, 0.3% fee"
Expand Down Expand Up @@ -155,19 +129,6 @@ providers:
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="pltr", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="pltr"}[1h])))

- slug: spy
name: SPY
tag: "S&P 500 ETF, 1% fee"
formula: "Median seconds until the SPY pool on Robinhood Chain came back within 20 bps of the Yahoo reference after a 25 bps one-minute move, regular hours only, over 24h."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="spy"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="spy"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="spy"}[24h])))
mean: sum(rate(tsp_arb_latency_seconds_sum{issuer="robinhood", asset="spy"}[24h])) / sum(rate(tsp_arb_latency_seconds_count{issuer="robinhood", asset="spy"}[24h]))
success: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="spy", outcome="converged"}[24h])) / clamp_min(sum(increase(tsp_arb_event_total{issuer="robinhood", asset="spy"}[24h])), 1)
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="spy", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="spy"}[1h])))

- slug: mu
name: MU
tag: "Micron, 1% fee"
Expand All @@ -181,29 +142,3 @@ providers:
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="mu", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="mu"}[1h])))

- slug: msft
name: MSFT
tag: "Microsoft, 2% fee, thin pool test"
formula: "Median seconds until the MSFT pool on Robinhood Chain came back within 20 bps of the Yahoo reference after a 25 bps one-minute move, regular hours only, over 24h."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="msft"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="msft"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="msft"}[24h])))
mean: sum(rate(tsp_arb_latency_seconds_sum{issuer="robinhood", asset="msft"}[24h])) / sum(rate(tsp_arb_latency_seconds_count{issuer="robinhood", asset="msft"}[24h]))
success: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="msft", outcome="converged"}[24h])) / clamp_min(sum(increase(tsp_arb_event_total{issuer="robinhood", asset="msft"}[24h])), 1)
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="msft", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="msft"}[1h])))

- slug: amzn
name: AMZN
tag: "Amazon, 2% fee, thin pool test"
formula: "Median seconds until the AMZN pool on Robinhood Chain came back within 20 bps of the Yahoo reference after a 25 bps one-minute move, regular hours only, over 24h."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="amzn"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="amzn"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="amzn"}[24h])))
mean: sum(rate(tsp_arb_latency_seconds_sum{issuer="robinhood", asset="amzn"}[24h])) / sum(rate(tsp_arb_latency_seconds_count{issuer="robinhood", asset="amzn"}[24h]))
success: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="amzn", outcome="converged"}[24h])) / clamp_min(sum(increase(tsp_arb_event_total{issuer="robinhood", asset="amzn"}[24h])), 1)
sample_size: sum(increase(tsp_arb_event_total{issuer="robinhood", asset="amzn", outcome="converged"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(tsp_arb_latency_seconds_bucket{issuer="robinhood", asset="amzn"}[1h])))

15 changes: 10 additions & 5 deletions harnesses/tokenized-stock-peg/cmd/script/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,22 @@ type Asset struct {
USDGIsC0 bool
}

// Illiquid tickers dropped 2026-07-16: GOOGL, TSLA, MSFT, AMZN, SPY.
// Their Uniswap v4 pools on Robinhood Chain have no arb activity;
// the pool spot price stays frozen at the last swap value (repeats
// tick after tick) while the Yahoo reference moves normally. Ref
// triggers fire but the pool never converges within the settle
// window, so events roll over as still_open with zero latency
// samples. The 5 dropped names surfaced as "unresponsive" on the
// bench page with no headline number. Cohort restricted to the 6
// tickers with observable arb activity: NVDA, AAPL, PLTR, META,
// AMD, MU. Re-add when a pool's swap volume picks up.
var assets = []Asset{
{Symbol: "NVDA", Token: "0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC", PoolID: "0x3bb34a44f1b2b5f32c034c38a53065a521a47b199700fa9bd19d60985ff24bf1", FeePPM: 3000, USDGIsC0: true},
{Symbol: "AAPL", Token: "0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9", PoolID: "0xda4116b5894ee7479e64eae9276e1a2944ef0e5ce863a299d296a15618deee01", FeePPM: 10000, USDGIsC0: true},
{Symbol: "GOOGL", Token: "0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3", PoolID: "0xef22239f96c6ac95dcd57b90c6b14c0cc8c3c16844def34daef68dc9dd945344", FeePPM: 10000, USDGIsC0: false},
{Symbol: "TSLA", Token: "0x322F0929c4625eD5bAd873c95208D54E1c003b2d", PoolID: "0x8517f8071ae5b831b738052f12125e8e3d6c158b78728aa44ce3b25e5104d32e", FeePPM: 3000, USDGIsC0: false},
{Symbol: "PLTR", Token: "0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A", PoolID: "0xee430ee1003e1985e1828a01b9a20dad67ad4302994fe2abb4a173de4ac54623", FeePPM: 10000, USDGIsC0: true},
{Symbol: "META", Token: "0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35", PoolID: "0x5875d407a42965b0e768c8925cea290e06fa50603ef34fc99eb92a1050e6ae36", FeePPM: 3000, USDGIsC0: true},
{Symbol: "AMD", Token: "0x86923f96303D656E4aa86D9d42D1e57ad2023fdC", PoolID: "0xde9f85fdd9e05a943a52f2c69ffafe3064a3287df03d02c9b431bc92d4781274", FeePPM: 10000, USDGIsC0: true},
{Symbol: "MSFT", Token: "0xe93237C50D904957Cf27E7B1133b510C669c2e74", PoolID: "0xace02af66d24427b162f80329e039b78c226fb9a79669f5e18d5feec2aa0c056", FeePPM: 20000, USDGIsC0: true},
{Symbol: "AMZN", Token: "0x12f190a9F9d7D37a250758b26824B97CE941bF54", PoolID: "0xa3280c768df670a535d14af8c22ad3907f2acfc0277c03309fb4d5fc8d43447e", FeePPM: 20000, USDGIsC0: false},
{Symbol: "SPY", Token: "0x117cc2133c37B721F49dE2A7a74833232B3B4C0C", PoolID: "0x7eeda68cd84620339e6ad4bf054af9b19878ac13139991c7aaec018c40a8bb6a", FeePPM: 10000, USDGIsC0: false},
{Symbol: "MU", Token: "0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD", PoolID: "0x6fa3ee0048e78bf0a513eb0ab56f482944a767c21db990fcf555605e69f05659", FeePPM: 10000, USDGIsC0: true},
}

Expand Down
Loading