/// <summary> /// This is faster for longer span /// </summary> /// <param name="data"></param> /// <param name="average"></param> /// <param name="periodic"></param> /// <param name="variance"></param> /// <returns></returns> public static double Next(double[] data, ref double average, ref List <double> periodic, ref double variance) { double[] PDR = MonteCarloSimulation.PeriodicChange(data, ref periodic); average = AMath.Average(PDR, average); variance = AMath.Variance(PDR, average, variance, false); double Drift = average - (variance / 2.0); double StandardDeviation = Math.Sqrt(variance); //AMath.StandarDeviation(Variance); return(data.Last() * Math.Exp(Drift + StandardDeviation * AExcel.NORMSINV(AMath.Random()))); }
/// <summary> /// confidence must be from (0 to 100) /// </summary> /// <param name="data"></param> /// <param name="average"></param> /// <param name="confidence"></param> /// <param name="population"></param> /// <returns></returns> public static double StandarConfidence(double[] data, double average, double confidence, bool population = false) { if (data == null || data.Length <= 0) { return(double.NaN); } double sigma = Math.Sqrt(AMath.Variance(data, average, population)); double multiplayer = (AExcel.NORMSINV((double)confidence / 100) + 1.5) / 2; return(sigma * multiplayer); }
/// <summary> /// this is faster for short span /// Simulates next value of double set /// </summary> /// <param name="data"></param> /// <returns>future random output</returns> public static double Next(double[] data) { if (data == null || data.Length <= 0) { return(double.NaN); } double[] PFR = MonteCarloSimulation.PeriodicChange(data); double Averange = AMath.Average(PFR); double Variance = AMath.Variance(PFR, Averange, false); double Drift = Averange - (Variance / 2.0); double StandardDeviation = Math.Sqrt(Variance); //AMath.StandarDeviation(Variance); return(data.Last() * Math.Exp(Drift + StandardDeviation * AExcel.NORMSINV(AMath.Random()))); }