1. Radon-Nikodým Stochastic Exponential Process
Let $(\theta_t)_{t \ge 0}$ be an adapted process representing market risk premium drift. Define the Stochastic Exponential (Doléans-Dade Exponential) process $(Z_t)_{t \ge 0}$:
$$Z_t = \mathcal{E}\left( -\int_0^\cdot \theta_s \, dW_s \right)_t = \exp\left( -\int_0^t \theta_s \, dW_s - \frac{1}{2} \int_0^t \theta_s^2 \, ds \right)$$By Itô’s Lemma on $f(t, x) = \exp(x - \frac{1}{2}\int \theta^2 ds)$, $Z_t$ satisfies differential $dZ_t = -\theta_t Z_t dW_t$ with $Z_0 = 1$, proving $Z_t$ is a local martingale under $\mathbb{P}$.
Novikov’s Condition
If $(\theta_t)$ satisfies Novikov’s Integrability Condition:
$$\mathbb{E}_{\mathbb{P}}\left[ \exp\left( \frac{1}{2} \int_0^T \theta_s^2 \, ds \right) \right] < \infty$$then $(Z_t)_{t \in [0, T]}$ is a true uniform martingale with $\mathbb{E}_{\mathbb{P}}[Z_T] = 1$.
2. Girsanov’s Theorem for Change of Drift
Theorem
Define equivalent probability measure $\mathbb{Q} \sim \mathbb{P}$ on $\mathcal{F}_T$ via Radon-Nikodým derivative $\frac{d\mathbb{Q}}{d\mathbb{P}} = Z_T$. Then the transformed process:
$$\tilde{W}_t = W_t + \int_0^t \theta_s \, ds$$is a standard Brownian motion under measure $\mathbb{Q}$ for $t \in [0, T]$.
3. Application: The Risk-Neutral Pricing Measure $\mathbb{Q}$
Consider asset price $dS_t = \mu S_t dt + \sigma S_t dW_t$ and risk-free cash account $dB_t = r B_t dt$. Setting Market Price of Risk $\theta = \frac{\mu - r}{\sigma}$, under $\mathbb{Q}$ where $d\tilde{W}_t = dW_t + \theta dt$:
$$dS_t = r S_t \, dt + \sigma S_t \, d\tilde{W}_t$$The discounted asset price $\tilde{S}_t = e^{-rt} S_t$ is a pure martingale under $\mathbb{Q}$:
$$\tilde{S}_t = \mathbb{E}_{\mathbb{Q}}\left[ \tilde{S}_T \mid \mathcal{F}_t \right]$$4. Python Verification: Girsanov Drift Shift under Radon-Nikodým Weighting
import numpy as np
def verify_girsanov_measure_change(num_paths: int = 150_000, T: float = 1.0):
"""Verifies that E_Q[f(W_T + theta*T)] = E_P[Z_T * f(W_T + theta*T)] matches N(0, T) under Q."""
theta = 1.2
W_T = np.random.normal(0.0, np.sqrt(T), size=num_paths)
# Process X_T = W_T + theta*T has drift theta under P
X_T = W_T + theta * T
# Radon-Nikodym derivative Z_T = exp(-theta*W_T - 0.5*theta^2*T)
Z_T = np.exp(-theta * W_T - 0.5 * (theta**2) * T)
# Under Q, X_T ~ N(0, T), so E_Q[X_T] = 0.0 and E_Q[X_T^2] = T
empirical_mean_Q = np.mean(Z_T * X_T)
empirical_var_Q = np.mean(Z_T * (X_T ** 2))
print(f"Empirical E_Q[X_T] via Girsanov Weighting: {empirical_mean_Q:.6f} (Theoretical: 0.000000)")
print(f"Empirical E_Q[X_T²] via Girsanov Weighting: {empirical_var_Q:.6f} (Theoretical: {T:.6f})")
if __name__ == "__main__":
verify_girsanov_measure_change()