Backtesting Historical Data Access
Access to Rebyte Financial Data Service through the Relay Data API
(/api/data/financial). Two modes:
- SQL (
/sql) — read-only analytical SQL over every table (see the SQL patterns below for what works). Work in three steps: catalog → schema → query. - Semantic search (
/search) — vector search over historical datasets that carry content embeddings (currently news). Query by meaning, not keywords. This is data access, not a separate News subcommand.
This sub-skill belongs to the Backtesting pillar. Use it to discover tables,
inspect schemas, pull bars, validate coverage, or explore historical context
needed before a simulation. For recent/realtime provider data, use
../realtime-api-data/SKILL.md. For analysis structures without API calls, use
../financial-templates/SKILL.md.
Authentication
AUTH_TOKEN="$(rebyte-auth 2>/dev/null || jq -r '.sandbox.token' /home/user/.rebyte.ai/auth.json)"
API_URL="$(jq -r '.sandbox.relay_url // empty' /home/user/.rebyte.ai/auth.json 2>/dev/null || true)"
API_URL="${API_URL:-https://api.rebyte.ai}"
If AUTH_TOKEN is empty or null, report that authentication is unavailable and stop. Do not invent credentials.
1. The catalog — every served table
IMPORTANT — metadata SQL is unavailable.
SHOW TABLES,DESCRIBE, and anyinformation_schemaquery are not supported by the service and fail. Do NOT use them, do NOT retry them. The table below is the catalog; discover columns withSELECT * FROM <table> LIMIT 1(step 2).
US equities (identifier ticker; time column t unless noted):
| Table | Range | What it is |
|---|---|---|
us.eod |
2021-06 → present | Daily price and volume history for US stocks (open/high/low/close/volume). Prices are as-traded — NOT adjusted for splits or dividends. |
us.bars_1m |
2021-06 → present | Minute-by-minute price and volume for US stocks. Very large — always filter by ticker and a time window. |
us.fundamentals |
filings → present | Company financial statements as filed with the SEC — income statement, balance sheet, cash flow — one row per company per reporting period (annual, quarterly, or trailing-12-months). 200+ metric columns. |
us.news |
2016-06 → present | Financial news articles: timestamp, headline, related tickers, full text. The only table you can search by meaning — use /search. |
us.splits |
1978 → future-dated | Every stock split: which ticker, the effective date, and the ratio (e.g. 2-for-1). Needed to adjust raw prices across a split. |
us.dividends |
2000 → future-dated | Every cash dividend: ex-dividend date, payment date, amount per share, payout frequency. |
us.short_volume |
2024-02 → present | For each stock and day, how much of that day's trading volume came from short selling, broken down by trading venue. |
us.short_interest |
2017-12 → present | Total shares currently sold short per stock, reported twice a month, with average daily volume and how many days of trading it would take to cover. |
us.tickers |
snapshot | Master list of every US ticker, listed or delisted, with exchange, security type, and identifiers. Use it to build universes and join other tables. |
us.ipos |
2008 → present | Companies going public: announcement and listing dates, offer price and size, and current status of each offering. |
China A-shares (identifier ts_code e.g. 000001.SZ; time column trade_date/trade_time unless noted):
| Table | Range | What it is |
|---|---|---|
cn.bars_day |
1990-12 → present | Daily price and volume history for China A-shares, including the cumulative adjustment factor needed to compute split/dividend-adjusted prices. Time column t. |
cn.bars_1m |
2021-06 → present | Minute-by-minute price and volume for China A-shares. Very large — filter by stock and time window. |
cn.daily_basic |
2021-06 → present | Per-stock daily valuation and trading snapshot: price-to-earnings, price-to-book, turnover rate, market cap, share counts. |
cn.income |
2013 → present | Quarterly/annual income statements of listed Chinese companies: revenue, costs, profit, earnings per share. |
cn.balancesheet |
2013 → present | Balance sheets of listed Chinese companies: assets, liabilities, shareholder equity. |
cn.cashflow |
2013 → present | Cash-flow statements of listed Chinese companies: operating, investing, and financing cash flows. |
cn.fina_indicator |
2013 → present | Precomputed financial ratios per company per period: profitability (ROE, margins), leverage, liquidity, growth rates. |
cn.moneyflow |
2010 → present | For each stock and day, the net value of buying versus selling — was money flowing into or out of the stock. |
cn.top_list |
2010 → present | The exchanges' daily disclosure of stocks with unusual price moves or turnover: which stocks triggered it, why, and the net amount the most active trading desks bought or sold. |
Ranges are indicative (checked 2026-07); daily tables land the prior trading day, intraday is delayed.
2. Get a table's columns — before querying it
DESCRIBE does not work (see above). Read the real columns from a single row:
python3 scripts/anyfinancial_cli.py query "SELECT * FROM cn.bars_1m LIMIT 1"
curl -fsS -X POST "$API_URL/api/data/financial/sql" \
-H "Authorization: Bearer $AUTH_TOKEN" -H "Content-Type: application/json" \
-d '{"sql":"SELECT * FROM cn.bars_1m LIMIT 1","parameters":[]}' | jq '.'
The keys of the returned row are the column names. Do not guess column names.
3. Query
python3 scripts/anyfinancial_cli.py query "SELECT trade_time, o, h, l, c, v FROM cn.bars_1m WHERE ts_code = '000001.SZ' ORDER BY trade_time DESC LIMIT 10"
curl -fsS -X POST "$API_URL/api/data/financial/sql" \
-H "Authorization: Bearer $AUTH_TOKEN" -H "Content-Type: application/json" \
-d '{"sql":"SELECT trade_time, c FROM cn.bars_1m WHERE ts_code = '''000001.SZ''' ORDER BY trade_time DESC LIMIT 10","parameters":[]}' | jq '.'
Semantic search — find news by meaning (not keywords)
For news, prefer semantic search over ... WHERE content ILIKE '%...%'. You send a
natural-language text; the service embeds it server-side and returns the most
similar rows ranked by _score (higher = more relevant). No keys, no embedding on
your side.
python3 scripts/anyfinancial_cli.py search "Fed rate cut expectations" --columns title,published_utc,tickers
curl -fsS -X POST "$API_URL/api/data/financial/search" \
-H "Authorization: Bearer $AUTH_TOKEN" -H "Content-Type: application/json" \
-d '{"text":"Fed rate cut expectations","datasets":["us.news"],"limit":5,"additional_columns":["title","published_utc","tickers"]}' | jq '.'
Body fields: text (required, natural language) · datasets (default ["us.news"]
— the only dataset with embeddings today) · limit (default 5) · additional_columns
(optional extra columns returned in each result's data).
Each result: _score (similarity), matches.content (hit snippets), data (the
columns you named in additional_columns), dataset.
Only
us.newsis searchable today. Other tables are SQL-only — use the three-step SQL flow above for them.
SQL patterns
Write SQL using these verified patterns:
| Need | Use |
|---|---|
| Current time | now() |
| Truncate to period | date_trunc('day', trade_time) |
| Bucket into N-minute bars | date_bin(INTERVAL '5 minutes', trade_time, TIMESTAMP '1970-01-01') |
| Relative time filter | trade_time > now() - INTERVAL '7 days' |
| Parse a timestamp | to_timestamp('2024-01-01T00:00:00') |
| Part of a date | extract(year FROM trade_time) |
| Cast | CAST(x AS BIGINT) or arrow_cast(x, 'Int64') |
| String concat / match | `a |
| Paging | LIMIT 100 OFFSET 0 |
Do not use (they error — switch syntax, do not retry as-is):
DATEADD / DATEDIFF / GETDATE() (use now(), date_trunc, INTERVAL math),
TOP n (use LIMIT n), SELECT INTO, stored procedures, or vendor-specific functions.
Rules
- Read-only, one statement per request. Start with
SELECTorWITH(SHOW/DESCRIBE/EXPLAINare not supported by the service — don't use them). - No mutating statements (
INSERT,UPDATE,DELETE,DROP,ALTER,CREATE,TRUNCATE, …). - Project only needed columns and add
LIMITwhile exploring. - The catalog table (step 1) and a
SELECT * … LIMIT 1probe (step 2) are the source of truth for table and column names.
On error — do not loop
If a query fails, do not resubmit the same or a near-identical statement. Instead:
- Read the error message.
Invalid function/No field named …means unsupported SQL syntax or wrong column → fix it using the pattern table above and the table schema from step 2. - Change exactly one thing and retry.
- After 2–3 failed attempts, stop and report the exact failing SQL and the exact error. Do not keep retrying.