For a single maturity, European call prices encode the risk-neutral distribution of the underlying. You can turn them into Monte Carlo samples without fitting a model or estimating a density.

For strikes K_0 < … < K_n with call prices C_0, …, C_n, define

    \[F_i = 1 + e^{rT} \frac{C_{i+1}-C_i}{K_{i+1}-K_i}, \quad F_0 = 0, \quad F_n = 1\]

This is a discrete approximation of the cumulative distribution function of S_T.

To sample:

  1. Draw U \sim Uniform(0,1)
  2. Find i such that F_i \le U < F_{i+1}
  3. Set

    \[S_T = K_i + (K_{i+1}-K_i)\frac{U-F_i}{F_{i+1}-F_i}\]

Repeat for as many samples as needed.

This produces risk-neutral samples directly from observed call prices using only simple finite differences. It’s fully model-free, requires no volatility surface fitting, and preserves arbitrage constraints!

Below and example results from S&P500 option prices: