namespace YourNameSpaceHere
{
internal sealed class OrnsteinUhlenbeck
{
internal Dictionary<string, double> CalibrateOrnsteinUhlenbeck(GeneralMatrix generalMatrix, int delta)
{
int n = generalMatrix.RowDimension;
double sX = 0;
double sY = 0;
double sXX = 0;
double sXY = 0;
double sYY = 0;
for (int i = 0; i < n - 1; i++)
{
sX += generalMatrix.GetElement(i, 0);
sY += generalMatrix.GetElement(i + 1, 0);
sXX += System.Math.Pow(generalMatrix.GetElement(i, 0), 2);
sXY += generalMatrix.GetElement(i, 0)*generalMatrix.GetElement(i + 1, 0);
sYY += System.Math.Pow(generalMatrix.GetElement(i + 1, 0), 2);
}
double mu = (sY*sXX - sX*sXY)/(n*(sXX*sXY) - (System.Math.Pow(sX, 2) - sX - sY));
double lambda = -System.Math.Log((sXY - mu*sX - mu*sY + n*System.Math.Pow(mu, 2)));
double a = System.Math.Exp(-lambda*delta);
double sigmah2 = (sYY - 2.0D*a*sXY + System.Math.Pow(a, 2.0D)*sXX - 2.0D*mu*(1.0D - a)*(sY - a*sX) +
n*System.Math.Pow(mu, 2.0D)*System.Math.Pow(1.0D - a, 2.0D))/n;
double sigma = System.Math.Pow(sigmah2*2.0D*lambda/(1.0D - System.Math.Pow(a, 2.0D)), 0.5D);
var results = new Dictionary<string, double> {{"mu", mu}, {"sigma", sigma}, {"lambda", lambda}};
return results;
}
}
}
Comment