AI Swing Trader
Capture directional moves lasting roughly 3 to 30 trading days in liquid US equities and ETFs, using a defined-risk framework where every position has a pre-committed stop and a maximum holding period.
Track record
Fewer than 60 daily observations. Annualised return, volatility, Sharpe, Sortino and Calmar are withheld: annualising a short sample produces numbers that look precise and are not.
Our own marks from our own fills (nothing here is vendor price data). Deliberately monochrome: colour that codes "good" and "bad" is an editorial thumb on the scale.
Weights are our own work product, computed at the newest audit-chain NAV mark — never re-derived later, never estimated from cost basis. Logos identify the holdings and imply no endorsement (operator decision, session 11); sector tints are structure, not judgement.
| Symbol | Quantity | Avg cost | Stop | Opened |
|---|---|---|---|---|
| 111.1523 | 107.31 | 102.24 | 2026-08-06 | |
| 37.6587 | 272.93 | 252.34 | 2026-08-06 | |
| 20.8284 | 499.32 | 463.85 | 2026-08-06 | |
| 48.0268 | 221.59 | 203.37 | 2026-08-06 |
Recent decisions
Every run, including the ones that traded nothing: the committed fact-pack hash (written to the audit chain before the model was called), the model's published view, each proposal with the rule engine's verdict, and the fills that resulted. Rejected proposals stay up with their reason codes — a reader who can only see the trades that happened cannot judge the discipline that refused the ones that didn't.
AI-generated. All quantitative claims traced to the published fact pack. The portfolio is highly concentrated in four mega-cap tech and healthcare positions (ABT, AMZN, MSFT, NVDA) representing ~43% of capital, with ~57% cash (pf.cash_pct). All four holdings show positive short-term momentum and are above entry prices with 3 days holding period (pos.ABT.days_held, pos.AMZN.days_held). Across the eligible universe, strong 5-day and 20-day momentum clusters are visible in several sectors: technology (AVGO +9.88/5d, +6.95/20d; ARM +17.89/5d; ALAB +7.37/5d), healthcare (AMGN +6.70/5d, +13.09/20d; ABBV +18.37/60d; BDX +6.79/5d, +16.40/20d), industrials (ABNB +17.52/5d, +19.82/20d; ALLE +7.33/5d, +23.65/20d), and notable single-stock surges (COHR +44.22/5d; CIEN +9.37/5d after -28.55/60d drawdown). The 20-day returns show divergence: ACN +29.94/20d but -29.01/252d suggests a counter-trend ral…
| Proposal | Conviction | Outcome | Codes |
|---|---|---|---|
| BUY AVGO | 4 | accepted | — |
| BUY ABNB | 4 | accepted | — |
| BUY AMGN | 3 | accepted | CLAMP_POSITION_CAP |
| BUY BKNG | 3 | accepted | CLAMP_POSITION_CAP |
The portfolio is starting from a clean slate with 100% cash (pf.cash_pct). The market exhibits clear divergence in recent performance across timeframes. **Short-term (5-day) momentum winners show strong reversals:** MSFT +10.8% (px.MSFT.ret_5d), AMZN +15.6% (px.AMZN.ret_5d), NVDA +12.3% (px.NVDA.ret_5d), ORCL +12.5% (px.ORCL.ret_5d), and GOOGL +7.2% (px.GOOGL.ret_5d) all bounced sharply over the past week after underperforming or declining on the 20-day horizon. **20-day trends reveal sector rotation:** Technology stocks show mixed performance with MSFT up 30.0% (px.MSFT.ret_20d) and ACN up 23.0% (px.ACN.ret_20d), while semiconductors like AMD -10.5% (px.AMD.ret_20d), QCOM -16.1% (px.QCOM.ret_20d), and SMH -6.0% (px.SMH.ret_20d) have pulled back. Healthcare names like ABT +14.4% (px.ABT.ret_20d), ABBV -2.4% (px.ABBV.ret_20d after strong 60d +20.3%), and TMO +10.5% (px.TMO.ret_20d) sho…
| Proposal | Conviction | Outcome | Codes |
|---|---|---|---|
| BUY MSFT | 5 | accepted | — |
| BUY AMZN | 4 | accepted | — |
| BUY ABT | 4 | accepted | CLAMP_POSITION_CAP |
| BUY NVDA | 4 | accepted | — |
fills: BUY 20.8284 MSFT @ 499.32 · BUY 37.6587 AMZN @ 272.93 · BUY 111.1523 ABT @ 107.31 · BUY 48.0268 NVDA @ 221.59
What the AI is allowed to do
This portfolio's AI ranks candidates and explains its reasoning. It proposes direction and conviction only. Every price, quantity, weight and risk limit is computed by deterministic code the model cannot see or influence.
BUY · TRIM · SELL · HOLD · TIGHTEN_STOP
At most 4 proposals per run, each carrying a direction, a conviction from 1 to 5, a rationale, and references to the facts it used.
- set a price
- set a quantity or share count
- set a weight or position size
- set or move a risk limit
- execute anything
Model tier fast · prompt version P02-v1. Any change to either is recorded as a MODEL_CHANGE event in the audit chain — without it the record would be a chimera of two systems presented as one.
Enforced limits
Every limit below names the code path that enforces it. This is not decoration: a limit that is published but never fires is worse than no limit, because a reader has no way to tell the difference. A test walks every mandate, drives the engine into the state each declared control claims to protect against, and fails the build if nothing stops it.
| Limit | Value | Enforced by |
|---|---|---|
| Maximum gross exposure | 100.0% | gate 2 — size_order |
| Maximum single sector | 40.0% | gate 2 — size_order |
| Limit | Value | Enforced by |
|---|---|---|
| Shorting | prohibited | gate 1 — proposal validation |
| Derivatives | prohibited | gate 1 — proposal validation |
| Margin | prohibited | gate 1 — proposal validation |
| Limit | Value | Enforced by |
|---|---|---|
| Minimum new position | 2.0% | gate 2 — size_order |
| Maximum order as % of ADV | 0.5% | gate 2 — size_order |
| Limit | Value | Enforced by |
|---|---|---|
| Weekly loss limit | 8.0% | gate 3 — HALT_WEEKLY_LOSS_LIMIT |
| Single-day loss alert | 4.0% | gate 3 — alert |
| Limit | Value | Enforced by |
|---|---|---|
| Stale-data halt | 24 hours | gate 3 — HALT_STALE_DATA |
| Limit | Value | Enforced by |
|---|---|---|
| At −10.0% drawdown | alert, scale_risk_budget:0.5 | gate 3 — drawdown ladder |
| At −15.0% drawdown | alert, pause_new_positions_days:5, scale_risk_budget:0.5 | gate 3 — drawdown ladder |
| At −20.0% drawdown | alert, scale_risk_budget:0.25, mandatory_deep_review | gate 3 — drawdown ladder |
| At −25.0% drawdown | suspend_portfolio, publish_post_mortem, require_new_rulebook_version | gate 3 — drawdown ladder |
| Limit | Value | Enforced by |
|---|---|---|
| Max trades per week | 12 | entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit) |
| Min holding period days | 1 | entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit) |
| Limit | Value | Enforced by |
|---|---|---|
| Halt trading if price gap unexplained pct | 20 | gate 3 — circuit breaker |
| Halt trading if vix above | 45 | gate 3 — circuit breaker |
| Halt trading if factpack hash mismatch | true | gate 3 — circuit breaker |
Execution
Fills are struck on a VWAP window that begins strictly after the decision timestamp plus a latency delay. No fill can use information from the bar in which the decision was made, so look-ahead is arithmetically impossible rather than merely avoided.
Philosophy
Trend continuation and mean reversion are both real but regime-dependent. The deterministic layer decides how much risk may be taken and where the stop sits; the AI decides which of the eligible setups it prefers and why. Risk is sized in dollars-at-risk, never in dollars-invested.
Review schedule
| Job | Cron | Timezone | Makes a decision |
|---|---|---|---|
| premarket scan | 30 7 * * MON-FRI | America/New_York | yes |
| midday check | 0 12 * * MON-FRI | America/New_York | yes |
| postclose react | 10 16 * * MON-FRI | America/New_York | yes |
Published on a fixed, regular schedule. Never event-triggered — no "market is crashing, sell now" alerts, deliberately.
Machine-readable mandate: config/portfolios/P02_ai_swing_trader.yaml · human rulebook: docs/portfolios/P02_ai_swing_trader.md · effective from 2026-08-06 · payload b618c290568f…