/// <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));
 }