Recreated dashboard and notification mockups (placeholder data) appear in the body below
Personal Project · Automation & Trust
A Conservative Trading Bot, Built Like a Product
Setting out to answer one honest question, can a disciplined, rules-based strategy beat just holding a portfolio, I built phase-gated risk controls and automated, always-honest reporting for an ongoing paper-trading experiment.
- Company
- Personal Project
- Role
- Designer & Engineer (solo)
- Timeline
- Jul 2026 – Present
Context
A personal algorithmic trading bot for US equities, built the same way I'd approach a product with real users and real risk, except here the user and the risk are both me. The goal was never "get rich quick." It was to find out, honestly, whether a simple, well-known strategy can survive real market conditions and real costs, tracked against my own actual portfolio rather than a theoretical one.
Built with
Alpaca
Paper trading API and live market data
Claude
Reasoning layer, plain-language reports, and build partner
Problem
Most trading-bot projects are optimized to look good, not to be honest. Backtests get tuned until they win, gates get skipped under pressure, and "the bot works" quietly becomes an article of faith rather than a tested claim. I wanted the opposite: a system that would tell me the truth even if the truth was "this doesn't beat just holding the index," and that made it structurally hard to fool myself.
Process
Gate the plan, not just the code: wrote out the path from repo to real money as an explicit, phased plan with a pass/fail gate at each step (backtest validation, then months of unmonitored paper trading, then a written post-mortem) before any code ran against real prices. No phase advances until its gate is genuinely met, not "close enough."
Test for the tailwind, not just the win: backtested across a range that deliberately includes the 2020 crash and the 2022 bear market. A strategy that only wins in a bull run isn't a strategy, it's a tailwind, and the backtest is built to catch that difference.
Separate the guardrails from the strategy: position sizing, stop losses, and daily/total drawdown limits live in their own module, kept deliberately independent from the signal logic that decides what to trade. The rule was that risk limits don't loosen just because a strategy looks like it's working.
Benchmark against the real thing: rebuilt the paper account to mirror my actual brokerage portfolio's structure, so the comparison is a true, like-for-like read on the bot's active trading against simply holding what I already own, not a generic index.
Automate the loop, then automate around its own failures: moved execution to a scheduled GitHub Action so results didn't depend on a laptop being on, then hardened the state-persistence step itself after a race condition between concurrent runs briefly lost a week of trading state.
Report like the numbers matter more than the story: hard numbers (returns, spread against the benchmark, drawdown, trade activity) are always computed deterministically first. An optional narrative layer can write the monthly/quarterly summary in plain language on top of those numbers, but every report sends whether or not that layer is available, so a number is never invented to fill a gap.
Explain every decision, not just report it: every trade, and every week the bot does nothing, comes with a plain-language explanation grounded in a written set of trading principles, so I'm not just watching a balance move, I'm learning why. A quiet week reads like this:
Why the bot did this
Every action, and the principle behind it.
No trades — holding steady
No crossover on the satellite positions and no stop was hit, so the rules say do nothing. Doing nothing is a real decision here: fewer trades means less whipsaw, lower costs, and more time in the market, which usually beats trying to time it.
- Whipsaw
- Getting chopped up by rapid false signals: you buy, it drops, you sell, it pops.
- Time in Market > Timing
- Staying invested usually beats trying to jump in and out at the right moments.
- Complexity Risk
- Every extra rule or symbol is more to break and overfit. Simple survives.
Surface it automatically: a Monday "week ahead" and Friday "week in review" text digest so I never have to go check on the bot myself:
Message history
Week of Sep 14
Mon · week aheadTrading bot — week of Sep 14
Starting balance: $517.86
Currently holding: VTI, SMH
Planned today: no trades
May also buy this week if signals trigger: SMH, XLE
Paper trading — simulated money, not real.
Week of Sep 7
Fri · recapTrading bot — week of Sep 7 recap
This week's trades: none
Balance: $517.86 (started week at $521.10)
Change this week: −$3.24 (−0.62%)
Paper trading — simulated money, not real.
Solution
A core-and-satellite trading strategy running on a schedule with hard, independently-enforced risk limits; a true benchmark comparison against my own real portfolio; multi-channel notifications (SMS, push, email) so activity surfaces automatically instead of requiring me to check; and a small dashboard, built on my own design system, that reads a single state file and clearly marks itself as sample data until real trading history exists:
Bot Console
Paper · satellite sleeve
Managed account value
$524.10
Weekly balance
Illustrative trend, not real account history
Rules in force
Core holding
VTI
65% · buy & hold, never sold on signals
Satellite
SMH · XLE
35% · actively traded
Signal
20/50 SMA
crossover — buy above, sell below
Stop-loss
5%
per satellite position, below entry
Position cap
20%
max per position of satellite budget
Safety halts
3% / 15%
daily loss / total drawdown
Cash reserve
10%
always kept uninvested
Schedule
Weekdays ~9:45am ET
notifications Mon + Fri
Outcome
The first version of the strategy didn't clear its own bar against buy-and-hold in backtesting, which the project's rules treat as a valid, useful result rather than a failure to explain away, and that result is what drove the redesign into the current core-and-satellite structure. It's still inside its own required paper-trading window, live capital stays off until that gate is genuinely met, and the automated reporting means there's an honest, ongoing scorecard instead of a story I get to tell myself after the fact.