I want to calibrate jointly the drift mu and volatility sigma of a geometric brownian motion,
$$\log(S_t) = \log(S_{t-1}) + (\mu - 0.5*\sigma^2) \Delta t + \sigma*\sqrt{\Delta t}*Z_t$$
where $Z_t$ is a standard normally distributed random variable, and am testing this by generating data $x = \log(S_t)$ via
x(1) = 0;
for i = 2:N
x(i) = x(i-1) + (mu-0.5*sigma^2)*Deltat + sigma*sqrt(Deltat)*randn;
end
and my (log-)likelihood function
function LL = LL(x, pars)
mu = pars(1);
sigma = pars(2);
Nt = size(x,2);
LL = 0;
for j = 2:Nt
LH_j = normpdf(x(j), x(j-1)+(mu-0.5*sigma^2)*Deltat, sigma*sqrt(Deltat));
LL = LL + log(LH_j);
end
which I maximize using fmincon
(because sigma is constrained to be positive), with starting values 0.15 and 0.3, true values 0.1 and 0.2, and N = Nt = 1000
or 100000 generated points over one year (i.e. $\Delta t$ = 0.0001 or 0.000001).
Calibrating the volatility alone yields a nice likelihood function with a maximum around the true parameter, but for small Deltat (less than say 0.1) calibrating both mu and sigma persistently shows a (log-)likelihood surface being very flat in mu (at least around the true parameter); I would expect also a maximum there; for a reason I think it should be possible to calibrate a GBM model to a data series of 100 stock prices in a year, making the average of Deltat = 0.01.
Any sharing of experience or help is greatly appreciated (thoughts passing through my mind: the likelihood function is not right / this is a normal behaviour / too few data points / data generation is not correct / ...?).