Evidilo

Accuracy by bank

Each bank's figure is the share of its test statements we read with every row exact, stated as the lowest share the sample supports: the lower bound of a 95% interval, rounded down. We have measured 10 banks on 100 test statements and 4,030 rows. The test set is synthetic statements generated in each bank's layout with the truth generated beside them, so this figure measures our pipeline against that generated corpus, not accuracy on real client statements.

Measured on Oct 12, 2026 with parser 1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e on test set corpus/2026-10. How we measure

Every bank we have measured

Showing all 10 banks, most statements tested first.

0 rows across the whole test set were read with a wrong amount or sign: . Which statement and row (CSV)

Accuracy by bank on test set corpus/2026-10
StatusBankPublished figureWeakest field95% intervalWrong amount or signDetails
PublishedBank of Americaat least16.8%4 of 10 statements exactDate 40.1%155 of 3870 rows
PublishedCapital Oneat least16.8%4 of 10 statements exactDate 39.1%168 of 4300 rows
PublishedCitizensat least16.8%4 of 10 statements exactDate 38.5%158 of 4100 rows
PublishedFifth Thirdat least16.8%4 of 10 statements exactDate 38.8%150 of 3870 rows
PublishedJPMorgan Chaseat least16.8%4 of 10 statements exactDate 37.2%156 of 4190 rows
PublishedPNCat least16.8%4 of 10 statements exactDate 40.6%171 of 4210 rows
PublishedTD Bankat least16.8%4 of 10 statements exactDate 41.8%156 of 3730 rows
PublishedTruistat least16.8%4 of 10 statements exactDate 38.2%164 of 4290 rows
PublishedU.S. Bankat least16.8%4 of 10 statements exactDate 39.5%156 of 3950 rows
PublishedWells Fargoat least16.8%4 of 10 statements exactDate 38.5%146 of 3790 rows
Published, 10 statements and 300 rows or more
Sample too small, counts only
95% interval
Lower bound, the published figure
Share of statements exact

The balance check on the test set

The same continuity check, on the statements this measurement read.

40 of 80 statements we could read tied out

50.0% of the statements in test set corpus/2026-10

A statement prints an opening balance, balances along the way and a closing balance. After we read a statement, we add its rows up against those printed balances, day by day where the bank prints a daily balance. That needs no truth file, so it runs on every statement we can read, on every bank, including the banks with no published figure.

It is a continuity check, not an accuracy measurement.

It catches

  • A wrong amount or sign
  • A missing row
  • A duplicated row

It cannot catch

  • A wrong date
  • A wrong description

The balance check stands next to the test-set figure and never in its place. A statement that does not tie out is marked for review at the row where it breaks, and it is not counted against your plan's pages.

How we measure

Seven steps, in the order they run. Anyone with the counts below can repeat steps 4 and 5.

  1. The test set

    100 statements from 10 banks. Each one is a synthetic statement this run generated in that bank's layout. No statement a customer uploads ever enters the test set.

  2. Where this test set's truth comes from

    The truth for these statements is generated with them: the generator writes the rows first, renders them in the bank's layout and keeps the rows it wrote, and those rows are what we compare our reading against. A corpus of real statements would need a truth built independently of our output, a person recording every row or the bank's own export of the same period. This test set has neither.

  3. Every row gets one verdict

    We compare each row we read with the truth, and the row gets the verdict of its worst field.

    Exact
    Every field equals the truth.
    Formatting
    Same value, written differently, such as “SQUARE INC” against “Square Inc”. Counted as exact.
    Value
    A field differs: an amount, a sign, a date, a description or a check number.
    Missing
    A row on the statement that we did not produce.
    Extra
    A row we produced that is not on the statement, usually a header or footer line.

    A statement is exact when none of its rows is value, missing or extra.

  4. An interval over statements, not rows

    Rows on one statement fail together: a layout we misread takes the whole statement with it. So the sample is the number of statements, not the number of rows, and we compute the 95% Wilson score interval over statements.

    lower bound =p + z² / 2n − z √(p(1 − p) / n + z² / 4n²)1 + z² / n

    p is exact statements divided by statements, n is the number of statements, z is 1.96 for 95%.

    Worked example, JPMorgan Chase: 4 of 10 statements exact, so p = 0.40 and n = 10. Then z²/n = 0.384, z²/2n = 0.192 and the square-root term is 0.359, so the lower bound is (0.40 + 0.192 − 0.359) ÷ 1.384 = 0.168. JPMorgan Chase is published as at least 16.8%, not as the 40% we measured.

  5. Rounded down, and a floor

    We publish the lower bound rounded down to a whole percent, never up, so JPMorgan Chase's 16.82% is published as 16.8%. Where we show an interval to one decimal, we round it outward, the lower end down and the upper end up, so a shown bound never claims more than the math. A bank gets a figure from 10 statements and 300 rows; below that its row reads “Sample too small” with its counts. Rows exact and the weakest field are published as counts beside the figure, so the column you would retype is never hidden behind a good headline. Rows with a wrong amount or sign are published as a count, never as a rate: 0 of 4,030 would read as 100.00% and hide the rows that cost you an afternoon.

  6. Every figure is versioned

    Each figure names its test set (corpus/2026-10), the parser version that produced it (1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e) and the day it was measured (Oct 12, 2026). A new measurement is published as a new report. The old figures stay as they were published, so a number you quoted in a proposal can still be checked.

    Re-run this measurement with node scripts/accuracy.mjs --tag corpus/2026-10 --out reports/accuracy/corpus-2026-10/1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e.json.

  7. The balance check, reported separately

    The upload figure above is computed without any truth file and catches different errors, so it is reported beside the test-set figure and never folded into it.

Check it yourself

Every count behind the figures above. Put a bank's statements and exact statements into the formula in step 4, round down, and you get the published figure.

Counts per bank, test set corpus/2026-10

Counts per bank on test set corpus/2026-10, parser 1c80bf88a27477c4e0fbb8bd4b7501e19cc3109e, measured Oct 12, 2026
BankStatementsExactRowsRows exactWrong amount or signLower boundPublishedBalance check
JPMorgan Chase104419144016.81%16.8%4 of 8
Bank of America104387140016.81%16.8%4 of 8
Wells Fargo104379134016.81%16.8%4 of 8
U.S. Bank104395141016.81%16.8%4 of 8
PNC104421153016.81%16.8%4 of 8
Truist104429146016.81%16.8%4 of 8
Capital One104430153016.81%16.8%4 of 8
TD Bank104373144016.81%16.8%4 of 8
Fifth Third104387133016.81%16.8%4 of 8
Citizens104410146016.81%16.8%4 of 8
10 banks100404,0301,434040 of 80

Lower bound: the 95% Wilson score lower bound, rounded down to two decimals. Balance check: the test-set statements whose rows add up to the balances the bank printed. The file adds the upper bounds and the test statement and row of each wrong amount or sign.

Download the counts (CSV)

Recompute a figure

  1. If the bank has fewer than 10 statements or 300 rows, stop: its sample is too small to publish.
  2. Take the bank's statements as n and its exact statements divided by n as p.
  3. Put both into the formula in step 4 with z = 1.96.
  4. Round the result down to a whole percent. JPMorgan Chase: 4 of 10 gives 16.82%, published as 16.8%.