Part 1 · The idea
1Why not just ask an LLM?
The obvious way to build a trading agent that reads the news is to give the headlines to a large language model and ask it for the answer: the trade itself, a tilt on top of a portfolio, or an event signal to act on. It is quick to build, and one model does everything.
That is also the problem. Inside one answer the model has to decide which asset a story is about, whether it is good or bad news, and how much money to move. When the result is wrong, you cannot tell which of the three went wrong; the answer can shift with the wording of the prompt; and nothing in it knows about risk, turnover or the limits of the portfolio. Our project’s methodology rejected a direct LLM allocator for exactly these reasons: prompt-sensitive, hard to reproduce and weakly risk-controlled.
So we asked a narrower question: how could news help a portfolio at all? Only if the agent knows what a story is about and whether it is good or bad. Those are two different skills, so they get two different models, and the allocation stays with the part of the system that understands risk.
2Two questions, two small models
Which asset?
Relevance model
A small sentence encoder (4 layers, BGE family) turns each article and a short description of each asset into vectors, and their similarity says how much the article is about that asset. One article can matter to several assets.
Good or bad?
Tone model
A financial sentiment classifier (FinBERT) reads the same article and gives probabilities for positive, neutral and negative. The tone is positive minus negative, between −1 and +1.
How much?
Risk model, with a cap
Not a language question. A risk-parity portfolio sets the weights from prices, and the news score may only tilt it, by at most 1.0% of the portfolio in total.
For each asset the agent pools the day’s articles, weighting each by its relevance to that asset and by how recent it is, and multiplies relevance × tone, together with how sure the tone model is and how strongly the article matches one of 8 fixed event types. The result is one news score per asset. Both models are small, run locally and give the same output for the same input, so each can be inspected and tested on its own.
3Why the news only nudges
Even with good relevance and tone, turning each headline straight into a large position is fragile: small day-to-day changes in the news would make the portfolio churn. So the news score enters as a small, centred adjustment: what one asset gains, others give up, and the total size of the adjustment is capped.
The cap is a design choice, not a forecast: whatever the text models conclude, they cannot move more than 1.0% of the portfolio in Track 1 (1.2% in Track 2) before normalisation.
4The system in one picture
- Prices decide. In Track 1 a shrinkage risk-parity portfolio gives every asset an equal share of portfolio risk.
- Text is local and deterministic. Both models load from local files, with no online calls; the encoder was adapted on 2024 data only.
- Failures are explicit. No visible news gives a zero tilt. A missing model stops the agent with a stable failure state rather than downloading a substitute.
5Where it runs
Nothing in the design is tied to one market: the relevance model needs a short description of each asset, the tone model needs text in the market’s language, and the risk model needs prices.
NLPCC 2026 Shared Task 4 tested
Chinese funds · daily decisions · Chinese news
Track 1, our main system: 11 macro and broad-market assets, from the CSI 300 and ChiNext to government bonds and gold. It placed 1st. Track 2, a secondary extension over 16 sector funds, placed 6th.
ACM ICAIF 2026 Trading Agent Competition Coming soon
US equities · 7 decisions a day · English news
The same design, adapted to 30 US-listed stocks. Results coming soon.
Part 2 · The evidence
Tested so far NLPCC 2026
- The complete system on the organizers’ hidden 2026 evaluation, both tracks
- A replay of the submitted agents over all 243 public-2025 decision dates
- Same-stack Track 1 controls: news zeroed, and news taken from 5 or 21 dates later
- The packaged agents reproduce the development agents’ weights on all 243 replay dates
In progress Coming soon
- ACM ICAIF 2026 Trading Agent Competition: US equities, live evaluation
- The ICAIF write-up
6A leakage-safe backtest
A backtest leaks when a decision uses something it could not have known. At NLPCC 2026 the official loader rules this out by construction, and our agent never steps outside it. We fitted and selected everything on 2024, replayed the frozen system on the public 2025 data, and the organizers ranked submissions on a hidden 2026 period.
- Inside a day. Features use prior closes and cutoff-visible news only. Today’s open is used just to turn target weights into order sizes.
- Across years. The text encoder was adapted on 2024 only, and the package manifests declare 2024-only selection, no 2025 tuning and no use of hidden 2026 data. The organizers ran the 2026 evaluation; we report only their aggregate results.
7Results: Track 1
Track 1 is where the design was meant to work, and where it did: over 11 macro assets it ranked first on the organizers’ hidden evaluation.
Official ranking
Hidden 2026 period · organizer-run
1st Sharpe 1.1144Result. Annualised return 13.52%, maximum drawdown −6.23%.
2025 replay
Public 2025 · 243 decisions
24.30% · Sharpe 2.270Result. Maximum drawdown 5.83%; target turnover 0.77% a day.
With and without news
Same agent, news score zeroed
2.270 vs 2.198Result. Sharpe with news against the same agent with news zeroed (23.31% return).
Where did the money go? The targets start almost equal-weighted on the first replay date and then shift during the year, most visibly towards government bonds, with a large early share in gold. The news tilt is part of these targets but too small to pick out at this scale, which is the point of the cap.
Track 2, sixteen sector funds on a volatility–momentum–trend base, is a secondary extension. It placed 6th (Sharpe 0.7566, annualised return 15.32%, maximum drawdown −7.49%).
8News on and off
The cleanest test is same stack, news zeroed: the identical Track 1 agent run over 2025 with an all-zero news score. The date-offset rows feed each day the complete news set from 5 or 21 dates later, and the reference rows are separately locked no-news systems.
- With the news zeroed, the same Track 1 agent returns 23.31% at Sharpe 2.198, against 24.30% at 2.270 with the news, with almost identical drawdown.
- Feeding each day the news from 5 or 21 dates later gives Sharpe 2.271 and 2.271.
9ICAIF 2026 Coming soon
AlphaAllocator is also being used, adapted to US equities, in the ACM ICAIF 2026 Trading Agent Competition: 30 US-listed stocks, 7 decisions a day, evaluated live. The questions stay the same; the asset descriptions, the text models’ language and the decision clock change. Results and a write-up are coming soon.
10Limitations and what didn’t work
Scope
- One task, one market. The NLPCC results come from a shared task and its evaluation protocol, and are historical backtests. The official rank evaluates the complete Track 1 system; it does not show that the separation of questions or news models in general improve portfolios. This is an academic system, not investment advice.
- The 2025 replay. The repository cannot show when 2025 outcomes were first looked at, so we call it public-2025 replay evidence, not a held-out or preregistered test. It is one year, and we make no statistical power claim. It compounds each day’s target weights from close to next close and simulates no orders, commission, slippage or rejected trades, so it is not comparable with the organizers’ execution metrics.
- No direct-LLM baseline. Using separate small models is a design choice. We did not run a direct-LLM allocator, so we make no claim that it would have done worse.
What the evidence does not show
- The effect of the news is small and not established. In Track 1 the same agent with news zeroed returns 23.31% at Sharpe 2.198, against 24.30% at 2.270: a modest, single-period difference, not a causal estimate. Feeding each day the news from 5 or 21 dates later gives essentially the same result (Sharpe 2.271 and 2.271). Those offsets ran only in our offline replay and can place later news on earlier dates, so they are stress tests of the call path, not leakage-safe controls. Read together, the replay does not show that the gain comes from the content of each day’s news. There is no component-by-component evaluation, so nothing is claimed about relevance, tone, recency, events or uncertainty separately.
- Track 2’s news overlay did not help. The text system returns 34.00% with a 12.53% drawdown; its no-news reference, which equals its zeroed-news run, returns 35.05% with 11.26%. We do not know why. One hypothesis for future testing is that sector queries mix direct, upstream, downstream and market-wide news.
- The relevance model’s adaptation is not shown to help. The 2024 checkpoint was kept because a 50:50 mix of lexical and embedding ranking improved development MRR from 0.9752 to 0.9942, while the embedding alone fell from 0.7985 to 0.7522. Training used CLS pooling and a retrieval prefix, whereas submitted inference uses mean pooling and no prefix, so the archive does not show that adaptation improved the relevance function the agent actually uses.
- Explored, not submitted. The research registry lists 14 evaluated-but-not-promoted branches, 6 planned but not run, 5 blocked and 6 future-work ideas, among them robust Black–Litterman, belief-state risk parity, online mirror-descent meta-allocation, hidden-state and model-predictive control, causal and event-impact models, rule-based sector ranking, a lightweight graph mixture of experts, and more aggressive transformer overlays. None was promoted. We concluded that a robust quantitative core with a tightly bounded overlay was easier to defend than aggressive news-driven allocation.
Implementation and reproducibility
- The news score is a heuristic. It is a deterministic engineering product of relevance, tone, recency, event match and certainty, not a learned objective or a calibrated return forecast, and the largest class probability it uses is not a calibrated confidence.
- Two configured switches did nothing. Disabling the confidence gate or the 0.035 overlay turnover guard leaves every metric unchanged. The gate is set to 0.0. The guard is inactive in the submitted call path: the adapter never passes previous weights to it and passes its value under a key the planner does not read, so the planner’s default 25% limit applies. A configured value is not evidence of enforcement.
- Gaps in the archive. A full-year strict HTTP parity run was not completed. At the last audit a clean offline dependency install and
pip checkwere blocked by an incomplete wheelhouse, andcompileallby sandboxed bytecode writes. News timestamps are timezone-naive and the source timezone is not recorded; the archived triplet generator was moved after it ran and carries no script hash; cap-binding frequency is not recoverable for both tracks, so we do not report it.
11What we would change
These directions come from the paper’s own limitations; none has been run.
Part 3 · Technical details
12The two quantitative bases
Track 1. The agent requests 60 rows: 59 completed bars and the masked current row. Simple returns come from positive prior closes, aligned across assets to the shortest history (at most 58 observations). With sample covariance , the fixed shrinkage is
Each asset’s share of portfolio variance is . Starting from inverse volatility, the weights are updated multiplicatively towards equal shares ,
and after every update projected to long-only weights, at most 35% per asset and 97% in total. Iteration stops when every share is within of its target or after 250 updates. A numerical exception falls back to a deterministic quantitative core. The base limits one-way target turnover to 25% and ignores changes below 1%.
Track 2. Three normalised components over 20-day windows: inverse volatility, momentum (the average of 3-, 5- and 20-day price momentum, negatives clipped) and sector trend (20-day momentum plus the share of positive days minus one half, negatives clipped):
Each weight is then multiplied by , where penalises the 20-day maximum drawdown and is the 20-day share of positive returns, before normalising to 97% and applying the 35% cap with redistribution.
13The news score
Cleaning. Each article is its title, a space and its content, whitespace-collapsed and cut to 1,200 characters. Empty records are skipped; duplicates are found by hashing the title and the first 500 content characters; the official ranking order is restored and at most 20 articles kept. Both tokenizers truncate at 256 tokens, batch size 16.
Relevance and recency. An asset query is its identifier followed by fixed Chinese keywords. Articles and queries are mean-pooled over the attention mask and L2-normalised, so dot products are cosines. For article and asset , with a two-day half-life,
with . This is a relative weighting, not a gate: every visible article keeps a small positive weight. A timestamp that cannot be parsed gets recency 0.65.
Tone and the daily score. FinBERT gives class probabilities ; tone is and is the largest class probability. Pooling with gives relevance , tone , probability and recency ; is the strongest pooled similarity to 8 fixed event descriptions and the pooled class entropy divided by , capped at 1. The score is
set to zero when . Similarities to 5 aspect descriptions are logged but do not enter the score.
The encoder. A 4-layer, 512-wide BGE-small-compatible encoder, contrastively adapted on 2024 weak-label triplets: keyword hits gave positives and non-matching queries gave negatives. Training used 4,096 of 60,682 candidate triplets (2 January – 23 October 2024), with 1,536 reserved for development (24 October – 31 December 2024), two fixed epochs and temperature 0.05. The tone model is a 12-layer Chinese FinBERT with neutral, positive and negative classes.
14From tilt to orders
With sensitivity (0.010 in Track 1, 0.012 in Track 2), the raw tilt is
The path from base to holdings has six distinct states, and the cap applies only to the second:
- Base weights from the quantitative core, already capped at 35%.
- Raw tilt , centred and L1-capped at .
- Agent target: base plus tilt, negatives clipped, rescaled to 97%. The 35% cap is not reapplied here.
- Planner target: each coordinate clipped to 35% without redistribution, then blended towards current holdings within a 25% one-way turnover limit.
- Orders: changes below 1% ignored; purchases funded from decision-time cash less a 3% reserve.
- Holdings after the official engine fills at the close, with 0.01% commission each way, buys before sells.
15Full tables
| Official, hidden 2026 | Rank | Sharpe | Annualised return | Maximum drawdown |
|---|---|---|---|---|
| Track 1 | 1st | 1.1144 | 13.52% | −6.23% |
| Track 2 | 6th | 0.7566 | 15.32% | −7.49% |
Organizer evaluation; drawdown in their signed-negative convention.
| Public 2025, gross replay | Return | Sharpe | Max drawdown | Turnover | News-active days |
|---|---|---|---|---|---|
| Track 1 · submitted text system | 24.30% | 2.270 | 5.83% | 0.77% | 243 |
| Track 1 · same stack, news zeroed | 23.31% | 2.198 | 5.83% | 1.47% | 0 |
| Track 1 · news from 5 dates later | 24.30% | 2.271 | 5.83% | 0.77% | 241 |
| Track 1 · news from 21 dates later | 24.30% | 2.271 | 5.83% | 0.77% | 234 |
| Track 1 · no-news reference (separately locked) | 23.91% | 2.257 | 5.83% | 1.57% | 0 |
| Track 2 · submitted text system | 34.00% | 1.681 | 12.53% | 1.74% | 243 |
| Track 2 · no-news reference (= news zeroed) | 35.05% | 1.681 | 11.26% | 12.15% | 0 |
243 decisions and 242 close-to-next-close returns. Return is cumulative; Sharpe uses 252 days and a zero risk-free rate; drawdown is a positive magnitude; turnover is the mean one-way change in target weights, not in realised holdings. News-active days count dates with a non-zero tilt.
16Reproducibility notes
The submission is a standalone package: the two track agents, a vendored copy of the runtime they need, an official-style local server, the configuration and both model snapshots, loaded with local files only. Commands, expected outputs and audits ship with it.
- Final configuration
- SHA-256 b4fc52e37f0fdb4c5704b196ff2f22980473f11f1713525110961b4ccdfb3d43; declares 2024-only selection, no 2025 tuning, no hidden-2026 use, no network.
- Encoder weights
- SHA-256 003563924b66722e96f19f5dedb33794c8a63f6d19e333fb83fc1a28c655ca41
- FinBERT weights
- SHA-256 0c25b105902f90d1e039d511944af4f49d1490f6698e701f2704a714ca74e66b; stored with Git LFS.
- Dependency lock
- NumPy 2.3.4, pandas 2.3.3, PyTorch 2.6.0+cu124, Transformers 5.8.1.
- Task interface
- Checked against the organizers’ starter kit at commit b94ce984e318fe09779318585db55b12dc9773f3.
- Parity
- The packaged agents reproduce the development agents’ target weights on all 243 replay dates, with zero difference. A 5-date test through the package’s HTTP server matched exactly for both tracks.
- Tests
- The package’s tests pass: 91 and 156, one skip each.
17Sources
Paper: NTU-QRS AlphaAllocator: Bounded Transformer News Overlays for Chinese Macro-Asset Allocation, NLPCC 2026 Shared Task 4, poster and oral, 5 August 2026. [OpenReview]
Recognition
- NLPCC 2026 Shared Task 4 · Track 1 · 1st
- NLPCC 2026 Shared Task 4 · Track 2 · 6th
Official results are the organizers’ release as reported in the paper; the 2025 numbers come from the replay outputs of the NLPCC submission. Asset names paraphrase the keyword lists in the reproducibility manifest.