Back to Feed
Benchmarks & Evals

Benchmarking Financial Document Question Answering Systems

Original: FinRank: An Evidence-Grounded Benchmark for Financial Question Answering and Retrieval over SEC Filings

Listen to the summary

Uses a voice available on your device

Audio options
On this page 5 sections
Related concepts 2 concepts

Key Takeaways

  • FinRank evaluates retrieval performance using 1185 manual question-answer records from 22 company filings.
  • A 7B parameter instruction-tuned embedder achieved only 44.8 percent Recall at 10 on the pooled evidence corpus.
  • Commonly used sub-billion-parameter encoders offer only a marginal performance improvement of at most 3.5 points over the BM25 baseline.
  • A finance-adapted embedder failed to beat the standard BM25 baseline, performing 9.7 points lower.
  • The use of curated hard negatives causes model accuracy to drop significantly, by 13.0 to 20.5 percentage points.

Summary & Methodology Analysis

The FinRank benchmark targets the retrieval phase of financial question answering systems by using a dataset of 1185 manually authored records derived from 10-K and 10-Q corporate filings. The methodology focuses on distinguishing between high-relevance supporting passages and curated hard negatives, which are similar but incorrect document segments. This testing regime evaluates whether a model can correctly identify evidence within a broader corpus rather than simply relying on surface-level keyword matching or statistical frequency.

Interactive System Flowchart

Click diagram to expand and zoom

Illustrative Implementation

A short sketch of the paper's core idea, not the authors' own code.

# Illustrative sketch (not from the paper)
import torch, torch.nn.functional as F
embedder = torch.hub.load('e5-mistral-7b-instruct', 'model')  # mock

def encode(t): return F.normalize(embedder.encode(t), dim=-1)

queries = ["What is the revenue for Company A?"]
gold = ["Revenue increased to $5B in FY2023."]
hard = ["Revenue decreased to $3B in FY2022."]
q, p, n = encode(queries[0]), encode(gold[0]), encode(hard[0])
pos, neg = (q * p).sum(), (q * n).sum()
pairwise_acc = (pos > neg).float().item()
print("Pairwise accuracy:", pairwise_acc)
# Mock Recall@10 using BM25 placeholder
retrieved = ["..."]  # top‑k passages
recall10 = 1.0 if gold[0] in retrieved[:10] else 0.0
print("Recall@10:", recall10)

Cross-Examination & FAQs

A deeper dive clarifying mechanics, constraints, and baseline evaluations.

Q1. What is FinRank?

FinRank is an evidence-grounded benchmark consisting of 1185 manually authored question-answer records based on 10-K and 10-Q filings from 22 companies.

Q2. Can this benchmark be used to generate financial advice?

No, the benchmark is not intended for generating investment advice, valuations, or trading signals.

Q3. What is the primary goal of the benchmark?

It is designed to evaluate retrieval-grounded financial question answering over specific corporate disclosures.

Q4. How did a 7B parameter model perform on this task?

The e5-mistral-7b-instruct model reached 44.8 percent Recall at 10 on the pooled evidence corpus.

Q5. How do sub-billion-parameter encoders compare to BM25?

These encoders improve performance over the BM25 baseline by at most 3.5 points.

Q6. How did a finance-adapted embedder compare to the baseline?

The finance-adapted embedder underperformed the BM25 baseline by 9.7 points.

Q7. What happens when you use curated hard negatives?

Pairwise accuracy drops by 13.0 to 20.5 percentage points compared to using random negatives.

Q8. How was the correctness of the benchmark records determined?

Correctness was determined by a single annotator with sampled review rather than a consensus-adjudicated process.

Q9. Are there known limitations regarding the current benchmark validation?

Yes, a stratified double-annotation study is the most important outstanding item for a future release as the current version relies on single-annotator review.

Flag an issue

What is wrong with this summary?

What is wrong?