Simple claim: Girsanov moves the drift and leaves the noise — which is why a silent drift overlay is invisible in path pictures. The trench is same paths, different story, and residual honesty after remove-drift.
The thing that unsettles me about drift errors is that there is nothing to see.
A path set arrives. Ten thousand simulated trajectories of the underlying, saved as a file, handed to whoever needs them. Someone plots a hundred. They look like the underlying, the volatility is right, the terminal distribution has the shape it should. The file gets used for pricing, for exposure, for a scenario study, and it is the same file every time, which everyone treats as a virtue.
But a path set is not a source of truth. A path set is half of an object. The other half is the measure under which those paths are weighted, and it does not live in the file.
What Girsanov actually says
Take a Brownian motion W under P, with its filtration, and an adapted process θ. Build the exponential martingale
Z_t = exp(−∫₀ᵗ θ_s dW_s − ½∫₀ᵗ θ_s² ds).
Define Q by dQ = Z_T dP. Then Girsanov's theorem says W̃_t = W_t + ∫₀ᵗ θ_s ds is a Brownian motion under Q.
Read that as an engineering statement rather than a theorem and it is startling. You have changed nothing about which trajectories exist, how rough they are, or how they were generated. You have reweighted the probability of each one, and under the new weighting, a process that had a drift no longer has one.
The proof mechanism sharpens the point. You verify the claim through the Lévy characterization: a continuous martingale starting at zero whose quadratic variation over [0,t] equals t is a Brownian motion. So the argument is to show W̃ is a Q-martingale and that its quadratic variation is unchanged. Quadratic variation is unchanged. That is not a side condition; it is the load-bearing fact. The drift shifts; the noise scale does not move at all.
Which yields the uncomfortable corollary: the measure is not a property of the paths. Two engineers can hold the identical file, one of them believing it is a physical simulation and the other believing it is risk-neutral, and neither of them is contradicted by anything in the data. The disagreement is real, it is worth money, and it is not resolvable by inspection.
Why the usual checks cannot catch it
Every quant stack I have worked in has a volatility check. Realized vol against implied, realized vol against the model's σ, a drift-diagnostic dashboard with a rolling window. These are good checks. They are also, for this failure, exactly the wrong checks, because quadratic variation is the one thing Girsanov leaves alone. A path set with the wrong drift passes the volatility test perfectly. It was always going to.
So could you test the drift directly? Take the honest numbers: a stock with physical mean return α = 10%, short rate r = 5%, volatility σ = 20%. The drift gap you are trying to detect is five percentage points. The standard error of a drift estimate over horizon T is roughly σ/√T, so with σ = 0.20 you get an error of 20% over one year, 6.3% over ten years, and 2.5% over sixty-four years.
To resolve a five-point gap with even a t-statistic of one, you need about sixteen years of the instrument's history. For anything you would call evidence, sixty-plus. Meanwhile the drift matters today, on a claim expiring in nine months.
This is the whole difficulty in one line. The quantity that cannot be estimated from the data is the quantity a silent overlay corrupts. Monitoring will not save you, not because the monitors are bad but because the information is not there. The only governance that works is declaration at the point of construction.
How this shows up in production
- The reusable path set. One simulation service, one output format, many consumers. The generator was written by someone who was thinking about scenario analysis, so it uses α. A pricing consumer picks up the file because it is the path file. Nothing in the schema has a field for the measure, so nothing was overwritten and nothing was violated. The paths are simply being used to answer a question they were not weighted to answer.
- The plausibility patch. A risk-neutral engine produces paths whose central tendency looks low to someone comparing them against the last three years. A "realism adjustment" gets added, a small drift bump, a regime tilt, a calibration to historical mean return. The adjustment is documented as improving realism, and it is: the paths do look more like history. They also stop pricing anything. This is
DRIFT_OVERLAY, and it is the continuous version of the wrong-coin failure from earlier in this series, except that here it is nearly impossible to see because there is no discrete q sitting next to a discrete p to compare.
- θ nowhere. The system does the right transformation, in code, once, correctly, and never writes θ down. Two years later nobody can say whether the pricing paths were tilted, by how much, or against which α. The transformation may still be running correctly; it is simply no longer auditable, which for a model-risk function is the same as being wrong.
- Two overlays, composed. A path set is tilted at generation, reweighted downstream by a scenario study, then discounted with a curve implying yet another drift assumption. Each step is defensible in isolation. The composition is a measure nobody chose, and because each step passed its own volatility check, the stack reports green throughout.
A CEH-001 exposure run that looks fine
Same never-traded note. Spread frame marks it near 1.50, curve frame near 2.10, and the desk denies 1.80 because the midpoint is disagreement painted over rather than settled.
The equity leg gets an exposure study off the standard path set. The distribution of outcomes looks reasonable. Realized vol on the simulated paths matches the σ on the instrument card to two decimals, the check runs, the check passes, and it is recorded as validation. Expected exposure comes out modest, the leg's contribution firms up, and the note's mark edges from 1.50 toward the middle.
Nothing in that run is detectably wrong. The vol matches. The paths look like the underlying. The code is the code that has always run. And the study is using paths carrying a 10% physical drift inside a calculation that only means something at 5%.
The five-point gap does not announce itself as an error. It announces itself as optimism that survives every diagnostic, modest exposure, comfortable mark, a number drifting toward the center of the disagreement. That is the pattern worth learning: 1.80 is not usually reached by someone arguing for it. It is reached by a sequence of runs each of which looked fine, tilted the same direction, and left no artifact recording which world they were computed in.
What stacks quietly assume
That a saved path set is measure-agnostic data. That matching realized volatility validates a simulation. That drift can be monitored the way volatility can. That a transformation done correctly once stays correct without being written down. That two adjustments which are individually reasonable compose into something reasonable. That because the picture looks right, the weighting is right. Girsanov is precisely the theorem that says the picture cannot tell you.
What a solution must do
It has to make the measure a first-class field on the path set, and the tilt an explicit posted number rather than an implicit consequence of code. Every simulated path artifact should carry the measure it was generated under, the density behind any change from the base measure, and the θ that defines the drift shift. Consumers should bind to a measure and refuse artifacts of the other kind rather than accepting whatever file is present. Any adjustment should declare itself as a density and compose visibly with the ones already applied. And because the drift is not statistically observable at the horizons the desk cares about, the harness cannot rely on detection, it has to require declaration, and refuse spend when θ is missing.
Agents may propose drift assumptions, alternative dynamics, and regime views all day. What they may not do is hand a pricing engine a path set whose weighting nobody wrote down.
Curious where others store the measure alongside their simulated paths, and whether anyone has caught a drift overlay any way other than reading the generator's source.
Clearance coupling. Silent drift overlay is DRIFT_OVERLAY. After remove-drift, residual honesty tests must run; forecastable residuals refuse residual-honesty claims. Path pictures that look the same are not evidence of the same measure story.
CEH-001 exposure runs that pass pathwise eyeballing and fail residual tests after remove-drift are the production shape of this episode.