/// <summary>
/// Attempts a calibration through <see cref="CapsHW1OptimizationProblem"/>
/// using caps matrices.
/// </summary>
/// <param name="data">The data to be used in order to perform the calibration.</param>
/// <param name="settings">The parameter is not used.</param>
/// <param name="controller">The controller which may be used to cancel the process.</param>
/// <returns>The results of the calibration.</returns>
public EstimationResult Estimate(List<object> data, IEstimationSettings settings = null, IController controller = null, Dictionary<string, object> properties = null)
{
InterestRateMarketData dataset = data[0] as InterestRateMarketData;
PFunction zr = new PFunction(null);
zr.VarName = "zr";
var preferences = settings as Fairmat.Calibration.CapVolatilityFiltering;
// Loads ZR
double[,] zrvalue = (double[,])ArrayHelper.Concat(dataset.ZRMarketDates.ToArray(), dataset.ZRMarket.ToArray());
zr.Expr = zrvalue;
BlackModel bm = new BlackModel(zr);
double deltak = dataset.CapTenor;
if (dataset.CapVolatility == null)
return new EstimationResult("Cap not available at requested date");
Matrix capVolatility = dataset.CapVolatility;
Vector capMaturity = dataset.CapMaturity;
Vector capRate = dataset.CapRate;
double a = 0.1;
double sigma = 0.1;
// Matrix calculated with Black.
Matrix blackCaps = new Matrix(capMaturity.Length, capRate.Length);
Matrix logic = new Matrix(capMaturity.Length, capRate.Length);
for (int m = 0; m < capMaturity.Length; m++)
{
for (int s = 0; s < capRate.Length; s++)
{
blackCaps[m, s] = bm.Cap(capRate[s], capVolatility[m, s], deltak, capMaturity[m]);
if (double.IsNaN(blackCaps[m, s]))
{
bm.Cap(capRate[s], capVolatility[m, s], deltak, capMaturity[m]);
throw new Exception("Malformed black caps");
}
if (blackCaps[m, s] == 0.0)
{
logic[m, s] = 0.0;
}
else
{
logic[m, s] = 1.0;
}
//filter
if (preferences != null)
{
if (capRate[s] < preferences.MinCapRate || capRate[s] > preferences.MaxCapRate ||
capMaturity[m]<preferences.MinCapMaturity|| capMaturity[m]>preferences.MaxCapMaturity)
{logic[m, s] = 0; blackCaps[m, s] = 0;}
}
}
}
DateTime t0 = DateTime.Now;
CapHW1 hw1Caps = new CapHW1(zr);
Matrix caps = hw1Caps.HWMatrixCaps(capMaturity, capRate, a, sigma, deltak);
for (int m = 0; m < capMaturity.Length; m++)
{
for (int s = 0; s < capRate.Length; s++)
{
caps[m, s] = logic[m, s] * caps[m, s];
}
}
CapsHW1OptimizationProblem problem = new CapsHW1OptimizationProblem(hw1Caps, blackCaps, capMaturity, capRate, deltak);
Vector provaparam = new Vector(2);
var solver = new QADE();
IOptimizationAlgorithm solver2 = new SteepestDescent();
DESettings o = new DESettings();
o.NP = 20;
o.MaxIter = 10;
o.Verbosity = 1;
o.Parallel = false;
SolutionInfo solution = null;
Vector x0 = new Vector(new double[] { 0.05, 0.01 });
o.controller = controller;
solution = solver.Minimize(problem, o, x0);
o.epsilon = 10e-8;
o.h = 10e-8;
o.MaxIter = 100;
solution = solver2.Minimize(problem, o, solution.x);
if (solution.errors)
return new EstimationResult(solution.message);
Console.WriteLine("Solution:");
Console.WriteLine(solution);
string[] names = new string[] { "Alpha", "Sigma" };
//solution.x[0] *= 3;
EstimationResult result = new EstimationResult(names, solution.x);
result.ZRX = (double[])dataset.ZRMarketDates.ToArray();
result.ZRY = (double[])dataset.ZRMarket.ToArray();
return result;
}