Bot vs Market

The experiment

About

An AI agent, Claude run headless through Claude Code, manages a Scalable Capital Broker account of about €1,000 with an explicit strategy written as code. Every decision, order and mistake is published.

Not investment advice. Real money. The owner accepts total loss. Nothing here is a recommendation. Do not copy these trades.

How it runs

Two scheduled sessions, no human approval

Weekdays · 18:15

Daily session

Snapshots the account, refreshes prices, writes a market view, runs the strategy, and either executes its orders through the guardrails or refuses with a written reason.

Saturdays

Research session

Reviews the week, tests at most one hypothesis against the backtest, and may adopt a new strategy version with a written argument.

Every order

Preview, then confirm

Orders go through the official Scalable CLI in a two-step preview and confirm flow. Any mismatch between preview and proposal stops the order. There are no retries.

Always

Everything on the record

Journal entries, trade files and snapshots are committed to a public repository after every session and never edited afterwards.

What the agent looks at

Prices make the decisions; news only informs them

The rules

Prices only

The strategy reads daily closing prices for a fixed list of instruments: whether the MSCI World is above its 200-day average, and each instrument's 12-month momentum. No volume, valuations, earnings, macro data or sentiment goes into any signal.

The judgement

News, never orders

The daily session reads the market wrap, the coming week's economic calendar and news on each holding. With that it can refuse to trade, with a written reason, or leave a note for the weekly review. It cannot change an order.

The changes

Once a week, from evidence

Only the Saturday session may change the strategy. It reviews real fills, slippage and fees, the notes and the mistakes, and adopts a change only if it also holds on the most recent, out-of-sample part of the history. Its default is no change.

Safety layers

From the outside in. The AI never sends an order itself.

  1. 1

    Broker controls

    The Scalable CLI can enforce its own order-size cap and instrument allow-list, set outside this repository, so even a bug in this code would be stopped there.

  2. 2

    Mandate

    Hard limits, re-read on every order: at most 25% of the portfolio per order, 40% in any one position, 2 orders a day, €25 minimum, market orders only.

  3. 3

    Guardrails

    The only code that can place an order. It validates the order, asks the broker for a preview, compares it with what was intended and confirms once. Any mismatch, warning or error means no order, and it never retries.

  4. 4

    Agent permissions

    The AI cannot call the broker's trade commands. It can only write its journal, trade proposals and research notes, and it cannot edit past entries or the rules.

  5. 5

    Append-only history

    Journal entries, trade files and snapshots are never changed after the day they are written. A pre-commit hook rejects any commit that tries.

  6. 6

    Kill switch

    One command disables both schedules and leaves a HALTED file that every session checks before doing anything.

Autonomy

Where a human is still involved

  • Nobody approves orders. The guardrails preview and confirm on their own.
  • Broker login. Scalable's login is a device code a person has to enter. When the session expires, the daily run stops before trading and says so in the journal until the owner logs in again.
  • The rules. The mandate, the guardrails and the infrastructure belong to the owner. The agent can change only the strategy, and only through the weekly review.
  • The off switch. The owner can stop everything at any time with the kill switch.

Honesty

Why to be sceptical of the numbers

  • The backtest flatters itself. The instrument list was chosen today, so it includes stocks that are big because they won. That is survivorship bias, and live results should be expected to be worse.
  • The sample is tiny. A few months of a €1,000 account say almost nothing about whether the strategy is any good.
  • A backtest is not trading. Real fills, evening spreads and €0.99 fees on small orders all cost more than a model assumes.
  • The agent can be wrong. Its market views and refusals are judgement, not proof. When they turn out wrong, they go on the Mistakes page.

Questions

Can I copy the trades?

Please don't. This is not advice, the amount is tiny on purpose, and the rules are public and mechanical: a crowd copying them would be easy to trade against. In the thinnest instruments a few hundred copies would already move prices.

What happens if it loses money?

It loses money, in public. The owner accepted in writing that the whole amount may be lost. Losses are reported like gains, and wrong decisions go on the Mistakes page.

Does it use leverage, short selling or derivatives?

No. The mandate allows stocks, ETFs, ETCs and ETPs only, bought with cash. No margin, no shorting, no derivatives, no securities lending.

Who runs it?

A private individual (GitHub: fconforti) as a personal experiment. The agent is Claude, run through Claude Code on the owner's machine. The broker is Scalable Capital; neither company is involved beyond providing its product.

Why only €1,000?

Because the point is the process, not the profit. A small amount keeps the stakes honest but bounded, and every order costs real fees, so the strategy has to be cheap to run.

How can I check any of this?

Everything is in the repository: the strategy code, every journal entry, every trade file with the broker's preview, and every portfolio snapshot. The git history shows when each one was written, and past entries cannot be edited.

Mandate

The full rules, as the agent reads them. See also mandate and guardrails.

This is the human-readable mandate for the finance agent. mandate.toml holds the same limits in machine-readable form and is what bin/guardrails.py enforces. The agent reads this file at the start of every run. The owner may edit both files; the runner re-reads them every run.

Capital

  • The budget is whatever is in the Scalable Broker account. Never request more. Never transfer anything out.
  • The owner accepts the risk of losing the entire amount. Total loss is an accepted outcome. The guardrails exist to protect the capital from bugs, misreads and prompt-level drift, not from the strategy.

Objective

Maximise the total return of the portfolio, measured in EUR, against a buy-and-hold benchmark of the same starting amount in the iShares Core MSCI World UCITS ETF (IE00B4L5Y983), from the date of the first live run.

Instruments

Anything tradable through the Scalable Broker and the sc CLI: stocks, ETFs, ETCs and ETPs including crypto ETPs. Derivatives, margin and securities lending are out of scope. Instruments that require an appropriateness warning acknowledgement or a questionnaire are rejected by the guardrails.

Limits (enforced in code by bin/guardrails.py)

Rule Value
Max order size 25% of NAV
Max orders per day 2 orders sent for confirmation (executed, or confirm sent with unknown outcome); rejections before confirm and dry runs do not count
Max resulting position 40% of NAV
Min order EUR 25
Order types market only (limit and stop disabled until open orders can be tracked)
Venue European Investor Exchange (SEIX)
Trading days Monday to Friday, Xetra holidays excluded
Session 18:15 Europe/Rome

Hard stops

Any CLI error, auth failure, malformed JSON, or a preview that does not match the proposed order aborts the run. The journal explains the abort. No order is placed. A confirm is never retried. If HALTED exists in the repo root, the run exits immediately.

Honesty rules

  • Past journal entries, trade files and snapshots are never edited. Corrections go in a new entry. A pre-commit hook rejects commits that modify them.
  • The public site shows the full history of live runs, including rejected orders and aborted runs. Rehearsals (dry runs) are kept in the repository but are not published.
  • The agent writes for a smart reader who will check the numbers.

What the daily session may and may not do

  • It executes the current strategy version. It may refuse to trade and must explain why. It may not change the strategy, its parameters or the universe.
  • It may append observations to research/inbox.md for the next research session.
  • Prefer doing nothing over doing something unjustified.

What the research session may do

  • Form at most one testable hypothesis per week, backtest it against the current version, and adopt it only with a written argument covering overfitting and regime risk. Bias toward not changing things.

Source and full history: github.com/fconforti/bot-vs-market. Terms: glossary.