Consider the common model of stock prices given by a geometric Brownian motion (GBM), which follows the SDE $$ dS(t) = \mu S(t) dt + \sigma S(t) dW(t). $$
Below is a plot of a simulation of such a GBM using $N = 1000$ points starting at $S(0) = 100$ and volatility $\sigma = 0.2$. What would you think the drift $\mu$ was set to?
If you were to do an MLE estimate of $\mu$ and $\sigma$ on this time series you would get $\mu = 0.5054$ and $\sigma = 0.1966$. In fact, this simulation was run with $\mu = 0$.
It's clear to me that I don't have a good intuition for $\mu$, as I would be tempted to agree with the MLE estimates. How should I be thinking of $\mu$?
I think this has important implications for understanding calibration in practice. I've done an MLE estimate to a GBM because I believe the process I'm trying to model follows a GBM to some extent - in this case, it IS a GBM, so there is no "modelling error". My "best guess" of its parameters are $\mu = 0.5054$ and $\sigma = 0.1966$. But, in fact, $\mu = 0$. That is, my GBM model for a GBM with drift $0$ has drift $0.5054$. What.
Some requested details: Set $R_i = \log \left( \frac{S(t_i)}{S(t_{i-1})} \right)$, $i = 1,\ldots,N$. The likelihood function $L$ for the data $\{R_i\}$ is \begin{align*} L(\mu, \sigma) = \prod_{i=1}^N \phi(R_i; \left(\mu - \frac{\sigma^2}{2}\right)\Delta t, \sigma \sqrt{\Delta t}) \end{align*} where $\phi(x; m,s)$ is the pdf for a $\mathcal{N}(m,s^2)$-distributed random variable.
The MATLAB code I'm using:
% Simulates a GBM(mu,sigma) and plots the path.
% Here, GBM(mu,sigma) ~ log N((mu - sigma^2/2)*t, sigma^2*t)
% ----------------- Simulation (Generation of Data) ---------------------
%------------ set up parameters ----------------
N=1000; % number of points in path
mu=0; % drift
sigma=0.2; % vol
S0=100; % initial value of process
T=1; % final time
dt=T/N; % time step
%------------ allocation & initialization ----------------
t=linspace(0,T,N+1); % time axis values
S=zeros(1,N+1); % allocate vector of process values
S(1)=S0; % assign initial value to process' first value
Z=normrnd(0,1,1,N); % std normals
%------------ compute paths ----------------
for i=2:N+1
S(i)=S(i-1)*exp((mu - sigma^2/2)*dt + sigma*sqrt(dt)*Z(i-1));
end
% create plot of process
plot(t,S);
% ----------------- Parameter Estimation ----------------------
% create vector of log returns
R=zeros(1,N);
for i=2:N+1
R(i-1) = log(S(i)/S(i-1));
end
%------------ MLE Estimates ----------------
mle_est = mle(R,'distribution','normal');
theta(2) = sqrt(mle_est(2)^2/dt); % sigma
theta(1) = mle_est(1)/dt + 0.5*theta(2)^2; % mu
disp('MLE Estimates:')
disp(sprintf('mu = %f, sigma = %g',theta(1), theta(2)));