Esempio n. 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="WalkForwardOptimizationManager"/> class
 /// </summary>
 /// <param name="start">Algorithm start date</param>
 /// <param name="end">Algorithm end date</param>
 /// <param name="fitScore">Argument of <see cref="FitnessScore"/> type. Fintess function to rank the backtest results</param>
 /// <param name="filterEnabled">Indicates whether to apply fitness filter to backtest results</param>
 public WalkForwardOptimizationManager(DateTime start, DateTime end, FitnessScore fitScore, bool filterEnabled)
 {
     StartDate      = start;
     EndDate        = end;
     FitnessScore   = fitScore;
     _filterEnabled = filterEnabled;
 }
        /// <summary>
        /// Calculates fitness by given metric (fitness score).
        /// </summary>
        /// <remarks></remarks>
        /// <param name="result">Full results dictionary</param>
        /// <param name="fitScore">Existing score of effectivness of an algorithm</param>
        /// <param name="filterEnabled">Indicates whether need to filter the results</param>
        /// <returns></returns>
        public static decimal CalculateFitness(Dictionary <string, decimal> result, FitnessScore fitScore, bool filterEnabled)
        {
            // Calculate fitness using the chosen fitness finction
            decimal fitness;

            switch (fitScore)
            {
            case FitnessScore.SharpeRatio:
                fitness = result["SharpeRatio"];
                break;

            case FitnessScore.TotalNetProfit:
                fitness = result["TotalNetProfit"];
                break;

            default:
                throw new ArgumentOutOfRangeException(fitScore.ToString(), "StatisticsAdapter.CalculateFitness() : default");
            }

            // apply filter if enabled
            if (filterEnabled)
            {
                if (!FitnessFilter.IsSuccess(result) || fitness < 0)
                {
                    fitness = FitnessFilter.ErrorValue;
                }
            }

            return(fitness);
        }
Esempio n. 3
0
        /// <summary>
        /// Method called in the backgound to validate the chromosome on out-of-sample data
        /// </summary>
        protected void ValidateOutOfSample(
            FitnessResult insampeResult,
            FitnessScore fitScore,
            DateTime validationStartDate,
            DateTime validationEndDate)
        {
            // Create a deep copy
            var copy = (Chromosome)insampeResult.Chromosome.CreateNew();

            // Run a backtest.
            // Do not apply fitness filtering to validation results - let it expose a true picture ->
            IFitness fitness;

            if (Shared.Config.TaskExecutionMode == TaskExecutionMode.Azure)
            {
                fitness = new AzureFitness(validationStartDate, validationEndDate, fitScore, false);
                fitness.EvaluateAsync(copy).GetAwaiter().GetResult();
            }
            else
            {
                fitness = new OptimizerFitness(validationStartDate, validationEndDate, fitScore, false);
                fitness.EvaluateAsync(copy).GetAwaiter().GetResult();;
            }

            // Raise an event
            ValidationCompleted?.Invoke(this, e:
                                        new WalkForwardValidationEventArgs(insampeResult, copy.FitnessResult));
        }
Esempio n. 4
0
 /// <summary>
 /// Base class constructor for all custom fitness objects implementations
 /// </summary>
 /// <param name="start">Start date</param>
 /// <param name="end">End date</param>
 /// <param name="fitScore">Fitness value calculation method</param>
 /// <param name="filterEnabled">Indicates whether to apply filter to backtest results</param>
 protected LeanFitness(DateTime start, DateTime end, FitnessScore fitScore, bool filterEnabled)
 {
     StartDate     = start;
     EndDate       = end;
     FitnessScore  = fitScore;
     FilterEnabled = filterEnabled;
 }
Esempio n. 5
0
        public static void SetScores(Evaluation.Solution temp, FitnessScore fitness, Evaluator ev)
        {
            temp.Scores.Total      = fitness.Score;
            temp.Scores.Validity   = fitness.ValidSolution;
            temp.Scores.ValidScore = fitness.MaxValidScore;

            temp.Scores.E2EScore             = fitness.E2EPenalty;
            temp.Scores.E2EViolation         = fitness.E2EViolations;
            temp.Scores.E2EPossibleViolation = fitness.PossibleE2EViolation;

            temp.Scores.DeadlineScore             = fitness.DeadlinePenalty;
            temp.Scores.DeadlineViolation         = fitness.DeadlineViolations;
            temp.Scores.DeadlinePossibleViolation = fitness.PossibleDeadlineViolation;

            temp.Scores.JitterScore             = fitness.JitterPenalty;
            temp.Scores.JitterViolation         = fitness.JitterViolations;
            temp.Scores.JitterPossibleViolation = fitness.PossibleJitterViolation;

            temp.Scores.OrderScore             = fitness.OrderPenalty;
            temp.Scores.OrderViolation         = fitness.OrderViolations;
            temp.Scores.OrderPossibleViolation = fitness.PossibleOrderViolation;
            temp.Scores.QOCScore   = fitness.ControlPenalty;
            temp.Scores.DevControl = fitness.ControlDevPenalty;

            temp.Scores.PartitionScore     = fitness.PartitionPenalty;
            temp.Scores.PartitionViolation = fitness.PartitionViolations;

            foreach (var qoc in ev.Apps)
            {
                if (qoc.CA)
                {
                    temp.Scores.CoC.Add(qoc.Cost);
                }
            }
            foreach (var chain in ev.Apps)
            {
                temp.Scores.Chains.Add(chain.E2E);
            }

            foreach (var deadline in ev.Deadlines)
            {
                temp.Scores.Deadlines.Add(deadline.MaxDistance);
            }


            //temp.Scores.ExtensibilityScore = fitness.ExtensibilityPenalty;
        }
        /// <summary>
        /// Creates a special format string for illustrative logging.
        /// </summary>
        /// <param name="ch">The chromosome to represent as a string</param>
        /// <param name="result">Dictionary with backtest statistics results</param>
        /// <param name="ftSc">Fitness Score enum value</param>
        /// <param name="fitness">Fitness value</param>
        /// <returns> Example:
        /// 2019-12-02T13:13:41.3568607Z TRACE:: [chromosome #id: 771bca555a6c42fca30affe9e77d8018]
        /// PARAMETERS: gold-fast-period 5
        ///             gold-slow-period 70
        ///             gold-drawdown-percent 0.2
        /// RESULTS: SharpeRatio = -0.32 Drawdown = 2.20 TotalNumberOfTrades = 67 AnnualReturn = -1.55
        /// </returns>
        public static string EvaluationToLogOutput(this Chromosome ch, Dictionary <string, decimal> result, FitnessScore ftSc, decimal fitness)
        {
            // beginning string
            var output = new StringBuilder($"[chromosome #id: {ch.Id}]{Environment.NewLine}PARAMETERS: ");
            // newline and 12 spaces
            string delimiter = Environment.NewLine + new string(' ', 12);
            var    pairs     = ch.ToDictionary();

            for (int i = 0; i < pairs.Count; i++)
            {
                var item = pairs.ElementAt(i);
                output.Append(item.Key).Append(" ").Append(item.Value);

                // if not the last item in collection append delimiter string
                if (i != (pairs.Count - 1))
                {
                    output.Append(delimiter);
                }
            }
            // finally
            output.Append($"{Environment.NewLine}RESULTS: ");
            output.Append(fitness == FitnessFilter.ErrorValue ? $"ErrValue = {fitness:f2} " : $"{ftSc} = {fitness:f2} ");
            output.Append($"NetProfit = {result["TotalNetProfit"] * 100:f2} ");
            output.Append($"Drawdown = {result["Drawdown"] * 100:f2} ");
            // new line starts with spaces
            output.Append(Environment.NewLine + new string(' ', 9));
            output.Append($"Trades = {result["TotalNumberOfTrades"]} ");
            output.Append($"Fees = {result["TotalFees"]} ");
            output.Append($"Expectancy = {result["Expectancy"]:f2} ");     // Expectancy = WinRate * ProfitLossRatio - LossRate
            return(output.ToString());
        }
Esempio n. 7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="AzureFitness"/> class
 /// </summary>
 /// <param name="start">Start date</param>
 /// <param name="end">End date</param>
 /// <param name="fitScore">Fitness value calculation method</param>
 /// <param name="filterEnabled">Indicates whether to apply filter to backtest results</param>
 public AzureFitness(DateTime start, DateTime end, FitnessScore fitScore, bool filterEnabled) :
     base(start, end, fitScore, filterEnabled)
 {
 }
 public override string ToString()
 {
     return("Id#" + m_network.Id + ", F=" + FitnessScore.ToString("F3"));
 }
Esempio n. 9
0
 public override string MakeFitnessScore()
 {
     FitnessScore = HelperFunctions.ReflFitnessScore(ReflData.Instance.GetReflData, ReflectivityMap, HighQOffset, LowQOffset, ParamSize());
     return(FitnessScore.ToString("#.### E-0"));
 }
Esempio n. 10
0
 public override string MakeFitnessScore()
 {
     FitnessScore = HelperFunctions.EDFitnessScore(RealRho, ElectronDensityArray, 0, 0, ParamSize());
     return(FitnessScore.ToString("##.### E-0"));
 }
Esempio n. 11
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AlgorithmOptimumFinder"/> class
        /// </summary>
        /// <param name="start">Algorithm start date</param>
        /// <param name="end">Algorithm end date</param>
        /// <param name="fitScore">Argument of <see cref="FitnessScore"/> type. Fintess function to rank the backtest results</param>
        /// <param name="filterEnabled">Indicates whether to apply fitness filter to backtest results</param>
        public AlgorithmOptimumFinder(DateTime start, DateTime end, FitnessScore fitScore, bool filterEnabled)
        {
            // Assign Dates and Criteria to sort the results
            StartDate    = start;
            EndDate      = end;
            FitnessScore = fitScore;

            // Common properties
            var selection = new RouletteWheelSelection();

            // Properties specific to optimization modes
            IFitness       fitness;
            PopulationBase population;
            ITaskExecutor  executor;
            ITermination   termination;

            // Task execution mode
            switch (Shared.Config.TaskExecutionMode)
            {
            // Enable fitness filtering while searching for optimum parameters
            case TaskExecutionMode.Linear:
                executor = new LinearTaskExecutor();
                fitness  = new OptimizerFitness(StartDate, EndDate, fitScore, filterEnabled);
                break;

            case TaskExecutionMode.Parallel:
                executor = new ParallelTaskExecutor();
                fitness  = new OptimizerFitness(StartDate, EndDate, fitScore, filterEnabled);
                break;

            case TaskExecutionMode.Azure:
                executor = new ParallelTaskExecutor();
                fitness  = new AzureFitness(StartDate, EndDate, fitScore, filterEnabled);
                break;

            default:
                throw new Exception("Executor initialization failed");
            }

            // Optimization mode
            switch (Shared.Config.OptimizationMode)
            {
            case OptimizationMode.BruteForce:
            {
                // Create cartesian population
                population  = new PopulationCartesian(Shared.Config.GeneConfigArray);
                termination = new GenerationNumberTermination(1);

                break;
            }

            case OptimizationMode.Genetic:
            {
                // Create random population
                population = new PopulationRandom(Shared.Config.GeneConfigArray, Shared.Config.PopulationInitialSize)
                {
                    GenerationMaxSize = Shared.Config.GenerationMaxSize
                };

                // Logical terminaton
                var localTerm = new LogicalOrTermination();

                localTerm.AddTermination(new FruitlessGenerationsTermination(3));

                if (Shared.Config.Generations.HasValue)
                {
                    localTerm.AddTermination(new GenerationNumberTermination(Shared.Config.Generations.Value));
                }

                if (Shared.Config.StagnationGenerations.HasValue)
                {
                    localTerm.AddTermination(new FitnessStagnationTermination(Shared.Config.StagnationGenerations.Value));
                }

                termination = localTerm;
                break;
            }

            default:
                throw new Exception("Optimization mode specific objects were not initialized");
            }

            // Create GA itself
            GenAlgorithm = new GeneticAlgorithm(population, fitness, executor)
            {
                // Reference types
                Selection   = selection,
                Termination = termination,

                // Values types
                CrossoverParentsNumber  = Shared.Config.CrossoverParentsNumber,
                CrossoverMixProbability = Shared.Config.CrossoverMixProbability,
                MutationProbability     = Shared.Config.MutationProbability
            };
        }