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();
// final double[] relativePartialForwardsZ = objZ.getRelativeForwardsZ();
System.out.println("Parameters XY");
for (int i = 0; i < nNorms; ++i) {
System.out.println(weights[i] + "\t" + inWeights[i]);
// assertEquals("weights ", weights[i], inWeights[i], Math.abs((inWeights[0] + inWeights[1]) / 2.) * 1e-6);
}
for (int i = 0; i < nNorms; ++i) {
System.out.println(sigmasX[i] + "\t" + inSigmasX[i]);
// assertEquals("sigmasY ", sigmasX[i], inSigmasX[i], Math.abs((inSigmasX[0] + inSigmasX[1]) / 2.) * 1e-6);
}
for (int i = 0; i < nNorms; ++i) {
System.out.println(sigmasY[i] + "\t" + inSigmasY[i]);
// assertEquals("sigmasY ", sigmasY[i], inSigmasY[i], Math.abs((inSigmasY[0] + inSigmasY[1]) / 2.) * 1e-6);
}
for (int i = 0; i < nNorms; ++i) {
System.out.println(relativePartialForwardsX[i] + "\t" + inRelativePartialForwardsX[i]);
// assertEquals("relativePartialForwardsX ", relativePartialForwardsX[i], inRelativePartialForwardsX[i], Math.abs((inRelativePartialForwardsX[0] + inRelativePartialForwardsX[1]) / 2.) * 1e-6);
}
for (int i = 0; i < nNorms; ++i) {
System.out.println(relativePartialForwardsY[i] + "\t" + inRelativePartialForwardsY[i]);
// assertEquals("relativePartialForwardsY ", relativePartialForwardsY[i], inRelativePartialForwardsY[i], Math.abs((inRelativePartialForwardsY[0] + inRelativePartialForwardsY[1]) / 2.) * 1e-6);
}
//
// System.out.println("\n");
// System.out.println("Parameters Z");
//
// for (int i = 0; i < nNorms; ++i) {
// System.out.println(sigmasZ[i] + "\t" + inSigmasZ[i]);
// assertEquals("sigmasZ ", sigmasZ[i], inSigmasZ[i], Math.abs((inSigmasZ[0] + inSigmasZ[1]) / 2.) * 1e-6);
// }
// for (int i = 0; i < nNorms; ++i) {
// System.out.println(relativePartialForwardsZ[i] + "\t" + inRelativePartialForwardsZ[i]);
// assertEquals("relativePartialForwardsZ ", relativePartialForwardsZ[i], inRelativePartialForwardsZ[i], Math.abs((inRelativePartialForwardsZ[0] + inRelativePartialForwardsZ[1]) / 2.) * 1e-6);
// }
System.out.println("\n");
System.out.println("Imp Vols XYZ from fitting");
final double[] ansVolsX = new double[100];
final double[] ansVolsY = new double[100];
final double[] ansVolsZ = new double[100];
for (int i = 0; i < 100; i++) {
final double k = fwdX * (0.1 + 2. * i / 100.);
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, time, true);
ansVolsX[i] = volfunc.getVolatility(option, fwdX, objAns1X);
ansVolsY[i] = volfunc.getVolatility(option, fwdY, objAns1Y);
ansVolsZ[i] = objZ.getImpliedVolatilityZ(option, fwdZ);
System.out.println(k + "\t" + ansVolsX[i] + "\t" + ansVolsY[i] + "\t" + ansVolsZ[i]);
}
System.out.println("\n");
System.out.println("True Imp Vols XYZ");
final double[] trueVolsX = new double[100];
final double[] trueVolsY = new double[100];
final double[] trueVolsZ = new double[100];
for (int i = 0; i < 100; i++) {
final double k = fwdY * (0.1 + 2. * i / 100.);
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, time, true);
trueVolsX[i] = volfunc.getVolatility(option, fwdX, inObjX);
trueVolsY[i] = volfunc.getVolatility(option, fwdY, inObjY);
trueVolsZ[i] = objTrueZ.getImpliedVolatilityZ(option, fwdZ);
System.out.println(k + "\t" + trueVolsX[i] + "\t" + trueVolsY[i] + "\t" + trueVolsZ[i]);
}