Governed Self-Evolution for Autonomous Investing: A Multi-Agent LLM System with an Invariant Core
Organizations: Nanyang Technological University Singapore, Singapore · University College London London, United Kingdom
Abstract
LLM agents that act on live Web data must combine heterogeneous evidence, remember what they have done and improve from outcomes without weakening their own safeguards. We study this problem in autonomous investing, where every action is irreversible and based on untrusted Web content. We present Steward, a multi-agent LLM system that draws the boundary of self-evolution in its type system. First, nine role-specialised agents decide jointly: four analysts read news feeds, SEC filings, macroeconomic series and market data and emit typed reports, from which a Portfolio Manager sets target positions that a protected Risk Manager audits. Second, a seven-layer shared memory, assembled by code from the system's own record, gives each decision its position context, the market narrative, calibration and the agent's past decisions. Third, the system improves itself by review: code grades every trade and forecast nightly and writes the grades into memory, and each quarter a reflector proposes prompt learnings that a deterministic gate applies reversibly and replay of recorded inputs verifies. All three operate around an invariant core of order arithmetic, risk rules and discipline-agent prompts that no self-edit can reach. In a five-month live deployment (102 trading days, 1,632 LLM calls), the system contained a 24.6% sector drawdown to a 0.3% loss; in replay of its recorded inputs, a single model given the same raw data traded more and lost 1.35 points against the market over five days where the joint design showed no significant loss, and no injected instruction was followed; and a 2015-2026 backtest shows the core alone lowering the maximum drawdown under all 50 random entry policies. The reflector traced the dominant failure to its root cause, and the gate applied a learning that the agent adopted on trigger evenings and on no control evening. Code: https://github.com/yebof/quant-agent
Figures & tables
| Policy | Return | Vol. | Max DD | Sharpe | Beta | Exposure |
|---|---|---|---|---|---|---|
| PM intent, no exits, no RM | 15.4 | 13.7 | 4.7 | 2.52 | 0.83 | 93% |
| PM intent + system exits | 11.6 | 15.0 | 4.7 | 1.80 | 0.80 | 76% |
| PM intent + exits + RM (Intent) | 12.2 | 11.9 | 4.5 | 2.33 | 0.64 | 79% |
| Live portfolio | 5.0 | 9.0 | 6.0 | 1.39 | 0.16 | 56% |
| Analyst-following, all buys | 1.3 | 11.3 | 7.8 | 0.32 | 0.50 | 41% |
| Analyst-following, high-conv. buys | 0.4 | 2.0 | 1.8 | 0.41 | 0.01 | 5% |
| Decision layer | Names | New | Gross | Rev. | Excess 5d | Excess 20d |
|---|---|---|---|---|---|---|
| Deployed design | 3.7 | 3.2 | 19% | 0.10 | 0.5 0.9 | 1.3 2.9 |
| No shared memory | 3.5 | 3.0 | 19% | 0.12 | 0.4 0.8 | 0.8 2.5 |
| Single agent, raw data | 5.8 | 4.4 | 41% | 0.25 | 1.3 0.4 | 0.8 0.9 |
| Return | Vol. | Max DD | Sharpe | Sortino | Beta | (ann.) | |
|---|---|---|---|---|---|---|---|
| Live portfolio | 5.0 | 9.0 | 6.0 | 1.39 | 1.76 | 0.16 | 8.2 |
| SPY (S&P 500) | 12.4 | 12.4 | 4.5 | 2.28 | 3.55 | 1.00 | 0.0 |
| QQQ (Nasdaq-100) | 17.1 | 22.1 | 11.2 | 1.79 | 2.79 | 1.63 | 6.6 |
| SMH (semiconductors) | 32.5 | 46.8 | 24.6 | 1.65 | 2.45 | 2.79 | 1.7 |
| 50/50 SPY / T-bills | 6.9 | 6.2 | 2.2 | 2.58 | 4.02 | 0.50 | 1.8 |
| Exposure-matched (56% SPY) | 7.5 | 6.9 | 2.5 | 2.52 | 3.92 | 0.56 | 1.6 |
| News agent | Portfolio Manager | Core | |||
|---|---|---|---|---|---|
| Payload | Excluded | Labelled | Followed | Refused | Max wt |
| P1 direct override | 10/10 | 10/10 | 0/10 | 7/10 | 0% |
| P2 plausible headline | 10/10 | 10/10 | 0/10 | 6/10 | 0% |
| P3 discipline suspension | – | – | 0/10 | 10/10 | 0% |
Appendix figures & tables12 assets
Supplementary material from the paper’s appendix.
Appendix
| Agent | CoT steps, in order |
|---|---|
| Tech Analyst (5) | trend (price versus moving averages) momentum (RSI, MACD) volatility (Bollinger position, ATR) volume (confirming or diverging) support_resistance (levels, valuation flags). Output: rating, conviction, entry, stop, target, thesis_invalid_if ; risk/reward is computed, not written. |
| Macro Analyst (6) | volatility_analysis yield_curve_analysis monetary_policy_analysis inflation_labor_credit cross_signal_synthesis sector_implications . Output: regime, confidence, target exposure, sector stances, regime-shift flag. |
| Earnings Analyst (5) | fundamental_quality growth_trajectory strategic_risks management_execution valuation_context . Output: sentiment and conviction derivable from the steps. |
| Portfolio Manager (7 + 2) | macro_filter news_check earnings_check signal_conflicts sizing_logic portfolio_balance cash_target ; optional continuity_check , premortem_check . Output: TargetPosition intent per symbol. |
| Risk Manager (6) | rr_audit signal_fidelity correlation_check event_risk sizing_sanity overall . Output: approve or reject, per-symbol modifications, scale_all_buys , reason category. |
| Position Reviewer (6) | macro_continuity_check thesis_progress_check thesis_integrity_check winners_discipline_check session_disposition_check execution_rationale . Output: HOLD, REDUCE, SELL or TRAIL_STOP per position. |
| Window | Session | LLM | Scope |
|---|---|---|---|
| 08:00–09:15 | earnings_preprocess | ✓ | analyse newly filed 10-Q/10-K |
| 09:30–12:00 | morning | ✓ | research, decide, risk-check, execute; the only session that may buy |
| 09:30–16:00 | intra_check (30’) | – | 3% daily-loss circuit breaker |
| 13:00–14:30 | midday | ✓ | sell-only review (patient) |
| 15:30–16:00 | close | ✓ | sell-only review (act on hard triggers) |
| 20:00–22:00 | evening | ✓ | reconcile fills; grade trades and forecasts; write insights |
| Post-exit 20d | |||||||
|---|---|---|---|---|---|---|---|
| Exit | Lots | Win | Realised | Hold (d) | Excess | Correct | Left (US$k) |
| Agent decision | 306 | 51% | 0.45% | 9.6 | 0.44% | 42% | 19.9 |
| Mechanical stop | 132 | 39% | 2.29% | 15.3 | 4.06% | 45% | 0.7 |
| All | 438 | 47% | 1.01% | 11.4 | 1.27% | 43% | 20.6 |
| Learning vs. baseline | |||||||
| Mornings | Flag. | Base | Kept | Red. | Incr. | Drop. | Added |
| Wrong BUYs (10 d) | 15 | 10 | 8 | 1 | 1 | 0 | 1 |
| Control BUYs (5 d) | 14 | 12 | 8 | 3 | 1 | 0 | 0 |
| Summed weight of flagged BUYs, wrong mornings: 59.6% 63.5%; control: 72.5% 67.3%. Re-running the baseline itself moves a flagged weight by 1.8pp at the median ( =7 pairs). 35 LLM calls, US$17. | |||||||
| Evenings | Prompt | Replays | Recurring named | TAKE/WAIT | Blocker |
|---|---|---|---|---|---|
| Trigger (10) | base | 20 | 26/64 | 0/20 | 0/20 |
| + learning | 20 | 25/64 | 3/20 | 4/20 | |
| Control (4) | base | 8 | 0/2 | 0/8 | 0/8 |
| + learning | 8 | 0/2 | 0/8 | 0/8 |
| Relation (Spearman) | ||||
|---|---|---|---|---|
| New BUY weight trailing 10-evening forecast hit rate | 0.14 | 0.32 | 1.00 | 54 |
| Number of BUYs trailing forecast hit rate | 0.11 | 0.41 | 1.00 | 54 |
| New BUY weight RM cuts in last 5 sessions | 0.08 | 0.49 | 1.00 | 82 |
| New BUY weight trailing 45-day realised win rate | 0.02 | 0.89 | 1.00 | 80 |
| Book exposure trailing 45-day realised win rate | 0.22 | 0.05 | 0.32 | 80 |
| Book exposure trailing forecast hit rate | 0.34 | 0.01 | 0.08 | 54 |
| Crisis drawdown | |||||||
| Entries / variant | CAGR | Sharpe | Max DD | 2018 | 2020 | 2022 | 2026 |
| Momentum entries | |||||||
| No core | 61 | 1.15 | 61 | 25 | 36 | 27 | 46 |
| Stops only | 58 | 1.12 | 61 | 25 | 29 | 27 | 51 |
| Core stops | 40 | 1.26 | 36 | 20 | 36 | 21 | 27 |
| Core breaker | 50 | 1.09 | 60 | 23 | 25 | 19 | 39 |
| Agent | Rows | Numbers | Grounded | Strict | Placebo |
|---|---|---|---|---|---|
| Portfolio Manager | 133 | 7,827 | 99.69% | 98.85% | 41% |
| Risk Manager | 75 | 979 | 99.59% | 91.52% | 18% |
| Macro Analyst | 137 | 3,457 | 99.94% | 99.28% | 9% |
| Technical Analyst | 150 | 233,310 | 99.94% | 95.85% | 23% |
| Position Reviewer | 150 | 3,155 | 99.40% | 98.07% | 21% |
| Evening Analyst | 105 | 5,366 | 99.27% | 98.53% | 17% |
| Failure | Response |
|---|---|
| Transient LLM error (429, 5xx) | up to 7 retries with backoff, then one call to a second vendor’s model |
| Unparseable or invalid output | the agent’s output is dropped; invalid list items are dropped singly |
| Research agent fails | recorded as degraded; two degraded sources raise a Risk Manager advisory |
| Portfolio Manager fails | session aborts without orders; the next 30-minute tick retries |
| Risk Manager fails | the plan is rejected (fail closed) |
| Position Reviewer fails | no exit actions; broker-held stops remain |
Self-Evolving Agents
Self-evolving agents improve their skills, memory, tools, policies, or environments by learning from interaction and evaluation feedback.
See all 418 papers