News and Rumours¶
Learning objectives
After reading this chapter you will be able to:
- Read a headline the way the simulation means it: scope, kind, sentiment and the secret impact behind it
- Follow a rumour from its first headline to its confirmation or retraction
- Predict how the AI traders and the market maker react to news
- Turn generated news up, down or off, and publish news of your own in front of a class
Prerequisites: The True Value.
Why news¶
In the simulation, as on a real exchange, the true value of a share does two things: it drifts a little all the time, and now and then it jumps because something happened. The jumps are what news is for. A headline tells the market that the value has moved — and roughly which way — before the price has caught up. Who reads it first, who believes it and who ignores it is what turns a headline into a price move you can watch.
Anatomy of a headline¶
| Field | Public? | Meaning |
|---|---|---|
| Scope and targets | yes | One symbol, one sector, or the whole market |
| Kind | yes | EARNINGS, GUIDANCE, MNA, REGULATORY, PRODUCT, LEGAL, MANAGEMENT or MACRO |
| Headline | yes | The text, e.g. "NVDA raises its outlook" |
| Sentiment | yes | How good it sounds, from −1 (very bad) to +1 (very good) |
| Status | yes | CONFIRMED (it happened), RUMOUR, then CONFIRMED or RETRACTED |
| Credibility | yes, rumours only | How believable the rumour looks, 0 to 1 |
| Impact | no | The log move it causes in the true value: 0.05 is about +5.1 %, −0.10 about −9.5 % |
Students see everything but the impact: in terminal-gui's news view, the API
(GET /api/v1/news) and pm-ticker. The impact is the market model's
secret, exactly like the true value.
How far a headline moves values. A symbol headline moves that symbol by
its impact. A sector headline moves each symbol of the sector by
beta_sector × impact, a market headline every symbol by
beta_market × impact — so with the s300-sim betas a sector headline
moves its symbols by about 35–60 % of the impact, and a market headline every
symbol by 35–60 % of it.
Generated news¶
Left alone, pm-market-sim writes news itself, at random moments during
continuous trading. The s300-sim example keeps the defaults:
news:
rate_symbol: 6.0 # symbol headlines per trading day, whole exchange
rate_sector: 0.5 # sector headlines per trading day
rate_market: 0.3 # market headlines per trading day
rumour_share: 0.3 # share that starts as a rumour
rumour_confirm: 0.6 # chance a rumour is confirmed rather than retracted
rumour_delay_min: 0.02 # trading days before a rumour resolves (uniform)
rumour_delay_max: 0.15
What that means on a 300-symbol exchange:
| On average | |
|---|---|
| Symbol headlines | 6 a day — one every hour or so; any one share gets news about once every 50 trading days |
| Sector headlines | one every two trading days |
| Market headlines | one every three or four trading days |
| Rumours | about 2 a day; they resolve 8 to 60 minutes of continuous trading later, 3 in 5 confirmed |
A "trading day" here is the 6.5 hours of continuous trading; the rates are per trading day whatever speed the calendar runs at (see Accelerated Time).
What kind of news, how big¶
Each scope draws a kind, and each kind has its own size: the impact is normally distributed with the kind's mean and spread.
| Kind | Scopes | Share of symbol news | Impact mean | Impact spread (σ) | Typical move |
|---|---|---|---|---|---|
EARNINGS |
symbol | 35 % | 0 | 5 % | ±5 % |
GUIDANCE |
symbol | 17 % | 0 | 3 % | ±3 % |
PRODUCT |
symbol | 17 % | +0.5 % | 2 % | ±2 % |
REGULATORY |
symbol, sector | 9 % | −1 % | 4 % | ±4 %, a little more often bad |
LEGAL |
symbol | 9 % | −1 % | 3 % | ±3 %, a little more often bad |
MANAGEMENT |
symbol | 9 % | 0 | 2 % | ±2 % |
MNA |
symbol | 4 % | +6 % | 6 % | a takeover bid: mostly up, sometimes a lot |
MACRO |
sector, market | — | 0 | 1.5 % | ±1.5 % before the betas |
Sector headlines are REGULATORY or MACRO (half each); market headlines
are always MACRO.
Sentiment: a hint, not the answer¶
The sentiment students see is the impact made public, but blurred: roughly impact ÷ (2 × the kind's spread), plus a little noise (σ 0.15), clipped to ±1. So an earnings beat of one spread (+5 %) reads about +0.5, a big miss of two spreads (−10 %) about −1. The sign is almost always right; the size is only a guide. Two headlines with the same sentiment can move the value by quite different amounts — which is why value traders, who see the value itself, keep correcting what news traders start.
Rumours¶
stateDiagram-v2
[*] --> RUMOUR: headline with a credibility\nvalue does not move
RUMOUR --> CONFIRMED: confirmed\nvalue moves by the impact
RUMOUR --> RETRACTED: retracted\nvalue never moves
CONFIRMED --> [*]
RETRACTED --> [*]
A rumour is a headline that may not be true. It carries a credibility and moves nothing in the model. Later it is confirmed — a second headline, and only then does the value move — or retracted, and the value never moves at all. Prices often do move on a rumour, though: that is traders betting on it, and when a retracted rumour's price move unwinds, someone has lost money.
Credibility is informative but not reliable. A generated rumour that will be confirmed gets a credibility between 0.4 and 0.9; one that will be retracted between 0.1 and 0.6. A credibility of 0.8 is almost surely true, one of 0.2 almost surely false, and anything in 0.4–0.6 is a coin toss.
Who reacts, and how¶
| Who | Reacts to | How |
|---|---|---|
news-trader (5 agents) |
every headline touching its symbols | Hears it after a lag of its own (median 5 s), then trades in the headline's direction while its conviction — |sentiment|, times credibility for a rumour, halving every 2 minutes — stays above 0.15; pays up to 0.08 × conviction beyond the price it first saw |
value-investor, institutional (30 agents) |
the true value, which news moves | Buy or sell toward the new value as soon as it moves. On a rumour, which does not move the value, they shift their own view by 0.05 × sentiment × credibility |
MM01, the market maker |
the true value | Moves its own price 30 % of the way toward the value every second and re-quotes once that has moved 15 ticks — so a confirmed headline moves its quotes within seconds, and a rumour does not move them at all |
| Everyone else (65 agents) | prices only | Trend followers and scalpers chase the move once it shows; contrarians fade it |
Put together, a confirmed headline is priced in fast: in a test with an anchored market maker and the same kinds of trader on 150 symbols, a +10 % earnings surprise moved the price +6.5 % within 5 seconds and +10 % within 15 seconds. Rumours leave much less trace than you might expect. The market maker sells to every rumour buyer at its value-anchored price, so in the same test a credible good rumour (sentiment 0.7, credibility 0.5) lifted the price under 3 %, and a sector rumour moved its sector by less than 1 %. To show students how a rumour moves a market, run without the market maker — see Tuning the Traders.
Steering the news¶
Fewer, more, or none¶
Change the rates in market_sim.yaml (how to deploy your copy:
Tuning the Traders):
| You want | Set |
|---|---|
| A quiet market where you alone publish news | every rate_* to 0 |
| A news-heavy market, a headline every few minutes | rate_symbol: 60 (and perhaps rate_sector: 3) |
| More rumours, harder to read | rumour_share: 0.6, rumour_confirm: 0.5 |
| Rumours that linger for a lesson | rumour_delay_min: 0.1, rumour_delay_max: 0.3 |
| No market-wide shocks | rate_market: 0 |
Each rate is a Poisson rate: the gaps between headlines are random, so
rate_symbol: 60 gives ten an hour on average, sometimes three in a
minute, sometimes none for twenty.
Publishing news yourself¶
pm-news sends a headline to the running market model as an ADMIN
participant. In the container:
# From the host
docker exec edumatcher-sim pm-news --id OPS01 inject --symbol NVDA \
--kind EARNINGS --sentiment 0.8 --impact 0.08 \
--headline "NVDA smashes estimates on data-centre demand"
# From within the container
pm-news --id OPS01 inject --symbol NVDA \
--kind EARNINGS --sentiment 0.8 --impact 0.08 \
--headline "NVDA smashes estimates on data-centre demand"
The value of NVDA moves +8.3 % at once; the price follows within seconds. A rumour you inject waits for you:
# From the host
docker exec edumatcher-sim pm-news --id OPS01 inject --sector ENERGY \
--kind REGULATORY --sentiment -0.7 --impact -0.06 --rumour --credibility 0.6 N12
docker exec edumatcher-sim pm-news --id OPS01 confirm N12 # or: retract N12
# From within the container
pm-news --id OPS01 inject --sector ENERGY \
--kind REGULATORY --sentiment -0.7 --impact -0.06 --rumour --credibility 0.6 N12
pm-news --id OPS01 confirm N12 # or: retract N12
inject prints the headline's id (N12 here). A rumour you inject never
resolves on its own. Your headlines and generated ones mix freely; set the
rates to 0 if yours should be the only ones.
Scenarios¶
For a lesson, script the news in a file and play it:
# From the host
docker exec edumatcher-sim pm-news --id OPS01 play \
/opt/edumatcher/.venv/lib/python3.13/site-packages/docs/examples/news/earnings-surprise.yaml
# From within the container
pm-news --id OPS01 play \
/opt/edumatcher/.venv/lib/python3.13/site-packages/docs/examples/news/earnings-surprise.yaml
Three scenarios ship with EduMatcher — earnings-surprise,
rumour-confirmed and rumour-retracted — and fit s300-sim as they fit
the s150-* examples. Their format, and how to write your own, is in
The Market Model;
the AI Traders & News exercises
use them in class.
Watching the news¶
| Where | What |
|---|---|
| terminal-gui, news view | Every headline as it is published, with status and sentiment |
docker exec edumatcher-sim pm-news list |
Headlines printed as they arrive, until Ctrl+C |
docker exec edumatcher-sim pm-news past --limit 20 --date 2026-10-14 |
Recent headlines from that session date, newest first |
GET /api/v1/news (any API key) |
Today's headlines, and the sector of every symbol |
Try it¶
- Pick a quiet symbol in book-gui and note its price and the value
(
pm-market-sim --status --id OPS01lists it if it is far off; the admin API,GET /api/v1/admin/simwith theOPS01key, gives all of them). - Inject a confirmed headline with impact
0.05and watch the price for a minute. Who traded first? (The tape and the order book showAIids.) - Inject a rumour with sentiment
0.8, credibility0.9, and no impact worth speaking of (--impact 0.001). Does the price move? Why not much? - Retract it. Then try again without the market maker (Tuning the Traders shows how to remove it).
See also¶
- The Market Model — the reference for
pm-newsand scenarios - How the AI Traders Decide — the
newsandvaluestrategies in full - AI Traders & News — classroom exercises with news