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.
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
| Pillar | Sub-types |
|---|---|
| Financial Analysis | Retrieval · Calculation · Comparison / Trend · Risk / Position |
| Market & Signal | Screening · 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
| Tool | What it returns |
|---|---|
| list_metrics | List 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_equities | Screen the frozen US-listed equity universe (data as of YYYY-MM-DD) |
| get_equity_metrics | Fetch the frozen metric row for specific tickers. |
| get_market_history | Split-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_financials | RAW 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_perps | Screen the frozen Hyperliquid perpetual universe (data as of YYYY-MM-DD) |
| get_perp | Frozen metric row for one perpetual (coin symbol, e.g |
| get_perp_history | Daily 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_assets | Screen the frozen crypto asset (top tokens by market cap) universe (data as of YYYY-MM-DD) |
| get_crypto_asset | Frozen metric row for one token (symbol, SYMBOL:coingecko_id, coingecko id or name). |
| search_dex_pools | Screen the frozen DEX liquidity pool universe (data as of YYYY-MM-DD) |
| get_dex_pool | Frozen metric row for one pool (id as listed, e.g |
| search_addresses | Screen the frozen on-chain trading address (Hyperliquid accounts) universe (data as of YYYY-MM-DD) |
| get_address_profile | Frozen metric row for one address (0x…). |
| run_calculation | Run 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_answer | Hand 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)
| Family | Pillar · type | Domains | Tasks | Implements |
|---|---|---|---|---|
| F04-R Revenue Growth — six companies ranked | Financial Analysis · Calculation | Financial filings | 1 | original |
| F05-R10 CAGR — ten companies ranked | Financial Analysis · Calculation | Financial filings | 4 | original |
| F08-R EPS Growth (diluted) — six companies ranked | Financial Analysis · Calculation | Financial filings | 1 | original |
| F09 Free Cash Flow | Financial Analysis · Calculation | Financial filings | 1 | original |
| F15 Peer Comparison (growth ranking) | Financial Analysis · Comparison / Trend | Financial filings | 1 | original |
| F29 Trailing-twelve-month revenue | Financial Analysis · Calculation | Financial filings | 1 | original |
| J01 Statement Audit — Equity | Financial Analysis · Comparison / Trend | Equity, Financial filings | 39 | original |
| J02 Statement Audit — Perpetuals | Market & Signal · Signal detection | Crypto / Perp | 4 | original |
| J03 Restatement Screen | Financial Analysis · Comparison / Trend | Equity, Financial filings | 4 | original |
| J05 Statement Audit — Equity Technicals | Market & Signal · Signal detection | Equity | 4 | original |
| S-CR06-M Token DEX Liquidity Threshold (pools) — median of a rebuilt metric over the matches | Market & Signal · Screening | DEX pools | 4 | original |
| S-CR08-N Pool Buy/Sell Transaction-Count Imbalance — count of matches | Market & Signal · Signal detection | DEX pools | 1 | proxy 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 matches | Market & Signal · Signal detection | DEX pools | 3 | original |
| S-CR17-X Perp Trend Alignment (close > EMA20 > EMA50) — plus one more hidden condition | Market & Signal · Derived metric | Crypto / Perp | 1 | original |
| S-CR18-A Perp RSI Range + Positive Trend — count, mean and median of a rebuilt metric over the matches | Market & Signal · Derived metric | Crypto / Perp | 4 | original |
| S-CR19-N Perp Volatility Expansion (ATR% threshold) — count of matches | Market & Signal · Derived metric | Crypto / Perp | 1 | original |
| S-EQ01-XX Size Screen — plus two more hidden conditions | Market & Signal · Screening | Equity | 4 | original |
| S-EQ02-XX Liquidity Screen — plus two more hidden conditions | Market & Signal · Screening | Equity | 4 | original |
| S-EQ04-XX Unusual Volume — plus two more hidden conditions | Market & Signal · Signal detection | Equity | 4 | original |
| S-EQ05-X First Breakout 20D — plus one more hidden condition | Market & Signal · Signal detection | Equity | 4 | original |
| S-EQ06-XX-N Breakout (N-day high) — plus two more hidden conditions — count of matches | Market & Signal · Signal detection | Equity | 3 | original |
| S-EQ07-XX-N Breakdown 60D — plus two more hidden conditions — count of matches | Market & Signal · Signal detection | Equity | 3 | original |
| S-EQ09-X Moving Average Cross (EMA20 above EMA50 today) — plus one more hidden condition | Market & Signal · Signal detection | Equity | 3 | original |
| S-EQ10-XX Pullback in Uptrend — plus two more hidden conditions | Market & Signal · Screening | Equity | 4 | original |
| S-EQ11-A RSI Range — count, mean and median of a rebuilt metric over the matches | Market & Signal · Derived metric | Equity | 4 | original |
| S-EQ12-XX Oversold / Overbought (RSI) — plus two more hidden conditions | Market & Signal · Signal detection | Equity | 4 | original |
| S-EQ13-XX ATR Volatility — plus two more hidden conditions | Market & Signal · Derived metric | Equity | 4 | original |
| S-EQ14 Gap Up | Market & Signal · Signal detection | Equity | 3 | original |
| S-EQ15-M Gap + Volume — median of a rebuilt metric over the matches | Market & Signal · Signal detection | Equity | 1 | original |
| S-EQ16-XX Relative Strength vs Index — plus two more hidden conditions | Market & Signal · Derived metric | Equity | 4 | original |
| S-EQ18-A Low-Drawdown Leader — count, mean and median of a rebuilt metric over the matches | Market & Signal · Screening | Equity | 4 | original |
| S-EQ19-XX-N Revenue Growth Screen — plus two more hidden conditions — count of matches | Market & Signal · Screening | Equity | 4 | original |
| S-EQ20-XX EPS Growth Screen — plus two more hidden conditions | Market & Signal · Screening | Equity | 4 | original |
| S-EQ21-XX Growth Acceleration — plus two more hidden conditions | Market & Signal · Signal detection | Equity | 4 | original |
| S-EQ22-A Profitability Screen (gross + operating margin) — count, mean and median of a rebuilt metric over the matches | Market & Signal · Screening | Equity | 4 | original |
| S-EQ23-XX-N Quality Screen (ROE + operating margin as proxies) — plus two more hidden conditions — count of matches | Market & Signal · Screening | Equity | 4 | proxy 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 matches | Market & Signal · Screening | Equity | 4 | original |
| S-EQ25-A Growth + Valuation (trailing P/E as a proxy for EV/Sales) — count, mean and median of a rebuilt metric over the matches | Market & Signal · Screening | Equity | 4 | proxy 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 conditions | Market & Signal · Screening | Equity | 4 | proxy of PRD S-EQ25 growth + EV/Sales valuation screen |
| S-EQ26 Cash Flow Quality (FCF margin) | Market & Signal · Screening | Equity | 4 | original |
| S-EQ29-XX Breakout with Exclusion — plus two more hidden conditions | Market & Signal · Screening | Equity | 4 | original |
| S-EQ33 Market-cap Bucket Ranking | Market & Signal · Ranking / Top-K | Equity | 4 | original |
| S-EQ34-N Multi-period Consistency — count of matches | Market & Signal · Screening | Equity | 4 | original |
| S-X06 Compound Screen with Staged Narrative (liquidity → growth → momentum → rank) | Market & Signal · Multi-step | Equity | 4 | original |
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
| Metric | Domain | Definition | Formula | Unit |
|---|---|---|---|---|
| ath_drawdown_pct v1 | Crypto / Token | Current price / all-time-high price − 1 (≤ 0). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | current_price / ath - 1 | ratio |
| circulating_supply v1 | Crypto / Token | Tokens in circulation. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | circulating_supply | tokens |
| fdv_market_cap_ratio v1 | Crypto / Token | Fully diluted valuation divided by market cap (≥ 1; large values = heavy future unlocks). | token_fdv_usd / token_market_cap_usd | ratio |
| is_stablecoin v1 | Crypto / Token | True 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 v1 | Crypto / Token | Rank 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_rank | rank |
| market_cap_tvl_ratio v1 | Crypto / Token | Token market cap divided by protocol TVL (only for protocol tokens). | token_market_cap_usd / tvl_usd | ratio |
| token_fdv_usd v1 | Crypto / Token | Fully diluted valuation = fully diluted supply × reference price. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | total_supply × current_price | USD |
| token_market_cap_usd v1 | Crypto / Token | circulating_supply × reference price. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | circulating_supply × current_price | USD |
| token_price_change_24h_pct v1 | Crypto / Token | Price 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 / 100 | ratio · 24H |
| token_price_change_7d_pct v1 | Crypto / Token | Price 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 / 100 | ratio · 7D |
| token_price_usd v1 | Crypto / Token | Reference price in USD. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | current_price | USD |
| token_volume_24h_usd v1 | Crypto / Token | Notional traded across venues over the past 24 hours. Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | total_volume | USD · 24H |
| total_supply v1 | Crypto / Token | Total minted supply (excluding burned). Source: CoinGecko /coins/markets (keyless), top tokens by market cap at snapshot time. | total_supply | tokens |
| tvl_change_7d_pct v1 | Crypto / Token | Protocol TVL now vs 7 days ago, minus one (ratio). Source: DefiLlama. | protocol.change_7d / 100 | ratio · 7D |
| tvl_usd v1 | Crypto / Token | Total 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.tvl | USD |
| volume_market_cap_ratio v1 | Crypto / Token | 24h volume divided by market cap (ratio: 0.3 = 30%). | token_volume_24h_usd / token_market_cap_usd | ratio |
| funding_annualized_pct v2 | Crypto / Perp | Hourly 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 v1 | Crypto / Perp | Current funding rate per hour as a fraction — the rate Hyperliquid actually pays each hour (venue field `funding`). | funding | ratio |
| funding_rate_8h v2 | Crypto / Perp | 8-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 × 8 | ratio |
| mark_price_usd v1 | Crypto / Perp | Venue mark price at snapshot time. | markPx | USD |
| oi_change_24h_pct v2 | Crypto / Perp | USD-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] − 1 | ratio · 24H |
| oi_change_7d_pct v1 | Crypto / Perp | Open 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] - 1 | ratio · 7D |
| oi_reference_24h_offset_seconds v1 | Crypto / Perp | Signed 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 v1 | Crypto / Perp | USD-notional open interest at the reference snapshot used for oi_change_24h_pct. | open_interest_usd[ref] | USD |
| open_interest_usd v1 | Crypto / Perp | Open interest in base units × mark price. | openInterest × markPx | USD |
| perp_atr_pct_14 v1 | Crypto / Perp | 14-day Wilder ATR divided by the current daily close. | ATR(14) / close | ratio · 14D |
| perp_breakout_30d v1 | Crypto / Perp | Current daily close above the previous 30-session high. | perp_close > perp_previous_high_30d | bool · 30D |
| perp_ema_20 v1 | Crypto / Perp | 20-day exponential moving average of daily closes. | EMA(close, 20) | USD · 20D |
| perp_ema_50 v1 | Crypto / Perp | 50-day exponential moving average of daily closes. | EMA(close, 50) | USD · 50D |
| perp_previous_high_30d v1 | Crypto / Perp | Highest daily high over the 30 complete sessions before the current one. | max(high[t-30..t-1]) | USD · 30D |
| perp_return_30d v1 | Crypto / Perp | Daily close today / daily close 30 sessions ago − 1 (Hyperliquid 1d candles). | close[t] / close[t-30] - 1 | ratio · 30D |
| perp_return_7d v1 | Crypto / Perp | Daily close today / daily close 7 sessions ago − 1 (Hyperliquid 1d candles). | close[t] / close[t-7] - 1 | ratio · 7D |
| perp_rsi_14 v1 | Crypto / Perp | 14-day Wilder RSI on daily closes. | RSI(close, 14) | index · 14D |
| perp_trend_alignment v1 | Crypto / Perp | Daily close > EMA20 > EMA50. | perp_close > perp_ema_20 > perp_ema_50 | bool |
| perp_volume_ratio_7d v1 | Crypto / Perp | Current 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 v1 | Crypto / Perp | Mark 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 v1 | Crypto / Perp | Notional traded over the last 24 hours. | dayNtlVlm | USD · 24H |
| buy_sell_txn_ratio v1 | DEX pools | Buy swap count divided by sell swap count over 24h (transaction counts, NOT volume — the free feed has no per-side volume). | buys_24h / sells_24h | ratio · 24H |
| buyer_seller_ratio v1 | DEX pools | Distinct buyers divided by distinct sellers over 24h (breadth of demand). | buyers_24h / sellers_24h | ratio · 24H |
| buyers_24h v1 | DEX pools | Distinct 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.buyers | count · 24H |
| buys_24h v1 | DEX pools | Number 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.buys | count · 24H |
| network v1 | DEX pools | GeckoTerminal network id of the pool (eth, solana, base, bsc, …). | network | category |
| pool_age_days v1 | DEX pools | Days 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) / 1d | days |
| pool_fdv_usd v1 | DEX pools | Fully 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_usd | USD |
| pool_liquidity_usd v1 | DEX pools | Total 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_usd | USD |
| pool_market_cap_usd v1 | DEX pools | Market 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_usd | USD |
| pool_price_change_24h_pct v1 | DEX pools | Base-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 / 100 | ratio · 24H |
| pool_volume_24h_usd v1 | DEX pools | USD 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.h24 | USD · 24H |
| sellers_24h v1 | DEX pools | Distinct 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.sellers | count · 24H |
| sells_24h v1 | DEX pools | Number 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.sells | count · 24H |
| token_dex_liquidity_usd v1 | DEX pools | Sum 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 v1 | DEX pools | 24h pool volume divided by pool liquidity (turnover of the pool). | pool_volume_24h_usd / pool_liquidity_usd | ratio · 24H |
| above_earnings_day_high v1 | Equity | True 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 v1 | Equity | Wilder average true range over 14 sessions. | wilder_mean(true_range, 14) | USD · 14D |
| atr_pct_14 v1 | Equity | ATR 14 divided by the current close. | atr_14 / close | ratio · 14D |
| avg_dollar_volume_20d v1 | Equity | Mean of close × volume over the 20 complete sessions before the current one. | mean(close × volume)[t-20..t-1] | USD · 20D |
| avg_volume_20d v1 | Equity | Mean share volume over the 20 complete sessions before the current one. | mean(volume[t-20..t-1]) | shares · 20D |
| breakdown_60d v1 | Equity | True when the current close is below the previous 60-session low. | close[t] < previous_low_60d | bool · 60D |
| breakout_20d v1 | Equity | True when the current close is above the previous 20-session high. | close[t] > previous_high_20d | bool · 20D |
| breakout_20d_first v1 | Equity | True 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 v1 | Equity | True when the current close is above the previous 252-session high. | close[t] > previous_high_252d | bool · 252D |
| breakout_30d v1 | Equity | True when the current close is above the previous 30-session high. | close[t] > previous_high_30d | bool · 30D |
| breakout_30d_first v1 | Equity | True 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 v1 | Equity | True when the current close is above the previous 60-session high. | close[t] > previous_high_60d | bool · 60D |
| days_since_earnings v1 | Equity | Number 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 v1 | Equity | Exponential 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 v1 | Equity | Exponential 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 v1 | Equity | Exponential 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 v1 | Equity | True 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 v1 | Equity | True when EMA50 > EMA200 on the current session (uptrend structure). | ema_50 > ema_200 | bool · 200D |
| eps_diluted_yoy_latest_q v1 | Equity | Diluted 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] − 1 | ratio · 1Q |
| exchange v1 | Equity | Primary listing exchange code (NAS = Nasdaq, NYS = NYSE). | vendor exchange | category |
| fcf_margin_latest_fy v1 | Equity | (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 v1 | Equity | Current session open relative to the previous close, minus one. | open[t] / close[t-1] - 1 | ratio · 1D |
| gross_margin_latest v1 | Equity | gross_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 v1 | Equity | Industry classification from the sector source recorded in the snapshot's sourceVersions (null when unmapped). | sector source | category |
| last_earnings_date v1 | Equity | Date 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 v1 | Equity | True when close > EMA20 > EMA50 > EMA200 on the current session. | close > ema_20 > ema_50 > ema_200 | bool · 200D |
| market_cap_bucket v1 | Equity | SMALL when market cap < $2B, MID when $2B–$10B (inclusive), LARGE when > $10B, at the data cutoff. | bucket(market_cap_usd) | category |
| market_cap_usd v1 | Equity | Company-level outstanding shares × reference close price at data cutoff. | total_shares × close | USD |
| max_drawdown_120d v1 | Equity | Largest peak-to-trough decline of the adjusted close over the last 120 sessions (current included). | max((peak - close) / peak) | ratio · 120D |
| net_margin_latest v1 | Equity | net_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 v1 | Equity | operating_income / revenue for the latest fiscal year that reports revenue (latest filing copy per period). | operating_income[FY] / revenue[FY] | ratio · 1FY |
| pb v1 | Equity | Vendor-reported price-to-book ratio at the data cutoff. | price / book_value_per_share | ratio |
| pb_filings v1 | Equity | market_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 v1 | Equity | Share of the last 120 sessions whose close was above that session's EMA50. | count(close > ema_50) / 120 | ratio · 120D |
| pe_ttm v1 | Equity | Vendor-reported trailing-twelve-month price/earnings ratio at the data cutoff (null when earnings ≤ 0). | price / eps_ttm | ratio |
| pe_ttm_filings v1 | Equity | market_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 v1 | Equity | post_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 v2 | Equity | Close 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] − 1 | ratio |
| previous_high_20d v1 | Equity | Maximum high over the 20 complete sessions before the current one (current excluded). | max(high[t-20..t-1]) | USD · 20D |
| previous_high_252d v1 | Equity | Maximum high over the 252 complete sessions before the current one (current excluded). | max(high[t-252..t-1]) | USD · 252D |
| previous_high_30d v1 | Equity | Maximum high over the 30 complete sessions before the current one (current excluded). | max(high[t-30..t-1]) | USD · 30D |
| previous_high_60d v1 | Equity | Maximum high over the 60 complete sessions before the current one (current excluded). | max(high[t-60..t-1]) | USD · 60D |
| previous_low_60d v1 | Equity | Minimum low over the 60 complete sessions before the current one. | min(low[t-60..t-1]) | USD · 60D |
| price_usd v1 | Equity | Raw (unadjusted) close of the current session. | raw_close | USD |
| pullback_from_5d_high_pct v1 | Equity | One 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 v1 | Equity | Split-adjusted close now divided by the close 120 trading sessions ago, minus one. | close[t] / close[t-120] - 1 | ratio · 120D |
| return_120d_vs_spx v1 | Equity | Ticker 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 v1 | Equity | Split-adjusted close now divided by the close 1 trading sessions ago, minus one. | close[t] / close[t-1] - 1 | ratio · 1D |
| return_20d v1 | Equity | Split-adjusted close now divided by the close 20 trading sessions ago, minus one. | close[t] / close[t-20] - 1 | ratio · 20D |
| return_20d_vs_spx v1 | Equity | Ticker 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 v1 | Equity | Split-adjusted close now divided by the close 5 trading sessions ago, minus one. | close[t] / close[t-5] - 1 | ratio · 5D |
| return_60d v1 | Equity | Split-adjusted close now divided by the close 60 trading sessions ago, minus one. | close[t] / close[t-60] - 1 | ratio · 60D |
| return_60d_vs_spx v1 | Equity | Ticker 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 v1 | Equity | True when the latest quarter's revenue YoY growth exceeds the previous quarter's. | revenue_yoy_latest_q > revenue_yoy_prev_q | bool |
| revenue_yoy_3q_min v1 | Equity | Minimum 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 v1 | Equity | Single-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] − 1 | ratio · 1Q |
| revenue_yoy_prev_q v1 | Equity | Same 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] − 1 | ratio · 1Q |
| roe_latest v1 | Equity | net_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 v1 | Equity | Wilder relative strength index over 14 sessions (SMA seed, then Wilder smoothing). | 100 - 100 / (1 + avg_gain / avg_loss) | index · 14D |
| sector v1 | Equity | Sector classification from the sector source recorded in the snapshot's sourceVersions (null when unmapped). | sector source | category |
| turnover_ratio v1 | Equity | Vendor-reported daily turnover (volume / float shares). | volume / free_share | % |
| volume_ratio_20d v1 | Equity | Current session volume divided by the 20-day average volume. | volume[t] / avg_volume_20d | ratio · 20D |
| account_value_usd v1 | On-chain | Total account equity (margin + unrealized) per the Hyperliquid leaderboard at the frozen file's Last-Modified time. | Hyperliquid leaderboard.accountValue | USD |
| chain v1 | On-chain | Venue the address was sampled from (v0.1: always "hyperliquid"). | adapter | category |
| closed_trades_30d v1 | On-chain | Number of closing fills with non-zero closedPnl over the trailing 30 days in the stored Hyperliquid fills. | count(closes) | count · 30D |
| fills_observed_days v1 | On-chain | Days 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 v1 | On-chain | Coin 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 v1 | On-chain | 1-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 v1 | On-chain | Margin currently locked by open positions (marginSummary.totalMarginUsed), per Hyperliquid clearinghouseState at capture time. | clearinghouseState.marginSummary.totalMarginUsed | USD |
| max_leverage v1 | On-chain | Highest 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 v1 | On-chain | Number of coins with a non-zero perp position, per Hyperliquid clearinghouseState at capture time. | count(position.szi ≠ 0) | count |
| pnl_all_time_usd v1 | On-chain | Realized + unrealized PnL of the account over the all time window, per the Hyperliquid leaderboard (window "allTime"). | Hyperliquid leaderboard.pnl | USD · ALL_TIME |
| pnl_day_usd v1 | On-chain | Realized + unrealized PnL of the account over the trailing day window, per the Hyperliquid leaderboard (window "day"). | Hyperliquid leaderboard.pnl | USD · DAY |
| pnl_month_usd v1 | On-chain | Realized + unrealized PnL of the account over the trailing month window, per the Hyperliquid leaderboard (window "month"). | Hyperliquid leaderboard.pnl | USD · MONTH |
| pnl_week_usd v1 | On-chain | Realized + unrealized PnL of the account over the trailing week window, per the Hyperliquid leaderboard (window "week"). | Hyperliquid leaderboard.pnl | USD · WEEK |
| position_BTC_usd v1 | On-chain | Signed 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 BTC | USD |
| position_ETH_usd v1 | On-chain | Signed 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 ETH | USD |
| position_HYPE_usd v1 | On-chain | Signed 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 HYPE | USD |
| position_SOL_usd v1 | On-chain | Signed 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 SOL | USD |
| realized_pnl_30d_fills v1 | On-chain | Sum of closedPnl over all stored Hyperliquid fills of the trailing 30 days (before funding). | Σ closedPnl | USD · 30D |
| roi_all_time v1 | On-chain | Return over the all time window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard. | Hyperliquid leaderboard.roi | ratio · ALL_TIME |
| roi_day v1 | On-chain | Return over the trailing day window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard. | Hyperliquid leaderboard.roi | ratio · DAY |
| roi_month v1 | On-chain | Return over the trailing month window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard. | Hyperliquid leaderboard.roi | ratio · MONTH |
| roi_week v1 | On-chain | Return over the trailing week window relative to deposits (vendor definition, NOT relative to initial equity), per the Hyperliquid leaderboard. | Hyperliquid leaderboard.roi | ratio · WEEK |
| total_notional_usd v1 | On-chain | Total 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.totalNtlPos | USD |
| unrealized_pnl_usd v1 | On-chain | Sum of unrealizedPnl across open positions, per Hyperliquid clearinghouseState at capture time. | Σ position.unrealizedPnl | USD |
| volume_all_time_usd v1 | On-chain | Notional perp volume traded over the all time window, per the Hyperliquid leaderboard. | Hyperliquid leaderboard.vlm | USD · ALL_TIME |
| volume_day_usd v1 | On-chain | Notional perp volume traded over the trailing day window, per the Hyperliquid leaderboard. | Hyperliquid leaderboard.vlm | USD · DAY |
| volume_month_usd v1 | On-chain | Notional perp volume traded over the trailing month window, per the Hyperliquid leaderboard. | Hyperliquid leaderboard.vlm | USD · MONTH |
| volume_week_usd v1 | On-chain | Notional perp volume traded over the trailing week window, per the Hyperliquid leaderboard. | Hyperliquid leaderboard.vlm | USD · WEEK |
| win_rate_30d v1 | On-chain | Share 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 / closes | ratio · 30D |
| capex v1 | Financial filings | Payments for property, plant and equipment, stored as a POSITIVE outflow magnitude. | abs(canonical_fact) | USD |
| cash_and_equivalents v1 | Financial filings | Cash and cash equivalents at period end (excludes marketable securities). | canonical_fact | USD |
| cogs v1 | Financial filings | Cost of revenue for the period. | canonical_fact | USD |
| depreciation_amortization v1 | Financial filings | Depreciation, depletion and amortization for the period, from the cash-flow statement. | canonical_fact | USD |
| dividends_paid v1 | Financial filings | Cash dividends paid during the period, stored as a POSITIVE outflow magnitude. | abs(canonical_fact) | USD |
| ebit v1 | Financial filings | Earnings before interest and taxes (GAAP operating income unless the task states otherwise). | canonical_fact | USD |
| eps_basic v1 | Financial filings | GAAP basic earnings per share. | canonical_fact | USD/share |
| eps_diluted v1 | Financial filings | GAAP diluted earnings per share. | canonical_fact | USD/share |
| gross_profit v1 | Financial filings | Revenue minus cost of revenue. | canonical_fact | USD |
| interest_expense v1 | Financial filings | Interest expense for the period. | canonical_fact | USD |
| inventory v1 | Financial filings | Inventories at period end. | canonical_fact | USD |
| net_income v1 | Financial filings | GAAP net income attributable to the company. | canonical_fact | USD |
| operating_cash_flow v1 | Financial filings | Net cash from operating activities. | canonical_fact | USD |
| operating_income v1 | Financial filings | GAAP operating income for the period. | canonical_fact | USD |
| revenue v1 | Financial filings | Total net revenue for the fiscal period. | canonical_fact | USD |
| share_repurchase v1 | Financial filings | Cash paid to repurchase common stock during the period, stored as a POSITIVE outflow magnitude. | abs(canonical_fact) | USD |
| shares_outstanding v1 | Financial filings | Common shares outstanding at period end. | canonical_fact | shares |
| total_assets v1 | Financial filings | Total assets at period end. | canonical_fact | USD |
| total_debt v1 | Financial filings | Short-term + long-term borrowings (incl. current portion), excluding leases. | canonical_fact | USD |
| total_equity v1 | Financial filings | Total stockholders' equity at period end. | canonical_fact | USD |
09Formulas (32, each with an independent verification implementation)
Show all formulas
| Formula | Inputs | Expression | Output |
|---|---|---|---|
| absolute_change v1 | new, old | new - old | same_as_input |
| atr_position_size v1 | risk_budget_usd, atr_14, atr_multiple | floor(risk_budget_usd / (atr_multiple × atr_14)) | shares |
| bps_change v1 | new, old | (new - old) × 10000 | bps |
| cagr v1 | ending, beginning, years | (ending / beginning) ^ (1 / years) - 1 | ratio |
| cash_conversion v1 | fcf, net_income | fcf / net_income | ratio |
| cash_conversion_from_facts v1 | operating_cash_flow, capex, net_income | (operating_cash_flow - capex) / net_income | ratio |
| dcf_enterprise_value v1 | fcf1, fcf2, fcf3, fcf4, fcf5, wacc, terminal_growth | Σ fcf_t / (1+wacc)^t (t=1..5) + [fcf5 × (1+g) / (wacc − g)] / (1+wacc)^5 | USD |
| dcf_equity_value_per_share v1 | fcf1, fcf2, fcf3, fcf4, fcf5, wacc, terminal_growth, net_debt, shares | (dcf_enterprise_value − net_debt) / shares | USD/share |
| dcf_from_filings_per_share v1 | operating_cash_flow, capex, growth, wacc, terminal_growth, total_debt, cash_and_equivalents, shares | FCF0 = 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)) / shares | USD/share |
| ebitda_v1 v1 | operating_income, depreciation_amortization | operating_income + depreciation_amortization | USD |
| ev_to_ebitda v1 | enterprise_value, ebitda | enterprise_value / ebitda | ratio |
| ev_to_ebitda_from_facts v1 | market_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 v1 | operating_cash_flow, capex | operating_cash_flow - capex | USD |
| gross_margin v1 | gross_profit, revenue | gross_profit / revenue | ratio |
| guidance_within v1 | actual, guidance_low, guidance_high | guidance_low <= actual <= guidance_high ? 1 : 0 | bool |
| identity v1 | value | value | same_as_input |
| interest_coverage v1 | ebit, interest_expense | ebit / interest_expense | ratio |
| interest_coverage_from_facts v1 | operating_income, interest_expense | operating_income / interest_expense | ratio |
| inventory_days v1 | average_inventory, cogs, days_in_period | average_inventory / cogs × days_in_period | days |
| inventory_days_change_yoy v1 | inventory_new, inventory_prev, inventory_prev2, cogs_new, cogs_old, days_in_period | inventory_days(new) - inventory_days(old), each = average_inventory / cogs × days | days |
| inventory_days_from_facts v1 | inventory_end, inventory_begin, cogs, days_in_period | ((inventory_end + inventory_begin) / 2) / cogs × days_in_period | days |
| margin_change_bps v1 | operating_income_new, revenue_new, operating_income_old, revenue_old | (operating_income_new / revenue_new - operating_income_old / revenue_old) × 10000 | bps |
| net_debt v1 | total_debt, cash_and_equivalents | total_debt - cash_and_equivalents | USD |
| net_debt_to_ebitda v1 | net_debt, ebitda | net_debt / ebitda | ratio |
| net_debt_to_ebitda_from_facts v1 | total_debt, cash_and_equivalents, operating_income, depreciation_amortization | (total_debt - cash_and_equivalents) / (operating_income + depreciation_amortization) | ratio |
| net_margin v1 | net_income, revenue | net_income / revenue | ratio |
| operating_margin v1 | operating_income, revenue | operating_income / revenue | ratio |
| pct_change v1 | new, old | new / old - 1 | ratio |
| revenue_growth v1 | new_revenue, old_revenue | new_revenue / old_revenue - 1 | ratio |
| surprise_pct v1 | actual, consensus | actual / consensus - 1 | ratio |
| ttm_growth v1 | n1, n2, n3, n4, o1, o2, o3, o4 | (n1 + n2 + n3 + n4) / (o1 + o2 + o3 + o4) − 1 | ratio |
| ttm_sum v1 | q1, q2, q3, q4 | q1 + 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.