Technical whitepaper

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.

Figure 1. The pipeline, as it actually executes. Each seat links to its specification in the agent library; the same structure is rendered from the same source on this page, the landing page and the library, so the three cannot disagree.

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.

DeskToolsOwns
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.

GroupDesksPrimary 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

Purged monthly walk-forward · 92-day embargo · 63-trading-day horizon · 163 tickers · 262,168 training rows · 29 features · artifact data/score/latest.json

MetricValueReading
Pooled out-of-sample AUC0.4969Coin flip
Out-of-sample observations109,402Not a sample-size problem
Top-decile hit rate45.4%No usable spread; ordering is not monotonic across deciles (0.449-0.475)
Bottom-decile hit rate47.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

Signals replayed on daily OHLCV from our own store · 163 tickers · ~8 years · excess return measured against SPY over the same window · overlapping signals counted individually · no costs, slippage or sizing · artifact data/scanner_bt.json

RulenWinMeantEx-SPY, ex-shock
Breakout5,66251%+4.05%9.6+1.88%
Pullback to 50-day2,60750%+3.08%6.6+1.05%
Golden cross77550%+1.63%1.9+1.08%
Squeeze release2,79147%+1.29%3.6+0.14%
Oversold in uptrend8,69348%+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

164 tickers · 21-day forward · ~8 years · in-sample through 2024-06-30, held out from 2024-07-01 · Benjamini-Hochberg FDR q=0.1 in-sample, sign agreement and |t| ≥ 1.5 out-of-sample · quantile, turnover and cost figures on the full sample · generated 2026-07-27

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.

FactorIS ICIS tOOS ICOOS 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 1d5d10d21d63d PeakHalf-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

Kronos-small (24.7M parameters, 512-bar context) run zero-shot over our own bar store · 164 tickers · 10,440 non-overlapping 21-day windows · 2020-08-05 to 2026-06-08 · split- and dividend-adjusted · signal is the sign of the forecast close versus the last actual close · scored with the same columns as the rule harness

SignalnWinMeantvs SPYLong
Kronos zero-shot10,44049% ±1.0−0.66%−3.6−0.39%34%
21-day momentum10,44050% ±1.0−0.31%−1.7−0.09%54%
Always long10,44054% ±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.

Reproducibility. Every figure in the appendices is emitted by code in the Parallax repository and stored as a dated artifact. Where a number is soft - a median run time, a desk's refresh cadence - it is described as such in the text rather than tabulated.

Parallax Research produces automated, impersonal, educational research. It is not personalized investment advice, and nothing in this document is a claim about achievable returns. See the methodology page for per-number detail and the terms for the full disclaimer.

Run the pipeline on a ticker → Read a finished report