First run
← Install with Docker · ← Install from source · Docs home
From an installed app to your first validated strategy in a few minutes. Everything here applies to both editions; where a step differs, the Docker-edition variant is called out.
Start the application
Section titled “Start the application”Docker edition (from the bundle folder):
docker compose up -d # stop with: docker compose downOpen http://localhost:8080.
Source install:
scripts/start.sh # stop with: scripts/stop.shThis starts the three host processes — the API, the worker, and the frontend dev
server — and runs database migrations. Logs are written under .run/; the dev server prints the
URL (typically http://localhost:5173).
Create your account and log in
Section titled “Create your account and log in”Holdout Lab is single-user. The first time you open it, register a username and password from the login
screen — this becomes the one account; registration refuses a second. (Equivalently, create it from
the CLI: cd backend && uv run python -m ats.cli create-user --username <you>.) Passwords are hashed
with Argon2id.
There is no email/password-reset flow by design (it’s your machine). Forgot your password? Reset
it locally — uv run python -m ats.cli reset-password --username <you> — which is exactly where the
login screen’s “Forgot password?” link points. See the
admin CLI.
Add your data key
Section titled “Add your data key”Open Settings (the gear in the header) and paste your free Tiingo token, then hit Test to
confirm the key actually works before you rely on it. Keys are stored locally (backend/.env on a
source install; a persistent Docker volume in the container edition) and never leave your machine.
(You can also add Databento, Telegram, Anthropic, and IB account ids here, each with its own Test —
see the configuration reference.)
After adding a data key, click Restart worker in the banner Settings shows you, so the worker can use it for ingestion. The Test works immediately; the restart is only needed to use the key — every other key applies on its own, as each key’s caption in Settings says.
No keys? The Getting started checklist’s crypto path needs none: ingest the crypto starter basket (free public data) and skip straight to backtesting.
Ingest some data
Section titled “Ingest some data”Go to the Data tab and ingest daily bars for a liquid ETF (e.g. SPY). Type a bare US ticker
(share classes hyphenated, BRK-B); the Symbol box validates it live and shows the instrument’s name
and available date range before you submit. The bars land in the local catalog,
which every backtest reads from. (Ticker formats, intraday, and crypto ingestion are covered in
ingestion.)
Run your first backtest
Section titled “Run your first backtest”Go to Backtests → pick a strategy from the library (e.g.
ibs_reversion), set the symbol and date range, and run a single backtest. The detail view shows
the full metrics, the candlestick chart with fills, the equity curve overlaid with buy-and-hold, a
drawdown subplot, the round-trip trades, and a Monte Carlo panel.
Validate it honestly
Section titled “Validate it honestly”A positive backtest means little on its own. Run the strategy through the gauntlet — the rule test, walk-forward, optimization, deflated Sharpe, and cost stress — and watch its readiness score on the Research tab. This is the heart of the product: see the gauntlet and the research ladder.
What you’re actually learning
Section titled “What you’re actually learning”The whole loop — ingest → backtest → validate → judge against buy-and-hold — is the discipline Holdout Lab exists to teach and enforce. When something survives the gauntlet, you can promote it to paper trading; only what survives that, and an explicit approval, can go live.
Back up your work
Section titled “Back up your work”Once you’ve ingested data and recorded runs, protect them. Settings → System shows the right backup path for your edition:
- Docker edition — data persists on named volumes; dump the database any time with the
pg_dumpcommand the panel shows. See Install with Docker → Backup & restore. - Source install — a Back up now button (DB + catalog +
.env→$ATS_BACKUP_DIR, default~/ATS-backups) and thescripts/restore.shrecovery command. Backups aren’t scheduled automatically until you install the launchd maintenance agent (scripts/install-launchd.sh) — the same panel nudges you if it’s off. See the production runbook for the full backup/restore drill.