The History You Published Last Year Has Changed

In December 2016 you published a report. It quoted a price for Johnson & Johnson on December 29, 2006, and that price was $48.56. The number came out of your system, which got it from your vendor, which is the same vendor you use today.

Pull that number again this morning. It reads $37.26.

The historical value fell 23.26 percent while sitting in the past. Nothing was restated. No vendor issued a correction. No analyst touched the file. Your reconciliation ran clean every night in between, because there was never a break to find. The number simply is not what it was, and if the 2016 report is in front of a regulator, a consultant or a client, you cannot produce the system that agrees with it.

This is not a data quality problem. It is working exactly as designed.

It is also avoidable. Run the same December 2006 date through a forward anchored series and it returns $60,214.79 in 2016 and $60,214.79 this morning. That number looks strange because it is not a price, it is what your position was worth, but the point is the two figures are identical and always will be. The report you published in 2016 still agrees with the system that produced it.

Why the past moved

To draw sixty years of a stock on one axis, you cannot use the prices that actually traded. Splits would make the chart fall off a cliff four or five times on the way up. So the old prices get restated into today's shares, and that restatement is anchored to today.

Today keeps moving. That is the whole of it.

Here is the mechanism, once, in the only terms that matter. Buy one share of Johnson & Johnson on January 2, 1962, for $96.50. Hold it. Seven splits multiply what you own by 432. Reinvest all 259 dividends along the way and that multiplies again by 3.74. You are holding 1,615.89 shares this morning, and they are worth $436,645. If you had only tracked the price, you would think you owned $270.22.

Backward adjustment takes that whole history and divides it by 1,615.89, so that the last row comes out at today's actual price. It is a sensible thing to want. It also means the divisor changes every time a dividend is paid, and when the divisor changes, every price before it changes too.

Johnson & Johnson pays quarterly. So four times a year, sixty five years of published history quietly moves.

What this argument is not

The returns are fine.

This matters enough to say plainly, because the loose version of this argument gets made a lot and it is wrong. Backward adjustment does not produce incorrect returns. The anchor appears in both the numerator and the denominator of any ratio, so it cancels. Measure the return from December 2006 to December 2016 three ways, forward anchored, backward anchored as published in 2016, and backward anchored as recomputed today, and you get 137.2566 percent all three times. The largest difference between them is zero. Not small. Zero.

Anyone telling you that backward adjustment gives you the wrong performance number is overstating the case, and the first numerate person in the room will catch it. Then you have lost the argument you were actually right about.

What changes is not the ratio. It is every stored level, and with it three things you probably assumed you had.

You cannot reproduce what you published

A performance record ought to be append-only. Yesterday happened, you write it down, and what you wrote yesterday is still there tomorrow. That is not a technology preference. It is the thing that makes a record a record.

Under backward adjustment you do not have that. You have a system that silently rewrites its own history four times a year, and the only reason nobody notices is that nobody goes back and checks.

Consider what that means the next time somebody does. An auditor asks how you arrived at a figure in a report from three years ago. A consultant reruns your since-inception numbers for a client and gets something different from the book you sent them. A regulator asks you to demonstrate the valuation that supported a decision. In every one of those conversations the honest answer is that the system no longer holds the number, and the reason is a convention nobody in the room ever chose.

You will probably be able to explain it. You should not have to.

You cannot tell a real error from an adjustment

The second cost is the one that actually shows up in operations every week.

If your historical prices are stable, comparing today's load against yesterday's is a powerful control. Anything that moved is either a genuine correction or a genuine problem, and either way you want to see it. That single diff catches bad vendor files, mismapped securities, failed loads and fat fingers, and it catches them cheaply.

Under backward adjustment that control does not work, because on any day with a corporate action, everything moved. The signal is buried in a rewrite of the entire series.

The scale of that rewrite is worth putting a number on. For Johnson & Johnson from 1962 to today, 266 corporate actions rewrote 2,151,045 historical rows. The series itself is 16,286 rows long, so the history was rewritten 132 times over. Across a book of 11,253 instruments that is 24.2 billion row rewrites, to end up with a number that was already correct.

And the cost per event never stops growing. The first dividend in this series, February 1962, rewrote 30 rows. The one paid last month rewrote 16,269. Every year you stay in business, every future dividend costs more to absorb than the last one did, forever. Under a forward anchor both of those dividends cost exactly one row, and that never changes.

This is why teams stop diffing. Not because they decided the control was unnecessary, but because it stopped producing anything they could act on, so it quietly fell out of the run book.

The part that actually breaks

Now the failure that ends the argument, and it took sixty five years of history to make it visible.

There are two ways a system can perform the rewrite. It can recompute every historical value from the raw close and the new cumulative factor, which is clean and accumulates nothing, and which requires you to keep the raw price series forever. Or it can take the adjusted value it already has stored and scale it by the new event. That second one is not a choice anybody makes on purpose. It is what a system is left with when it kept only adjusted prices, which is extremely common, because for years the adjusted price was the only one anybody looked at.

The second method rounds an already rounded number, once per corporate action, forever. On the 1962 value in this series, stored at four decimal places and truncated the way a database cast truncates, the accumulated error after 266 rewrites is 656 basis points. The system holds a value that is 6.6 percent wrong, and it looks completely reasonable on screen.

Then set the stored precision to two decimal places, which is the ordinary width of a price column in most systems in this industry, and watch what happens.

The backward adjusted price for January 1962 is six cents.

It has to be. The whole history is divided by 1,615.89, and $96.50 divided by 1,615.89 is $0.0597. A two decimal column cannot hold that number. Truncated, it becomes zero, and every return measured from that date is not slightly wrong, it is destroyed. Rounded, it is 134 percent wrong, because the rounding step is now larger than the value it is rounding.

That is a structural failure rather than a numerical one, and it is the one that should worry you, because it gets worse on a schedule you cannot stop. Backward adjustment makes old prices smaller every year. The longer your track record, the larger today's share count, the further your early history sinks toward your storage precision, and one day part of it goes underneath. Nothing alerts when it does. The oldest, most valuable part of your record is the part that fails first, and it fails quietly.

A forward anchor cannot do this. The oldest price is the one it starts from, so the oldest price is the largest number in the series rather than the smallest.

What to do instead

Anchor where the record starts, not where it currently ends.

Count shares from the first date you hold. A split multiplies the count. A dividend reinvested at that day's close adds a fraction to it. The adjusted value is that day's close times the count you held on that day, which is not a price at all, it is what your position was worth. On this series that number starts at $96.50 in 1962 and ends at $436,645 today, and the 1962 figure is $96.50 whether you compute it in 1962, in 2016 or this afternoon.

Three disciplines make it work, and all three are the kind of thing that costs nothing on day one and cannot be retrofitted cheaply on day 4,000.

Keep the raw close forever. Not the adjusted one. Every adjusted series in existence is derivable from raw prices plus an event list, and no raw series is recoverable from an adjusted one. Firms that dropped the raw price to save space bought themselves a permanent inability to recompute anything.

Carry the count at full precision and derive returns on demand. Do not store a shortened return and multiply it back up. Over the 16,285 daily links in this series, storing returns at six decimals costs 0.08 basis points if you round and 1.09 if you truncate. At four decimals it is 9.49 rounded and 138.68 truncated. Same data, same chain, one setting apart. Truncation is the dangerous one because it always errs in the same direction, so nothing cancels and everything compounds, and it is easy to commit by accident: casting to a narrower type, writing to a fixed point column and formatting a number as a string all truncate silently.

Treat the event list as the record. The events are the facts. The factor is a derived view of them, and it should be reproducible from the events at any time, by anyone, without reference to whatever the system happened to store.

None of this is novel and I want to be clear about that. Several data vendors publish a forward anchored factor already, and have for years. The failure is not that the technique is unknown. It is that most firms inherited the other convention from a charting tool, never wrote down which one they were on, and have no idea which one their own system is using today. If nobody at your firm can answer that question this week, that is the finding, and it is available to you for the cost of one afternoon.

Five questions for your own system

None of these require a project, and all five can be answered by someone who already has access.

Which convention are we on? Take a price from ten years ago that your system stored at the time, and pull the same date and security today. If the two numbers differ, you are backward anchored and your history is not append-only. Most firms have never run this test and are genuinely unsure of the answer before they do.

Do we still have the raw close? Not the adjusted one. If the raw series was dropped at some point to save space, or was never loaded because the vendor feed came adjusted, you cannot recompute anything and every downstream number is permanently dependent on whatever your vendor decides to publish next.

When a corporate action lands, do we recompute from raw or scale what we stored? This is the question that separates an accuracy problem from a bookkeeping one, and it is usually answerable in an afternoon by reading one job.

What precision do our price and return columns actually hold, and does anything truncate? Check the column definition, not the display format. Then check every cast and every string conversion between the vendor file and the database, because that is where truncation gets committed without anybody deciding to commit it.

Who wrote this down? If the answer is nobody, then the convention your performance record depends on is whatever a developer picked years ago, and it is undocumented, unowned and unreviewed. That is the finding, and it is worth more than the numbers above.

What breaks anyway

One honest limit, because it applies to the forward method just as hard.

Spin-offs break all of this. A share count of one company cannot express the fact that you now own shares of a second company, and no amount of care in the factor changes that, because it is a limit of the representation rather than a gap in the data. Every method in use either ignores the distributed entity, treats it as a cash distribution at some assumed value, or silently drops it. None of those is right, and anybody claiming their adjusted series handles spin-offs cleanly is either solving a narrower problem than they think or has not looked.

The workbook does not solve it either. It says so on the Read Me tab, which is a better outcome than pretending.

There is a live example inside the very data this article is built on, and it is better named than left for somebody to find. Johnson & Johnson separated Kenvue in 2023, and it appears as an event in neither source used here. That absence is correct rather than a gap: the separation was completed as a split-off through an exchange offer, so holders were invited to trade JNJ shares for Kenvue shares, and anybody who declined kept exactly what they had. For that holder the share count in this workbook is right and nothing is missing.

For anybody who accepted, it is not, and cannot be. They gave up JNJ shares and received shares of a different company, and no factor for JNJ can carry that. The series describes one of those two holders and cannot tell you which one you are reading. I do not have a solution. The moment a corporate action turns one holding into two, a factor is the wrong instrument and you need position level records of what each holder actually elected, which is a larger build than a spreadsheet.

None of which touches the argument. The anchor is still yours to choose, it still costs nothing to choose correctly on day one, and it still decides whether the record you publish this quarter is the same record ten years from now. Get the anchor right and the hard cases stay hard. Get it wrong and even the easy ones move.

The calculator

The workbook is the argument with the arithmetic exposed. It carries Johnson & Johnson from January 2, 1962 to September 17, 2026, 16,286 daily rows and 266 corporate actions, and it builds both anchors side by side from nothing but a date, a raw close and an event list. Every figure quoted above is a live formula in it, 197,642 of them, no macros, no protected sheets, nothing computed elsewhere and pasted in as a value. Change the precision settings and the damage recalculates in front of you. Replace the two data tabs with your own security and the whole thing follows.

The data deserves a note, because a tool about data integrity should say what was done to its own inputs. The 1996 to 2026 portion is observed raw closes and full distribution records from a professional data vendor, untouched. The 1962 to 1995 portion is reconstructed from Yahoo Finance, whose published Close and Dividends columns are already restated into today's shares, which is the exact unit error this article is about. Both columns were multiplied back up by the splits that followed them, and that reconstruction was then validated against the vendor data on the thirty years where the two overlap: prices agree exactly on 7,661 of 7,727 rows, and dividends agree on 127 of 127. Nothing was snapped to a tick grid to make it look tidier than it is, and the Prices and Events tabs both carry a source column so you can see which rows are which.

It is on its own page: Forward vs Backward Price Adjustment.

This is a description of a data convention and its consequences, not investment advice. Johnson & Johnson is used here because it has a long, clean, publicly available history and a lot of corporate actions, and for no other reason. Nothing here is a view on the security.

Next
Next

Nobody Priced the Environment You Already Have