Skip to content
All library documents

Simulating Bachelier Prices with Gaussian Increments

Article Quant Q&A · Author: user50317

Summary

The document addresses how to simulate an underlying price under the Bachelier model, in which price changes are additive and driven by Brownian motion. The response represents the Brownian path as a sequence of independent standard normal increments scaled by the square root of the time step, then adds those increments to the prior simulated price.

A short Python example constructs a path by repeating this update across a fixed number of steps and plots several resulting paths. This illustrates the discrete simulation method and the role of Gaussian draws. The code shown omits the drift term present in the question’s stated dynamics and uses a particular time-step convention, so users must adapt it to their horizon, desired step size, and drift assumptions. The document provides a visual illustration, but no validation, parameter guidance, or comparison with other models.

Key ideas

  • Bachelier dynamics model price changes additively rather than proportionally.
  • A Brownian increment over a time step is simulated as a standard normal draw scaled by the square root of that step.
  • Each simulated price is formed by adding the scaled increment to the previous price.
  • The example omits the drift term and does not discuss calibration or simulation accuracy.

Tags

Full text
# Bachelier model in terms of normal distribution to simulate price


# Bachelier model in terms of normal distribution to simulate price












Bachelier Model is $dS_t = rdt + 𝜎dW_t$ and can also write to $S_t = S_0 + 𝜎W_t$ How can write $W_t$ in terms of normal distribution?

Basically I want to simulated the underlying asset in the Bachelier Model. Thank you.

## Answer by StackG (score 2)

https://quant.stackexchange.com/a/58541

I adjusted your function slightly:

```
import numpy as np
from matplotlib import pyplot as plt

def terminal_value(S0, sigma, M):
    S = np.zeros(M)
    S[0] = S0
    for i in range(1, M):
        S[i] = S[i-1] + sigma * np.random.standard_normal() * np.sqrt(1/M)
    return S

for i in range(10):
    series = terminal_value(100, 10, 100)
    plt.plot(series)
```

It works now and produces the following:

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.