/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.option;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.Validate;
import org.threeten.bp.LocalDate;
import com.opengamma.analytics.financial.timeseries.analysis.DoubleTimeSeriesStatisticsCalculator;
import com.opengamma.analytics.financial.timeseries.returns.TimeSeriesReturnCalculator;
import com.opengamma.analytics.financial.timeseries.returns.TimeSeriesReturnCalculatorFactory;
import com.opengamma.analytics.math.statistics.descriptive.StatisticsCalculatorFactory;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.function.AbstractFunction;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.FunctionExecutionContext;
import com.opengamma.engine.function.FunctionInputs;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.financial.OpenGammaCompilationContext;
import com.opengamma.financial.analytics.timeseries.DateConstraint;
import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesFunctionUtils;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver;
import com.opengamma.timeseries.DoubleTimeSeries;
/**
*
*
*/
@Deprecated
public class HistoricalSkewKurtosisFunction extends AbstractFunction.NonCompiledInvoker {
private final TimeSeriesReturnCalculator _returnCalculator;
private final DoubleTimeSeriesStatisticsCalculator _skewCalculator;
private final DoubleTimeSeriesStatisticsCalculator _kurtosisCalculator;
private final boolean _isPearson;
private final LocalDate _startDate;
private final String _dataSource;
private final String _dataProvider;
private final String _field;
public HistoricalSkewKurtosisFunction(final String returnCalculatorName, final String skewCalculatorName, final String kurtosisCalculatorName, final String isPearson, final String startDate,
final String dataSource, final String dataProvider, final String field) {
Validate.notNull(returnCalculatorName, "return calculator name");
Validate.notNull(skewCalculatorName, "skew calculator name");
Validate.notNull(kurtosisCalculatorName, "kurtosis calculator name");
Validate.notNull(startDate, "start date");
Validate.notNull(dataSource, "data source");
Validate.notNull(field, "field");
_returnCalculator = TimeSeriesReturnCalculatorFactory.getReturnCalculator(returnCalculatorName);
_skewCalculator = new DoubleTimeSeriesStatisticsCalculator(StatisticsCalculatorFactory.getCalculator(skewCalculatorName));
_kurtosisCalculator = new DoubleTimeSeriesStatisticsCalculator(StatisticsCalculatorFactory.getCalculator(kurtosisCalculatorName));
_isPearson = Boolean.parseBoolean(isPearson);
_startDate = LocalDate.parse(startDate);
_dataSource = dataSource;
_dataProvider = dataProvider;
_field = field;
}
@Override
public Set<ComputedValue> execute(final FunctionExecutionContext executionContext, final FunctionInputs inputs, final ComputationTarget target, final Set<ValueRequirement> desiredValues) {
final HistoricalTimeSeries tsObject = (HistoricalTimeSeries) inputs.getValue(ValueRequirementNames.HISTORICAL_TIME_SERIES);
final DoubleTimeSeries<?> returnTS = _returnCalculator.evaluate(tsObject.getTimeSeries());
final double skew = _skewCalculator.evaluate(returnTS);
final double kurtosis = _kurtosisCalculator.evaluate(returnTS);
double pearson, fisher;
if (_isPearson) {
pearson = kurtosis;
fisher = kurtosis - 3;
} else {
fisher = kurtosis;
pearson = fisher + 3;
}
final Set<ComputedValue> results = new HashSet<ComputedValue>();
results.add(new ComputedValue(new ValueSpecification(ValueRequirementNames.SKEW, target.toSpecification(), createValueProperties().get()), skew));
results.add(new ComputedValue(new ValueSpecification(ValueRequirementNames.PEARSON_KURTOSIS, target.toSpecification(), createValueProperties().get()), pearson));
results.add(new ComputedValue(new ValueSpecification(ValueRequirementNames.FISHER_KURTOSIS, target.toSpecification(), createValueProperties().get()), fisher));
return results;
}
@Override
public String getShortName() {
return "HistoricalSkewKurtosisFunction";
}
@Override
public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) {
final HistoricalTimeSeriesResolver resolver = OpenGammaCompilationContext.getHistoricalTimeSeriesResolver(context);
final HistoricalTimeSeriesResolutionResult timeSeries = resolver.resolve(target.getSecurity().getExternalIdBundle(), null, _dataSource, _dataProvider, _field, null);
if (timeSeries == null) {
return null;
}
return Collections.singleton(HistoricalTimeSeriesFunctionUtils.createHTSRequirement(timeSeries, _field, DateConstraint.of(_startDate), true, DateConstraint.VALUATION_TIME, true));
}
@Override
public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) {
final Set<ValueSpecification> results = new HashSet<ValueSpecification>();
final ComputationTargetSpecification targetSpec = target.toSpecification();
final ValueProperties properties = createValueProperties().get();
results.add(new ValueSpecification(ValueRequirementNames.SKEW, targetSpec, properties));
results.add(new ValueSpecification(ValueRequirementNames.PEARSON_KURTOSIS, targetSpec, properties));
results.add(new ValueSpecification(ValueRequirementNames.FISHER_KURTOSIS, targetSpec, properties));
return results;
}
@Override
public ComputationTargetType getTargetType() {
return ComputationTargetType.SECURITY;
}
}