- Purpose:
- CIR process maximum likelihood estimation.
- Input
- Model.Data = Time series of interest rates observations.
- Model.TimeStep = Delta t; recommended: 1/250 for daily data and 1/12 for monthly data.
- Model.Disp = 'y' | 'n', (default: 'n').
- Model.Method = 'ncx2pdf' | 'besseli' (default: 'besseli').
- Model.MatlabDisp = 'off' | 'iter' | 'notify' |' final' (default: 'off').
- Output:
- Results.Params = Estimated parameters (kappa, theta, sigma).
- Results.Fval = Objective function value.
function Results = CIRestimation(Model)
Nobs = length(Model.Data);
r = Model.Data(1:end-1);
dr = diff(Model.Data);
dr = dr./r.^0.5;
regressors = [Model.TimeStep./r.^0.5, Model.TimeStep*r.^0.5];
drift = regressors\dr;
res = regressors*drift - dr;
alpha = -drift(2);
theta = -drift(1)/drift(2);
sigma = sqrt(var(res, 1)/Model.TimeStep);
InitialParams = [kappa theta sigma];
if ~isfield(Model, 'Disp'), Model.Disp = 'y';
end;
if strcmp(Model.Disp, 'y')
fprintf('\n initial kappa=...%+3.6f\n initial theta=...%+3.6f\n initial sigma = %+3.6f\n',kappa, theta, sigma);
end
if ~isfield(Model, 'MatlabDisp'), Model.MatlabDisp = 'off';
end;
options = optimset('LargeScale', 'off', 'MaxIter', 300, 'MaxFunEvals',300, 'Display', Model.MatlabDisp, 'TolFun', 1e-4, 'TolX', 1e-4, 'TolCon', 1e-4);
if ~isfield(Model, 'Method'), Model.Method = 'besseli';
end;
if strcmp(Model.Method, 'ncx2pdf')
[Params, Fval, Exitflag] = fminsearch(@(Params) CIRobjective2(Params, Model),InitialParams, options);
else
[Params, Fval, Exitflag] = fminsearch(@(Params) CIRobjective1(Params, Model),InitialParams, options);
end
Results.Params = Params;
Results.Fval = -Fval/Nobs;
Results.Exitflag = Exitflag;
if strcmp(Model.Disp, 'y')
fprintf('\n kappa = %+3.6f\n theta = %+3.6f\n sigma = %+3.6f\n',...
Params(1), Params(2), Params(3));
fprintf(' log-likelihood = %+3.6f\n', -Fval/Nobs);
end
end