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()