/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.timeseries.model;
import org.apache.commons.lang.Validate;
import org.threeten.bp.LocalDate;
import com.opengamma.analytics.math.statistics.distribution.ProbabilityDistribution;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
/**
*
*/
public class AutoregressiveTimeSeriesModel {
private final ProbabilityDistribution<Double> _random;
public AutoregressiveTimeSeriesModel(final ProbabilityDistribution<Double> random) {
Validate.notNull(random, "random");
_random = random;
}
public LocalDateDoubleTimeSeries getSeries(final double[] phi, final int p, final LocalDate[] dates) {
Validate.notNull(phi, "phi");
if (p < 1) {
throw new IllegalArgumentException("Order must be greater than zero");
}
if (phi.length < p + 1) {
throw new IllegalArgumentException("Coefficient array must contain at least " + (p + 1) + " elements");
}
Validate.notNull(dates, "dates");
if (dates.length == 0) {
throw new IllegalArgumentException("Dates array was empty");
}
final int n = dates.length;
final double[] data = new double[n];
data[0] = phi[0] + _random.nextRandom();
double sum;
for (int i = 1; i < n; i++) {
sum = phi[0] + _random.nextRandom();
for (int j = 1; j < (i < p ? i : p + 1); j++) {
sum += phi[j] * data[i - j];
}
data[i] = sum;
}
return ImmutableLocalDateDoubleTimeSeries.of(dates, data);
}
}