A research bench beside the desk, not a second trading desk
Trading Intelligence reads a market and writes an opinion. This is the other half: an agent that turns a thesis into code, tests it against 478 alpha factors, and reports Sharpe, drawdown, turnover and costs. I installed HKUDS Vibe-Trading as an evaluation bench — isolated from everything else on the server. It places no orders, and it will not until a result survives out-of-sample and then a paper account.
Someone else's factor library, my own discipline
Upstream is HKUDS/Vibe-Trading, MIT-licensed, built by the HKU data-science lab: a persona-driven multi-agent framework where analysts, a bull and a bear researcher, a risk debate and a portfolio manager work one instrument, plus an MCP server so other agents can call its tools. Three parts are worth my time:
Alpha Zoo
478 factors in one registry — WorldQuant Alpha101, Qlib158, academic and GTJA families — with a stated contract: a factor whose declared input is missing on a bar returns nothing, not a plausible number.
Backtest with frictions
Per-market rules rather than one generic engine: A-share T+1 and lot sizes, Hong Kong board lots, US half-days, crypto funding, commission and slippage models.
Paper accounts
A saved account matches orders or a strategy against completed bars and moves forward only. It never reaches a broker — the point is to find out what breaks before capital does.
Installed in minutes, because I did not build it
The server has one vCPU, 3.9 GB of RAM and already runs five stacks. Building the image locally means 388 npm packages and 197 Python packages — numpy, scipy, pandas, scikit-learn, matplotlib — compiled on that single core, with a memory peak around 1.5 GB and swap already half consumed. Half an hour of a monopolised CPU, and a real chance the OOM killer picks a neighbour.
So I pulled the published image instead, pinned by digest rather than the moving edge tag: 0.53 GB compressed, 26 seconds, 2.3 GB on disk. The container has its own bridge network, publishes no port, runs on a read-only root filesystem with every capability dropped, and is capped at 1.6 GB and one CPU. At rest it sits at about 220 MB. One ingress: Traefik terminates TLS with a Let's Encrypt certificate and asks for a password before the app is even reached.
Local builds
Prebuilt image, pinned by digest.
To pull
0.53 GB compressed, 13 layers.
On disk
No build cache left behind.
At rest
Inference is remote, not local.
Write the thesis, then try to kill it
Thesis to code
A plain-language idea becomes a modular strategy in Python: universe, signal, sizing, rebalance. The code is readable, so a bad idea is visible before it is measured.
Factor screening
Which of the 478 carries information on this universe, and with how many observations. A factor with too few IC points is skipped with a reason rather than reported as a signal.
Cost-aware backtests
Sharpe, CAGR, max drawdown, win rate, turnover and an estimate of slippage — because a strategy that dies on fees was never a strategy.
Shadow, then stop
Out-of-sample split, Monte-Carlo drawdown, then a paper account. If the edge does not survive the first two, there is no third step.
- No broker connected, no key with order permission, no capital.
- No claim that a backtest is an edge. It is a hypothesis with error bars.
- No autonomous execution — ever. A proposed order would be formatted, shown, and left waiting for a human.
- No performance figure published from a run that has not been tested out-of-sample.
One desk that reads a market and one bench that tries to falsify the reading. Keeping them separate forces the interesting question: when the two disagree, which one is wrong, and how would I know?
Runs on its own subdomain of this server, behind a login, outside the public site. Model inference is a metered remote API; every run has a cost before it has an opinion.
Look at the bench, not the marketing
The workspace is private, but the architecture, the hosting constraints and the rules above are the whole story. The strategy work happens next, in public increments.