尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 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.
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.查看完整 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.