public static VolatilitySurface BuildInterpol(VolatilityMatrix volMatrix, MoneynessProvider moneyness) { double[] timePillars = volMatrix.Time[volMatrix.Pillars]; var varianceSlices = EnumerableUtils.For(0, timePillars.Length, i => { double t = timePillars[i]; double[] moneynessPillars = volMatrix.Strikes.Map(k => moneyness.Moneyness(t, k)); var varianceSlice = volMatrix.Vols.Row(i).Map(v => t * v * v); return((RrFunction)SplineInterpoler.BuildCubicSpline(moneynessPillars, varianceSlice)); }); var varianceInterpol = new VarianceInterpoler(timePillars, varianceSlices); return(new VolatilitySurface(volMatrix.Time, moneyness, varianceInterpol, varianceInterpol.BuildLocalVariance())); }
public AssetMarket(AssetId asset, DateTime refDate, ITimeMeasure time, double spot, DiscountCurve riskFreeDiscount, DiscountCurve repoCurve, DividendQuote[] dividends, VolatilityMatrix volMatrix) { Time = time; Spot = spot; RiskFreeDiscount = riskFreeDiscount; RepoCurve = repoCurve; Dividends = dividends; VolMatrix = volMatrix; RefDate = refDate; Asset = asset; if (refDate != repoCurve.RefDate || refDate != time.RefDate) { throw new Exception("AssetMarket : incompatible ref date !"); } }