/**
* 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 org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.function.Function;
import com.opengamma.analytics.math.regression.LeastSquaresRegressionResult;
import com.opengamma.timeseries.DoubleTimeSeries;
import com.opengamma.timeseries.precise.instant.ImmutableInstantDoubleTimeSeries;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class CAPMFromRegressionCalculatorTest {
private static final DoubleTimeSeries<?> MARKET;
private static final DoubleTimeSeries<?> ASSET_1;
private static final DoubleTimeSeries<?> ASSET_2;
private static final DoubleTimeSeries<?> ASSET_3;
private static final DoubleTimeSeries<?> ASSET_4;
private static final DoubleTimeSeries<?> ASSET_5;
private static final double BETA1 = 2;
private static final double BETA2 = -0.5;
private static final double ALPHA1 = 0.05;
private static final double ALPHA2 = -0.3;
private static final double RF = 0.05;
private static final double EPS = 1e-12;
private static final Function<DoubleTimeSeries<?>, LeastSquaresRegressionResult> CAPM = new CAPMFromRegressionCalculator();
static {
final int n = 1000;
final long[] t = new long[n];
final double[] market = new double[n];
final double[] asset1 = new double[n];
final double[] asset2 = new double[n];
final double[] asset3 = new double[n];
final double[] asset4 = new double[n];
final double[] asset5 = new double[n];
for (int i = 0; i < n; i++) {
market[i] = Math.random() - 0.5;
asset1[i] = market[i] * BETA1;
asset2[i] = market[i] * BETA2;
asset3[i] = RF;
asset4[i] = asset1[i] + ALPHA1;
asset5[i] = asset2[i] + ALPHA2;
}
MARKET = ImmutableInstantDoubleTimeSeries.of(t, market);
ASSET_1 = ImmutableInstantDoubleTimeSeries.of(t, asset1);
ASSET_2 = ImmutableInstantDoubleTimeSeries.of(t, asset2);
ASSET_3 = ImmutableInstantDoubleTimeSeries.of(t, asset3);
ASSET_4 = ImmutableInstantDoubleTimeSeries.of(t, asset4);
ASSET_5 = ImmutableInstantDoubleTimeSeries.of(t, asset5);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullData() {
CAPM.evaluate((DoubleTimeSeries<?>[]) null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNoMarketData() {
CAPM.evaluate(ASSET_1);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testInsufficientData() {
CAPM.evaluate(ImmutableInstantDoubleTimeSeries.EMPTY_SERIES, ImmutableInstantDoubleTimeSeries.EMPTY_SERIES);
}
@Test
public void testBetas() {
double[] betas = CAPM.evaluate(MARKET, MARKET).getBetas();
assertEquals(betas[0], 0, EPS);
assertEquals(betas[1], 1, EPS);
betas = CAPM.evaluate(ASSET_1, MARKET).getBetas();
assertEquals(betas[0], 0, EPS);
assertEquals(betas[1], BETA1, EPS);
betas = CAPM.evaluate(ASSET_2, MARKET).getBetas();
assertEquals(betas[0], 0, EPS);
assertEquals(betas[1], BETA2, EPS);
betas = CAPM.evaluate(ASSET_3, MARKET).getBetas();
assertEquals(betas[0], RF, EPS);
assertEquals(betas[1], 0, EPS);
betas = CAPM.evaluate(ASSET_4, MARKET).getBetas();
assertEquals(betas[0], ALPHA1, EPS);
assertEquals(betas[1], BETA1, EPS);
betas = CAPM.evaluate(ASSET_5, MARKET).getBetas();
assertEquals(betas[0], ALPHA2, EPS);
assertEquals(betas[1], BETA2, EPS);
}
}