/** * 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; import com.opengamma.util.ArgumentChecker; /** * */ public class MovingAverageTimeSeriesModel { private final ProbabilityDistribution<Double> _random; public MovingAverageTimeSeriesModel(final ProbabilityDistribution<Double> random) { Validate.notNull(random, "random"); _random = random; } public LocalDateDoubleTimeSeries getSeries(final double[] theta, final int q, final LocalDate[] dates) { Validate.notNull(theta, "theta"); if (q < 1) { throw new IllegalArgumentException("Order must be greater than zero"); } if (theta.length < q) { throw new IllegalArgumentException("Coefficient array must contain at least " + q + " elements"); } Validate.notNull(dates, "dates"); ArgumentChecker.notEmpty(dates, "dates"); final int n = dates.length; final double[] z = new double[n]; for (int i = 0; i < n; i++) { z[i] = _random.nextRandom(); } final double[] data = new double[n]; data[0] = theta[0]; double sum; for (int i = 1; i < n; i++) { sum = theta[0] + z[i]; for (int j = 1; j < (i < q ? i : q + 1); j++) { sum += z[i - j] * theta[j]; } data[i] = sum; } return ImmutableLocalDateDoubleTimeSeries.of(dates, data); } }