← All use cases
CASE STUDY / BUILT WITH BASAL

ESPI disclosures from Warsaw-listed companies: basal classifies type, tone and impact; we measure the price reaction

Adrian

English translation of a contributor’s story. Read the Polish original →

We read current ESPI disclosures from companies listed on the Warsaw Stock Exchange and wanted to find out whether they could be described automatically well enough to measure the stock-price reaction. We do not need summaries, but decisions: what the disclosure concerns, its tone for shareholders and its potential impact on valuation.

Basal’s role
Each disclosure — title, legal basis and text, up to 4,000 characters — goes to basal-1.5-4.5B with three questions in one request:
- Type: 10 categories described in ordinary Polish sentences: agreement or contract, results, dividend, buyback, issuance, insider transactions, acquisition, dispute/penalty/restructuring, shareholder meeting and management, and routine matters.
- Tone for shareholders: negative, neutral or positive.
- Valuation impact: a 0–3 scale.
Insider-transaction disclosures receive a second request: direction — purchase, sale, not established by the text, or no transaction — and who: a person discharging managerial responsibilities under MAR Article 19, or a major shareholder under Article 69. Changing the taxonomy means editing a dictionary in code, without training.

Infrastructure
basal-serve on Modal (serverless GPU) behind an authenticated endpoint, with a dependency-free Python client of around 100 lines. The container sleeps after two minutes of inactivity, so we pay only for actual work.

Scale
6,236 ESPI disclosures from 8 June to 5 October 2026. Three questions were applied to 5,917 disclosures with a ticker; 1,526 insider disclosures received two additional questions — around 20,800 decisions in total. Type confidence was at least 0.8 for 71% of disclosures; tone confidence reached that level for 79%.

Performance on our disclosures — median input around 3,500 tokens for all three questions
- L4, fast-nocompile: 333 ms per disclosure on the server, 2.3 disclosures/s with 32 concurrent requests.
- H100, fast: 39 ms per disclosure, 22.4 disclosures/s (67 decisions/s) with 32 concurrent requests.
At Modal’s prices — around USD 0.80/h for L4 and USD 3.95/h for H100 — this is around USD 0.10 per 1,000 disclosures on L4 and USD 0.05 on H100. At full utilisation, H100 is cheaper per disclosure and processes all four months in around 4.5 minutes instead of 43.

Findings from the price-reaction study
4,328 events, 373 companies; return above that day’s market median, entering at the first market open after publication.
- Negative tone, confidence ≥ 0.5: −0.82% over two sessions (t = −3.0; n = 320); for liquid stocks, −1.33% (t = −3.3; n = 98). Raising the confidence threshold does not strengthen the effect.
- Positive news without an opening gap (absolute gap < 1%), liquid stocks: +1.24% over five sessions (t = 2.9; n = 169). This was found retrospectively, so we treat it as a hypothesis to test on new data.
- After transaction costs — estimated because we lack bid/ask quotes — nothing remains for small companies. Basal labels work better as a “what to avoid” filter than as a ready-made strategy.
We tested around 130 combinations on four months of data, so some results are noise.

What basal does not do here
It does not predict stock prices. Probabilities express confidence in text classification. The relationship between labels and prices is a separate measurement.

What helped most
Polish categories without translation, several questions about one disclosure in a single request, probabilities that can be thresholded, and a cost of cents for thousands of disclosures.

Next steps
Manually label around 150 disclosures and measure classification accuracy; test rules frozen on 5 October 2026 on disclosures from later months.

Submitted by a model user and published after moderation.

How do you use basal?

Share your use case