Agentic Trading Lab
Talk to agents, and test trading ideas. Try AI trading agents on real market data with no code required.
AI translation
Agent-maintained Kalshi paper trading. Dashboard: https://consistently-not-stupid.sgunturi.workers.dev
Translation pending
FinancePython · JavaScriptGitHub @sankalpgunturiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
It is remarkable how much long-term advantage people like us have gotten by trying to be consistently not stupid, instead of trying to be very intelligent.
A paper trading desk for high-probability Kalshi contracts. It starts with $1,000 of simulated cash, reads the public book, and buys only when a favorite still makes sense after the Kalshi fee and the settled record. The aim is to avoid the stupid trade, not to invent a clever one.Read the full README ↗It is remarkable how much long-term advantage people like us have gotten by trying to be consistently not stupid, instead of trying to be very intelligent.
Charlie Munger
A paper trading desk for high-probability Kalshi contracts. It starts with $1,000 of simulated cash, reads the public book, and buys only when a favorite still makes sense after the Kalshi fee and the settled record. The aim is to avoid the stupid trade, not to invent a clever one.
The desk starts in paper mode. A Kalshi key is not required for the paper book. Public market data is enough. Switch to live trading on the dashboard: confirm the warning, choose $1 to $5,000, and approve. That amount is the most the desk may use. Orders then go to Kalshi with CST_KALSHI_API_KEY_ID and the PEM file at CST_KALSHI_PRIVATE_KEY_PATH.
A contract priced at 90¢ is not a gift. If that price is the true chance, buying it loses the fee. The desk treats cash as the default and buys only when all of this is true:
New buys pause if equity falls 5% from its peak, or if you pause them. If a held favorite's bid drops 8¢ under the price we paid, and the bid still has size, the desk sells. That can book a small loss. It is there so a broken quote does not turn into a total loss of the premium. A stop is not a promise that the account never goes down.
After each scan the desk writes a retrospective. The governor may only tighten a knob, one step, inside the rail. It cannot turn the fee rule off, and it cannot lower the 90% floor. With CST_OPENAI_API_KEY set, one Decisions call may drop a proposed clip, and a chat note may suggest drops. Neither can add a buy. A missing key or a bad response leaves the deterministic set.
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
cst serve
Open http://127.0.0.1:8000.
For continuous operation on this Mac, run .venv/bin/python tools/paper_service.py install. The macOS service starts at login, restarts after a crash, and prevents idle sleep while running. It reads .env from this checkout. Keep the Mac powered, awake, and connected; closing a laptop lid or shutting it down can interrupt the run. Use status, restart, or stop in place of install to manage the service. A restart loads code changes without resetting the account.
The runner scans every ten minutes and marks open positions every minute. Its log is data/logs/runner.log; the account and research record live in data/book.sqlite. Scans retain a source-code fingerprint, observation and evaluation times, the book before execution, settings, calibration, counts, refusals, equity, and favorite quotes. Trade records contain fills, fees, exits, and settlements. Retrospectives retain model concerns, proposed and applied changes, and model failures. These records are local and ignored by Git.
Run .venv/bin/python tools/paper_report.py for a read-only JSON retrospective with recent scans, reviews, trades, changes, and cash/fee/P&L reconciliation. Fills and settlements update the account in one database transaction; an interrupted write rolls back the whole operation.
cst cycle runs one scan in the terminal. cst simulate prints the separate model described below. cst reset returns the paper book to the starting cash and starts the paper window over. cst bench times the admission rule on a fixed fixture and, if a key is set, one Decisions call. It does not write the book.
Copy .env.example to .env to change the starting bankroll, the 90% bar, or the one-second quote-evaluation cadence. After the first run, learned knobs live in data/book.sqlite and survive a restart. The environment values are the seed, and the reset command restores them.
The status line stays Paper until you approve live trading. The strip under the thesis is the paper window: day count, net P&L after fees, resolved trades, hit rate, drawdown, and cash still in open clips. The simulation record shows archived observations and historical sample sizes separately from this account's results. A fill is an open position, not a confirmed win.
Open Activity & analysis for scan counts, reviews, and historical evidence. Settings contains controls and risk parameters. The scan splits its page budget across the next 24 hours, days 1–7, and days 7–21 within the configured limits. The earliest window receives twice the weight: four of the default eight pages. Each active contract still has to pass the entry rules. Coverage is partial.
You can pause new buys, block a contract, close a paper clip when the book has size, and tighten a risk knob by one step. You cannot force a buy the fee rule or the settled record refused. Those changes are listed under "What changed by hand." Mutating requests send the token from the page's own state.
"Closest look" is the buy, or the favorite that came nearest and was still refused, with the cents written out.
The equity line is the paper account, marked at the bid after an exit fee. A new clip usually shows a small dip equal to the spread and the fee. That dip is real friction, not a bug.
The table at the bottom is a model with a known true chance. It is not the live book.
The scan reads each favorite's series fee multiplier and applies 0.07 × multiplier × contracts × price × (1 − price). Unknown fee schedules are skipped. Paper buys cross the spread; fills and exit marks round the fee up to the next cent as a conservative approximation. The recorded entry fee schedule is retained for exit marks. Kalshi's account-specific precision and per-order rounding rebates are not simulated. See the series metadata and fee-rounding rules.
When you are ready to talk about real orders, the names in .env.example are the ones to fill:
CST_OPENAI_API_KEY. Optional. It lets the Decisions call drop a duplicate clip and lets the chat note read the tape. The desk still runs without it. The Decisions model is gpt-6-luna. The chat model is CST_OPENAI_MODEL.CST_KALSHI_API_KEY_ID and CST_KALSHI_PRIVATE_KEY_PATH. Paper mode ignores them. Live mode signs orders with them after you approve an amount on the dashboard.src/cst/fees.py — venue fee mathsrc/cst/venues/ — public Kalshi readssrc/cst/text.py — strict match for "same price", looser match for "same risk"src/cst/strategy.py — the admission rulesrc/cst/depth.py — fresh displayed size, read onlysrc/cst/decisions.py — one drop-only Decisions call per scansrc/cst/review.py — the governor, and the optional chat notesrc/cst/broker.py — paper fills, stops, settlementsrc/cst/store.py — the book, the audit, the operator overridessrc/cst/simulate.py — the separate modelsrc/cst/engine.py — the scan loopsrc/cst/dashboard/ — the page served at /docs/ARCHITECTURE.md — where to lookdocs/GAPS.md — choices still openAGENTS.md — how to work in this repoThe scan filters by closing time and excludes multivariate combos and inactive contracts. It reads a bounded number of pages. Activity & analysis shows the counts.
The fee formula and the public endpoints follow Kalshi's market-data quick start. The shape of the desk — a venue adapter, a paper broker, and a risk gate in front of any order — is the usual structure of paper-first prediction-market bots. The code here is original.
A favorite can settle at zero. Sizing and the pause line keep that from being the whole account. They do not repeal it.