All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opengamma.strata.pricer.impl.volatility.smile.SsviFormulaData Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.pricer.impl.volatility.smile;

import java.io.Serializable;
import java.lang.invoke.MethodHandles;

import org.joda.beans.ImmutableBean;
import org.joda.beans.JodaBeanUtils;
import org.joda.beans.MetaBean;
import org.joda.beans.TypedMetaBean;
import org.joda.beans.gen.BeanDefinition;
import org.joda.beans.gen.ImmutableValidator;
import org.joda.beans.gen.PropertyDefinition;
import org.joda.beans.impl.light.LightMetaBean;

import com.opengamma.strata.collect.ArgChecker;
import com.opengamma.strata.collect.array.DoubleArray;

/**
 * The data bundle for SSVI smile formula.
 * 

* The bundle contains the SSVI model parameters, ATM volatility, rho and eta. */ @BeanDefinition(style = "light") public final class SsviFormulaData implements SmileModelData, ImmutableBean, Serializable { /** * The number of model parameters. */ private static final int NUM_PARAMETERS = 3; /** * The model parameters. *

* This must be an array of length 3. * The parameters in the array are in the order of sigma (ATM volatility), rho and eta. * The constraints for the parameters are defined in {@link #isAllowed(int, double)}. */ @PropertyDefinition(validate = "notNull") private final DoubleArray parameters; //------------------------------------------------------------------------- /** * Obtains an instance of the SSVI formula data. * * @param sigma the sigma parameter, ATM volatility * @param rho the rho parameter * @param eta the eta parameter * @return the instance */ public static SsviFormulaData of(double sigma, double rho, double eta) { return new SsviFormulaData(DoubleArray.of(sigma, rho, eta)); } /** * Obtains an instance of the SSVI formula data. *

* The parameters in the input array should be in the order of sigma (ATM volatility), rho and eta. * * @param parameters the parameters * @return the instance */ public static SsviFormulaData of(double[] parameters) { ArgChecker.notNull(parameters, "parameters"); ArgChecker.isTrue(parameters.length == NUM_PARAMETERS, "the number of parameters should be 3"); return new SsviFormulaData(DoubleArray.copyOf(parameters)); } @ImmutableValidator private void validate() { for (int i = 0; i < NUM_PARAMETERS; ++i) { ArgChecker.isTrue(isAllowed(i, parameters.get(i)), "the {}-th parameter is not allowed", i); } } //------------------------------------------------------------------------- /** * Gets the sigma parameter. * * @return the sigma parameter */ public double getSigma() { return parameters.get(0); } /** * Gets the rho parameter. * * @return the rho parameter */ public double getRho() { return parameters.get(1); } /** * Gets the eta parameters. * * @return the eta parameter */ public double getEta() { return parameters.get(2); } //------------------------------------------------------------------------- /** * Returns a copy of this instance with sigma replaced. * * @param sigma the new sigma * @return the new data instance */ public SsviFormulaData withSigma(double sigma) { return of(sigma, getRho(), getEta()); } /** * Returns a copy of this instance with rho replaced. * * @param rho the new rho * @return the new data instance */ public SsviFormulaData withRho(double rho) { return of(getSigma(), rho, getEta()); } /** * Returns a copy of this instance with eta replaced. * * @param eta the new eta * @return the new data instance */ public SsviFormulaData withEta(double eta) { return of(getSigma(), getRho(), eta); } //------------------------------------------------------------------------- @Override public int getNumberOfParameters() { return NUM_PARAMETERS; } @Override public double getParameter(int index) { ArgChecker.inRangeExclusive(index, -1, NUM_PARAMETERS, "index"); return parameters.get(index); } @Override public boolean isAllowed(int index, double value) { switch (index) { case 0: return value > 0; case 1: return value >= -1 && value <= 1; case 2: return value > 0; default: throw new IllegalArgumentException("index " + index + " outside range"); } } @Override public SsviFormulaData with(int index, double value) { ArgChecker.inRange(index, 0, NUM_PARAMETERS, "index"); double[] paramsCp = parameters.toArray(); paramsCp[index] = value; return of(paramsCp); } //------------------------- AUTOGENERATED START ------------------------- /** * The meta-bean for {@code SsviFormulaData}. */ private static final TypedMetaBean META_BEAN = LightMetaBean.of( SsviFormulaData.class, MethodHandles.lookup(), new String[] { "parameters"}, new Object[0]); /** * The meta-bean for {@code SsviFormulaData}. * @return the meta-bean, not null */ public static TypedMetaBean meta() { return META_BEAN; } static { MetaBean.register(META_BEAN); } /** * The serialization version id. */ private static final long serialVersionUID = 1L; private SsviFormulaData( DoubleArray parameters) { JodaBeanUtils.notNull(parameters, "parameters"); this.parameters = parameters; validate(); } @Override public TypedMetaBean metaBean() { return META_BEAN; } //----------------------------------------------------------------------- /** * Gets the model parameters. *

* This must be an array of length 3. * The parameters in the array are in the order of sigma (ATM volatility), rho and eta. * The constraints for the parameters are defined in {@link #isAllowed(int, double)}. * @return the value of the property, not null */ public DoubleArray getParameters() { return parameters; } //----------------------------------------------------------------------- @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj.getClass() == this.getClass()) { SsviFormulaData other = (SsviFormulaData) obj; return JodaBeanUtils.equal(parameters, other.parameters); } return false; } @Override public int hashCode() { int hash = getClass().hashCode(); hash = hash * 31 + JodaBeanUtils.hashCode(parameters); return hash; } @Override public String toString() { StringBuilder buf = new StringBuilder(64); buf.append("SsviFormulaData{"); buf.append("parameters").append('=').append(JodaBeanUtils.toString(parameters)); buf.append('}'); return buf.toString(); } //-------------------------- AUTOGENERATED END -------------------------- }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy