public LiborForwardModel(LiborForwardModelProcess process, LmVolatilityModel volaModel, LmCorrelationModel corrModel) : base(volaModel.parameters().Count() + corrModel.parameters().Count()) { f_ = new InitializedList<double>(process.size()); accrualPeriod_ = new InitializedList<double>(process.size()); covarProxy_=new LfmCovarianceProxy(volaModel, corrModel); process_=process; /*copy(volaModel.parameters().begin(), volaModel.parameters().end(), arguments_.begin()); copy(corrModel.parameters().begin(), corrModel.parameters().end(), arguments_.begin()+k);*/ int k=volaModel.parameters().Count; for (int j = 0; j < k; j++) arguments_[j] = volaModel.parameters()[j]; for (int j = 0; j < corrModel.parameters().Count; j++) arguments_[j+k] = corrModel.parameters()[j]; for (int i=0; i < process.size(); ++i) { accrualPeriod_[i] = process.accrualEndTimes()[i] - process.accrualStartTimes()[i]; f_[i] = 1.0/(1.0+accrualPeriod_[i]*process_.initialValues()[i]); } }
public VarProxy_Helper(LfmCovarianceProxy proxy, int i, int j) { i_=i; j_=j; volaModel_=proxy.volaModel_; corrModel_=proxy.corrModel_; }
public void testSimpleCovarianceModels() { //"Testing simple covariance models..."; //SavedSettings backup; const int size = 10; const double tolerance = 1e-14; int i; LmCorrelationModel corrModel=new LmExponentialCorrelationModel(size, 0.1); Matrix recon = corrModel.correlation(0.0,null) - corrModel.pseudoSqrt(0.0,null)*Matrix.transpose(corrModel.pseudoSqrt(0.0,null)); for (i=0; i<size; ++i) { for (int j=0; j<size; ++j) { if (Math.Abs(recon[i,j]) > tolerance) Assert.Fail("Failed to reproduce correlation matrix" + "\n calculated: " + recon[i,j] + "\n expected: " + 0); } } List<double> fixingTimes=new InitializedList<double>(size); for (i=0; i<size; ++i) { fixingTimes[i] = 0.5*i; } const double a=0.2; const double b=0.1; const double c=2.1; const double d=0.3; LmVolatilityModel volaModel=new LmLinearExponentialVolatilityModel(fixingTimes, a, b, c, d); LfmCovarianceProxy covarProxy=new LfmCovarianceProxy(volaModel, corrModel); LiborForwardModelProcess process=new LiborForwardModelProcess(size, makeIndex()); LiborForwardModel liborModel=new LiborForwardModel(process, volaModel, corrModel); for (double t=0; t<4.6; t+=0.31) { recon = covarProxy.covariance(t,null) - covarProxy.diffusion(t,null)*Matrix.transpose(covarProxy.diffusion(t,null)); for (int k=0; k<size; ++k) { for (int j=0; j<size; ++j) { if (Math.Abs(recon[k,j]) > tolerance) Assert.Fail("Failed to reproduce correlation matrix" + "\n calculated: " + recon[k,j] + "\n expected: " + 0); } } Vector volatility = volaModel.volatility(t,null); for (int k=0; k<size; ++k) { double expected = 0; if (k>2*t) { double T = fixingTimes[k]; expected=(a*(T-t)+d)*Math.Exp(-b*(T-t)) + c; } if (Math.Abs(expected - volatility[k]) > tolerance) Assert.Fail("Failed to reproduce volatities" + "\n calculated: " + volatility[k] + "\n expected: " + expected); } } }