{"openapi":"3.1.0","info":{"title":"Variance Ratio Test API","version":"1.0.0","description":"A formal statistical test of whether a market follows a random walk, or whether its returns carry tradeable momentum or mean-reversion that is real rather than noise — the Lo-MacKinlay variance ratio test, computed live from Yahoo Finance daily closes, no key, nothing stored. Most persistence tools give you a single descriptive number; this gives you a hypothesis test with a verdict. The variance ratio compares the variance of multi-day returns to the variance of one-day returns scaled up: under a true random walk the ratio is 1 at every horizon. A ratio above 1 means returns positively autocorrelate (trends persist — momentum); below 1 means they reverse (mean-reversion). Crucially it attaches a heteroskedasticity-robust z-statistic and a p-value at each horizon, so you know whether the deviation from a random walk is statistically significant or just sampling noise — the thing a point estimate cannot tell you. The asset endpoint runs the test at horizons of 2, 4, 8 and 16 days and returns each ratio, z-statistic, p-value and a reject/fail-to-reject verdict, plus an overall read. The screener endpoint ranks the cross-asset universe by their 2-day variance ratio, separating the statistically momentum-like markets from the mean-reverting ones. This is the random-walk hypothesis-test cut — distinct from the Hurst-exponent regime API (a point estimate with no significance), the momentum and the price APIs. It is the test, with the p-value attached.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/varianceratio-api","description":"oanor gateway"}],"tags":[{"name":"Screener"},{"name":"Asset"},{"name":"Universe"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/screener":{"get":{"operationId":"get_v1_screener","tags":["Screener"],"summary":"Rank the universe by the 2-day variance ratio test","description":"","parameters":[{"name":"metric","in":"query","required":false,"description":"significance, momentum or reversion","schema":{"type":"string"},"example":"significance"},{"name":"window","in":"query","required":false,"description":"Lookback in trading days (252-2520)","schema":{"type":"string"},"example":"756"},{"name":"class","in":"query","required":false,"description":"equity, sector, commodity, bond, fx, crypto or all","schema":{"type":"string"},"example":"all"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Ranked by the 2-day variance ratio test. vr2 > 1 = momentum, < 1 = mean-reversion; |z2| >= 1.96 (p < 0.05) means the market is statistically distinguishable from a random walk at the 2-day horizon. metric=momentum ranks high VR first, reversion low VR first, significance by |z|. Read fresh per call, nothing cached.","class":"all","count":19,"metric":"significance","source":"Yahoo Finance","horizon":2,"results":[{"z2":-1.2,"vr2":0.944,"name":"Emerging Markets","rank":1,"class":"index","abs_z2":1.2,"symbol":"EEM","available":true,"p_value_2":0.2311,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.98,"vr2":0.938,"name":"Nasdaq 100 ETF","rank":2,"class":"index","abs_z2":0.98,"symbol":"QQQ","available":true,"p_value_2":0.3285,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.97,"vr2":0.959,"name":"20Y+ Treasuries","rank":3,"class":"bond","abs_z2":0.97,"symbol":"TLT","available":true,"p_value_2":0.3302,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.85,"vr2":0.966,"name":"USD/JPY","rank":4,"class":"fx","abs_z2":0.85,"symbol":"USDJPY=X","available":true,"p_value_2":0.3929,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.8,"vr2":0.953,"name":"Technology Sector","rank":5,"class":"sector","abs_z2":0.8,"symbol":"XLK","available":true,"p_value_2":0.4254,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.79,"vr2":0.948,"name":"High-Yield Credit","rank":6,"class":"bond","abs_z2":0.79,"symbol":"HYG","available":true,"p_value_2":0.4302,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.72,"vr2":0.936,"name":"S&P 500 ETF","rank":7,"class":"index","abs_z2":0.72,"symbol":"SPY","available":true,"p_value_2":0.47,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.72,"vr2":0.959,"name":"Bitcoin","rank":8,"class":"crypto","abs_z2":0.72,"symbol":"BTC-USD","available":true,"p_value_2":0.4725,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.64,"vr2":0.967,"name":"Developed ex-US","rank":9,"class":"index","abs_z2":0.64,"symbol":"EFA","available":true,"p_value_2":0.5218,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.56,"vr2":0.976,"name":"EUR/USD","rank":10,"class":"fx","abs_z2":0.56,"symbol":"EURUSD=X","available":true,"p_value_2":0.577,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":0.54,"vr2":1.041,"name":"Energy Sector","rank":11,"class":"sector","abs_z2":0.54,"symbol":"XLE","available":true,"p_value_2":0.5864,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.5,"vr2":0.974,"name":"US Small Caps","rank":12,"class":"index","abs_z2":0.5,"symbol":"IWM","available":true,"p_value_2":0.6176,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.46,"vr2":0.972,"name":"Gold ETF","rank":13,"class":"commodity","abs_z2":0.46,"symbol":"GLD","available":true,"p_value_2":0.6448,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":0.42,"vr2":1.019,"name":"Broad Commodities","rank":14,"class":"commodity","abs_z2":0.42,"symbol":"DBC","available":true,"p_value_2":0.6748,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.41,"vr2":0.981,"name":"Silver ETF","rank":15,"class":"commodity","abs_z2":0.41,"symbol":"SLV","available":true,"p_value_2":0.6809,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.39,"vr2":0.982,"name":"Crude Oil ETF","rank":16,"class":"commodity","abs_z2":0.39,"symbol":"USO","available":true,"p_value_2":0.6963,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.38,"vr2":0.986,"name":"Utilities Sector","rank":17,"class":"sector","abs_z2":0.38,"symbol":"XLU","available":true,"p_value_2":0.7076,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":0.37,"vr2":1.025,"name":"Financials Sector","rank":18,"class":"sector","abs_z2":0.37,"symbol":"XLF","available":true,"p_value_2":0.7082,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},{"z2":-0.05,"vr2":0.998,"name":"Ethereum","rank":19,"class":"crypto","abs_z2":0.05,"symbol":"ETH-USD","available":true,"p_value_2":0.9636,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"}],"sorted_by":"abs_z2","unavailable":[],"window_days":756,"significant_non_random_walk":[]},"meta":{"timestamp":"2026-06-12T10:34:37.359Z","request_id":"b4b551b5-37eb-4659-9c4a-2d153ea080ea"},"status":"ok","message":"Variance ratio screener retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/asset":{"get":{"operationId":"get_v1_asset","tags":["Asset"],"summary":"Full variance ratio test at horizons 2/4/8/16 with z-stats and p-values","description":"","parameters":[{"name":"symbol","in":"query","required":true,"description":"Universe symbol","schema":{"type":"string"},"example":"SPY"},{"name":"window","in":"query","required":false,"description":"Lookback in trading days (252-2520)","schema":{"type":"string"},"example":"756"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"S&P 500 ETF","note":"Lo-MacKinlay variance ratio test at horizons 2/4/8/16 days. variance_ratio = 1 under a random walk; > 1 = momentum (positive autocorrelation), < 1 = mean-reversion. z_stat is heteroskedasticity-robust; |z| >= 1.96 rejects the random walk at 95% (p < 0.05). Read fresh per call, nothing cached.","class":"index","source":"Yahoo Finance","symbol":"SPY","horizons":[{"q":2,"z_stat":-0.72,"p_value":0.47,"verdict":"random walk (cannot reject at 95%)","variance_ratio":0.936},{"q":4,"z_stat":-0.51,"p_value":0.6085,"verdict":"random walk (cannot reject at 95%)","variance_ratio":0.924},{"q":8,"z_stat":-0.7,"p_value":0.4818,"verdict":"random walk (cannot reject at 95%)","variance_ratio":0.837},{"q":16,"z_stat":-0.63,"p_value":0.5318,"verdict":"random walk (cannot reject at 95%)","variance_ratio":0.804}],"window_days":756,"overall_verdict":"random walk — no horizon rejects the random-walk hypothesis at 95%"},"meta":{"timestamp":"2026-06-12T10:34:37.479Z","request_id":"ab8261a3-b5c1-4e42-bc3d-35b4f9cac0bd"},"status":"ok","message":"Variance ratio test retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/universe":{"get":{"operationId":"get_v1_universe","tags":["Universe"],"summary":"The cross-asset universe and its classes","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"The cross-asset universe the screener ranks. Pass class= to a screener call to rank within one class.","count":19,"assets":[{"name":"S&P 500 ETF","class":"index","symbol":"SPY"},{"name":"Nasdaq 100 ETF","class":"index","symbol":"QQQ"},{"name":"US Small Caps","class":"index","symbol":"IWM"},{"name":"Developed ex-US","class":"index","symbol":"EFA"},{"name":"Emerging Markets","class":"index","symbol":"EEM"},{"name":"Technology Sector","class":"sector","symbol":"XLK"},{"name":"Financials Sector","class":"sector","symbol":"XLF"},{"name":"Energy Sector","class":"sector","symbol":"XLE"},{"name":"Utilities Sector","class":"sector","symbol":"XLU"},{"name":"Gold ETF","class":"commodity","symbol":"GLD"},{"name":"Silver ETF","class":"commodity","symbol":"SLV"},{"name":"Crude Oil ETF","class":"commodity","symbol":"USO"},{"name":"Broad Commodities","class":"commodity","symbol":"DBC"},{"name":"20Y+ Treasuries","class":"bond","symbol":"TLT"},{"name":"High-Yield Credit","class":"bond","symbol":"HYG"},{"name":"EUR/USD","class":"fx","symbol":"EURUSD=X"},{"name":"USD/JPY","class":"fx","symbol":"USDJPY=X"},{"name":"Bitcoin","class":"crypto","symbol":"BTC-USD"},{"name":"Ethereum","class":"crypto","symbol":"ETH-USD"}],"source":"Yahoo Finance","classes":["index","sector","commodity","bond","fx","crypto"]},"meta":{"timestamp":"2026-06-12T10:34:37.616Z","request_id":"a55a83c5-4c80-4918-aec2-49324a2e578a"},"status":"ok","message":"Universe retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Service metadata","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"metric is significance (default), momentum or reversion. window is 252-2520 trading days (default 756, ~3 years). class filters to equity/sector/commodity/bond/fx/crypto (default all). The test follows Lo & MacKinlay (1988) with overlapping observations and a heteroskedasticity-robust z. |z| >= 1.96 rejects the random walk at 95%. Read fresh per call, nothing cached.","source":"Yahoo Finance daily closes, live","classes":["index","sector","commodity","bond","fx","crypto"],"metrics":["momentum","reversion","significance"],"service":"varianceratio-api","horizons":[2,4,8,16],"endpoints":{"GET /v1/meta":"This document.","GET /v1/asset":"Full variance ratio test at horizons 2/4/8/16 with z-stats, p-values and verdicts (symbol=SPY, window=756).","GET /v1/screener":"Rank the universe by the 2-day variance ratio test (metric=significance, window=756, class=all).","GET /v1/universe":"The cross-asset universe and its classes."},"description":"Variance ratio test (Lo-MacKinlay) — a formal statistical test of whether a market follows a random walk or carries real momentum or mean-reversion, live from Yahoo Finance daily closes (no key, nothing stored). The variance ratio compares multi-day to one-day return variance: 1 under a random walk, > 1 momentum, < 1 mean-reversion. It attaches a heteroskedasticity-robust z-statistic and p-value at horizons of 2/4/8/16 days, so you know whether the deviation is significant or noise. asset runs the full test with verdicts; screener ranks the cross-asset universe by the 2-day variance ratio. The random-walk hypothesis-test cut — distinct from the Hurst-exponent regime API (a point estimate with no significance), the momentum and the price APIs.","universe_size":19,"upstream_status":"ok","significant_non_random_walk":[]},"meta":{"timestamp":"2026-06-12T10:34:37.834Z","request_id":"ac2e66f5-8256-4bf1-ae6f-b48f1ff0fc03"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":715,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":1260,"monthly_call_quota":15100,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":3680,"monthly_call_quota":82500,"rps_limit":16,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":8060,"monthly_call_quota":476000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/varianceratio-api"}