An adversarial multi-agent system
for equity research
Abstract. Retail investors are not short of market data; they are short of research - the labour of turning data into a defended position. Sell-side coverage supplies that labour for a few thousand large caps and, for everyone else, not at all. This paper describes Parallax, a system that produces a written equity research note on any US-listed ticker in about three minutes by running four independent analyst agents over live filings, prices, news and alternative data, forcing a bull and a bear to argue the resulting evidence, and passing the surviving thesis through a risk committee that assigns levels. We describe the agent graph, the nineteen-desk data layer, the two quantitative components (a gradient-boosted cross-sectional score and a rule backtest harness over our own bar store), and - at greater length than is customary - the evaluation discipline that governs what we are willing to ship. That discipline has so far rejected a published foundation model, six of ten candidate factors, and our own score's headline claim.
01 The problem is research supply, not data supply
A retail investor in 2026 can reach almost every input a professional can reach. Filings are free at the SEC. Prices are free. Options prints, insider Form 4s, congressional disclosures and federal contract awards are all public record. What is scarce is not the data. What is scarce is the work: reading it, weighing it against the opposite case, and committing to a position with a level at which you would admit you were wrong.
That work is expensive because it is human, and it is rationed accordingly. Sell-side analysts cover the names that generate banking and commission revenue. Below that line, coverage thins to nothing - and the thinner the coverage, the more likely the mispricing that would have justified the work in the first place.
The AI products aimed at this gap have mostly automated the wrong half. They produce a rating: a letter, a score, a percentage, a direction. A rating is the cheapest possible output because it hides all the reasoning that would let a reader disagree with it. It is also the least useful, because an investor who cannot see the argument cannot tell a well-reasoned BUY from a badly-reasoned one, and therefore cannot update when the facts change.
Parallax automates the argument, and treats the rating as a by-product. Every report ships with the bull case, the bear case, the exchange between them, the risk committee's objections, and the level at which the thesis is void.
02 System overview
A run is a directed graph of language-model agents with tool access, executed once per request and never resumed. Four analyst agents read in parallel; a research manager passes their reports to two adversarial agents; a risk committee of three temperaments and a judge converts the surviving thesis into a decision with levels; a deterministic gate reviews the result before it is written. The median run completes in about two and a half minutes.
Three properties of this design are deliberate and worth naming, because they are what the system is for:
- Independence before synthesis
- The four analyst agents do not see one another's output. They are given the same ticker and different tools. A shared draft would produce agreement by contamination rather than by evidence, which is the failure mode of a single long prompt that "considers all angles".
- Adversarial resolution
- Neither debater is told the conclusion, and neither is asked to be balanced. Each is asked to make the strongest case it can from the same evidence. Disagreement is the output; the verdict is what is left after it.
- Structure before publication
- A thesis without an entry, a stop and an invalidation is an opinion. The risk stage exists so that the report commits to conditions that can later be checked against the tape - which is also what makes post-publication monitoring possible at all.
03 The analysis engine
3.1 The four analyst desks
Each analyst is a tool-using agent with a narrow mandate and a disjoint toolset. The separation is enforced by the tools, not by instruction: the technicals agent cannot read a filing because it has no tool that returns one.
| Desk | Tools | Owns |
|---|---|---|
| Technicals | daily and intraday bars; an indicator library from which it selects at most eight complementary indicators per name; a verified market snapshot | Trend state, momentum, and the support/resistance levels that become stop and target candidates downstream |
| Fundamentals | income statement, balance sheet, cash-flow statement (SEC XBRL, 10 years annual / 40 quarters); computed ratio pack; the latest earnings-call transcript | Business quality and what the current multiple already assumes. Claims must carry their figure |
| News | company and sector news; global macro news; FRED series by indicator; live prediction-market probabilities; the earnings-call transcript | What changed this week, and whether macro commentary is grounded in a series or in a vibe |
| Sentiment | headline flow, StockTwits messages indexed by cashtag with their author-labelled bull/bear tags, and Reddit posts from three investing subreddits | Positioning and crowding - whether a story is early, consensus, or exhausted |
The sentiment desk does not call tools: its corpus is placed in the prompt at turn zero and its output is constrained to a schema (native structured output where the provider supports it, tool-use or free-text fallback elsewhere), so the sentiment band and score are deterministic in shape across providers rather than free-form prose that has to be parsed.
3.2 The debate
The bull and bear agents receive the four analyst reports verbatim and argue over them. Each exchange is recorded and published in the report's debate room - not summarised, not cleaned up. A research manager then states which case survived and why.
The published transcript is the point. It is the difference between a system a reader can audit and one they must trust, and it is the part of the product that competitors offering a score cannot retrofit, because they never generated it.
3.3 Risk committee and the deterministic gate
Three risk agents - aggressive, conservative and neutral - argue position sizing against the surviving thesis, and a judge issues BUY, SELL or HOLD with entry, stop, target and size.
The result then passes a non-LLM discipline gate: deterministic rules over market regime and trend posture that can demote a BUY to HOLD. This exists because language models are agreeable, and an agreeable analyst in a hostile tape is expensive. When the gate intervenes, the report says so explicitly rather than silently publishing the softened call.
3.4 Horizons and style lenses
A run is parameterised by horizon - tactical (days), swing (2-8 weeks) or position (months) - which changes what the desks weight and what the risk stage considers a stop. Horizon is not cosmetic: it is carried on the report and is the unit by which the call is later judged (§6).
An optional style lens - Buffett, Graham, Lynch, Taleb, Damodaran, Burry or Druckenmiller - injects a named analytical prior with explicit thresholds rather than a personality. The tail-risk lens, for instance, instructs the desks in terms of excess kurtosis above 5 being extreme and skew above +0.5 favouring long convexity. A lens changes what counts as evidence; it does not change the pipeline.
3.5 Model routing
Depth selects the engine, and the engine is disclosed on every report. The standard tier runs on a fast, inexpensive frontier model; the deep tier on a mid-weight reasoning model; the ultra tier on the largest model available to us. Per-run compute cost is metered and attributed to the requesting account in an internal ledger, with a global spend ceiling that halts the worker rather than silently degrading output.
04 The data layer: nineteen desks
Around the engine sits a set of independently-scheduled feeds, each of which is also a page a subscriber can read directly. They serve two purposes: they are the product's browsable surface, and they are compressed into a desk dossier injected into every analysis at run time.
| Group | Desks | Primary sources |
|---|---|---|
| Positioning | Options flow · Dark-pool prints · Short interest & borrow | Public tape data, flagged by premium size and urgency |
| Ownership & disclosure | Insider Form 4s · Congress & Senate · 13F fund clusters · Corporate filings | SEC EDGAR, STOCK Act disclosures |
| Catalysts | FDA catalysts · Earnings calendar · Market calendar · Federal contracts | Regulatory calendars, award notices, earnings schedules |
| Crowd & attention | Retail buzz · Web demand · Consumer desk · Unusual volume | Social streams, search and encyclopaedia attention, volume anomalies |
| Real economy | Maritime & shipping · Commodities radar · Macro briefing | AIS vessel positions, event-stream supply-shock detection, FRED and World Bank |
| Derived | Daily scanners · Confluence board · Most mispriced | Computed nightly from our own bar store and the desks above |
The dossier is assembled from already-cached feeds - it costs zero additional API calls at run time - and every line carries a figure and a date so the agents can cite it rather than gesture at it. Each source degrades independently: a feed that is down contributes nothing and the analysis proceeds.
Two discipline notes. First, the confluence board - which counts how many independent desks are lit on a name - weights nothing and predicts nothing on its own. It is a ranked reading list, and is labelled as one. Second, every report published to a reader now names the full input set, including desks that returned nothing, because a list of only the desks that fired makes a quiet day look like a thin analysis.
05 Quantitative components
Two components in the system are statistical rather than generative. Both are held to a standard the generative parts cannot be held to, because both make falsifiable claims.
5.1 Parallax Score
A gradient-boosted classifier (histogram GBM, 29 features across momentum, trend, risk and liquidity families) trained to predict whether a name beats SPY over the next 63 trading days. Features are computed only from bars at or before the observation date, so there is no look-ahead by construction.
Validation is a purged monthly walk-forward with a 92-calendar-day embargo: a training row's forward label must be fully resolved before any test date it could touch. Overlapping labels are how a do-it-yourself quant model manufactures a 70% hit rate; the embargo is not optional.
The current pooled out-of-sample AUC is 0.4969 over 109,402 observations. That is indistinguishable from a coin flip, and the decile spread is flat (0.449 to 0.475, non-monotonic). Price-and-volume features do not predict three-month relative returns on this universe.
We publish that number on the score page itself. The score remains in the product because its subscores are a legible summary of momentum, trend and volatility posture - which is genuinely useful and is what they are labelled as - but it does not carry a predictive claim, and it will not until a validation number earns it. Every nightly score is stored, so the deciles accumulate a forward record whether or not it flatters the model. Full numbers in Appendix A.
5.2 The rule harness
The scanners are mechanical filters recomputed nightly over roughly eight years of daily history for 163 tickers, held in our own bar store rather than a vendor's. Because we own the bars, we can replay every rule against them, and we do: each rule reports its sample size, win rate with a sampling band, mean and median excess return over SPY, a t-statistic, a regime breakdown, and a first-half/second-half split to expose decay.
The harness also reports each rule ex-shock, stripping any window containing a day of four or more average true ranges - a rule cannot claim credit for having predicted a shock it had no information about. The gap between a rule's headline return and its ex-shock return is usually most of the headline. Full table in Appendix B.
These are measurements of signal information, not strategy returns: no costs, no slippage, no sizing, and overlapping signals counted individually. Presenting them as achievable returns would be the exact dishonesty the harness was built to prevent.
5.3 The factor lab
An offline research loop - a language model proposes a factor, the factor is implemented, backtested and scored, and the result conditions the next proposal. It runs on a workstation and emits a JSON artifact; production computes nothing and only reads.
Automated factor mining manufactures false positives by construction: test 100 random factors at p<0.05 and roughly five will look significant. Two gates address this. Every batch is corrected for multiple testing with Benjamini-Hochberg FDR - verified against 50 pure-noise factors, where the naive rule "discovered" two and the correction found none, while still recovering three real signals hidden among 47 noise factors. And every factor must clear a held-out period the proposal step never saw, carrying the same IC sign out-of-sample and a non-trivial out-of-sample result (|t| ≥ 1.5).
That last condition was added after the first run, in which a factor survived on an out-of-sample t of −0.33 purely because the sign happened to match a strong in-sample result. Sign agreement on noise is not confirmation. Four of ten seed factors survive both gates; see Appendix C.
06 Evaluation discipline
Everything above is a claim about capability. This section is about what we are willing to believe from our own outputs, which is the part of a research system that is easiest to fake and hardest to fix once faked.
6.1 Forward-only, horizon-aware scoring
Every published call is scored forward from its publication date against realized prices and benchmarked to SPY over the same window. Calls are never backfilled, never edited, and losses are never dropped.
Crucially, a call is only scored once it has matured for its own horizon: five trading days for tactical, twenty-one for swing, ninety for position. Marking a six-month thesis at four days is not a preliminary result, it is a different measurement - it reports noise and calls it evidence. The internal scorecard therefore reports two counts for every cell, graded and total, and shows a pending state rather than a percentage where the sample has not matured.
We do not publish an aggregate track record. The sample is young, the calls are predominantly long-horizon, and a hit rate computed before maturity would be a marketing number rather than a measurement. The scorecard is computed and reviewed internally; when there is a defensible number, it will be published with its sample size and start date.
6.2 Thesis monitoring
Because every call ships with levels and invalidation conditions, it can be watched. Alerts fire when the stop is crossed, the target is hit, the thesis goes offside, or the desks flip on the name - and not on ordinary volatility. A re-run produces a dated delta against the previous call rather than an edit, so the history of a position's reasoning is preserved.
6.3 Negative results are results
The discipline is only real if it is allowed to cost something. It has:
- A published time-series foundation model was evaluated zero-shot on our own bar store over 10,440 non-overlapping windows and rejected. It was not merely edgeless - it was significantly negative (t = −3.6) and was beaten decisively by buying and holding (Appendix D).
- 6 of 10 candidate factors were rejected on the statistics, including one whose in-sample result was among the strongest in the batch and whose sign inverted out of sample. Of the survivors, only 1 clears the cost of trading it (Appendix C) - a real signal that loses money to its own turnover is still a rejection.
- Our own score's predictive claim was withdrawn and its AUC published instead.
Each of those decisions removed something we could have marketed. That is the test of whether an evaluation process is real: a harness that has never rejected anything is not a harness.
07 Limitations
Stated plainly, because a whitepaper that lists only capabilities is advertising.
- The output is generated and can be wrong
- Language models produce fluent, confident, well-cited text whether or not the underlying reasoning is sound. Independent desks, an adversarial debate and a deterministic gate reduce the failure rate; they do not eliminate it. The published debate exists so a reader can catch what the system did not.
- No causal claim is made about alternative data
- A congressional disclosure, a dark-pool print or a vessel's course is an observation. The desks surface them with their figures and dates; they do not assert that any of them predicts a return, and the confluence count is a reading list rather than a model.
- Backtests are not returns
- Every historical figure in this paper measures signal information without costs, slippage, sizing or execution. Nothing here is a claim about achievable performance.
- Coverage is bounded by the sources
- Thinly-covered names have thinner news, no transcripts and sparse alt-data. The report will say so rather than pad the gap - but the analysis on such a name rests more heavily on filings and price structure.
- It is not advice, and it is read-only by construction
- No broker connections, no order placement, no custody. Output is automated, impersonal and educational, and is not personalized investment advice.
08 Engineering
The service is a Python application on a single small virtual machine: a web tier, a queued analysis worker with per-tier priority, and a set of scheduled jobs that refresh the desks. Storage is SQLite. The front end has no build step and runs under a strict content-security policy; static assets are content-versioned and served immutable.
Three constraints shaped more of the design than is obvious. Memory: the box has under two gigabytes, so nothing heavy is trained or inferred in production - the score is trained offline and the droplet reads an artifact. Vendor fragility: market-data providers rate limit aggressively, so every vendor call goes through a cache, a retry policy, a circuit breaker and a fallback vendor, and a desk that fails degrades to empty rather than to an error. Deploys are visible: the release sequence stages dependencies and units before the code lands so that a deploy does not serve errors while the process restarts.
Costs are metered per run and attributed per account, with a global ceiling that stops the worker rather than degrading silently. Uptime and job health are published on the status page.
A Score validation
| Metric | Value | Reading |
|---|---|---|
| Pooled out-of-sample AUC | 0.4969 | Coin flip |
| Out-of-sample observations | 109,402 | Not a sample-size problem |
| Top-decile hit rate | 45.4% | No usable spread; ordering is not monotonic across deciles (0.449-0.475) |
| Bottom-decile hit rate | 47.5% |
The top decile underperforms the bottom decile. This is published on the score page in the product, not only here.
B Rule information, 21-day forward
| Rule | n | Win | Mean | t | Ex-SPY, ex-shock |
|---|---|---|---|---|---|
| Breakout | 5,662 | 51% | +4.05% | 9.6 | +1.88% |
| Pullback to 50-day | 2,607 | 50% | +3.08% | 6.6 | +1.05% |
| Golden cross | 775 | 50% | +1.63% | 1.9 | +1.08% |
| Squeeze release | 2,791 | 47% | +1.29% | 3.6 | +0.14% |
| Oversold in uptrend | 8,693 | 48% | +0.99% | 6.0 | +0.45% |
Note the win rates: every rule sits at or below 51%. These rules earn their mean from the size of the right tail, not from being right often - which is precisely why a screen is a starting point for research rather than a signal to act on. Note also the gap between the mean column and the ex-shock excess column: for squeeze release, essentially all of the headline return is shock and market beta.
C Factor survivorship, and the cost gate
4 of 10 candidates survive the statistics. 1 of those clears 10bp of one-way trading cost. That second number is the one that matters, and it is the reason this appendix was rewritten: a factor can be statistically real and still lose money, because rebalancing it costs more than it earns. An information coefficient that cannot survive its own turnover is not an edge.
| Factor | IS IC | IS t | OOS IC | OOS t | Spread | Median | Churn | Breakeven | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| illiq | -0.0333 | -9.89 | -0.0147 | -3.05 | +39 | -92 | 0.40 | 24bp | real, but skew-dominated |
| vol_21 | +0.0315 | +4.11 | -0.0142 | -1.06 | -354 | +155 | 0.42 | 211bp | rejected - sign flips out of sample |
| px_vol_corr | -0.0270 | -8.22 | -0.0021 | -0.33 | +123 | -54 | 0.72 | 43bp | rejected - out of sample is zero |
| range_pos | +0.0214 | +4.68 | +0.0182 | +2.37 | +3 | +59 | 0.78 | 1bp | real, uneconomic (1bp breakeven) |
| z_close_63 | -0.0197 | -4.12 | -0.0290 | -3.72 | -76 | -43 | 0.64 | 30bp | tradeable |
| mom_63 | +0.0175 | +2.98 | +0.0062 | +0.66 | +88 | +50 | 0.43 | 51bp | rejected - out of sample is zero |
| vol_shock | +0.0099 | +2.94 | +0.0107 | +2.04 | +14 | +35 | 0.81 | 4bp | real, uneconomic (4bp breakeven) |
| reversal_5 | -0.0094 | -1.85 | +0.0038 | +0.45 | -47 | -40 | 0.76 | 15bp | rejected - sign flips out of sample |
| mom_21 | +0.0084 | +1.68 | +0.0209 | +2.45 | +109 | +57 | 0.77 | 36bp | rejected - fails FDR |
| gap_persist | +0.0050 | +0.97 | -0.0051 | -0.54 | +79 | +3 | 0.74 | 27bp | rejected - fails FDR |
Two things this table shows that an IC column alone cannot.
range_pos clears every statistical test - in-sample t of
+4.68,
out-of-sample t of
+2.37 - and
breaks even at 1bp, because it replaces 78%
of its top quintile every rebalance to earn a spread of a few basis points. It is a real
signal and an uninvestable one. And vol_21 shows why the median column exists:
its mean spread is −354bp while its median is +155bp, because the highest-volatility bucket
means +4.62% and medians −0.61% - the typical name loses money and a handful of lottery
outcomes carry the average. Any factor whose mean and median spreads disagree in sign is
marked skew-dominated and disqualified.
vol_21 remains the case worth studying for a second reason. The
low-volatility anomaly is real in the literature and strong here in-sample - and it inverts
out-of-sample. A harness without a held-out period would have shipped it.
Signal decay
Information coefficient measured at 1, 5, 10, 21, 63 day forward horizons. This answers a question a single-horizon IC cannot: how long the signal is worth holding.
| Factor | 1d | 5d | 10d | 21d | 63d | Peak | Half-life |
|---|---|---|---|---|---|---|---|
| illiq | -0.0120 | -0.0183 | -0.0218 | -0.0287 | -0.0478 | 63d | not reached |
| vol_21 | +0.0228 | +0.0175 | +0.0158 | +0.0202 | +0.0161 | 1d | not reached |
| px_vol_corr | -0.0106 | -0.0136 | -0.0149 | -0.0209 | -0.0209 | 21d | not reached |
| range_pos | +0.0101 | +0.0127 | +0.0183 | +0.0206 | +0.0238 | 63d | not reached |
| z_close_63 | -0.0136 | -0.0168 | -0.0211 | -0.0220 | -0.0195 | 21d | not reached |
| mom_63 | +0.0126 | +0.0130 | +0.0131 | +0.0147 | +0.0233 | 63d | not reached |
| vol_shock | +0.0016 | +0.0070 | +0.0098 | +0.0101 | +0.0042 | 21d | 63d |
| reversal_5 | +0.0035 | +0.0055 | -0.0050 | -0.0062 | -0.0095 | 63d | not reached |
| mom_21 | +0.0069 | +0.0111 | +0.0127 | +0.0115 | +0.0113 | 10d | not reached |
| gap_persist | -0.0057 | -0.0049 | -0.0021 | +0.0025 | -0.0051 | 1d | 10d |
Most of these peak at the longest horizon we test and never halve inside it, which is a finding about our own harness rather than about the market: the 21-day forward window the rest of this document uses may be measuring these factors before they have finished working. It is on the list to extend, and it is recorded here rather than quietly fixed later.
D Rejected research: a zero-shot foundation model
| Signal | n | Win | Mean | t | vs SPY | Long |
|---|---|---|---|---|---|---|
| Kronos zero-shot | 10,440 | 49% ±1.0 | −0.66% | −3.6 | −0.39% | 34% |
| 21-day momentum | 10,440 | 50% ±1.0 | −0.31% | −1.7 | −0.09% | 54% |
| Always long | 10,440 | 54% ±1.0 | +2.39% | +13.1 | +1.01% | 100% |
Not merely edgeless: at t = −3.6 the signal is significantly negative. The mechanism is that it was bearish 66% of the time across a sample the market spent rising. It was negative in every volatility regime and got worse over time, not better. As a ranking signal it also fails: the most-bullish decile realized +3.41% against the most-bearish decile's +3.72%, an inverted spread, with a Spearman rank IC of +0.021 where a usable equity factor starts around 0.03 to 0.06.
What this does not show: we tested one of the model's three published claims. Its volatility and range calibration - the claim most likely to be useful to a risk stage - is untested here, as are larger checkpoints and fine-tuning on our own universe, which is how the authors present the model. This measures what "just plug it in" would have bought us, which was the question being asked.