/// <summary> /// Calculates the residual risk (annualised standard deviation of the error term from the CAPM linear regession) /// </summary> /// <param name="asset">Asset time series</param> /// <param name="benchmark">Benchmark time series</param> /// <param name="riskfree">Risk-free rate of return specified as a fractional value, e.g. 0.05 for 5%</param> /// <returns>Returns the standard deviation</returns> public static double ResidualRisk(ITimeSeries <double> asset, ITimeSeries <double> benchmark, double riskfree = 0) { var Ra = asset.AsTimeSeries() - riskfree; var Rb = benchmark.AsTimeSeries() - riskfree; return(Math.Round(Statistics.StandardDeviation(Model.LinearRegression(Ra.Data, Rb.Data).Residuals) * Math.Sqrt(asset.PeriodsInYear()), DecimalDigits)); }
/// <summary> /// Calculates the regression coefficients of the linear CAPM regresion model /// </summary> /// <param name="asset"></param> /// <param name="benchmark"></param> /// <param name="riskfree">Risk-free rate of return specified as a fractional value, e.g. 0.05 for 5%</param> /// <returns>The CAPM coefficients - Alpha and Beta</returns> public static CAPMCoefficients CAPModel(ITimeSeries <double> asset, ITimeSeries <double> benchmark, double riskfree = 0) { var Ra = asset.AsTimeSeries() - riskfree; var Rb = benchmark.AsTimeSeries() - riskfree; var capm = Model.LinearRegression(Ra.Data, Rb.Data); return(new CAPMCoefficients(Math.Round(capm.Intercept, DecimalDigits), Math.Round(capm.Coefficients.First(), DecimalDigits))); }
public void Result() { TimeSeriesFactory <double> .SampleData.RandomSeed = 8; ITimeSeries <double> asset = TimeSeriesFactory <double> .SampleData.Gaussian(mu_a, sigma_a, numperiods : elements, freq : DataFrequency.Daily); var res = PortfolioAnalytics.TrackingError(asset, benchmark); var te = (asset.AsTimeSeries() - benchmark.AsTimeSeries()).AnnualisedStdDev(); Assert.AreEqual(te, res, 0.001); }
/// <summary> /// Calculates the portfolio tracking error, i.e. the annualised standard deviation of the difference in returns between the portfolio and the benchmark /// </summary> /// <param name="portfolio">Portfolio time series</param> /// <param name="benchmark">Benchmark time series</param> /// <returns></returns> public static double TrackingError(ITimeSeries <double> portfolio, ITimeSeries <double> benchmark) { return(Math.Round((portfolio.AsTimeSeries() - benchmark.AsTimeSeries()).AnnualisedStdDev(), DecimalDigits)); }