Source: FiQA-2018 (Pau Riba, test split). TRUE OUT-OF-SAMPLE — ProsusAI/finbert was NOT trained on this set (disjoint from Financial PhraseBank).
Sample: n=150. Models: keyword proxy (production fallback), ProsusAI/finbert (3-class, wired in production), cardiffnlp/twitter-roberta-base-sentiment-latest, finiteautomata/bertweet-base-sentiment-analysis, and ensemble (mean of all available transformers' signed scores in [-1,1]).
| Scorer | Accuracy | Macro-F1 |
|---|
| all-neutral baseline | 0.333 | 0.167 |
| keyword proxy | 0.387 | 0.345 |
| finbert | 0.567 | 0.562 |
| cardiffnlp | 0.560 | 0.554 |
| bertweet | 0.540 | 0.526 |
| ENSEMBLE (mean of transformers) | 0.640 | 0.639 |
| Scorer | Direction accuracy | n |
|---|
| keyword | 0.792 | 24 |
| finbert | 0.857 | 63 |
| cardiffnlp | 0.860 | 50 |
| bertweet | 0.870 | 46 |
| ENSEMBLE | 0.838 | 80 |
Direction matters more than 3-class for the bot (we skip neutrals in the daily panel anyway), so this is the most decision-relevant number.
| Pair | κ |
|---|
| kw_vs_ens | 0.106 |
| kw_vs_finbert | 0.197 |
| ens_vs_finbert | 0.717 |
| kw_vs_cardiffnlp | 0.073 |
| ens_vs_cardiffnlp | 0.541 |
| kw_vs_bertweet | 0.011 |
| ens_vs_bertweet | 0.519 |
| finbert_vs_cardiffnlp | 0.350 |
| finbert_vs_bertweet | 0.338 |
| cardiffnlp_vs_bertweet | 0.607 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 8 | 40 | 2 |
| neutral | 7 | 39 | 4 |
| negative | 3 | 36 | 11 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 19 | 25 | 6 |
| neutral | 6 | 31 | 13 |
| negative | 3 | 12 | 35 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 19 | 29 | 2 |
| neutral | 4 | 41 | 5 |
| negative | 5 | 21 | 24 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 14 | 33 | 3 |
| neutral | 3 | 41 | 6 |
| negative | 3 | 21 | 26 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 30 | 13 | 7 |
| neutral | 8 | 29 | 13 |
| negative | 6 | 7 | 37 |
- Best 3-class accuracy:
ensemble (0.640).
- Best direction accuracy:
bertweet (0.870).
- Ensemble beats the best single transformer by +0.073 on accuracy — keep the ensemble in production.
- Ensemble direction accuracy 0.838 < best single 0.870; ensemble dilutes direction slightly.
- The ensemble is a mean of signed scores, not a learned stacker. It assumes the transformers output comparable units ([-1, 1]); since each has its own scoring curve (FinBERT 3-class confidence, cardiffnlp/bertweet 2-3-class), the mean is a coarse combination. A learned meta-stacker on this data would likely do better, but the gain is small and the mean is a robust default.
- The signed score mapping assumes neutral = 0; transformers vary in how they treat the neutral class. The ensemble will lean more positive/negative than the mean of the three discrete labels would suggest.