Expected Performance of a Mean-Reversion Trading Strategy - Part 3

2026-03-02

In Part 1 we derived the asymptotic Sharpe ratio \mathrm{SR}_\infty = \sqrt{\theta/2} for a mean-reversion strategy with perfect knowledge of fair value, and Part 2 showed that a constant bias M in the fair-value estimate leaves expected PnL untouched while increasing path risk, producing a penalty factor (1 + 2\theta M^2/\sigma^2)^{-1/2}.

A natural next relaxation is to allow for estimation error being correlated with the mispricing. This post establishes that any positive covariance between the bias and the mispricing directly reduces expected PnL and affects risk. We develop this result in three stages: first, we confirm that a random but independent bias behaves identically to the constant case of Part 2; second, we derive the general covariance correction to expected PnL; and third, we apply the framework to the exponential moving average (EMA) trailing estimator, arriving at a closed-form Sharpe ratio \mathrm{SR}_\infty = \theta/\sqrt{2(\theta + \lambda)} where \lambda is the EMA decay rate. The section concludes by showing that the positive-correlation penalty is not specific to the EMA but is an unavoidable consequence of any trailing estimator under mean reversion.

1 Random Independent Bias

Before tackling correlated estimation error, it is useful to verify that the Part 2 penalty formula extends to a random bias drawn independently of the price process. Suppose the trader’s bias M is sampled once from a distribution F with \mathbb{E}[M]=0 and \mathbb{E}[M^2] = \sigma_M^2, independently of the Brownian motion \{W_t\}. Each realisation of M is a constant over the trading period, so conditionally on M the PnL is exactly the Part 2 expression:

Y_t = \frac{\sigma^2 t - X_t^2}{2} + M X_t.

Since M and X_t are independent and \mathbb{E}[X_t] = 0, the expected PnL is unchanged:

\mathbb{E}[Y_t] = \frac{\sigma^2 t - s_t^2}{2}.

For path risk, the quadratic variation d\langle Y\rangle_t = \sigma^2(X_t - M)^2\,dt gives, by the law of iterated expectation:

\frac{1}{t}\,\mathbb{E}[\langle Y\rangle_t] = \frac{1}{t}\int_0^t \sigma^2\bigl(\underbrace{\mathbb{E}[X_u^2]}_{s_u^2} + \underbrace{\mathbb{E}[M^2]}_{\sigma_M^2}\bigr)du = \sigma^2 \sigma_M^2 + \frac{\sigma^2}{2\theta}\left(\sigma^2 - \frac{s_t^2}{t}\right).

This is identical to Part 2’s formula with M^2 replaced by \mathbb{E}[M^2] = \sigma_M^2. The asymptotic Sharpe ratio follows immediately:

\boxed{ \mathrm{SR}_\infty = \sqrt{\frac{\theta}{2}} \cdot \frac{1}{\sqrt{1 + \dfrac{2\theta\,\sigma_M^2}{\sigma^2}}}. }

The conclusion reinforces Part 2: uncertainty in fair value increases path risk without affecting the expected return, and the Sharpe penalty depends only on \mathbb{E}[M^2], regardless of the shape of F. Figure 1 confirms both predictions via Monte Carlo. The independence assumption, however, is the crucial one. As we show next, relaxing it changes the picture qualitatively.

Show simulation code
# --- Simulation: SR with random independent bias ---
theta, sigma, T, dt = 1.0, 0.10, 100, 1 / 252
n_paths = 3_000
X = simulate_ou(theta, sigma, T, dt, n_paths)

sigma_M_values = np.linspace(0, 0.15, 30)
rng_M = np.random.default_rng(99)

mean_pnls, sr_sim = [], []
for sm in sigma_M_values:
    M_draw = rng_M.normal(0, sm, size=n_paths) if sm > 0 else np.zeros(n_paths)
    Y = pnl_paths(X, M_draw, dt)
    mean_pnl = (Y[:, -1] / T).mean()
    mean_pnls.append(mean_pnl)

    dX = np.diff(X, axis=1)
    dY = -(X[:, :-1] - M_draw[:, None]) * dX
    qv = np.sum(dY**2, axis=1)
    sr_sim.append(mean_pnl / np.sqrt((qv / T).mean()))

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Left: mean annualised PnL vs sigma_M (should be flat)
theory_mean = 0.5 * (sigma**2 - s2(T, theta, sigma) / T)
axes[0].plot(sigma_M_values, mean_pnls, "o", ms=4, label="Simulated")
axes[0].axhline(theory_mean, color="k", ls="--", lw=2, label=r"Theory (all $\sigma_M$)")
axes[0].set(xlabel=r"$\sigma_M$", ylabel=r"$\mathbb{E}[Y_T/T]$",
            title="Mean Annualised PnL vs Bias Uncertainty")
axes[0].legend()

# Right: SR vs sigma_M (theory + MC)
sr_theory = np.sqrt(theta / 2) / np.sqrt(1 + 2 * theta * sigma_M_values**2 / sigma**2)
axes[1].plot(sigma_M_values, sr_sim, "o", ms=4, label="Simulated")
axes[1].plot(sigma_M_values, sr_theory, "k-", lw=2, label="Theory")
axes[1].set(xlabel=r"$\sigma_M$", ylabel=r"$\mathrm{SR}_\infty$",
            title="Sharpe Ratio vs Bias Uncertainty")
axes[1].legend()

print("Left: expected PnL is invariant to bias uncertainty. Right: SR degrades with sigma_M.")

plt.tight_layout()plt.show()
Figure 1: Random independent bias. Expected PnL is invariant to bias uncertainty (left). SR degrades with \sigma_M following the same penalty formula as the constant-bias case (right).
Left: expected PnL is invariant to bias uncertainty. Right: SR degrades with sigma_M.

2 Time-Varying Correlated Bias

We now allow the bias M_t to vary over time and to be correlated with the mispricing X_t. This is the practically relevant case: any estimate derived from the price history will, by construction, covary with price movements.

2.1 Expected PnL with correlated bias

The PnL decomposition from Part 2 still holds:

Y_t = \frac{\sigma^2 t - X_t^2}{2} + \int_0^t M_u\, dX_u.

The new ingredient is the expectation of the stochastic integral. Substituting the OU dynamics dX_u = -\theta X_u\, du + \sigma\, dW_u:

\mathbb{E}\!\left[\int_0^t M_u\, dX_u\right] = -\theta \int_0^t \mathbb{E}[M_u X_u]\, du + \sigma\, \underbrace{\mathbb{E}\!\left[\int_0^t M_u\, dW_u\right]}_{=\, 0}.

The stochastic integral has zero expectation (martingale property). Since \mathbb{E}[X_u] = 0, we have \mathbb{E}[M_u X_u] = \operatorname{Cov}(M_u, X_u). The expected annualised PnL is therefore:

\boxed{ \mathbb{E}\!\left[\frac{Y_t}{t}\right] = \frac{1}{2}\left(\sigma^2 - \frac{s_t^2}{t}\right) - \frac{\theta}{t}\int_0^t \operatorname{Cov}(M_u, X_u)\, du. }

This is the central result of the post. Compared to Parts 1–2, the expected PnL acquires a correction term proportional to the time-averaged covariance between the bias and the mispricing. Positive covariance — the bias and the mispricing moving in the same direction — reduces expected PnL: when the asset is overpriced (X>0), the bias also tends to be positive, so the trader under-estimates the overpricing and takes too small a position. Negative covariance would increase expected PnL, but this requires a contrarian estimator that anticipates mean reversion, a rare luxury in practice. Zero covariance recovers the Part 2 result, confirming that independent bias affects only risk.

2.2 A contrast: proportional bias

To sharpen intuition for the EMA analysis that follows, consider the limiting case M_t = \rho\, X_t for some \rho \in [0,1). The trader’s perceived mispricing is then \tilde{X}_t = (1-\rho)\,X_t, and the PnL satisfies Y_t = (1-\rho)\,(\sigma^2 t - X_t^2)/2. Both the expected PnL and the path risk scale by (1-\rho) and (1-\rho)^2 respectively, so the Sharpe ratio remains \sqrt{\theta/2}, independent of \rho. Proportional bias reduces capacity without degrading risk-adjusted return — a qualitatively different outcome from the lagged, asymmetric distortion introduced by trailing estimators.

3 EMA Trailing Estimator

With the general covariance correction in hand, we now apply it to the most natural source of correlated bias: a trailing estimator of fair value. Suppose the trader estimates \tilde{v}_t by exponentially smoothing past prices:

d\tilde{v}_t = \lambda\,(p_t - \tilde{v}_t)\,dt, \qquad \tilde{v}_0 = v,

where \lambda > 0 is the EMA decay rate. Since p_t = v + X_t (constant fair value) and \tilde{v}_t = v + M_t, the bias M_t = \tilde{v}_t - v satisfies

dM_t = \lambda\,(X_t - M_t)\,dt, \qquad M_0 = 0.

The bias is purely deterministic given the path of X — it has no diffusion component, only a lagged response to the mispricing. The EMA half-life is \ln 2/\lambda. Unlike the proportional bias M_t = \rho X_t discussed above, the EMA introduces a temporal lag: M_t tracks X_t with delay, and this asymmetry between the bias and the mispricing is what breaks the Sharpe-ratio invariance.

3.1 Stationary moments

The joint system (X_t, M_t) is a two-dimensional linear SDE, and its stationary second moments can be derived by applying the product rule and setting time derivatives to zero.

For \mathbb{E}[X_t^2], Itô’s formula gives d(X^2) = (\sigma^2 - 2\theta X^2)\,dt + 2\sigma X\,dW, so in stationarity:

0 = \sigma^2 - 2\theta\,\Sigma_{XX} \;\;\Longrightarrow\;\; \Sigma_{XX} = \frac{\sigma^2}{2\theta}.

For the cross-moment \mathbb{E}[X_t M_t], the product rule yields d(XM) = X\,dM + M\,dX = \bigl(\lambda X^2 - (\theta+\lambda)XM\bigr)dt + \sigma M\,dW, giving:

0 = \lambda\,\Sigma_{XX} - (\theta+\lambda)\,\Sigma_{XM} \;\;\Longrightarrow\;\; \Sigma_{XM} = \frac{\lambda}{\theta+\lambda}\,\Sigma_{XX} = \frac{\lambda\sigma^2}{2\theta(\theta+\lambda)}.

For \mathbb{E}[M_t^2], since d(M^2) = 2M\,dM = 2\lambda(XM - M^2)\,dt:

0 = 2\lambda\bigl(\Sigma_{XM} - \Sigma_{MM}\bigr) \;\;\Longrightarrow\;\; \Sigma_{MM} = \Sigma_{XM} = \frac{\lambda\sigma^2}{2\theta(\theta+\lambda)}.

It is worth noting that \Sigma_{MM} = \Sigma_{XM}: the variance of the bias equals its covariance with the mispricing. This is a consequence of the deterministic dynamics of M_t — the bias has no independent noise source, so all of its variability derives from its coupling to X_t. The stationary correlation between the bias and the mispricing is

\operatorname{Corr}(M, X) = \frac{\Sigma_{XM}}{\sqrt{\Sigma_{XX}\,\Sigma_{MM}}} = \sqrt{\frac{\lambda}{\theta+\lambda}}.

As \lambda \to \infty (fast EMA), \operatorname{Corr} \to 1 and the bias tracks the mispricing almost perfectly. As \lambda \to 0 (slow EMA), \operatorname{Corr} \to 0 and the bias decouples from the mispricing. Figure 2 confirms these stationary moments via Monte Carlo.

3.2 Asymptotic expected PnL

Substituting \Sigma_{XM} into the general covariance correction derived above:

\mathbb{E}\!\left[\frac{Y_t}{t}\right] \;\xrightarrow{t\to\infty}\; \frac{\sigma^2}{2} - \theta\,\Sigma_{XM} = \frac{\sigma^2}{2} - \frac{\lambda\sigma^2}{2(\theta+\lambda)} = \frac{\sigma^2}{2}\cdot\frac{\theta}{\theta+\lambda}.

\boxed{ \text{Asymptotic mean PnL rate} = \frac{\sigma^2\theta}{2(\theta+\lambda)}. }

The expected PnL is reduced by a factor \theta/(\theta+\lambda) relative to the perfect-information benchmark \sigma^2/2. At \lambda = \theta — when the EMA half-life matches the OU half-life — the expected PnL is exactly halved.

3.3 Asymptotic quadratic variation

The stationary variance of the trader’s signal \tilde{X}_t = X_t - M_t determines the path risk:

\operatorname{Var}(X-M) = \Sigma_{XX} - 2\Sigma_{XM} + \Sigma_{MM} = \frac{\sigma^2}{2\theta} - \frac{\lambda\sigma^2}{2\theta(\theta+\lambda)} = \frac{\sigma^2}{2(\theta+\lambda)},

so the quadratic variation rate \mathbb{E}[d\langle Y\rangle_t] = \sigma^2\,\mathbb{E}[(X_t-M_t)^2]\,dt yields

\boxed{ \text{Asymptotic QV rate} = \frac{\sigma^4}{2(\theta+\lambda)}. }

Both the numerator (expected PnL) and the denominator (path risk) of the Sharpe ratio are suppressed by the factor 1/(\theta+\lambda), but their ratio does not cancel — the square root in the denominator leaves a net penalty.

3.4 Asymptotic Sharpe ratio

Combining the expected PnL and QV rates:

\mathrm{SR}_\infty = \frac{\sigma^2\theta/\bigl(2(\theta+\lambda)\bigr)}{\sqrt{\sigma^4/\bigl(2(\theta+\lambda)\bigr)}} = \frac{\theta}{\sqrt{2(\theta+\lambda)}}.

Factoring out the unbiased Sharpe from Part 1:

\boxed{ \mathrm{SR}_\infty = \sqrt{\frac{\theta}{2}} \cdot \sqrt{\frac{\theta}{\theta+\lambda}} = \frac{\theta}{\sqrt{2(\theta+\lambda)}}. }

The penalty factor \sqrt{\theta/(\theta+\lambda)} depends only on the ratio \lambda/\theta. At \lambda = 0 (no estimation) we recover the Part 1 result; at \lambda = \theta the penalty is 1/\sqrt{2} \approx 0.71; and as \lambda \to \infty the EMA tracks the price too closely and the Sharpe ratio vanishes. Figure 3 and Figure 4 confirm these predictions via Monte Carlo and display the universal penalty curve.

Show simulation code
# --- EMA: stationary covariance and mean PnL rate vs lambda ---
theta, sigma = 1.0, 0.10
T, dt, n_paths = 30, 1 / 252, 3_000
lam_scan = np.linspace(0.1, 5.0, 20)

cov_sim_list, pnl_sim_list = [], []
for lam in lam_scan:
    X, M = simulate_ou_ema(theta, sigma, lam, T, dt, n_paths,
                           rng=np.random.default_rng(42))
    # Stationary covariance: use last 20% of each path
    burn = int(0.8 * X.shape[1])
    cov_sim_list.append(np.mean(X[:, burn:] * M[:, burn:]))

    # Mean annualised PnL
    Y = pnl_paths(X, M, dt)
    pnl_sim_list.append((Y[:, -1] / T).mean())

# Theory curves
lam_fine = np.linspace(0.01, 5.5, 300)
cov_theory = lam_fine * sigma**2 / (2 * theta * (theta + lam_fine))
pnl_theory = sigma**2 * theta / (2 * (theta + lam_fine))

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

axes[0].plot(lam_scan, cov_sim_list, "o", ms=5, label="Simulated")
axes[0].plot(lam_fine, cov_theory, "k-", lw=2, label="Theory")
axes[0].set(xlabel=r"EMA decay rate $\lambda$",
            ylabel=r"$\Sigma_{XM}$",
            title=r"Stationary $\mathrm{Cov}(M_t, X_t)$ vs $\lambda$")
axes[0].legend()

axes[1].plot(lam_scan, pnl_sim_list, "o", ms=5, label="Simulated")
axes[1].plot(lam_fine, pnl_theory, "k-", lw=2, label="Theory")
axes[1].axhline(sigma**2 / 2, color="gray", ls=":", lw=1, label=r"Unbiased ($\sigma^2/2$)")
axes[1].set(xlabel=r"EMA decay rate $\lambda$",
            ylabel=r"$\mathbb{E}[Y_t/t]$",
            title="Asymptotic Mean Annualised PnL vs $\\lambda$")
axes[1].legend()

print(f"Unbiased PnL rate: {sigma**2/2:.4f}.  At lambda=theta={theta}: {sigma**2*theta/(2*(theta+theta)):.4f} (halved).")

plt.tight_layout()plt.show()
Figure 2: Stationary covariance \Sigma_{XM} (left) and mean annualised PnL (right) vs EMA decay rate \lambda. Faster EMA tracking increases correlation and reduces expected PnL.
Unbiased PnL rate: 0.0050.  At lambda=theta=1.0: 0.0025 (halved).
Show simulation code
# --- SR vs theta for different EMA speeds ---
sigma = 0.10
T, dt, n_paths = 100, 1 / 252, 1_000
theta_range = np.linspace(0.1, 5.0, 30)
lam_values = [0.0, 0.5, 1.0, 2.0]

fig, ax = plt.subplots(figsize=(10, 6))
colors = plt.cm.tab10(np.linspace(0, 0.4, len(lam_values)))

for lam, c in zip(lam_values, colors):
    # Theory curve
    if lam == 0:
        sr_th = np.sqrt(theta_range / 2)
        label = r"Unbiased ($\lambda=0$)"
    else:
        sr_th = theta_range / np.sqrt(2 * (theta_range + lam))
        label = f"$\\lambda={lam}$"
    ax.plot(theta_range, sr_th, "-", color=c, lw=2, label=f"Theory {label}")

    # MC at subset of theta values
    theta_sim = theta_range[::5]
    sr_sim = []
    for th in theta_sim:
        seed_rng = np.random.default_rng(123)
        if lam == 0:
            X = simulate_ou(th, sigma, T, dt, n_paths, rng=seed_rng)
            M_arr = np.zeros_like(X)
        else:
            X, M_arr = simulate_ou_ema(th, sigma, lam, T, dt, n_paths, rng=seed_rng)
        Y = pnl_paths(X, M_arr, dt)
        mean_pnl = (Y[:, -1] / T).mean()

        dX = np.diff(X, axis=1)
        dY = -(X[:, :-1] - M_arr[:, :-1]) * dX
        qv = np.sum(dY**2, axis=1)
        sr_sim.append(mean_pnl / np.sqrt((qv / T).mean()))

    ax.plot(theta_sim, sr_sim, "o", color=c, ms=7, zorder=5)

ax.set(xlabel=r"Mean reversion speed $\theta$",
       ylabel="Asymptotic Sharpe Ratio",

       title=r"Sharpe Ratio vs $\theta$ for EMA Fair-Value Estimate (dots = MC)")plt.show()

ax.legend(loc="upper left")plt.tight_layout()
Figure 3: Sharpe ratio vs \theta for different EMA decay rates. Lines are the closed-form \theta/\sqrt{2(\theta+\lambda)}; dots are Monte Carlo estimates.
Show simulation code
# --- Penalty curve and 2-D SR heatmap ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Left: universal penalty 1/sqrt(1 + lambda/theta) vs lambda/theta
ratio = np.linspace(0, 10, 500)
penalty = 1 / np.sqrt(1 + ratio)
axes[0].plot(ratio, penalty, "k-", lw=2)
axes[0].axhline(1 / np.sqrt(2), color="gray", ls=":", lw=1)
axes[0].axvline(1.0, color="gray", ls=":", lw=1)
axes[0].annotate(r"$\lambda/\theta = 1$: penalty $\approx 0.71$",
                 xy=(1, 1 / np.sqrt(2)), xytext=(3.5, 0.82),
                 arrowprops=dict(arrowstyle="->"), fontsize=11)
axes[0].set(xlabel=r"$\lambda / \theta$",
            ylabel=r"$\mathrm{SR}_\infty(\lambda)\;/\;\mathrm{SR}_\infty(0)$",
            title="Universal EMA Sharpe Penalty")

# Right: heatmap of absolute SR = theta / sqrt(2*(theta+lambda))
theta_grid = np.linspace(0.1, 5.0, 200)
lam_grid = np.linspace(0.0, 10.0, 200)
Theta, Lam = np.meshgrid(theta_grid, lam_grid)
SR = Theta / np.sqrt(2 * (Theta + Lam))

cf = axes[1].contourf(Theta, Lam, SR, levels=20, cmap="viridis")
cs = axes[1].contour(Theta, Lam, SR, levels=[0.25, 0.5, 0.75, 1.0, 1.25],
                     colors="w", linewidths=0.8)
axes[1].clabel(cs, fmt="%.2f", fontsize=10)
plt.colorbar(cf, ax=axes[1], label=r"$\mathrm{SR}_\infty$")
axes[1].set(xlabel=r"$\theta$", ylabel=r"$\lambda$",
            title=r"Asymptotic SR: $\theta/\sqrt{2(\theta+\lambda)}$")

print("Left: penalty depends only on lambda/theta. Right: absolute SR over the (theta, lambda) plane.")

plt.tight_layout()plt.show()
Figure 4: Universal penalty curve 1/\sqrt{1+\lambda/\theta} (left) and absolute SR heatmap over the (\theta, \lambda) plane (right).
Left: penalty depends only on lambda/theta. Right: absolute SR over the (theta, lambda) plane.

4 All Trailing Estimates Create Positive Correlation

The EMA penalty derived above is not specific to exponential weighting — it is an instance of a general result. Any trailing estimator of the form

M_t = \int_0^t w(t-s)\, X_s\, ds, \qquad w \geq 0,\;\;\int_0^\infty w(s)\,ds = 1,

produces a bias with non-negative covariance with the mispricing:

\operatorname{Cov}(M_t, X_t) = \int_0^t w(t-s)\,\operatorname{Cov}(X_s, X_t)\,ds.

For the OU process, the autocovariance \operatorname{Cov}(X_s, X_t) = s_s^2\, e^{-\theta(t-s)} is everywhere non-negative for s \leq t. Since both w and the autocovariance are non-negative, the integral is non-negative — and strictly positive unless w = 0 almost everywhere, which corresponds to no estimation at all.

The EMA corresponds to exponential weights w(u) = \lambda e^{-\lambda u}; a simple moving average over a window \tau uses rectangular weights w(u) = 1/\tau for u \in [0,\tau]. In every case, the trailing estimate injects positive correlation, and the expected PnL falls below the perfect-information benchmark \sigma^2/2. The positive-correlation penalty is therefore not a modelling artefact of the EMA but an unavoidable cost of inferring fair value from price history under mean reversion. Figure 5 illustrates the finite-horizon convergence of the Sharpe ratio for several EMA decay rates.

Show simulation code
# --- Finite-horizon SR_t convergence for EMA ---
theta, sigma = 1.0, 0.10
T, dt, n_paths = 30, 1 / 252, 5_000
lam_values = [0.0, 0.5, 1.0, 2.0, 5.0]
eval_years = np.arange(1, int(T) + 1)

fig, ax = plt.subplots(figsize=(10, 5))
colors = plt.cm.tab10(np.linspace(0, 0.5, len(lam_values)))

for lam, c in zip(lam_values, colors):
    # Simulate
    seed_rng = np.random.default_rng(42)
    if lam == 0:
        X = simulate_ou(theta, sigma, T, dt, n_paths, rng=seed_rng)
        M_arr = np.zeros_like(X)
        label = r"Unbiased ($\lambda=0$)"
    else:
        X, M_arr = simulate_ou_ema(theta, sigma, lam, T, dt, n_paths, rng=seed_rng)
        label = f"$\\lambda={lam}$"

    # Full PnL and cumulative QV
    Y = pnl_paths(X, M_arr, dt)
    dX = np.diff(X, axis=1)
    dY = -(X[:, :-1] - M_arr[:, :-1]) * dX
    cumQV = np.cumsum(dY**2, axis=1)

    sr_pts = []
    for yr in eval_years:
        idx = int(yr / dt)
        if idx >= X.shape[1]:
            break
        mean_ann = (Y[:, idx] / yr).mean()
        mean_qv_ann = (cumQV[:, idx - 1] / yr).mean()
        sr_pts.append(mean_ann / np.sqrt(mean_qv_ann))

    # Asymptotic limit
    sr_lim = np.sqrt(theta / 2) if lam == 0 else theta / np.sqrt(2 * (theta + lam))
    ax.axhline(sr_lim, color=c, ls=":", lw=1, alpha=0.5)
    ax.plot(eval_years[:len(sr_pts)], sr_pts, "o-", color=c, ms=4, lw=1, label=label)

ax.set(xlabel="Horizon t (years)", ylabel=r"$\mathrm{SR}_t$",

       title="Finite-Horizon Sharpe Ratio for EMA Fair-Value Estimate")plt.show()

ax.legend(loc="lower right", fontsize=10)plt.tight_layout()
Figure 5: Finite-horizon Sharpe ratio convergence for EMA fair-value estimates with different decay rates. Dotted horizontal lines show the asymptotic limits.

5 Discussion

The key distinction established in this post is between independent and correlated estimation error. An independent bias — whether constant or random — leaves the expected PnL untouched and degrades only risk, exactly as in Part 2 (Figure 1). A correlated bias, by contrast, directly reduces the expected return through the covariance correction -(\theta/t)\int_0^t \operatorname{Cov}(M_u, X_u)\,du, as demonstrated for the EMA trailing estimator in Figure 2. The mechanism is intuitive: when the trader’s fair-value estimate co-moves with the price, the estimate chases the price rather than anchoring to true value, weakening the mean-reversion signal at its source.

The EMA Sharpe penalty \sqrt{\theta/(\theta+\lambda)} = 1/\sqrt{1+\lambda/\theta} collapses to a universal curve in \lambda/\theta (Figure 4), yielding a practical rule of thumb: the EMA lookback (half-life \ln 2/\lambda) must be much longer than the OU half-life (\ln 2/\theta) — equivalently, \lambda \ll \theta — for the estimation-induced penalty to remain small. At \lambda = \theta the Sharpe ratio is roughly 71% of the unbiased level; Table 1 summarises the penalty across several values.

Table 1: EMA Sharpe penalty for selected values of \lambda/\theta.
\lambda/\theta 0 0.25 0.5 1 2 5
Penalty 1.00 0.89 0.82 0.71 0.58 0.41

The proportional-bias benchmark (M_t = \rho X_t) provides a useful contrast. In that case, both the PnL and QV scale by (1-\rho) and (1-\rho)^2 respectively, and the Sharpe ratio cancels to \sqrt{\theta/2} regardless of \rho. The EMA, however, introduces a lagged, asymmetric distortion — not a pure rescaling — and it is precisely this temporal asymmetry that degrades risk-adjusted return. The general trailing-estimate theorem then confirms that this penalty is not particular to exponential weighting: any non-negative kernel applied to an OU process produces positive correlation and therefore reduces expected PnL below the perfect-information benchmark.

6 Further directions

Several extensions of this framework merit investigation. The analysis throughout assumes a constant fair value; when v_t itself follows a random walk or trend, the OU dynamics of X_t remain valid but the assumption dp_t = dX_t breaks down, and the interplay between estimation bias and fair-value drift becomes considerably richer. A related question is the optimal choice of \lambda in the presence of trading costs: the unbiased (\lambda=0) strategy generates the highest expected PnL but relies on continuous rebalancing, and some smoothing of fair value may actually improve net performance by reducing turnover. On the analytical side, the EMA has the cleanest closed-form results thanks to the Markov property of the joint system, but simple moving averages and other kernel estimators are common in practice; their qualitative behaviour follows from the general trailing-estimate result above, with quantitative differences depending on the kernel shape.

In the next post we turn to a complementary source of error: uncertainty in the OU parameters \theta and \sigma themselves. Joint estimation of these parameters and fair value introduces additional correlations with the mispricing, and the rolling-estimation framework developed here will provide the analytical bridge between Parts 3 and 4.