LessonThis is a lesson restated in new words. Any figure in it is an example from the source, not this desk's record.
The Bachelier model in this session is arithmetic Brownian motion with no drift. Each new price is the previous price plus volatility times a standard normal draw times the square root of the time step. A short Python function builds that update, stores one path per simulation, and plots the fan. The demonstration uses a one-year horizon, 252 steps, and 100 paths, and the call is opened with the number 0.3.
Why it matters
The analytical session shows a forward that moves only by a scaled Brownian increment, and a call price as an expectation under that forward. Paths make the increment visible. You can see a fan of futures leaving a common start, some above and some below, with no exponential pull. That picture is the model the call formula assumes. The code is the whole lesson: NumPy for the draws, Matplotlib for the lines, and a loop that stops at the horizon.
The idea in plain words
The function needs five inputs. A starting level, a volatility, a horizon, a count of steps, and a count of paths. The step length is the horizon divided by the step count, so the grid is even. Each path begins as a list holding the starting level, and each path has a clock at zero.
While the clock plus one step is still short of the horizon, two things happen. The clock gains one step. The list gains a new level: the last level, plus volatility, times a fresh standard normal, times the square root of the step. The square root is required by the Brownian increment. Over a step of length d t the increment has variance d t, so its standard deviation is the square root. Multiplying a standard normal by that square root, then by volatility, is the shock in the forward equation. There is no drift term to add. When the clock would pass the horizon, the loop stops. The finished list is saved, and the next path starts from the same level. The function returns every path.
The lesson's plot is a loop that draws one line per path. The lines share a start and then separate. Because the shock is additive, the distance between paths is on the price scale, not a percentage scale. A large volatility spreads the fan in price points per square-root of time. The starting level shifts the whole fan up or down and does not change the width.
How to use it
Import NumPy and Matplotlib. Define the function with the five arguments. Compute the step once. For each path, reset the price list and the clock, run the while loop, and append the list to a collection. Return the collection.
The lesson's call asks for 100 paths and a one-year horizon split into 252 steps, and it passes 0.3 in the first slot of the call. With the signature above, that first slot is the starting level. Volatility still has to be supplied. The spoken call does not read a separate volatility number in the same sentence, so pick the volatility you mean to study and keep it next to the 0.3, the year, the 252, and the 100 when you compare your picture with the lesson's. Then plot.
To tie a picture back to the formula, remember that one full step of the loop is a discrete reading of "add sigma times a Brownian increment." Many steps are a path. The value at the end of one path is one sample of the forward at the horizon. An average of call payoffs on those endings is a Monte Carlo reading of the expectation the analytical session studies. This session does not run that average. It stops at the plotted paths.
A three-minute version leaves out a leftover-time correction. If the horizon is not an exact multiple of the step, the final while test simply does not take a partial step. Choose a step count that divides the horizon, as 252 does for one year in the demo, and the grid lands on the end.
What usually goes wrong
Using the step, rather than its square root, as the scale of the normal draw gives the wrong variance. Adding a drift builds a different model. The update here is the previous price plus the scaled shock only.
Each step needs its own random draw. Each path has to reset both the price list and the clock. The opening 0.3 and the volatility are different inputs. A fan that is too tight or too wide is often those two numbers swapped.
Questions people ask
What is the update rule?
New price equals the last price plus volatility times a standard normal times the square root of the time step. No drift is added.
How long is the demo?
One year, 252 steps, 100 paths. The call begins with 0.3.
What process is this?
Driftless arithmetic Brownian motion, which is the Bachelier forward the pricing session solves in closed form.