/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.interestrate;
import org.apache.commons.lang.Validate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.model.interestrate.definition.VasicekDataBundle;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.util.time.DateUtils;
/**
*
*/
public class VasicekInterestRateModel implements DiscountBondModel<VasicekDataBundle> {
@Override
public Function1D<VasicekDataBundle, Double> getDiscountBondFunction(final ZonedDateTime time, final ZonedDateTime maturity) {
Validate.notNull(time);
Validate.notNull(maturity);
return new Function1D<VasicekDataBundle, Double>() {
@Override
public Double evaluate(final VasicekDataBundle data) {
Validate.notNull(data);
final double lt = data.getLongTermInterestRate();
final double speed = data.getReversionSpeed();
final double dt = DateUtils.getDifferenceInYears(time, maturity);
final double t = DateUtils.getDifferenceInYears(data.getDate(), time);
final double sigma = data.getShortRateVolatility(t);
final double r = data.getShortRate(t);
final double sigmaSq = sigma * sigma;
final double speedSq = speed * speed;
final double rInfinity = lt - 0.5 * sigmaSq / speedSq;
final double factor = 1 - Math.exp(-speed * dt);
final double a = rInfinity * (factor / speed - dt) - sigmaSq * factor * factor / (4 * speedSq * speed);
final double b = factor / speed;
return Math.exp(a - r * b);
}
};
}
}