com.opengamma.analytics.financial.model.volatility.smile.function.SABRFormulaData.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.financial.model.volatility.smile.function.SABRFormulaData.java

Source

/**
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.analytics.financial.model.volatility.smile.function;

import java.util.Arrays;

import org.apache.commons.lang.Validate;

/**
 * 
 */
public class SABRFormulaData implements SmileModelData {

    private static final int NUM_PARAMETERS = 4;
    private final double[] _parameters;

    /**
     * 
     * @param parameters Must be 4 parameters in the order alpha, beta, rho, nu
     */
    public SABRFormulaData(final double[] parameters) {
        Validate.notNull(parameters, "parameters are null");
        Validate.isTrue(parameters.length == NUM_PARAMETERS, "must be " + NUM_PARAMETERS + " parameters");
        Validate.isTrue(parameters[0] >= 0.0, "alpha must be >= 0.0");
        Validate.isTrue(parameters[1] >= 0.0, "beta must be >= 0.0");
        Validate.isTrue(parameters[2] >= -1 && parameters[2] <= 1, "rho must be between -1 and 1");
        Validate.isTrue(parameters[3] >= 0.0, "nu must be >= 0.0");

        _parameters = new double[NUM_PARAMETERS];
        System.arraycopy(parameters, 0, _parameters, 0, NUM_PARAMETERS);
    }

    @Override
    public boolean isAllowed(final int index, final double value) {
        switch (index) {
        case 0:
        case 1:
        case 3:
            return value >= 0;
        case 2:
            return value >= -1 && value <= 1;
        case 4:
            return true;
        default:
            throw new IllegalArgumentException("index " + index + " outside range");
        }
    }

    /**
     * 
     * @param alpha The initial value of the stochastic volatility
     * @param beta The CEV parameter
     * @param rho The correlation between the driver of the underlying and the driver of the stochastic volatility
     * @param nu The vol-of-vol
     */
    public SABRFormulaData(final double alpha, final double beta, final double rho, final double nu) {
        this(new double[] { alpha, beta, rho, nu });
    }

    public double getNu() {
        return _parameters[3];
    }

    public double getRho() {
        return _parameters[2];
    }

    public double getBeta() {
        return _parameters[1];
    }

    public double getAlpha() {
        return _parameters[0];
    }

    public SABRFormulaData withAlpha(final double alpha) {

        return new SABRFormulaData(alpha, getBeta(), getRho(), getNu());
    }

    public SABRFormulaData withBeta(final double beta) {
        return new SABRFormulaData(getAlpha(), beta, getRho(), getNu());
    }

    public SABRFormulaData withRho(final double rho) {
        return new SABRFormulaData(getAlpha(), getBeta(), rho, getNu());
    }

    public SABRFormulaData withNu(final double nu) {
        return new SABRFormulaData(getAlpha(), getBeta(), getRho(), nu);
    }

    @Override
    public int getNumberOfParameters() {
        return NUM_PARAMETERS;
    }

    @Override
    public double getParameter(final int index) {
        return _parameters[index];
    }

    @Override
    public SmileModelData with(final int index, final double value) {
        final double[] temp = new double[NUM_PARAMETERS];
        System.arraycopy(_parameters, 0, temp, 0, NUM_PARAMETERS);
        temp[index] = value;
        return new SABRFormulaData(temp);
    }

    @Override
    public String toString() {
        return "SABRFormulaData [alpha=" + getAlpha() + ", beta=" + getBeta() + ", rho=" + getRho() + ", nu="
                + getNu() + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(_parameters);
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final SABRFormulaData other = (SABRFormulaData) obj;
        if (!Arrays.equals(_parameters, other._parameters)) {
            return false;
        }
        return true;
    }

}