/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.option.pricing.tree;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public class CashDividendFunctionProvider extends DividendFunctionProvider {
/**
* @param dividendTimes The dividend times
* @param dividends The cash dividends
*/
public CashDividendFunctionProvider(final double[] dividendTimes, final double[] dividends) {
super(dividendTimes, dividends);
}
@Override
public double spotModifier(final double spot, final double interestRate) {
double res = spot;
final double[] dividendTimes = getDividendTimes();
final double[] dividends = getDividends();
final int nDiv = dividends.length;
for (int i = 0; i < nDiv; ++i) {
res -= dividends[i] * Math.exp(-interestRate * dividendTimes[i]);
}
ArgumentChecker.isTrue(res > 0., "Dividends are too large");
return res;
}
@Override
public double dividendCorrections(final double sumDiscountDiv, final double interestRate, final double offset, final int k) {
final double dividendTime = getDividendTimes()[k];
final double dividend = getDividends()[k];
final double res = sumDiscountDiv + dividend * Math.exp(-interestRate * (dividendTime - offset));
return res;
}
@Override
public double[] getAssetPricesForDelta(final double assetPriceBase, final double interestRate, final int[] divSteps, final double upFactor, final double downFactor, final double sumDiscountDiv) {
final double[] res = new double[2];
res[0] = assetPriceBase * downFactor + sumDiscountDiv;
res[1] = assetPriceBase * upFactor + sumDiscountDiv;
return res;
}
@Override
public double[] getAssetPricesForGamma(final double assetPriceBase, final double interestRate, final int[] divSteps, final double upFactor, final double downFactor, final double sumDiscountDiv) {
final double[] res = new double[3];
res[0] = assetPriceBase * downFactor * downFactor + sumDiscountDiv;
res[1] = assetPriceBase * upFactor * downFactor + sumDiscountDiv;
res[2] = assetPriceBase * upFactor * upFactor + sumDiscountDiv;
return res;
}
@Override
public double[] getAssetPricesForDelta(final double assetPriceBase, final double interestRate, final int[] divSteps, final double upFactor, final double middleFactor, final double downFactor,
final double sumDiscountDiv) {
final double[] res = new double[3];
res[0] = assetPriceBase * downFactor + sumDiscountDiv;
res[1] = assetPriceBase * middleFactor + sumDiscountDiv;
res[2] = assetPriceBase * upFactor + sumDiscountDiv;
return res;
}
@Override
public double[] getAssetPricesForGamma(final double assetPriceBase, final double interestRate, final int[] divSteps, final double upFactor, final double middleFactor, final double downFactor,
final double sumDiscountDiv) {
final double[] res = new double[5];
final double up = assetPriceBase * upFactor;
final double down = assetPriceBase * downFactor;
res[0] = down * downFactor + sumDiscountDiv;
res[1] = down * middleFactor + sumDiscountDiv;
res[2] = down * upFactor + sumDiscountDiv;
res[3] = up * middleFactor + sumDiscountDiv;
res[4] = up * upFactor + sumDiscountDiv;
return res;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof CashDividendFunctionProvider)) {
return false;
}
return super.equals(obj);
}
}