/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.riskreward;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.timeseries.analysis.DoubleTimeSeriesStatisticsCalculator;
import com.opengamma.analytics.math.function.Function;
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 RiskRewardCrossTest {
private static final double ASSET_STANDARD_DEVIATION = 0.24;
private static final double MARKET_STANDARD_DEVIATION = 0.17;
private static final DoubleTimeSeriesStatisticsCalculator CALCULATOR = new DoubleTimeSeriesStatisticsCalculator(new Function<double[], Double>() {
@Override
public Double evaluate(final double[]... x) {
return x[0][0];
}
});
private static final DoubleTimeSeriesStatisticsCalculator STD_ASSET = new DoubleTimeSeriesStatisticsCalculator(new Function<double[], Double>() {
@Override
public Double evaluate(final double[]... x) {
return ASSET_STANDARD_DEVIATION;
}
});
private static final DoubleTimeSeriesStatisticsCalculator STD_MARKET = new DoubleTimeSeriesStatisticsCalculator(new Function<double[], Double>() {
@Override
public Double evaluate(final double[]... x) {
return MARKET_STANDARD_DEVIATION;
}
});
private static final double PERIODS_PER_YEAR = 1;
private static final long[] T = new long[] {1};
private static final DoubleTimeSeries<?> RISK_FREE_TS = ImmutableInstantDoubleTimeSeries.of(T, new double[] {0.03});
private static final DoubleTimeSeries<?> ASSET_RETURN_TS = ImmutableInstantDoubleTimeSeries.of(T, new double[] {0.174});
private static final DoubleTimeSeries<?> MARKET_RETURN_TS = ImmutableInstantDoubleTimeSeries.of(T, new double[] {0.11});
private static final DoubleTimeSeries<?> RISK_FREE_RETURN_TS = ImmutableInstantDoubleTimeSeries.of(T, new double[] {0.03});
private static final double RISK_FREE_RETURN = 0.03;
private static final double ASSET_RETURN = 0.174;
private static final double MARKET_RETURN = 0.11;
private static final double BETA = 1.3;
private static final TotalRiskAlphaCalculator TRA = new TotalRiskAlphaCalculator(CALCULATOR, CALCULATOR, CALCULATOR, STD_ASSET, STD_MARKET);
private static final SharpeRatioCalculator SHARPE_ASSET = new SharpeRatioCalculator(PERIODS_PER_YEAR, CALCULATOR, STD_ASSET);
private static final SharpeRatioCalculator SHARPE_MARKET = new SharpeRatioCalculator(PERIODS_PER_YEAR, CALCULATOR, STD_MARKET);
private static final RiskAdjustedPerformanceCalculator RAP = new RiskAdjustedPerformanceCalculator();
private static final MTwoPerformanceCalculator M2 = new MTwoPerformanceCalculator();
private static final TreynorRatioCalculator TREYNOR = new TreynorRatioCalculator(CALCULATOR, CALCULATOR);
private static final JensenAlphaCalculator JENSEN = new JensenAlphaCalculator(CALCULATOR, CALCULATOR, CALCULATOR);
private static final MarketRiskAdjustedPerformanceCalculator MRAP = new MarketRiskAdjustedPerformanceCalculator();
private static final TTwoPerformanceCalculator T2 = new TTwoPerformanceCalculator();
private static final double EPS = 1e-15;
@Test
public void testTRAAndSharpeRatio() {
final double tra = TRA.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, MARKET_RETURN_TS);
final double srAsset = SHARPE_ASSET.evaluate(ASSET_RETURN_TS, RISK_FREE_TS);
final double srMarket = SHARPE_MARKET.evaluate(MARKET_RETURN_TS, RISK_FREE_TS);
assertEquals(tra, ASSET_STANDARD_DEVIATION * (srAsset - srMarket), EPS);
}
@Test
public void testRAPAndSharpeRatio() {
final double rap = RAP.calculate(ASSET_RETURN, RISK_FREE_RETURN, ASSET_STANDARD_DEVIATION, MARKET_STANDARD_DEVIATION);
final double srAsset = SHARPE_ASSET.evaluate(ASSET_RETURN_TS, RISK_FREE_TS);
assertEquals(rap, MARKET_STANDARD_DEVIATION * srAsset + RISK_FREE_RETURN, EPS);
}
@Test
public void testM2TRAAndSharpeRatio() {
final double tra = TRA.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, MARKET_RETURN_TS);
final double srAsset = SHARPE_ASSET.evaluate(ASSET_RETURN_TS, RISK_FREE_TS);
final double srMarket = SHARPE_MARKET.evaluate(MARKET_RETURN_TS, RISK_FREE_TS);
final double m2 = M2.calculate(ASSET_RETURN, RISK_FREE_RETURN, MARKET_RETURN, ASSET_STANDARD_DEVIATION, MARKET_STANDARD_DEVIATION);
assertEquals(m2, tra * MARKET_STANDARD_DEVIATION / ASSET_STANDARD_DEVIATION, EPS);
assertEquals(m2, MARKET_STANDARD_DEVIATION * (srAsset - srMarket), EPS);
}
@Test
public void testJensenAndTreynor() {
final double ja = JENSEN.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, BETA, MARKET_RETURN_TS);
final double trAsset = TREYNOR.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, BETA);
final double trMarket = TREYNOR.evaluate(MARKET_RETURN_TS, RISK_FREE_RETURN_TS, 1);
assertEquals(trAsset, ja / BETA + trMarket, EPS);
}
@Test
public void testMRAPAndTreynor() {
final double mrap = MRAP.calculate(ASSET_RETURN, RISK_FREE_RETURN, BETA);
final double trAsset = TREYNOR.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, BETA);
assertEquals(mrap, trAsset + RISK_FREE_RETURN, EPS);
}
@Test
public void testT2AndJensen() {
final double ja = JENSEN.evaluate(ASSET_RETURN_TS, RISK_FREE_RETURN_TS, BETA, MARKET_RETURN_TS);
final double t2 = T2.calculate(ASSET_RETURN, RISK_FREE_RETURN, MARKET_RETURN, BETA);
assertEquals(t2, ja / BETA, EPS);
}
}