Columns and types
These columns come from the same versioned logical catalog used by the query validator and engine. They describe the fields you can query. Some historical rows have missing values; fields absent from older shards can return typed NULL.
| backtest_uuid | VARCHAR |
| portfolio_uuid | VARCHAR |
| experiment_id | VARCHAR |
| author_type | VARCHAR |
| start_date | DATE |
| end_date | DATE |
| duration_days | INTEGER |
| date_range_bucket | VARCHAR |
| interval | VARCHAR |
| cadence | VARCHAR |
| asset_class | VARCHAR |
| has_options | BOOLEAN |
| memory_class | VARCHAR |
| baseline_symbol | VARCHAR |
| starting_cash | DOUBLE |
| stock_fee_amount | DOUBLE |
| stock_fee_type | VARCHAR |
| crypto_fee_amount | DOUBLE |
| crypto_fee_type | VARCHAR |
| tickers | VARCHAR[] |
| n_strategies | INTEGER |
| n_comparisons | INTEGER |
| n_indicator_instances | INTEGER |
| distinct_indicator_types | VARCHAR[] |
| distinct_action_types | VARCHAR[] |
| uses_temporal_gating | BOOLEAN |
| min_temporal_threshold_days | DOUBLE |
| signal_frequency_class | VARCHAR |
| traded | BOOLEAN |
| warnings | VARCHAR[] |
| percent_change | DOUBLE |
| sharpe_ratio | DOUBLE |
| sortino_ratio | DOUBLE |
| max_drawdown | DOUBLE |
| avg_drawdown | DOUBLE |
| ulcer_index | DOUBLE |
| ulcer_performance_index | DOUBLE |
| win_rate | DOUBLE |
| profit_factor | DOUBLE |
| avg_trade_pnl | DOUBLE |
| dollars_sold | DOUBLE |
| total_dividends | DOUBLE |
| total_fees | DOUBLE |
| risk_free_rate | DOUBLE |
| baseline_percent_change | DOUBLE |
| baseline_sharpe_ratio | DOUBLE |
| baseline_max_drawdown | DOUBLE |
| alpha_pct | DOUBLE |
| alpha_sharpe | DOUBLE |
| time_elapsed_ms | BIGINT |
| created_at | TIMESTAMP |
No matching rows. Clear the filter to see all records.
Current logical schema for lake.backtest_runs
Coverage and timing
Anonymized backtest corpus: one row per run; other backtest_* tables join on backtest_uuid.
`backtest_uuid` identifies a run. Select it whenever strategy examples are wanted: NexusTrade hydrates the full strategy JSON from `lake.backtest_strategies` by that id. `portfolio_uuid` is a stable anonymized portfolio hash. DEDUPLICATE ON `experiment_id` before any average, median or ranking. It hashes the strategy logic plus tickers plus window, and cloned or forked portfolios repeat one experiment under many `backtest_uuid`s (about 60% of rows are repeats), so an aggregate over raw rows measures what got cloned rather than what performed. Counting rows is fine. It is a hash: never pattern-match it. `author_type` is 'optimizer' for genetic-search output and 'unknown' otherwise. Filter `author_type <> 'optimizer'` for any question about what performs well: a genetic search is a population of attempts, not strategies anyone chose to keep, and it is about a third of the corpus. `tickers`, `distinct_indicator_types`, `distinct_action_types` and `warnings` are VARCHAR[]. Filter by overlap, e.g. `array_length(list_intersect(tickers, ['NVDA']::VARCHAR[])) > 0`. `asset_class` is equity, crypto, options or mixed. `cadence` is daily or intraday. `signal_frequency_class` is unconstrained, sub_daily, daily, weekly, monthly or quarterly. `alpha_pct` and the `baseline_*` columns are populated only for runs that carried validation statistics (nearly all options runs, very few daily-equity runs). Restrict to non-null rows before comparing them across asset classes. Return per day is `percent_change / duration_days`.
Run a limited query
Use a registered API key with lake scope. Select needed columns, bind user-supplied values and restrict dates when the table has a time dimension. Query results are durable parts with a schema and manifest rather than an unbounded in-memory array.
This reference documents the schema and its meaning. Run queries in your signed-in workspace; this page does not execute SQL or show private results and datasets.
SELECT "backtest_uuid", "portfolio_uuid", "experiment_id"
FROM lake.backtest_runs
LIMIT 20;