/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.curve;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.Period;
import java.util.Set;
import org.joda.beans.BeanDefinition;
import org.joda.beans.ImmutableBean;
import org.joda.beans.JodaBeanUtils;
import org.joda.beans.MetaBean;
import org.joda.beans.Property;
import org.joda.beans.PropertyDefinition;
import org.joda.beans.impl.light.LightMetaBean;
import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.date.HolidayCalendars;
import com.opengamma.strata.basics.index.IborIndex;
import com.opengamma.strata.data.MarketData;
import com.opengamma.strata.data.ObservableId;
import com.opengamma.strata.market.ValueType;
import com.opengamma.strata.market.param.DatedParameterMetadata;
import com.opengamma.strata.market.param.LabelDateParameterMetadata;
/**
* Dummy curve node.
* Based on a FRA.
*/
@BeanDefinition(style = "light")
public final class DummyFraCurveNode
implements CurveNode, ImmutableBean, Serializable {
@PropertyDefinition(validate = "notNull")
private final Period periodToStart;
@PropertyDefinition(validate = "notNull")
private final Period periodToEnd;
@PropertyDefinition(validate = "notNull")
private final ObservableId rateId;
@PropertyDefinition
private final double spread;
@PropertyDefinition(validate = "notEmpty", overrideGet = true)
private final String label;
@PropertyDefinition(validate = "notNull")
private final CurveNodeDateOrder order;
//-------------------------------------------------------------------------
public static DummyFraCurveNode of(Period periodToStart, IborIndex index, ObservableId rateId) {
return new DummyFraCurveNode(
periodToStart,
periodToStart.plus(index.getTenor().getPeriod()),
rateId,
0,
"Dummy:" + periodToStart,
CurveNodeDateOrder.DEFAULT);
}
public static DummyFraCurveNode of(Period periodToStart, IborIndex index, ObservableId rateId, double spread) {
return new DummyFraCurveNode(
periodToStart,
periodToStart.plus(index.getTenor().getPeriod()),
rateId,
spread,
"Dummy:" + periodToStart,
CurveNodeDateOrder.DEFAULT);
}
public static DummyFraCurveNode of(Period periodToStart, IborIndex index, ObservableId rateId, CurveNodeDateOrder order) {
return new DummyFraCurveNode(
periodToStart,
periodToStart.plus(index.getTenor().getPeriod()),
rateId,
0,
"Dummy:" + periodToStart,
order);
}
//-------------------------------------------------------------------------
@Override
public Set<ObservableId> requirements() {
return ImmutableSet.of(rateId);
}
@Override
public LocalDate date(LocalDate valuationDate, ReferenceData refData) {
return HolidayCalendars.SAT_SUN.nextOrSame(valuationDate.plus(periodToEnd));
}
@Override
public DatedParameterMetadata metadata(LocalDate valuationDate, ReferenceData refData) {
return LabelDateParameterMetadata.of(
HolidayCalendars.SAT_SUN.nextOrSame(valuationDate.plus(periodToEnd)), periodToEnd.toString());
}
@Override
public DummyFraTrade trade(double quantity, MarketData marketData, ReferenceData refData) {
double fixedRate = marketData.getValue(rateId) + spread;
return DummyFraTrade.of(marketData.getValuationDate(), fixedRate);
}
@Override
public DummyFraTrade resolvedTrade(double quantity, MarketData marketData, ReferenceData refData) {
return trade(quantity, marketData, refData);
}
@Override
public double initialGuess(MarketData marketData, ValueType valueType) {
if (ValueType.ZERO_RATE.equals(valueType)) {
return marketData.getValue(rateId);
}
return 0d;
}
@Override
public CurveNodeDateOrder getDateOrder() {
return order;
}
//------------------------- AUTOGENERATED START -------------------------
///CLOVER:OFF
/**
* The meta-bean for {@code DummyFraCurveNode}.
*/
private static MetaBean META_BEAN = LightMetaBean.of(DummyFraCurveNode.class);
/**
* The meta-bean for {@code DummyFraCurveNode}.
* @return the meta-bean, not null
*/
public static MetaBean meta() {
return META_BEAN;
}
static {
JodaBeanUtils.registerMetaBean(META_BEAN);
}
/**
* The serialization version id.
*/
private static final long serialVersionUID = 1L;
private DummyFraCurveNode(
Period periodToStart,
Period periodToEnd,
ObservableId rateId,
double spread,
String label,
CurveNodeDateOrder order) {
JodaBeanUtils.notNull(periodToStart, "periodToStart");
JodaBeanUtils.notNull(periodToEnd, "periodToEnd");
JodaBeanUtils.notNull(rateId, "rateId");
JodaBeanUtils.notEmpty(label, "label");
JodaBeanUtils.notNull(order, "order");
this.periodToStart = periodToStart;
this.periodToEnd = periodToEnd;
this.rateId = rateId;
this.spread = spread;
this.label = label;
this.order = order;
}
@Override
public MetaBean metaBean() {
return META_BEAN;
}
@Override
public <R> Property<R> property(String propertyName) {
return metaBean().<R>metaProperty(propertyName).createProperty(this);
}
@Override
public Set<String> propertyNames() {
return metaBean().metaPropertyMap().keySet();
}
//-----------------------------------------------------------------------
/**
* Gets the periodToStart.
* @return the value of the property, not null
*/
public Period getPeriodToStart() {
return periodToStart;
}
//-----------------------------------------------------------------------
/**
* Gets the periodToEnd.
* @return the value of the property, not null
*/
public Period getPeriodToEnd() {
return periodToEnd;
}
//-----------------------------------------------------------------------
/**
* Gets the rateId.
* @return the value of the property, not null
*/
public ObservableId getRateId() {
return rateId;
}
//-----------------------------------------------------------------------
/**
* Gets the spread.
* @return the value of the property
*/
public double getSpread() {
return spread;
}
//-----------------------------------------------------------------------
/**
* Gets the label.
* @return the value of the property, not empty
*/
@Override
public String getLabel() {
return label;
}
//-----------------------------------------------------------------------
/**
* Gets the order.
* @return the value of the property, not null
*/
public CurveNodeDateOrder getOrder() {
return order;
}
//-----------------------------------------------------------------------
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj != null && obj.getClass() == this.getClass()) {
DummyFraCurveNode other = (DummyFraCurveNode) obj;
return JodaBeanUtils.equal(periodToStart, other.periodToStart) &&
JodaBeanUtils.equal(periodToEnd, other.periodToEnd) &&
JodaBeanUtils.equal(rateId, other.rateId) &&
JodaBeanUtils.equal(spread, other.spread) &&
JodaBeanUtils.equal(label, other.label) &&
JodaBeanUtils.equal(order, other.order);
}
return false;
}
@Override
public int hashCode() {
int hash = getClass().hashCode();
hash = hash * 31 + JodaBeanUtils.hashCode(periodToStart);
hash = hash * 31 + JodaBeanUtils.hashCode(periodToEnd);
hash = hash * 31 + JodaBeanUtils.hashCode(rateId);
hash = hash * 31 + JodaBeanUtils.hashCode(spread);
hash = hash * 31 + JodaBeanUtils.hashCode(label);
hash = hash * 31 + JodaBeanUtils.hashCode(order);
return hash;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder(224);
buf.append("DummyFraCurveNode{");
buf.append("periodToStart").append('=').append(periodToStart).append(',').append(' ');
buf.append("periodToEnd").append('=').append(periodToEnd).append(',').append(' ');
buf.append("rateId").append('=').append(rateId).append(',').append(' ');
buf.append("spread").append('=').append(spread).append(',').append(' ');
buf.append("label").append('=').append(label).append(',').append(' ');
buf.append("order").append('=').append(JodaBeanUtils.toString(order));
buf.append('}');
return buf.toString();
}
///CLOVER:ON
//-------------------------- AUTOGENERATED END --------------------------
}