Source: Financial PhraseBank v1.0 (50agree). IN-SAMPLE to ProsusAI/finbert (its training data). Use FiQA-2018 for true OOS.
Sample: n=500. 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.632 | 0.258 |
| keyword proxy | 0.678 | 0.464 |
| finbert | 0.892 | 0.880 |
| cardiffnlp | 0.684 | 0.556 |
| bertweet | 0.700 | 0.634 |
| ENSEMBLE (mean of transformers) | 0.816 | 0.815 |
| Scorer | Direction accuracy | n |
|---|
| keyword | 0.615 | 65 |
| finbert | 0.972 | 176 |
| cardiffnlp | 1.000 | 59 |
| bertweet | 0.989 | 89 |
| ENSEMBLE | 0.972 | 179 |
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.187 |
| kw_vs_finbert | 0.226 |
| ens_vs_finbert | 0.848 |
| kw_vs_cardiffnlp | 0.045 |
| ens_vs_cardiffnlp | 0.387 |
| kw_vs_bertweet | 0.109 |
| ens_vs_bertweet | 0.572 |
| finbert_vs_cardiffnlp | 0.310 |
| finbert_vs_bertweet | 0.409 |
| cardiffnlp_vs_bertweet | 0.599 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 28 | 74 | 11 |
| neutral | 11 | 299 | 6 |
| negative | 14 | 45 | 12 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 104 | 6 | 3 |
| neutral | 32 | 275 | 9 |
| negative | 2 | 2 | 67 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 32 | 81 | 0 |
| neutral | 25 | 283 | 8 |
| negative | 0 | 44 | 27 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 50 | 62 | 1 |
| neutral | 46 | 262 | 8 |
| negative | 0 | 33 | 38 |
| true \ pred | positive | neutral | negative |
|---|
| positive | 106 | 4 | 3 |
| neutral | 67 | 234 | 15 |
| negative | 2 | 1 | 68 |
- Best 3-class accuracy:
finbert (0.892).
- Best direction accuracy:
cardiffnlp (1.000).
- Ensemble does NOT beat the best single transformer on accuracy (-0.076); the mean dilutes the strongest signal. Stick with a single model (FinBERT) in production.
- Ensemble direction accuracy 0.972 < best single 1.000; 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.