CoolFace
Modelpublic

andreadm/reddit-pulse-bert

sourceHugging Faceapache-2.0updated 9d agoView on Hugging Face
1likes43downloads
Model Card

Reddit-pulse InflaBERT

Retrained checkpoint. This model was trained again after the paper, on the same gold dataset and with the same seed protocol. The metrics on this card come from that retraining and may differ from the ones reported in the paper.

Reddit-pulse InflaBERT is a three-way directional inflation-expectation classifier for short English texts about the economy, fine-tuned on Reddit submission titles. Given a title (or any sentence-length text), it predicts whether the text conveys that inflation / prices are going up, going down, or carries no directional signal (neutral).

It is not a sentiment model: "inflation falls sharply" is good news but labelled down; "rents are out of control" is bad news but labelled up. The direction is about the price level, not the mood.

The checkpoint is the model behind the Reddit inflation signal in

Del Monaco, A., Longo, L., Marcucci, J. & Tafani, I. (2026). Reddit's 'pulse' on US inflation: forecasting with large language models. Journal of Applied Econometrics, forthcoming. Working-paper version: Banca d'Italia, Questioni di Economia e Finanza (Occasional Papers) No. 1028, June 2026, doi:10.32057/0.QEF.2026.1028.

<!-- TODO: add the JAE DOI / article URL once assigned. -->

The fine-tuning and full-corpus inference code lives at andrea-dm/reddit-pulse.

Model lineage

StageModelNotes
Pre-training`distilroberta-base`6-layer distilled RoBERTa, 82.1 M parameters
Domain adaptation`mrm8488/distilroberta-finetuned-financial-news-sentiment-analysis`Financial-news sentiment
Task adaptation`MAPAi/InflaBERT`Inflation-news sentiment (negative / neutral / positive)
This checkpoint`andreadm/reddit-pulse-bert`Full fine-tuning on Reddit titles, labels re-mapped to down / neutral / up

Architecture: RobertaForSequenceClassification, 6 hidden layers, hidden size 768, 12 attention heads, 50 265-token byte-level BPE vocabulary, 512-token context. Every parameter was updated (no adapters, no quantization); the classification head was re-initialised for the three directional classes.

Labels

idlabelmeaningencoding used in the paper's corpus files
0downinflation / prices heading lower, disinflation, falling expectations-1
1neutralno directional signal (questions, definitions, unrelated, mixed)0
2upinflation / prices heading higher, rising expectations+1

How to use

python
from transformers import pipeline

clf = pipeline("text-classification", model="andreadm/reddit-pulse-bert")
clf("Fed officials warn prices will keep climbing as CPI hits 40-year high")
# [{'label': 'up', 'score': 0.999}]

Batched, with the paper's -1 / 0 / +1 encoding:

python
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

name = "andreadm/reddit-pulse-bert"
tokenizer = AutoTokenizer.from_pretrained(name)
model = AutoModelForSequenceClassification.from_pretrained(name).eval()
encoding = {"down": -1, "neutral": 0, "up": 1}

texts = [
    "Inflation expectations drop to lowest level since 2021, NY Fed survey shows",
    "What is the difference between CPI and PCE?",
]
with torch.no_grad():
    batch = tokenizer(texts, padding=True, truncation=True, max_length=512, return_tensors="pt")
    ids = model(**batch).logits.argmax(dim=-1).tolist()

print([encoding[model.config.id2label[i]] for i in ids])   # [-1, 0]

Tested with transformers 5.16 and PyTorch 2.13; the checkpoint uses the standard safetensors + fast-tokenizer layout and loads on any recent 4.x release as well. Inference is cheap: the full paper corpus (≈ 243 k texts) labels in a few minutes on one A100 at batch size 64.

Intended use and limitations

Intended use. Labelling large volumes of short, informal, English, economy-related texts (Reddit titles and comments, headlines, social media posts) with a directional inflation signal that is then aggregated over time — the paper's use case. The model is a building block for a high-frequency indicator, not a stand-alone oracle.

Limitations.

  • Single predictions are noisy. Held-out accuracy is ≈ 74 %; the value of the model comes from averaging thousands of predictions per period, where idiosyncratic errors wash out. Do not rely on any single label.
  • Domain and register. Trained on r/economy, r/Economics and r/wallstreetbets titles about US inflation from 2008 to 2022. Other countries, other registers (formal reports, central-bank prose) and post-2022 vocabulary are out of distribution.
  • Class imbalance. down is the minority class (16 % of the gold set) and the hardest one (test F1 0.67 vs 0.79 for neutral). The loss was class-balanced during training, but down recall remains lower.
  • Short texts. Fine-tuned on titles (median 11 words, max 52). Long comments are truncated at 512 tokens and were not seen during training.
  • Direction, not stance or sentiment. The model does not say whether the author wants inflation to move, nor whether the news is good or bad; only which way prices are said to be going.
  • No factuality. A confidently worded false claim is labelled by its direction, not its truth.

Training data

The gold set is a hand-labelled sample of 1 383 Reddit submission titles from r/economy, r/Economics and r/wallstreetbets, dated February 2008 to December 2022. Labels were produced by a human-in-the-loop protocol (manual annotation assisted by zero-shot LLaMA-70B, a fine-tuned LLaMA-8B classifier and ChatGPT-assisted adjudication of disagreements) described in the paper. The gold set itself is not redistributed here.

labeltitlesshare
neutral62345.0 %
up53738.8 %
down22316.1 %

Titles are lower-cased as found on Reddit; median length 11 words (IQR 8–16, max 52).

Training procedure

Seed protocol and model selection

The paper's protocol asks how sensitive the classifier is to which titles it is trained on, so it separates two sources of randomness:

  • 19 split seeds (training.seeds) each draw a different stratified 71 / 19 / 10 % train / validation / test partition (981 / 263 / 139 titles) of the same gold set.
  • One fixed seed (42) governs everything else: classification-head initialisation, batch shuffling and dropout. Every split therefore trains the same model the same way on different data.

Each split is fine-tuned independently; the checkpoint with the median test weighted-F1 across the 19 runs (the upper median, rank 10 of 19) is kept and the others discarded. The result is a typical run, not the best one — the reported metrics are an honest estimate of what a rerun yields, not a lucky draw. This checkpoint is split seed 2786505123.

Hyperparameters

ObjectiveCross-entropy with balanced class weights (sklearn.utils.class_weight)
OptimizerAdamW (fused), β = (0.9, 0.999), ε = 1e-8, weight decay 0.01
Learning rate5e-5, linear decay, no warm-up
Batch size64 (train and eval), dynamic padding to multiples of 8
Epochsup to 15, early stopping with patience 5 on validation weighted-F1
Checkpointbest epoch by validation weighted-F1 (load_best_model_at_end)
Precisionfp16 mixed precision, fp32 master weights
Max sequence length512 tokens (truncation only; titles are far shorter)
Gradient clipping1.0
Hardware1 × NVIDIA A100 80 GB; ≈ 2 min per seed, 38 min for all 19

The exact TrainingArguments are in `training_args.json` and the governing configuration extract in `training_config.yml`.

Evaluation

Selected checkpoint (split seed 2786505123)

splitnaccuracyF1 weightedF1 macroprecision macrorecall macroROC-AUC
validation2630.7570.7560.7390.7420.7380.864
test1390.7410.7390.7220.7250.7240.872

Per class, on the test split:

labelprecisionrecallF1support
down0.6520.6820.66722
neutral0.7460.8410.79163
up0.7780.6480.70754

Confusion matrix (rows = true, columns = predicted):

downneutralup
down1534
neutral4536
up41535

Most errors are up titles absorbed by neutral (15 of 54): hedged or question-shaped titles whose direction a human infers from context. Confusions between up and down — the ones that would bias an aggregate signal — are rare (8 of 139).

Split sensitivity across the 19 seeds

Test metrics of every run, sorted by weighted F1. The selected checkpoint is the median.

split seedval F1wtest acctest F1wtest F1mtest AUC
7099647090.7920.6760.6760.6400.813
4772843360.7260.6910.6890.6880.907
1079359030.7930.6980.7020.6800.878
12450930800.7400.7050.7070.6930.866
42800889790.8030.7120.7140.7040.891
29281427880.7440.7120.7160.6940.863
31446932710.8100.7190.7190.7000.862
2390801150.7590.7340.7320.7160.876
13618834820.7860.7340.7330.7090.901
27865051230.7560.7410.7390.7220.872selected
2282777620.7070.7480.7490.7140.895
32661235020.7940.7480.7520.7310.916
13294960500.7920.7480.7520.7400.923
40548713970.7680.7550.7550.7360.874
13893030300.7500.7550.7570.7450.898
31544471440.7830.7840.7850.7670.886
25655551620.7750.7910.7940.7660.921
20782375410.7830.7990.7970.7790.911
42035960920.7650.8130.8130.8040.923
test metricmeanstdminmedianmax
accuracy0.7400.0380.6760.7410.813
F1 weighted0.7410.0380.6760.7390.813
F1 macro0.7220.0390.6400.7160.804
ROC-AUC0.8880.0280.8130.8910.923

The spread is what a 139-title test set implies (one title ≈ 0.7 accuracy points) and is the reason the paper reports the median run rather than a single split. Full per-seed numbers: `evaluation/`.

Corpus labelling in the paper

Applied to the paper's filtered corpus, this checkpoint labels 33 460 submissions and 209 995 comments (r/economy, r/Economics, r/wallstreetbets, 2008–2022):

upneutraldown
submissions43.6 %42.0 %14.4 %
comments40.3 %51.8 %8.0 %

Files

filecontent
model.safetensors, config.jsonweights (fp32, 328 MB) and architecture / label map
tokenizer.json, tokenizer_config.jsonbyte-level BPE tokenizer inherited from RoBERTa
training_args.jsonthe transformers.TrainingArguments of the selected run
training_config.ymldataset split, hyperparameters, seed list and label map from the project config
evaluation/seeds_test_metrics.csvtest metrics of all 19 split seeds
evaluation/seeds_validation_metrics.csvvalidation metrics of all 19 split seeds
evaluation/selected_seed_report.jsonper-class report and confusion matrices of this checkpoint
LICENSE.mdMIT license, scope statement and upstream Apache-2.0 / MIT notices

Reproducing

bash
git clone https://github.com/andrea-dm/reddit-pulse && cd reddit-pulse
uv venv && uv pip install -e .
reddit run --model inflabert --gpu 0     # 19 seeds, median selection, corpus labelling

The gold set (data/labelled.xlsx) and the subreddit corpus are not part of the repository; see the paper for the data-construction stages.

Citation

bibtex
@article{delmonaco2026reddit,
  title   = {Reddit's `pulse' on {US} inflation: forecasting with large language models},
  author  = {Del Monaco, Andrea and Longo, Luigi and Marcucci, Juri and Tafani, Irene},
  journal = {Journal of Applied Econometrics},
  year    = {2026},
  note    = {forthcoming},
}

@techreport{delmonaco2026reddit_qef,
  title       = {Reddit's `pulse' on {US} inflation: forecasting with large language models},
  author      = {Del Monaco, Andrea and Longo, Luigi and Marcucci, Juri and Tafani, Irene},
  institution = {Banca d'Italia},
  series      = {Questioni di Economia e Finanza (Occasional Papers)},
  number      = {1028},
  year        = {2026},
  month       = jun,
  doi         = {10.32057/0.QEF.2026.1028},
}

License

Apache License, Version 2.0 (see `LICENSE.md`). The direct parent MAPAi/InflaBERT is MIT-licensed; the deeper lineage (distilroberta-base, mrm8488/distilroberta-finetuned-financial-news-sentiment-analysis) is Apache-2.0, which this checkpoint now matches. The attribution notices these upstream licenses require are included in LICENSE.md.

The views expressed in the paper are those of the authors and do not necessarily reflect those of the Bank of Italy, the Eurosystem, or the European Commission.