/**
* 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 org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.timeseries.analysis.DoubleTimeSeriesStatisticsCalculator;
import com.opengamma.timeseries.DoubleTimeSeries;
/**
* The total risk alpha measures the performance of an asset by comparing its
* returns with those of a benchmark portfolio. The benchmark portfolio
* represents the market risk matched to the total risk of the fund.
* <p>
* The total risk alpha is given by:
* $$
* \begin{eqnarray*}
* TRA_i = R_i - \left(R_f + \frac{\mu_M - R_f}{\sigma_M}\sigma_i\right)
* \end{eqnarray*}
* $$
* where $R_i$ is the asset return, $R_f$ is the risk-free return, $\mu_M$ is
* the market return, $\sigma_M$ is the standard deviation of market returns
* and $\sigma_i$ is the standard deviation of the asset returns.
*/
public class TotalRiskAlphaCalculator {
private final DoubleTimeSeriesStatisticsCalculator _expectedAssetReturnCalculator;
private final DoubleTimeSeriesStatisticsCalculator _expectedRiskFreeReturnCalculator;
private final DoubleTimeSeriesStatisticsCalculator _expectedMarketReturnCalculator;
private final DoubleTimeSeriesStatisticsCalculator _marketStandardDeviationCalculator;
private final DoubleTimeSeriesStatisticsCalculator _assetStandardDeviationCalculator;
public TotalRiskAlphaCalculator(final DoubleTimeSeriesStatisticsCalculator expectedAssetReturnCalculator,
final DoubleTimeSeriesStatisticsCalculator expectedRiskFreeReturnCalculator, final DoubleTimeSeriesStatisticsCalculator expectedMarketReturnCalculator,
final DoubleTimeSeriesStatisticsCalculator assetStandardDeviationCalculator, final DoubleTimeSeriesStatisticsCalculator marketStandardDeviationCalculator) {
Validate.notNull(expectedAssetReturnCalculator, "expected asset return calculator");
Validate.notNull(expectedRiskFreeReturnCalculator, "expected risk-free return calculator");
Validate.notNull(expectedMarketReturnCalculator, "expected market return calculator");
Validate.notNull(assetStandardDeviationCalculator, "asset standard deviation calculator");
Validate.notNull(marketStandardDeviationCalculator, "market standard deviation calculator");
_expectedAssetReturnCalculator = expectedAssetReturnCalculator;
_expectedRiskFreeReturnCalculator = expectedRiskFreeReturnCalculator;
_expectedMarketReturnCalculator = expectedMarketReturnCalculator;
_assetStandardDeviationCalculator = assetStandardDeviationCalculator;
_marketStandardDeviationCalculator = marketStandardDeviationCalculator;
}
/**
* Calculates the total risk alpha.
* @param assetReturnTS The return series of the asset
* @param riskFreeReturnTS The risk-free return series
* @param marketReturnTS The return series of the market
* @return The total risk alpha
*/
public double evaluate(final DoubleTimeSeries<?> assetReturnTS, final DoubleTimeSeries<?> riskFreeReturnTS, final DoubleTimeSeries<?> marketReturnTS) {
Validate.notNull(assetReturnTS, "asset returns");
Validate.notNull(riskFreeReturnTS, "risk-free returns");
Validate.notNull(marketReturnTS, "market returns");
final double assetReturn = _expectedAssetReturnCalculator.evaluate(assetReturnTS);
final double marketReturn = _expectedMarketReturnCalculator.evaluate(marketReturnTS);
final double riskFreeReturn = _expectedRiskFreeReturnCalculator.evaluate(riskFreeReturnTS);
final double assetStandardDeviation = _assetStandardDeviationCalculator.evaluate(assetReturnTS);
final double marketStandardDeviation = _marketStandardDeviationCalculator.evaluate(marketReturnTS);
return assetReturn - (riskFreeReturn + (marketReturn - riskFreeReturn) * assetStandardDeviation / marketStandardDeviation);
}
}