final double[] inSigmasX = {0.25, 0.7 };
final double[] inSigmasY = {0.3, 0.5 };
final double[] inWeights = {0.7, 0.3 };
final MixedLogNormalModelData inObjX = new MixedLogNormalModelData(inWeights, inSigmasX, inRelativePartialForwardsX);
final MixedLogNormalModelData inObjY = new MixedLogNormalModelData(inWeights, inSigmasY, inRelativePartialForwardsY);
final double[] xx = new double[] {0.5, 0.7, 0.9, 1.0, 1.2, 1.5, 1.8, 0.5, 0.7, 0.9, 1.0, 1.2, 1.5, 1.8 };
final MixedLogNormalVolatilityFunction volfunc = MixedLogNormalVolatilityFunction.getInstance();
Arrays.fill(yy, 0.);
for (int j = 0; j < nDataPtsX; ++j) {
final EuropeanVanillaOption option = new EuropeanVanillaOption(xx[j], time, true);
final double[] tmpRandNorm = objRandNorm.getVector(1);
yyNoRand[j] = volfunc.getVolatility(option, fwdX, inObjX);
yy[j] = yyNoRand[j] * (1. + tmpRandNorm[0]);
}
for (int j = nDataPtsX; j < nDataPts; ++j) {
final EuropeanVanillaOption option = new EuropeanVanillaOption(xx[j], time, true);
final double[] tmpRandNorm = objRandNorm.getVector(1);
yyNoRand[j] = volfunc.getVolatility(option, fwdY, inObjY);
yy[j] = yyNoRand[j] * (1. + tmpRandNorm[0]);
}
for (int j = 0; j < nDataPts; ++j) {
System.out.println(yy[j] + "\t" + yyNoRand[j]);
}
final double[] rhos = new double[] {0.4, 0.4 };
final MixedBivariateLogNormalModelVolatility objTrueZ = new MixedBivariateLogNormalModelVolatility(inWeights, inSigmasX,
inSigmasY, inRelativePartialForwardsX, inRelativePartialForwardsY, rhos);
// final double[] inSigmasZ = objTrueZ.getSigmasZ();
// final double[] inRelativePartialForwardsZ = objTrueZ.getRelativeForwardsZ();
System.out.println("true values: " + inSigmasX[0] + "\t" + inSigmasX[1]);
System.out.println("\n");
for (int i = 0; i < nParams; ++i) {
aaGuess1[i] = 1e-2 + objRand.nextDouble();
}
MixedBivariateLogNormalFitter fitter1 = new MixedBivariateLogNormalFitter();
boolean fitDone = false;
while (fitDone == false) {
for (int i = 0; i < nNorms; ++i) {
aaGuess1X[i] = aaGuess1[i];
aaGuess1Y[i] = aaGuess1[i + nNorms];
}
for (int i = 0; i < nNorms - 1; ++i) {
aaGuess1X[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1X[i + 2 * nNorms - 1] = aaGuess1[i + 3 * nNorms - 1];
aaGuess1Y[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1Y[i + 2 * nNorms - 1] = aaGuess1[i + 4 * nNorms - 2];
}
MixedLogNormalModelData tmpObj1X = new MixedLogNormalModelData(aaGuess1X, true);
double[] tmpSigmasX = tmpObj1X.getVolatilities();
System.out.println("guess: " + tmpSigmasX[0] + "\t" + tmpSigmasX[1]);
fitter1.doFit(aaGuess1, xx, yy, time, fwdX, fwdY, nNorms, nDataPtsX, 1);
aaGuess1 = fitter1.getParams();
System.out.println("inintial sq: " + fitter1.getInitialSq());
for (int i = 0; i < nNorms; ++i) {
aaGuess1X[i] = aaGuess1[i];
aaGuess1Y[i] = aaGuess1[i + nNorms];
}
for (int i = 0; i < nNorms - 1; ++i) {
aaGuess1X[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1X[i + 2 * nNorms - 1] = aaGuess1[i + 3 * nNorms - 1];
aaGuess1Y[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1Y[i + 2 * nNorms - 1] = aaGuess1[i + 4 * nNorms - 2];
}
tmpObj1X = new MixedLogNormalModelData(aaGuess1X, true);
tmpSigmasX = tmpObj1X.getVolatilities();
System.out.println("answer: " + tmpSigmasX[0] + "\t" + tmpSigmasX[1]);
System.out.println("sq: " + fitter1.getFinalSq());
System.out.println("\n");
if (fitter1.getFinalSq() <= fitter1.getInitialSq() * 1e-6) {
fitDone = true;
} else {
for (int i = 0; i < nParams; ++i) {
aaGuess1[i] = 1e-2 + objRand.nextDouble();
}
fitter1 = new MixedBivariateLogNormalFitter();
}
}
for (int i = 0; i < nNorms; ++i) {
aaGuess1X[i] = aaGuess1[i];
aaGuess1Y[i] = aaGuess1[i + nNorms];
}
for (int i = 0; i < nNorms - 1; ++i) {
aaGuess1X[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1X[i + 2 * nNorms - 1] = aaGuess1[i + 3 * nNorms - 1];
aaGuess1Y[i + nNorms] = aaGuess1[i + 2 * nNorms];
aaGuess1Y[i + 2 * nNorms - 1] = aaGuess1[i + 4 * nNorms - 2];
}
final MixedLogNormalModelData objAns1X = new MixedLogNormalModelData(aaGuess1X, true);
final double[] weights = objAns1X.getWeights();
final double[] sigmasX = objAns1X.getVolatilities();
final double[] relativePartialForwardsX = objAns1X.getRelativeForwards();
final MixedLogNormalModelData objAns1Y = new MixedLogNormalModelData(aaGuess1Y, true);
final double[] sigmasY = objAns1Y.getVolatilities();
final double[] relativePartialForwardsY = objAns1Y.getRelativeForwards();
final MixedBivariateLogNormalModelVolatility objZ = new MixedBivariateLogNormalModelVolatility(weights, sigmasX,
sigmasY, relativePartialForwardsX, relativePartialForwardsY, rhos);
// final double[] sigmasZ = objZ.getSigmasZ();