A fine-tuned ProsusAI/finbert (109M params, BERT-base) for 3-class sentiment analysis on financial, macroeconomic, and climate/ESG text. Trained on 20K samples from 5 financial NLP datasets.
This model is the default FinBERT head and the backbone of the macro-sentiment-finbert ensemble pipeline. The topic router selects it for general financial news and social/tweet content. It can also be used standalone as a drop-in upgrade for the original ProsusAI/finbert.
Why Fine-Tune FinBERT?
The original ProsusAI/finbert was trained only on Financial PhraseBank (Araci, 2019) — ~4,800 sentences from English financial news. By fine-tuning on a broader mix of 5 datasets spanning news headlines, financial tweets, auditor reports, financial QA, and climate disclosures, we significantly improve recall on minority classes and cross-domain generalization:
Metric
Off-the-shelf FinBERT
This model
Δ
Accuracy
~0.670
0.897
+23pp
F1 (macro)
~0.578
0.881
+30pp
Negative recall
~0.47
0.89
+42pp
Positive recall
~0.35
0.91
+56pp
The original model's weakness is its strong neutral bias — it achieves decent accuracy by defaulting to "neutral" but badly under-predicts both positive and negative classes. Our broader training mix and class weighting fix this.
Within the macro-sentiment-finbert pipeline, this model is the default head — selected for general financial news, social media, and any text that doesn't trigger the policy or climate routing keywords:
This model preserves FinBERT's native label encoding:
Label ID
Label
Unified Sentiment
Score Mapping
0
positive
positive
+1.0
1
negative
negative
-1.0
2
neutral
neutral
0.0
Note: FinBERT's label ordering (positive=0, negative=1, neutral=2) differs from the standard convention (negative=0, neutral=1, positive=2). The ensemble pipeline handles this remapping internally. If using standalone, interpret labels by name, not by ID.
Evaluation Results
In-Domain (Combined Test Set — 4,333 samples)
All three fine-tuned heads compared on the same held-out test split:
Balanced recall across all three classes (89–91%) is the key improvement over the original FinBERT, which suffered from strong neutral bias (~90%+ neutral recall but <50% for positive/negative).
FinBERT's financial pre-training gives it an edge over ClimateBERT on stock-specific headlines. The overall lower numbers reflect the 5→3 class mapping noise and significant domain shift (short, noisy headlines vs. the longer sentences in the training mix).
Comparison Against Baselines
Method
Accuracy
F1 (macro)
Notes
FinBERT (this model)
0.8973
0.8813
109M params, fine-tuned
Off-the-shelf ProsusAI/finbert
~0.670
~0.578
Same architecture, no fine-tuning on combined data
Dict-only meta-classifier (GBT)
0.6693
0.5781
GradientBoosting on 24 dictionary features
Dict-only rules (LM + Henry)
0.5684
0.5277
Threshold-based, no learned parameters
Training Data
Fine-tuned on 20,034 training samples combined from 5 public financial/climate sentiment datasets:
Following the approach in the original FinBERT paper (Araci, 2019, Section 4.4), sqrt-inverse-frequency class weights are applied to the cross-entropy loss to counteract the ~58% neutral class imbalance:
This upweights the minority negative class (1.30×) and downweights the majority neutral class (0.68×) while keeping the positive class near unity (1.02×).
Training Curve
Epoch
Train Loss
Val Loss
Accuracy
F1 (macro)
F1 (weighted)
1
0.894
0.376
0.858
0.838
0.860
2
0.629
0.353
0.859
0.846
0.862
3
0.360
0.317
0.892
0.876
0.893
4
0.160
0.377
0.894
0.879
0.895
5
0.124
0.405
0.897
0.881
0.898
6
0.086
0.429
0.896
0.880
0.897
Validation loss bottomed at epoch 3, but F1 macro continued improving through epoch 5. The divergence between val loss and F1 suggests the model becomes less calibrated (overconfident) on later epochs while still improving classification boundaries — a common pattern with class-weighted loss. The best checkpoint (epoch 5) trades slightly worse calibration for better discrimination.
Role in the Ensemble Pipeline
This model serves as the default financial news head in the macro-sentiment-finbert pipeline. It is selected when no specialized routing keyword is triggered, making it the workhorse for general financial content.
The pipeline fuses this model's prediction with four dictionary-based signals (Loughran-McDonald, Henry earnings tone, Sautner-style climate exposure, and macro policy/crisis dictionaries) using crisis-adaptive weighting — during crisis language, more weight shifts to the dictionary composite, since crisis keywords carry clearer signal than neural softmax outputs.
The fine-tuning script (from the parent repo) accepts CSV, TSV, JSON, or JSONL. Labels can be strings ("positive", "negative", "neutral", "bullish", "bearish") or integers (0/1/2). Automatic label remapping handles FinBERT's non-standard label ordering (positive=0, negative=1, neutral=2). Class-weighted loss is applied by default.
Limitations
English only — FinBERT was pre-trained on English financial text (Reuters TRC2). Non-English text should use the multilingual head in the full pipeline.
128-token max length — fine-tuned with 128-token truncation. Longer documents (earnings calls, 10-K filings) should be chunked at paragraph or sentence level before scoring.
Neutral class dominance — despite class weighting, neutral precision (0.95) is noticeably higher than positive (0.84) or negative (0.81), reflecting the ~58% neutral training distribution. The model remains slightly conservative on polarity predictions.
Label noise — the FiQA dataset uses continuous sentiment scores thresholded at ±0.15, introducing boundary noise. The Twitter dataset contains informal language, $cashtags, and abbreviations that differ substantially from formal financial text.
No temporal or entity awareness — treats each text independently. Cannot reason about whether "rates rising" is positive (for banks) or negative (for growth stocks) without entity context.
FinBERT label ordering — label IDs are {0: positive, 1: negative, 2: neutral}, which differs from the standard convention. Use label names, not IDs, when interpreting results.
Parameter count trade-off — at 109M parameters, this model sits between ClimateBERT (82M) and RoBERTa-Large (355M). For maximum accuracy (+1.6 F1 points), use the RoBERTa-Large head; for minimum latency (−25% params), use ClimateBERT.
Citation
bibtex
1@article{araci2019finbert,
2 title={FinBERT: Financial Sentiment Analysis with Pre-Trained Language Models},
3 author={Araci, Dogu},
4 journal={arXiv preprint arXiv:1908.10063},
5 year={2019}
6}
78@article{loughran2011liability,
9 title={When is a liability not a liability? Textual analysis, dictionaries, and 10-Ks},
10 author={Loughran, Tim and McDonald, Bill},
11 journal={The Journal of Finance},
12 volume={66},
13 number={1},
14 pages={35--65},
15 year={2011}
16}
1718@article{henry2008earnings,
19 title={Are investors influenced by how earnings press releases are written?},
20 author={Henry, Elaine},
21 journal={Journal of Business Communication},
22 volume={45},
23 number={4},
24 pages={363--407},
25 year={2008}
26}