How the FundsArena exam works

A financial-work exam for AI models: every model answers the same tasks on the same frozen market snapshot through the same tools, and every answer is graded by code against a gold answer that was computed and verified before any model saw the question. No model judges another model; no human assigns a score.

benchmark fa-bench-0.1.0 · environment env-0.1.0-primary · tools primary · harness harness_73f4ef28ff150d187728d12c · grader grader_159c6327e802b88d6d0f9e74

01Same exam room, only the model changes

A batch freezes one market snapshot (prices, fundamentals as filed, liquidity, funding, on-chain state), one task set and one tool environment. Every model on the board took exactly that batch. A newly released model is added to the same frozen batch, so scores stay comparable; a canonical batch re-runs the field periodically. Old runs are kept forever.

02Pillars and weights

PillarSub-types
Financial AnalysisRetrieval · Calculation · Comparison / Trend · Risk / Position
Market & SignalScreening · Ranking / Top-K · Derived metric · Signal detection · Multi-step

A task is either right or wrong: every member, the full order, every group, the number within tolerance. The published score is the share of tasks answered exactly right — over the whole paper (the ranking), and within each pillar and sub-type. No partial credit, no weighting.

03Where questions come from

Questions are instances of task families — parameterised templates written from real analyst and trader workflows and from what Questflow users ask the product to do. A factory fills each template from the frozen snapshot, computes the gold by code, and passes it through quality gates: source exists, facts complete, formula recomputable, independent recomputation agrees, selectivity valid, no leakage. What fails a gate never reaches a ranked batch.

A ranked paper is hidden. One task per family is published as an example so the method can be read; the rest is never published, never used in prompts, few-shot examples or training.

03bHow the official paper is selected

The official paper is a curated subset of a much larger task pool. Families that every model answers completely right are retired to the base pool and not scored; what remains is chosen for difficulty and for coverage across pillars, task types and data domains. The paper is refreshed as new results come in, so it gets harder over time.

04Grading: right or wrong, by code

The published score counts a task only when it is entirely right. Partial-credit graders (F1 over sets, field counts) still run and appear on the model page as diagnostics, but they are never published as the score.

Numbers must fall within a declared tolerance after unit normalisation. Sets are scored by precision and recall (F1); ranked lists also by order agreement; grouped answers by group membership and order inside each group; multi-field answers by the weight of fields passed, with must-pass fields. The diagnostic score gives partial credit; the strict pass is only granted when every requirement is met — right members, full order, every group, number within tolerance. Both are shown.

Every grader is tested against deliberately wrong answers: reversed order, right members in the wrong group, padding with duplicates, a value scaled by 1000, an empty list when the data has matches. A correct answer passing is not enough; each kind of mistake must be caught.

05The environment: 16 standard tools, one budget

ToolWhat it returns
list_metricsList the metrics available for a domain in this frozen snapshot — id, unit and one-line definition for each (read them before screening: similar names differ, e.g
search_equitiesScreen the frozen US-listed equity universe (data as of YYYY-MM-DD)
get_equity_metricsFetch the frozen metric row for specific tickers.
get_market_historySplit-adjusted daily OHLCV for one or more US equities, oldest→newest, ending at the data cutoff (up to 400 sessions served per ticker)
get_equity_financialsRAW SEC XBRL facts for up to 200 tickers per call, as filed (every filing's copy is included, so the same period can appear several times with different filing dates — the latest filing at or before the data cutoff is authoritative)
search_perpsScreen the frozen Hyperliquid perpetual universe (data as of YYYY-MM-DD)
get_perpFrozen metric row for one perpetual (coin symbol, e.g
get_perp_historyDaily OHLCV of one or more Hyperliquid perpetuals (completed UTC sessions only, oldest→newest, ending at each coin's last closed bar; up to 400 sessions)
search_crypto_assetsScreen the frozen crypto asset (top tokens by market cap) universe (data as of YYYY-MM-DD)
get_crypto_assetFrozen metric row for one token (symbol, SYMBOL:coingecko_id, coingecko id or name).
search_dex_poolsScreen the frozen DEX liquidity pool universe (data as of YYYY-MM-DD)
get_dex_poolFrozen metric row for one pool (id as listed, e.g
search_addressesScreen the frozen on-chain trading address (Hyperliquid accounts) universe (data as of YYYY-MM-DD)
get_address_profileFrozen metric row for one address (0x…).
run_calculationRun a short JavaScript program in a sandbox to do the arithmetic over data you already fetched — averages, EMAs, RSI, ratios, growth rates, sorting, screening dozens of tickers at once
submit_answerHand in your FINAL answer for this task

Budget per task, identical for every model: 40 successful tool calls (a call that returns an error is not charged), 30 minutes of model time (tool execution and infrastructure waits never count against the model) and 32768 output tokens. A model that runs out is asked for its best answer, which is graded normally and flagged as forced.

Tool tier "primary": tools serve identities, fundamentals as reported (every XBRL fact, every filing version), market caps, volumes and daily bars — but no pre-computed technical signal. Breakouts, moving averages, ATR, returns and relative volume must be rebuilt by the model from the frozen daily history the history tools serve. The gold is computed from the same bars, so a model that applies the definition exactly reproduces the answer; a model that guesses does not.

06Model configuration, retries, versions

  • Official runs go through OpenRouter with a fixed model slug and provider fallbacks off; the serving provider, request ids and test time are recorded, so a score is always "model X in batch Y at time Z".
  • Infrastructure failures (timeouts, rate limits, provider errors) are retried and never scored. Model failures (wrong tool use, no answer, budget exceeded, invalid format) score normally.
  • Each batch records a harness version (hash of the model-facing code) and a grader version (hash of the graders). A grader fix re-grades stored answers — no model is re-run, every model is affected equally. A harness change after freezing is logged with a reason and the affected runs are re-run. A provider-side model update is a new revision; the old run stays in history.

07Task families in this batch (44)

FamilyPillar · typeDomainsTasksImplements
F04-R Revenue Growth — six companies rankedFinancial Analysis · CalculationFinancial filings1original
F05-R10 CAGR — ten companies rankedFinancial Analysis · CalculationFinancial filings4original
F08-R EPS Growth (diluted) — six companies rankedFinancial Analysis · CalculationFinancial filings1original
F09 Free Cash FlowFinancial Analysis · CalculationFinancial filings1original
F15 Peer Comparison (growth ranking)Financial Analysis · Comparison / TrendFinancial filings1original
F29 Trailing-twelve-month revenueFinancial Analysis · CalculationFinancial filings1original
J01 Statement Audit — EquityFinancial Analysis · Comparison / TrendEquity, Financial filings39original
J02 Statement Audit — PerpetualsMarket & Signal · Signal detectionCrypto / Perp4original
J03 Restatement ScreenFinancial Analysis · Comparison / TrendEquity, Financial filings4original
J05 Statement Audit — Equity TechnicalsMarket & Signal · Signal detectionEquity4original
S-CR06-M Token DEX Liquidity Threshold (pools) — median of a rebuilt metric over the matchesMarket & Signal · ScreeningDEX pools4original
S-CR08-N Pool Buy/Sell Transaction-Count Imbalance — count of matchesMarket & Signal · Signal detectionDEX pools1proxy of PRD S-CR08 buy/sell VOLUME imbalance
S-CR12-A Pool Buyer/Seller Breadth — count, mean and median of a rebuilt metric over the matchesMarket & Signal · Signal detectionDEX pools3original
S-CR17-X Perp Trend Alignment (close > EMA20 > EMA50) — plus one more hidden conditionMarket & Signal · Derived metricCrypto / Perp1original
S-CR18-A Perp RSI Range + Positive Trend — count, mean and median of a rebuilt metric over the matchesMarket & Signal · Derived metricCrypto / Perp4original
S-CR19-N Perp Volatility Expansion (ATR% threshold) — count of matchesMarket & Signal · Derived metricCrypto / Perp1original
S-EQ01-XX Size Screen — plus two more hidden conditionsMarket & Signal · ScreeningEquity4original
S-EQ02-XX Liquidity Screen — plus two more hidden conditionsMarket & Signal · ScreeningEquity4original
S-EQ04-XX Unusual Volume — plus two more hidden conditionsMarket & Signal · Signal detectionEquity4original
S-EQ05-X First Breakout 20D — plus one more hidden conditionMarket & Signal · Signal detectionEquity4original
S-EQ06-XX-N Breakout (N-day high) — plus two more hidden conditions — count of matchesMarket & Signal · Signal detectionEquity3original
S-EQ07-XX-N Breakdown 60D — plus two more hidden conditions — count of matchesMarket & Signal · Signal detectionEquity3original
S-EQ09-X Moving Average Cross (EMA20 above EMA50 today) — plus one more hidden conditionMarket & Signal · Signal detectionEquity3original
S-EQ10-XX Pullback in Uptrend — plus two more hidden conditionsMarket & Signal · ScreeningEquity4original
S-EQ11-A RSI Range — count, mean and median of a rebuilt metric over the matchesMarket & Signal · Derived metricEquity4original
S-EQ12-XX Oversold / Overbought (RSI) — plus two more hidden conditionsMarket & Signal · Signal detectionEquity4original
S-EQ13-XX ATR Volatility — plus two more hidden conditionsMarket & Signal · Derived metricEquity4original
S-EQ14 Gap UpMarket & Signal · Signal detectionEquity3original
S-EQ15-M Gap + Volume — median of a rebuilt metric over the matchesMarket & Signal · Signal detectionEquity1original
S-EQ16-XX Relative Strength vs Index — plus two more hidden conditionsMarket & Signal · Derived metricEquity4original
S-EQ18-A Low-Drawdown Leader — count, mean and median of a rebuilt metric over the matchesMarket & Signal · ScreeningEquity4original
S-EQ19-XX-N Revenue Growth Screen — plus two more hidden conditions — count of matchesMarket & Signal · ScreeningEquity4original
S-EQ20-XX EPS Growth Screen — plus two more hidden conditionsMarket & Signal · ScreeningEquity4original
S-EQ21-XX Growth Acceleration — plus two more hidden conditionsMarket & Signal · Signal detectionEquity4original
S-EQ22-A Profitability Screen (gross + operating margin) — count, mean and median of a rebuilt metric over the matchesMarket & Signal · ScreeningEquity4original
S-EQ23-XX-N Quality Screen (ROE + operating margin as proxies) — plus two more hidden conditions — count of matchesMarket & Signal · ScreeningEquity4proxy of PRD S-EQ23 quality screen (ROIC, Net Debt / EBITDA)
S-EQ24-A Valuation Screen (trailing P/E) — count, mean and median of a rebuilt metric over the matchesMarket & Signal · ScreeningEquity4original
S-EQ25-A Growth + Valuation (trailing P/E as a proxy for EV/Sales) — count, mean and median of a rebuilt metric over the matchesMarket & Signal · ScreeningEquity4proxy of PRD S-EQ25 growth + EV/Sales valuation screen
S-EQ25-XX Growth + Valuation (trailing P/E as a proxy for EV/Sales) — plus two more hidden conditionsMarket & Signal · ScreeningEquity4proxy of PRD S-EQ25 growth + EV/Sales valuation screen
S-EQ26 Cash Flow Quality (FCF margin)Market & Signal · ScreeningEquity4original
S-EQ29-XX Breakout with Exclusion — plus two more hidden conditionsMarket & Signal · ScreeningEquity4original
S-EQ33 Market-cap Bucket RankingMarket & Signal · Ranking / Top-KEquity4original
S-EQ34-N Multi-period Consistency — count of matchesMarket & Signal · ScreeningEquity4original
S-X06 Compound Screen with Staged Narrative (liquidity → growth → momentum → rank)Market & Signal · Multi-stepEquity4original

4 families implement a proxy or a reduced version of the original requirement. They are scored as what they are and never counted as coverage of the original capability.

08Metric definitions (163, versioned)

Show all metric definitions
MetricDomainDefinitionFormulaUnit
ath_drawdown_pct v1Crypto / TokenCurrent price / all-time-high price − 1 (≤ 0). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.current_price / ath - 1ratio
circulating_supply v1Crypto / TokenTokens in circulation. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.circulating_supplytokens
fdv_market_cap_ratio v1Crypto / TokenFully diluted valuation divided by market cap (≥ 1; large values = heavy future unlocks).token_fdv_usd / token_market_cap_usdratio
is_stablecoin v1Crypto / TokenTrue for fiat/commodity-pegged tokens: known stablecoin symbol list, or price within 1% of $1 with |24h change| < 0.5%, or name mentioning USD with price ≈ $1. Token screens exclude these.heuristic(symbol, price, change_24h, name)bool
market_cap_rank v1Crypto / TokenRank by market cap among all CoinGecko-listed tokens (1 = largest). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.market_cap_rankrank
market_cap_tvl_ratio v1Crypto / TokenToken market cap divided by protocol TVL (only for protocol tokens).token_market_cap_usd / tvl_usdratio
token_fdv_usd v1Crypto / TokenFully diluted valuation = fully diluted supply × reference price. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.total_supply × current_priceUSD
token_market_cap_usd v1Crypto / Tokencirculating_supply × reference price. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.circulating_supply × current_priceUSD
token_price_change_24h_pct v1Crypto / TokenPrice now vs 24 hours ago, minus one (ratio: 0.05 = +5%). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.price_change_percentage_24h / 100ratio · 24H
token_price_change_7d_pct v1Crypto / TokenPrice now vs 7 days ago, minus one (ratio). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.price_change_percentage_7d_in_currency / 100ratio · 7D
token_price_usd v1Crypto / TokenReference price in USD. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.current_priceUSD
token_volume_24h_usd v1Crypto / TokenNotional traded across venues over the past 24 hours. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.total_volumeUSD · 24H
total_supply v1Crypto / TokenTotal minted supply (excluding burned). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time.total_supplytokens
tvl_change_7d_pct v1Crypto / TokenProtocol TVL now vs 7 days ago, minus one (ratio). Source: DefiLlama.protocol.change_7d / 100ratio · 7D
tvl_usd v1Crypto / TokenTotal value locked of the protocol whose governance/utility token this is (largest-TVL protocol sharing the token's CoinGecko id). Null for tokens that are not protocol tokens. Source: DefiLlama /protocols.protocol.tvlUSD
volume_market_cap_ratio v1Crypto / Token24h volume divided by market cap (ratio: 0.3 = 30%).token_volume_24h_usd / token_market_cap_usdratio
funding_annualized_pct v2Crypto / PerpHourly funding rate simply annualized (no compounding): × 24 hours × 365 days × 100. This is the current rate extrapolated, not historical funding actually paid. v1 annualized the hourly field as if it were an 8h rate (8× too low).funding_rate_1h × 24 × 365 × 100%
funding_rate_1h v1Crypto / PerpCurrent funding rate per hour as a fraction — the rate Hyperliquid actually pays each hour (venue field `funding`).fundingratio
funding_rate_8h v2Crypto / Perp8-hour-equivalent funding rate = hourly rate × 8 (for comparison with venues that pay every 8h). v1 wrongly stored the hourly field as an 8h rate.funding_rate_1h × 8ratio
mark_price_usd v1Crypto / PerpVenue mark price at snapshot time.markPxUSD
oi_change_24h_pct v2Crypto / PerpUSD-notional open interest now divided by its value at the 24h reference, minus one — a RATIO despite the legacy _pct suffix (0.2 = +20%). Reference = the nearest earlier frozen snapshot to (now − 24h) within ±12h (row fields oi_reference_24h_usd, oi_reference_24h_offset_seconds, attrs oi_reference_24h_snapshot / observed_at); no reference within the window → null (unknown, never 0).open_interest_usd[t] / open_interest_usd[ref] − 1ratio · 24H
oi_change_7d_pct v1Crypto / PerpOpen interest now vs ~7 days ago (nearest earlier frozen snapshot within ±1.5 d), minus one. Accumulated from our own daily snapshots; null until history exists.oi[t] / oi[t-7d] - 1ratio · 7D
oi_reference_24h_offset_seconds v1Crypto / PerpSigned seconds between the reference snapshot time and the (now − 24h) target; |offset| ≤ 43,200 by policy.ref.createdAt − (now − 24h)seconds
oi_reference_24h_usd v1Crypto / PerpUSD-notional open interest at the reference snapshot used for oi_change_24h_pct.open_interest_usd[ref]USD
open_interest_usd v1Crypto / PerpOpen interest in base units × mark price.openInterest × markPxUSD
perp_atr_pct_14 v1Crypto / Perp14-day Wilder ATR divided by the current daily close.ATR(14) / closeratio · 14D
perp_breakout_30d v1Crypto / PerpCurrent daily close above the previous 30-session high.perp_close > perp_previous_high_30dbool · 30D
perp_ema_20 v1Crypto / Perp20-day exponential moving average of daily closes.EMA(close, 20)USD · 20D
perp_ema_50 v1Crypto / Perp50-day exponential moving average of daily closes.EMA(close, 50)USD · 50D
perp_previous_high_30d v1Crypto / PerpHighest daily high over the 30 complete sessions before the current one.max(high[t-30..t-1])USD · 30D
perp_return_30d v1Crypto / PerpDaily close today / daily close 30 sessions ago − 1 (Hyperliquid 1d candles).close[t] / close[t-30] - 1ratio · 30D
perp_return_7d v1Crypto / PerpDaily close today / daily close 7 sessions ago − 1 (Hyperliquid 1d candles).close[t] / close[t-7] - 1ratio · 7D
perp_rsi_14 v1Crypto / Perp14-day Wilder RSI on daily closes.RSI(close, 14)index · 14D
perp_trend_alignment v1Crypto / PerpDaily close > EMA20 > EMA50.perp_close > perp_ema_20 > perp_ema_50bool
perp_volume_ratio_7d v1Crypto / PerpCurrent session's daily volume / mean daily volume of the previous 7 sessions.volume[t] / mean(volume[t-7..t-1])ratio · 7D
price_change_24h_pct v1Crypto / PerpMark price now vs 24h ago, minus one, in PERCENT (e.g. 2.5 = +2.5%).(markPx[t] / markPx[t-24h] - 1) × 100% · 24H
volume_24h_usd v1Crypto / PerpNotional traded over the last 24 hours.dayNtlVlmUSD · 24H
buy_sell_txn_ratio v1DEX poolsBuy swap count divided by sell swap count over 24h (transaction counts, NOT volume — the free feed has no per-side volume).buys_24h / sells_24hratio · 24H
buyer_seller_ratio v1DEX poolsDistinct buyers divided by distinct sellers over 24h (breadth of demand).buyers_24h / sellers_24hratio · 24H
buyers_24h v1DEX poolsDistinct addresses that bought in the past 24 hours. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.transactions.h24.buyerscount · 24H
buys_24h v1DEX poolsNumber of buy swaps (quote → base) in the past 24 hours. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.transactions.h24.buyscount · 24H
network v1DEX poolsGeckoTerminal network id of the pool (eth, solana, base, bsc, …).networkcategory
pool_age_days v1DEX poolsDays since the pool was created, at snapshot time. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.(snapshot_time - pool_created_at) / 1ddays
pool_fdv_usd v1DEX poolsFully diluted valuation of the pool's base token. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.fdv_usdUSD
pool_liquidity_usd v1DEX poolsTotal USD value of both reserves in the pool at reference prices. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.reserve_in_usdUSD
pool_market_cap_usd v1DEX poolsMarket cap of the pool's base token; falls back to FDV when the token has no CoinGecko listing. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.market_cap_usd ?? fdv_usdUSD
pool_price_change_24h_pct v1DEX poolsBase-token price in the pool now vs 24h ago, minus one (ratio). Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.price_change_percentage.h24 / 100ratio · 24H
pool_volume_24h_usd v1DEX poolsUSD notional swapped through the pool over the past 24 hours. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.volume_usd.h24USD · 24H
sellers_24h v1DEX poolsDistinct addresses that sold in the past 24 hours. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.transactions.h24.sellerscount · 24H
sells_24h v1DEX poolsNumber of sell swaps (base → quote) in the past 24 hours. Source: GeckoTerminal /networks/{network}/pools sorted by 24h volume (top-200 pools per network) at snapshot time.transactions.h24.sellscount · 24H
token_dex_liquidity_usd v1DEX poolsSum of pool_liquidity_usd over every fetched pool on the same network whose base token has the same contract address (the token's aggregate liquidity within the supported pool universe).Σ pool_liquidity_usd by (network, base_token_address)USD
volume_liquidity_ratio v1DEX pools24h pool volume divided by pool liquidity (turnover of the pool).pool_volume_24h_usd / pool_liquidity_usdratio · 24H
above_earnings_day_high v1EquityTrue when the cutoff close is above the high of the first full session after the latest earnings release (split-adjusted).close[cutoff] > high[first session > release]bool
atr_14 v1EquityWilder average true range over 14 sessions.wilder_mean(true_range, 14)USD · 14D
atr_pct_14 v1EquityATR 14 divided by the current close.atr_14 / closeratio · 14D
avg_dollar_volume_20d v1EquityMean of close × volume over the 20 complete sessions before the current one.mean(close × volume)[t-20..t-1]USD · 20D
avg_volume_20d v1EquityMean share volume over the 20 complete sessions before the current one.mean(volume[t-20..t-1])shares · 20D
breakdown_60d v1EquityTrue when the current close is below the previous 60-session low.close[t] < previous_low_60dbool · 60D
breakout_20d v1EquityTrue when the current close is above the previous 20-session high.close[t] > previous_high_20dbool · 20D
breakout_20d_first v1EquityTrue when today's close is above the previous 20-session high AND yesterday's close was NOT above its own previous 20-session high (first session of the breakout).breakout_20d[t] and not breakout_20d[t-1]bool · 20D
breakout_252d v1EquityTrue when the current close is above the previous 252-session high.close[t] > previous_high_252dbool · 252D
breakout_30d v1EquityTrue when the current close is above the previous 30-session high.close[t] > previous_high_30dbool · 30D
breakout_30d_first v1EquityTrue when today's close is above the previous 30-session high AND yesterday's close was NOT above its own previous 30-session high (first session of the breakout).breakout_30d[t] and not breakout_30d[t-1]bool · 30D
breakout_60d v1EquityTrue when the current close is above the previous 60-session high.close[t] > previous_high_60dbool · 60D
days_since_earnings v1EquityNumber of trading sessions from the first post-release session to the data cutoff (0 = cutoff is the first post-release session).index(cutoff) − index(first session after release date)sessions
ema_20 v1EquityExponential moving average of the adjusted close with period 20 (seeded by the SMA of the first 20 closes).ema(close, 20)USD · 20D
ema_200 v1EquityExponential moving average of the adjusted close with period 200 (seeded by the SMA of the first 200 closes).ema(close, 200)USD · 200D
ema_50 v1EquityExponential moving average of the adjusted close with period 50 (seeded by the SMA of the first 50 closes).ema(close, 50)USD · 50D
ema20_cross_above_ema50_today v1EquityTrue when EMA20 > EMA50 today and EMA20 <= EMA50 on the previous session.ema_20[t] > ema_50[t] and ema_20[t-1] <= ema_50[t-1]bool · 50D
ema50_above_ema200 v1EquityTrue when EMA50 > EMA200 on the current session (uptrend structure).ema_50 > ema_200bool · 200D
eps_diluted_yoy_latest_q v1EquityDiluted EPS (metric=eps_diluted, single quarter) of the latest quarter for which eps_diluted is reported (latest period_end) divided by the same fiscal quarter one year earlier, minus one; null when the base is ≤ 0. Latest filing copy per period.eps_q[latest] / eps_q[same quarter, fiscal_year − 1] − 1ratio · 1Q
exchange v1EquityPrimary listing exchange code (NAS = Nasdaq, NYS = NYSE).vendor exchangecategory
fcf_margin_latest_fy v1Equity(operating_cash_flow − capex) / revenue for the latest fiscal year that reports revenue; capex is served as a positive outflow (PaymentsToAcquirePropertyPlantAndEquipment). Latest filing copy per period.(operating_cash_flow[FY] − capex[FY]) / revenue[FY]ratio · 1FY
gap_pct v1EquityCurrent session open relative to the previous close, minus one.open[t] / close[t-1] - 1ratio · 1D
gross_margin_latest v1Equitygross_profit / revenue for the latest fiscal year that reports revenue (fiscal_period FY; latest filing copy per period).gross_profit[FY] / revenue[FY]ratio · 1FY
industry v1EquityIndustry classification from the sector source recorded in the snapshot's sourceVersions (null when unmapped).sector sourcecategory
last_earnings_date v1EquityDate of the latest SEC 8-K with Item 2.02 (Results of Operations) at or before the data cutoff — the earnings release date.max(8-K.reportDate where items ∋ 2.02, ≤ cutoff)category
ma_alignment_bull v1EquityTrue when close > EMA20 > EMA50 > EMA200 on the current session.close > ema_20 > ema_50 > ema_200bool · 200D
market_cap_bucket v1EquitySMALL when market cap < $2B, MID when $2B–$10B (inclusive), LARGE when > $10B, at the data cutoff.bucket(market_cap_usd)category
market_cap_usd v1EquityCompany-level outstanding shares × reference close price at data cutoff.total_shares × closeUSD
max_drawdown_120d v1EquityLargest peak-to-trough decline of the adjusted close over the last 120 sessions (current included).max((peak - close) / peak)ratio · 120D
net_margin_latest v1Equitynet_income / revenue for the latest fiscal year that reports revenue (latest filing copy per period).net_income[FY] / revenue[FY]ratio · 1FY
operating_margin_latest v1Equityoperating_income / revenue for the latest fiscal year that reports revenue (latest filing copy per period).operating_income[FY] / revenue[FY]ratio · 1FY
pb v1EquityVendor-reported price-to-book ratio at the data cutoff.price / book_value_per_shareratio
pb_filings v1Equitymarket_cap_usd divided by the latest reported total_equity (any fiscal period, latest period_end, latest filing copy); null when equity ≤ 0.market_cap_usd / total_equity[latest period_end]ratio
pct_days_above_ema50_120d v1EquityShare of the last 120 sessions whose close was above that session's EMA50.count(close > ema_50) / 120ratio · 120D
pe_ttm v1EquityVendor-reported trailing-twelve-month price/earnings ratio at the data cutoff (null when earnings ≤ 0).price / eps_ttmratio
pe_ttm_filings v1Equitymarket_cap_usd divided by trailing-twelve-month net income = the sum of the four latest single-quarter net_income facts (consecutive quarters by period_end, latest filing copy per period; a fiscal Q4 that is not filed as a single quarter is derived as the fiscal-year value minus Q1–Q3 of the same fiscal year); null when fewer than four quarters exist or TTM net income ≤ 0.market_cap_usd / Σ net_income_q[latest 4]ratio · 4Q
post_earnings_1d_excess_vs_spx v1Equitypost_earnings_1d_return minus the S&P 500 (SPX) return over the same session.post_earnings_1d_return − (spx[first session > release] / spx[last session ≤ release] − 1)ratio
post_earnings_1d_return v2EquityClose of the reaction session divided by the close of the session before it, minus one (split-adjusted). Reaction session = the filing day when EDGAR accepted the 8-K before 16:00 ET, otherwise the next session (v1 always used the next session after the report date).close[reaction session] / close[session before] − 1ratio
previous_high_20d v1EquityMaximum high over the 20 complete sessions before the current one (current excluded).max(high[t-20..t-1])USD · 20D
previous_high_252d v1EquityMaximum high over the 252 complete sessions before the current one (current excluded).max(high[t-252..t-1])USD · 252D
previous_high_30d v1EquityMaximum high over the 30 complete sessions before the current one (current excluded).max(high[t-30..t-1])USD · 30D
previous_high_60d v1EquityMaximum high over the 60 complete sessions before the current one (current excluded).max(high[t-60..t-1])USD · 60D
previous_low_60d v1EquityMinimum low over the 60 complete sessions before the current one.min(low[t-60..t-1])USD · 60D
price_usd v1EquityRaw (unadjusted) close of the current session.raw_closeUSD
pullback_from_5d_high_pct v1EquityOne minus the current close divided by the highest high of the last 5 sessions (current included).1 - close[t] / max(high[t-4..t])ratio · 5D
return_120d v1EquitySplit-adjusted close now divided by the close 120 trading sessions ago, minus one.close[t] / close[t-120] - 1ratio · 120D
return_120d_vs_spx v1EquityTicker return over the last 120 sessions minus the S&P 500 (SPX) return over the same sessions.return_120d − (spx[t] / spx[t−120] − 1)ratio · 120D
return_1d v1EquitySplit-adjusted close now divided by the close 1 trading sessions ago, minus one.close[t] / close[t-1] - 1ratio · 1D
return_20d v1EquitySplit-adjusted close now divided by the close 20 trading sessions ago, minus one.close[t] / close[t-20] - 1ratio · 20D
return_20d_vs_spx v1EquityTicker return over the last 20 sessions minus the S&P 500 (SPX) return over the same sessions.return_20d − (spx[t] / spx[t−20] − 1)ratio · 20D
return_5d v1EquitySplit-adjusted close now divided by the close 5 trading sessions ago, minus one.close[t] / close[t-5] - 1ratio · 5D
return_60d v1EquitySplit-adjusted close now divided by the close 60 trading sessions ago, minus one.close[t] / close[t-60] - 1ratio · 60D
return_60d_vs_spx v1EquityTicker return over the last 60 sessions minus the S&P 500 (SPX) return over the same sessions.return_60d − (spx[t] / spx[t−60] − 1)ratio · 60D
revenue_growth_accelerating v1EquityTrue when the latest quarter's revenue YoY growth exceeds the previous quarter's.revenue_yoy_latest_q > revenue_yoy_prev_qbool
revenue_yoy_3q_min v1EquityMinimum of the single-quarter revenue YoY growth (as defined for revenue_yoy_latest_q) across the three latest reported quarters; null unless all three exist.min(revenue_yoy[latest], revenue_yoy[latest − 1], revenue_yoy[latest − 2])ratio · 3Q
revenue_yoy_latest_q v1EquitySingle-quarter revenue of the latest reported quarter divided by the same fiscal quarter one year earlier, minus one. Facts: metric=revenue, fiscal_period Q1–Q4 (Q4 = fiscal-year value minus the first three quarters, as served); for each (fiscal_year, fiscal_period) use the copy from the latest filing; latest quarter = the one with the latest period_end.rev_q[latest] / rev_q[same quarter, fiscal_year − 1] − 1ratio · 1Q
revenue_yoy_prev_q v1EquitySame as revenue_yoy_latest_q for the quarter immediately before the latest reported quarter (by period_end).rev_q[latest − 1] / rev_q[same quarter, fiscal_year − 1] − 1ratio · 1Q
roe_latest v1Equitynet_income / total_equity (period-end stockholders equity) for the latest fiscal year that reports revenue (latest filing copy per period).net_income[FY] / total_equity[FY]ratio · 1FY
rsi_14 v1EquityWilder relative strength index over 14 sessions (SMA seed, then Wilder smoothing).100 - 100 / (1 + avg_gain / avg_loss)index · 14D
sector v1EquitySector classification from the sector source recorded in the snapshot's sourceVersions (null when unmapped).sector sourcecategory
turnover_ratio v1EquityVendor-reported daily turnover (volume / float shares).volume / free_share%
volume_ratio_20d v1EquityCurrent session volume divided by the 20-day average volume.volume[t] / avg_volume_20dratio · 20D
account_value_usd v1On-chainTotal account equity (margin + unrealized) per the Hyperliquid leaderboard at the frozen file's Last-Modified time.Hyperliquid leaderboard.accountValueUSD
chain v1On-chainVenue the address was sampled from (v0.1: always "hyperliquid").adaptercategory
closed_trades_30d v1On-chainNumber of closing fills with non-zero closedPnl over the trailing 30 days in the stored Hyperliquid fills.count(closes)count · 30D
fills_observed_days v1On-chainDays between the earliest stored fill for the address and the snapshot, capped at 30 — evidence that a 30-day window was actually observed (null when no fills are stored).min(30, days(now − first stored fill))days
largest_position_coin v1On-chainCoin with the largest open notional, per Hyperliquid clearinghouseState at capture time; null when flat or not sampled.argmax(positionValue)category
leaderboard_rank_all_time_vlm v1On-chain1-based rank of the address within the frozen universe, ordered by all-time volume descending (ties by address).rank(volume_all_time_usd desc)rank
margin_used_usd v1On-chainMargin currently locked by open positions (marginSummary.totalMarginUsed), per Hyperliquid clearinghouseState at capture time.clearinghouseState.marginSummary.totalMarginUsedUSD
max_leverage v1On-chainHighest leverage.value across open positions (cross or isolated), per Hyperliquid clearinghouseState at capture time; null when no positions.max(position.leverage.value)x
open_positions_count v1On-chainNumber of coins with a non-zero perp position, per Hyperliquid clearinghouseState at capture time.count(position.szi ≠ 0)count
pnl_all_time_usd v1On-chainRealized + unrealized PnL of the account over the all time window, per the Hyperliquid leaderboard (window "allTime").Hyperliquid leaderboard.pnlUSD · ALL_TIME
pnl_day_usd v1On-chainRealized + unrealized PnL of the account over the trailing day window, per the Hyperliquid leaderboard (window "day").Hyperliquid leaderboard.pnlUSD · DAY
pnl_month_usd v1On-chainRealized + unrealized PnL of the account over the trailing month window, per the Hyperliquid leaderboard (window "month").Hyperliquid leaderboard.pnlUSD · MONTH
pnl_week_usd v1On-chainRealized + unrealized PnL of the account over the trailing week window, per the Hyperliquid leaderboard (window "week").Hyperliquid leaderboard.pnlUSD · WEEK
position_BTC_usd v1On-chainSigned notional of the open BTC perp position (+ long, − short, 0 when flat), per Hyperliquid clearinghouseState at capture time; null when positions were not sampled.sign(szi) × positionValue for coin BTCUSD
position_ETH_usd v1On-chainSigned notional of the open ETH perp position (+ long, − short, 0 when flat), per Hyperliquid clearinghouseState at capture time; null when positions were not sampled.sign(szi) × positionValue for coin ETHUSD
position_HYPE_usd v1On-chainSigned notional of the open HYPE perp position (+ long, − short, 0 when flat), per Hyperliquid clearinghouseState at capture time; null when positions were not sampled.sign(szi) × positionValue for coin HYPEUSD
position_SOL_usd v1On-chainSigned notional of the open SOL perp position (+ long, − short, 0 when flat), per Hyperliquid clearinghouseState at capture time; null when positions were not sampled.sign(szi) × positionValue for coin SOLUSD
realized_pnl_30d_fills v1On-chainSum of closedPnl over all stored Hyperliquid fills of the trailing 30 days (before funding).Σ closedPnlUSD · 30D
roi_all_time v1On-chainReturn over the all time window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard.Hyperliquid leaderboard.roiratio · ALL_TIME
roi_day v1On-chainReturn over the trailing day window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard.Hyperliquid leaderboard.roiratio · DAY
roi_month v1On-chainReturn over the trailing month window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard.Hyperliquid leaderboard.roiratio · MONTH
roi_week v1On-chainReturn over the trailing week window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard.Hyperliquid leaderboard.roiratio · WEEK
total_notional_usd v1On-chainTotal notional value of open perp positions (marginSummary.totalNtlPos), per Hyperliquid clearinghouseState at capture time. Null when positions were not sampled for the address.clearinghouseState.marginSummary.totalNtlPosUSD
unrealized_pnl_usd v1On-chainSum of unrealizedPnl across open positions, per Hyperliquid clearinghouseState at capture time.Σ position.unrealizedPnlUSD
volume_all_time_usd v1On-chainNotional perp volume traded over the all time window, per the Hyperliquid leaderboard.Hyperliquid leaderboard.vlmUSD · ALL_TIME
volume_day_usd v1On-chainNotional perp volume traded over the trailing day window, per the Hyperliquid leaderboard.Hyperliquid leaderboard.vlmUSD · DAY
volume_month_usd v1On-chainNotional perp volume traded over the trailing month window, per the Hyperliquid leaderboard.Hyperliquid leaderboard.vlmUSD · MONTH
volume_week_usd v1On-chainNotional perp volume traded over the trailing week window, per the Hyperliquid leaderboard.Hyperliquid leaderboard.vlmUSD · WEEK
win_rate_30d v1On-chainShare of closing fills (dir "Close Long"/"Close Short") with positive closedPnl over the trailing 30 days, from Hyperliquid userFillsByTime fills accumulated daily by FundsArena. Null until at least 20 closing fills are stored (the API only exposes the last 10,000 fills, so history accrues from the first sync).wins / closesratio · 30D
capex v1Financial filingsPayments for property, plant and equipment, stored as a POSITIVE outflow magnitude.abs(canonical_fact)USD
cash_and_equivalents v1Financial filingsCash and cash equivalents at period end (excludes marketable securities).canonical_factUSD
cogs v1Financial filingsCost of revenue for the period.canonical_factUSD
depreciation_amortization v1Financial filingsDepreciation, depletion and amortization for the period, from the cash-flow statement.canonical_factUSD
dividends_paid v1Financial filingsCash dividends paid during the period, stored as a POSITIVE outflow magnitude.abs(canonical_fact)USD
ebit v1Financial filingsEarnings before interest and taxes (GAAP operating income unless the task states otherwise).canonical_factUSD
eps_basic v1Financial filingsGAAP basic earnings per share.canonical_factUSD/share
eps_diluted v1Financial filingsGAAP diluted earnings per share.canonical_factUSD/share
gross_profit v1Financial filingsRevenue minus cost of revenue.canonical_factUSD
interest_expense v1Financial filingsInterest expense for the period.canonical_factUSD
inventory v1Financial filingsInventories at period end.canonical_factUSD
net_income v1Financial filingsGAAP net income attributable to the company.canonical_factUSD
operating_cash_flow v1Financial filingsNet cash from operating activities.canonical_factUSD
operating_income v1Financial filingsGAAP operating income for the period.canonical_factUSD
revenue v1Financial filingsTotal net revenue for the fiscal period.canonical_factUSD
share_repurchase v1Financial filingsCash paid to repurchase common stock during the period, stored as a POSITIVE outflow magnitude.abs(canonical_fact)USD
shares_outstanding v1Financial filingsCommon shares outstanding at period end.canonical_factshares
total_assets v1Financial filingsTotal assets at period end.canonical_factUSD
total_debt v1Financial filingsShort-term + long-term borrowings (incl. current portion), excluding leases.canonical_factUSD
total_equity v1Financial filingsTotal stockholders' equity at period end.canonical_factUSD

09Formulas (32, each with an independent verification implementation)

Show all formulas
FormulaInputsExpressionOutput
absolute_change v1new, oldnew - oldsame_as_input
atr_position_size v1risk_budget_usd, atr_14, atr_multiplefloor(risk_budget_usd / (atr_multiple × atr_14))shares
bps_change v1new, old(new - old) × 10000bps
cagr v1ending, beginning, years(ending / beginning) ^ (1 / years) - 1ratio
cash_conversion v1fcf, net_incomefcf / net_incomeratio
cash_conversion_from_facts v1operating_cash_flow, capex, net_income(operating_cash_flow - capex) / net_incomeratio
dcf_enterprise_value v1fcf1, fcf2, fcf3, fcf4, fcf5, wacc, terminal_growthΣ fcf_t / (1+wacc)^t (t=1..5) + [fcf5 × (1+g) / (wacc − g)] / (1+wacc)^5USD
dcf_equity_value_per_share v1fcf1, fcf2, fcf3, fcf4, fcf5, wacc, terminal_growth, net_debt, shares(dcf_enterprise_value − net_debt) / sharesUSD/share
dcf_from_filings_per_share v1operating_cash_flow, capex, growth, wacc, terminal_growth, total_debt, cash_and_equivalents, sharesFCF0 = OCF − capex; EV = Σ FCF0(1+growth)^t / (1+wacc)^t (t=1..5) + [FCF0(1+growth)^5 (1+g) / (wacc − g)] / (1+wacc)^5; (EV − (debt − cash)) / sharesUSD/share
ebitda_v1 v1operating_income, depreciation_amortizationoperating_income + depreciation_amortizationUSD
ev_to_ebitda v1enterprise_value, ebitdaenterprise_value / ebitdaratio
ev_to_ebitda_from_facts v1market_cap_usd, total_debt, cash_and_equivalents, operating_income, depreciation_amortization(market_cap_usd + total_debt - cash_and_equivalents) / (operating_income + depreciation_amortization)ratio
fcf v1operating_cash_flow, capexoperating_cash_flow - capexUSD
gross_margin v1gross_profit, revenuegross_profit / revenueratio
guidance_within v1actual, guidance_low, guidance_highguidance_low <= actual <= guidance_high ? 1 : 0bool
identity v1valuevaluesame_as_input
interest_coverage v1ebit, interest_expenseebit / interest_expenseratio
interest_coverage_from_facts v1operating_income, interest_expenseoperating_income / interest_expenseratio
inventory_days v1average_inventory, cogs, days_in_periodaverage_inventory / cogs × days_in_perioddays
inventory_days_change_yoy v1inventory_new, inventory_prev, inventory_prev2, cogs_new, cogs_old, days_in_periodinventory_days(new) - inventory_days(old), each = average_inventory / cogs × daysdays
inventory_days_from_facts v1inventory_end, inventory_begin, cogs, days_in_period((inventory_end + inventory_begin) / 2) / cogs × days_in_perioddays
margin_change_bps v1operating_income_new, revenue_new, operating_income_old, revenue_old(operating_income_new / revenue_new - operating_income_old / revenue_old) × 10000bps
net_debt v1total_debt, cash_and_equivalentstotal_debt - cash_and_equivalentsUSD
net_debt_to_ebitda v1net_debt, ebitdanet_debt / ebitdaratio
net_debt_to_ebitda_from_facts v1total_debt, cash_and_equivalents, operating_income, depreciation_amortization(total_debt - cash_and_equivalents) / (operating_income + depreciation_amortization)ratio
net_margin v1net_income, revenuenet_income / revenueratio
operating_margin v1operating_income, revenueoperating_income / revenueratio
pct_change v1new, oldnew / old - 1ratio
revenue_growth v1new_revenue, old_revenuenew_revenue / old_revenue - 1ratio
surprise_pct v1actual, consensusactual / consensus - 1ratio
ttm_growth v1n1, n2, n3, n4, o1, o2, o3, o4(n1 + n2 + n3 + n4) / (o1 + o2 + o3 + o4) − 1ratio
ttm_sum v1q1, q2, q3, q4q1 + q2 + q3 + q4 (four single fiscal quarters, oldest → newest)input unit

10Known limitations

  • Expert Visual Pattern is not evaluated yet: its families are schema-complete but wait for the event-split labelled dataset. Until then the overall score is the weighted mean of the two evaluated pillars (35 / 50, renormalised) and is labelled as such — never a full three-pillar score.
  • Proxy and reduced families are labelled, not hidden: a family that implements a stand-in for the original requirement (buy/sell count ratio for dollar imbalance, ROE for ROIC, …) is scored as what it is and never counted as coverage of the original capability.
  • Capabilities without a free primary source are deferred rather than approximated: consensus estimates and guidance, M&A databases, liquidations, cross-venue spreads, EVM / Solana fund flows and smart-money labels, long-form disclosure text.
  • Where models lose points today: multi-step arithmetic (DCF, basis-point deltas) without a calculator tool; signal families whose candidate set is large enough that rebuilding history exhausts the call budget; empty-set answers. These are kept on purpose — they are where models differ.
  • Universe: US-listed common equities on NASDAQ / NYSE with a market cap and a bar on the cutoff session (warrants, units, rights, notes, preferreds out of scope); Hyperliquid perpetuals; CoinGecko top-500 tokens; GeckoTerminal pools; Hyperliquid leaderboard addresses. Sector / industry from SEC SIC codes.
  • A grader fix re-grades stored answers under a new grader version (no model is re-run, every model is affected equally). A harness change after a batch is frozen is written to the batch change log with a reason and the affected runs are re-run. A provider-side model update is a new revision; the old run stays in history.