News-momentum paper-trading bot: Claude classifies the news, deterministic Python makes every trade decision. Built in one day with Claude Code agents.
Python
2
3 commits
updated Oct 1, 2026
Watch the video to see how NewsWave was built. The exact prompts are in prompts/.
A news-momentum paper-trading bot where Claude only classifies the news and deterministic Python makes every trading decision.
Story: https://jellycharts.com/newswave
NEWS -> VOLUME -> MOMENTUM -> FIRST 9 EMA PULLBACK -> BREAKOUT -> ENTRY
claude CLI, which returns a structured classification of the news (is it a material catalyst, and in which direction). That is all it does. It never sizes, enters, exits or sees an order.newswave/risk.py, newswave/exits.py and newswave/execution/.Shadow signals. Setups that fail a filter are still tracked as shadow signals, so you can measure what each filter costs or saves.
The funnel log. Every stage a symbol passes or fails is written to a timeline table with a reason, so you can see exactly why something did or did not trade.
TRADING_MODE=PAPER, ALPACA_PAPER=true and any Alpaca URL is the paper host. The only TradingClient is built with a literal paper=True, and a test greps the package for violations.EXECUTION_MODE=PAPER orders are refused unless python -m newswave arm (which runs the full test suite) wrote an .armed file matching the current code and parameters.claude -p on stdin, never on the command line.claude -p; there is no API key.git clone https://github.com/AskElira/newswave.git
cd newswave
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -e '.[dev]'
cp .env.example .env # fill in ALPACA_API_KEY and ALPACA_SECRET_KEY (paper)
.venv/bin/python -m newswave check
.venv/bin/python -m newswave run
Windows: see deploy/windows/SETUP.md. A launchd template is in deploy/com.newswave.daemon.plist; it is never loaded for you.
Run as .venv/bin/python -m newswave <command>.
| command | what it does |
|---|---|
check | validate settings and the paper guard; never prints secrets |
run | the daemon in OBSERVE mode |
arm | run the full test suite; on green write .armed |
run --execute | send paper orders to Alpaca (needs a valid arm) |
dashboard [--port N] | local dashboard on 127.0.0.1 (default 8765) |
report --month YYYY-MM | write the monthly report (md + html) under DATA_DIR/reports/ |
replay --fixture tests/fixtures/story_nvda.json | stream a recorded story through the real engine with a simulated broker |
arm passed for the current code and parameters. Re-run arm after any change.Typical path: pytest, then run for several sessions while watching dashboard, then arm, then run --execute.
Secrets and modes come from .env (see .env.example). Every strategy parameter lives in StrategyParams in newswave/config.py. Changing one requires a new STRATEGY_VERSION; the daemon refuses to boot if the parameters changed under an existing version, so results from different versions stay separate.
.venv/bin/pytest -q
Tests block non-localhost sockets, scrub credential environment variables and never call the real claude CLI.
Built in one day by Claude Sonnet 5.5 agents directed from a single spec. The spec is kept in docs/SPEC.md and the resulting design decisions in docs/CONTRACT.md.
Want to backtest your own ideas on futures and stocks, and code strategies with your Claude subscription? Try Jelly Charts: https://jellycharts.com
This is educational software for paper trading only. It is not financial advice. It comes with no warranty (see LICENSE). Trading involves risk of loss; do not point it at real money.
Python
98.0%
HTML
1.5%
News-momentum paper-trading bot: Claude classifies the news, deterministic Python makes every trade decision. Built in one day with Claude Code agents.
Python
2
3 commits
updated Oct 1, 2026
Watch the video to see how NewsWave was built. The exact prompts are in prompts/.
A news-momentum paper-trading bot where Claude only classifies the news and deterministic Python makes every trading decision.
Story: https://jellycharts.com/newswave
NEWS -> VOLUME -> MOMENTUM -> FIRST 9 EMA PULLBACK -> BREAKOUT -> ENTRY
claude CLI, which returns a structured classification of the news (is it a material catalyst, and in which direction). That is all it does. It never sizes, enters, exits or sees an order.newswave/risk.py, newswave/exits.py and newswave/execution/.Shadow signals. Setups that fail a filter are still tracked as shadow signals, so you can measure what each filter costs or saves.
The funnel log. Every stage a symbol passes or fails is written to a timeline table with a reason, so you can see exactly why something did or did not trade.
TRADING_MODE=PAPER, ALPACA_PAPER=true and any Alpaca URL is the paper host. The only TradingClient is built with a literal paper=True, and a test greps the package for violations.EXECUTION_MODE=PAPER orders are refused unless python -m newswave arm (which runs the full test suite) wrote an .armed file matching the current code and parameters.claude -p on stdin, never on the command line.claude -p; there is no API key.git clone https://github.com/AskElira/newswave.git
cd newswave
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -e '.[dev]'
cp .env.example .env # fill in ALPACA_API_KEY and ALPACA_SECRET_KEY (paper)
.venv/bin/python -m newswave check
.venv/bin/python -m newswave run
Windows: see deploy/windows/SETUP.md. A launchd template is in deploy/com.newswave.daemon.plist; it is never loaded for you.
Run as .venv/bin/python -m newswave <command>.
| command | what it does |
|---|---|
check | validate settings and the paper guard; never prints secrets |
run | the daemon in OBSERVE mode |
arm | run the full test suite; on green write .armed |
run --execute | send paper orders to Alpaca (needs a valid arm) |
dashboard [--port N] | local dashboard on 127.0.0.1 (default 8765) |
report --month YYYY-MM | write the monthly report (md + html) under DATA_DIR/reports/ |
replay --fixture tests/fixtures/story_nvda.json | stream a recorded story through the real engine with a simulated broker |
arm passed for the current code and parameters. Re-run arm after any change.Typical path: pytest, then run for several sessions while watching dashboard, then arm, then run --execute.
Secrets and modes come from .env (see .env.example). Every strategy parameter lives in StrategyParams in newswave/config.py. Changing one requires a new STRATEGY_VERSION; the daemon refuses to boot if the parameters changed under an existing version, so results from different versions stay separate.
.venv/bin/pytest -q
Tests block non-localhost sockets, scrub credential environment variables and never call the real claude CLI.
Built in one day by Claude Sonnet 5.5 agents directed from a single spec. The spec is kept in docs/SPEC.md and the resulting design decisions in docs/CONTRACT.md.
Want to backtest your own ideas on futures and stocks, and code strategies with your Claude subscription? Try Jelly Charts: https://jellycharts.com
This is educational software for paper trading only. It is not financial advice. It comes with no warranty (see LICENSE). Trading involves risk of loss; do not point it at real money.
Python
98.0%
HTML
1.5%