/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.equity.capm;
import static com.opengamma.analytics.financial.timeseries.util.TimeSeriesDataTestUtils.testNotNullOrEmpty;
import static com.opengamma.analytics.financial.timeseries.util.TimeSeriesDataTestUtils.testTimeSeriesDates;
import static com.opengamma.analytics.financial.timeseries.util.TimeSeriesDataTestUtils.testTimeSeriesSize;
import org.apache.commons.lang.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.analytics.math.function.Function;
import com.opengamma.analytics.math.regression.LeastSquaresRegressionResult;
import com.opengamma.analytics.math.regression.OrdinaryLeastSquaresRegression;
import com.opengamma.timeseries.DoubleTimeSeries;
/**
*
*/
public class CAPMFromRegressionCalculator implements Function<DoubleTimeSeries<?>, LeastSquaresRegressionResult> {
private static final Logger s_logger = LoggerFactory.getLogger(CAPMFromRegressionCalculator.class);
private static final OrdinaryLeastSquaresRegression OLS = new OrdinaryLeastSquaresRegression();
/**
* @param ts The first argument is the return time series of the asset, the second is the return time series of the market.
* @return The regression result
*/
@Override
public LeastSquaresRegressionResult evaluate(final DoubleTimeSeries<?>... ts) {
Validate.notNull(ts, "ts");
final int n = ts.length;
Validate.isTrue(n > 1);
if (n > 2) {
s_logger.warn("Found more than two time series; will only use the first two");
}
final DoubleTimeSeries<?> assetTS = ts[0];
final DoubleTimeSeries<?> marketTS = ts[1];
testNotNullOrEmpty(assetTS);
testNotNullOrEmpty(marketTS);
testTimeSeriesSize(assetTS, 2);
testTimeSeriesSize(marketTS, 2);
testTimeSeriesDates(assetTS, marketTS);
final double[] asset = assetTS.valuesArrayFast();
final double[][] market = new double[asset.length][1];
for (int i = 0; i < asset.length; i++) {
market[i][0] = marketTS.getValueAtIndex(i);
}
//final double[][] market = new double[][] {marketTS.toFastLongDoubleTimeSeries().valuesArrayFast()}; //TODO change when [ANA-254] is completed
final LeastSquaresRegressionResult result = OLS.regress(market, asset, true);
return result;
}
}