Пример #1
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));
        }
        public override double Evaluate(IChromosome chromosome)
        {
            this.Name = "DualPeriodSharpe";

            var list  = ((Chromosome)chromosome).ToDictionary();
            var start = Config.StartDate.Value;
            var end   = Config.EndDate.Value;

            var first = base.Evaluate(chromosome);

            var diff = end - start;

            Config.StartDate = end;
            Config.EndDate   = end + diff;

            OptimizerAppDomainManager.ReInitialize(Config);
            var second = base.Evaluate(chromosome);

            var fitness = new FitnessResult
            {
                Fitness = (first + second) / 2
            };

            fitness.Value = (decimal)base.GetValueFromFitness(fitness.Fitness);

            var output = string.Format("Start: {0}, End: {1}, Start: {2}, End: {3}, {4}: {5}", start, end, Config.StartDate, Config.EndDate, this.Name, fitness.Value);

            Program.Logger.Info(output);

            Config.StartDate = start;
            Config.EndDate   = end;

            return(fitness.Fitness);
        }
Пример #3
0
        protected virtual FitnessResult CalculateFitness(Dictionary <string, string> result)
        {
            this.Name = "Sharpe";
            var fitness = new FitnessResult();

            var sharpe = -10m;
            var ratio  = result["Sharpe Ratio"];

            Decimal.TryParse(ratio, out sharpe);
            var     compound = result["Compounding Annual Return"];
            decimal parsed;

            Decimal.TryParse(compound.Trim('%'), out parsed);

            if (!_config.IncludeNegativeReturn)
            {
                sharpe = System.Math.Max(sharpe <= 0 || parsed < 0 ? -10 : sharpe, -10);
            }
            else
            {
                sharpe = System.Math.Max(sharpe, -10);
            }

            fitness.Value = sharpe.ToString("0.00");

            fitness.Fitness = (double)(System.Math.Max(sharpe, -10) + 10) * scale;

            return(fitness);
        }
Пример #4
0
        //Fitness based on config settings
        protected override FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            var fitness = new FitnessResult();

            var raw = StatisticsAdapter.Translate(Config.Fitness.ResultKey, result);

            fitness.Value = raw;

            fitness.Fitness = (double)raw * Config.Fitness.Scale.Value * Config.Fitness.Modifier.Value;

            return(fitness);
        }
        //Fitness based on Compounding Annual Return
        protected override FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            this.Name = "Return";
            var fitness = new FitnessResult();

            var raw = result["CompoundingAnnualReturn"];

            fitness.Value = raw;

            fitness.Fitness = (double)raw * scale;

            return(fitness);
        }
Пример #6
0
        public void LogGenerationInfo(IGenerationResult <Coefficients, double> generationResult)
        {
//            Console.WriteLine($" Average generation: {generationResult.AverageGenomeGeneration:0.00}");
//            Console.WriteLine($" Average fitness: {generationResult.OrderedGenomes.Average(r => r.Fitness):e2}");
            LogGenome(generationResult.FittestGenome);

            FitnessResult <Coefficients, double> topGenome = generationResult.FittestGenome;
            double averageAgeTop10Genomes   = generationResult.OrderedGenomes.Take(10).Average(r => r.GenomeInfo.Generation);
            var    averageScoreAllGenomes   = generationResult.OrderedGenomes.Average(r => r.Fitness);
            var    averageScoreTop10Genomes = generationResult.OrderedGenomes.Take(10).Average(r => r.Fitness);

            _logFile.WriteLine($"{_loggerId},{generationResult.GenerationNumber},{generationResult.AverageGenomeGeneration:0.00},{averageAgeTop10Genomes:0.00},{topGenome.GenomeInfo.Generation:0},{averageScoreAllGenomes:e2},{averageScoreTop10Genomes:e2},{topGenome.Fitness:e2}");
            _logFile.Flush();
        }
        protected override FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            var cost    = (double)result[Name];
            var fitness = new FitnessResult {
                Fitness = cost, Value = result[AverageSharpe]
            };

            var output = new StringBuilder();

            output.AppendFormat("{0}: {1}, ", AverageSharpe, fitness.Value.ToString("0.##"));
            output.AppendFormat("{0}: {1}", Name, fitness.Fitness.ToString("0.##"));
            LogProvider.GenerationsLogger.Info(output);

            return(fitness);
        }
        //Fitness based on config settings
        protected override FitnessResult CalculateFitness(Dictionary <string, string> result)
        {
            var fitness = new FitnessResult();

            double parsed = 0.0;
            var    raw    = result[Config.Fitness.ResultKey].TrimEnd('%');

            double.TryParse(raw, out parsed);

            fitness.Value = parsed.ToString();

            fitness.Fitness = parsed * Config.Fitness.Scale.Value * Config.Fitness.Modifier.Value;

            return(fitness);
        }
        //Fitness based on Compounding Annual Return
        protected override FitnessResult CalculateFitness(Dictionary <string, string> result)
        {
            this.Name = "Return";
            var fitness = new FitnessResult();

            double parsed = 0;
            var    raw    = result["Compounding Annual Return"];

            double.TryParse(raw.TrimEnd('%'), out parsed);

            fitness.Value = parsed.ToString();

            fitness.Fitness = parsed * scale;

            return(fitness);
        }
Пример #10
0
        //Fitness based on total trades
        protected override FitnessResult CalculateFitness(Dictionary <string, string> result)
        {
            this.Name = "Trades";
            var fitness = new FitnessResult();

            int parsed = 0;
            var raw    = result["Total Trades"];

            int.TryParse(raw, out parsed);

            fitness.Value = parsed.ToString();

            fitness.Fitness = (double)(System.Math.Max(parsed, 0)) * scale;

            return(fitness);
        }
        protected virtual FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            var fitness = new FitnessResult();

            var ratio = result["SharpeRatio"];

            if (Filter != null && !Filter.IsSuccess(result, this))
            {
                ratio = -10m;
            }

            fitness.Value = ratio;

            fitness.Fitness = (double)(System.Math.Max(ratio, -10) + 10) * scale;

            return(fitness);
        }
        protected virtual FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            var fitness = new FitnessResult();

            var ratio    = result["SharpeRatio"];
            var compound = result["CompoundingAnnualReturn"];

            if (!Config.IncludeNegativeReturn)
            {
                ratio = compound < 0 ? -10 : ratio;
            }
            fitness.Value = ratio;

            fitness.Fitness = (double)(System.Math.Max(ratio, -10) + 10) * scale;

            return(fitness);
        }
        //Fitness based on Compounding Annual Return
        protected override FitnessResult CalculateFitness(Dictionary <string, decimal> result)
        {
            var fitness = new FitnessResult();

            var car = result["CompoundingAnnualReturn"];

            if (!Filter.IsSuccess(result, this))
            {
                car = -100m;
            }

            fitness.Value = car;

            fitness.Fitness = (double)car * scale;

            return(fitness);
        }
Пример #14
0
        public override double Evaluate(IChromosome chromosome)
        {
            var dualConfig = ((OptimizerConfiguration)Config).Clone();
            var start      = Config.StartDate.Value;
            var end        = Config.EndDate.Value;
            var diff       = end - start;

            dualConfig.StartDate = end;
            dualConfig.EndDate   = end + diff;

            var dualFitness = new OptimizerFitness(dualConfig, this.Filter);

            dualFitness.Name = this.Name;

            var    first  = base.Evaluate(chromosome);
            double second = -10;

            if (first > -10)
            {
                second = dualFitness.Evaluate(chromosome);
            }

            var fitness = new FitnessResult
            {
                Fitness = (first + second) / 2
            };

            fitness.Value = (decimal)base.GetValueFromFitness(fitness.Fitness);

            var output = string.Format($"Start: {Config.StartDate}, End: {Config.EndDate}, Start: {dualConfig.StartDate}, End: {dualConfig.EndDate}, "
                                       + $"Id: {((Chromosome)chromosome).Id}, Dual Period {this.Name}: {fitness.Value}");

            LogProvider.GenerationsLogger.Info(output);

            Config.StartDate = start;
            Config.EndDate   = end;

            return(fitness.Fitness);
        }
Пример #15
0
        private void LogGenome(FitnessResult <Coefficients, double> result)
        {
            var coefficients = result.GenomeInfo.Genome;

            Console.WriteLine($" {result.GenomeInfo.Generation}, {result.Fitness:e2} - ({coefficients.FifthLevel:0.##}) * x ^ 4 + ({coefficients.FourthLevel:0.##}) * x ^ 3 + ({coefficients.ThirdLevel:0.##}) * x ^ 2 + ({coefficients.SecondLevel:0.##}) * x + ({coefficients.FirstLevel:0.##})");
        }
Пример #16
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="insamp">In sample fitness result</param>
 /// <param name="outsamp">Out of sample fitness result</param>
 public WalkForwardValidationEventArgs(FitnessResult insamp, FitnessResult outsamp)
 {
     InsampleResults   = insamp;
     ValidationResults = outsamp;
 }
Пример #17
0
        protected override void OnIndividualEvaluationFinished(Individual individual, FitnessResult fitness, object[] results)
        {
            base.OnIndividualEvaluationFinished(individual, fitness, results);

            AssignSemanticsToTreeNodes(individual, fitness as MDLFitnessResult);
            AssignSemanticsToIndividual(individual, results);
        }
        protected override void OnIndividualEvaluationFinished(Individual individual, FitnessResult fitness, object[] results)
        {
            MDLFitnessResult fitnessResult = fitness as MDLFitnessResult;

            if (SubTreePool != null)
            {
                int usedAttributes      = fitnessResult.UsedAttributes;
                int classificationError = fitnessResult.ClassificationError;
                if (usedAttributes > 0)
                {
                    double utilityMeasure = CalculateUtilityMeasure(usedAttributes, classificationError);
                    foreach (var id in fitnessResult.Dataset.Features)
                    {
                        // utility measure is maximized between 0 and 1 -> fitness is minimized
                        SubTreePool.Add(individual.SyntaxTree.FindNodeById(id), 1 - utilityMeasure);
                    }
                    SubTreePool.TrimToMaxSize();
                }
            }
        }
Пример #19
0
        public void LogGenome(FitnessResult <MyThing, int> result)
        {
            var thing = result.GenomeInfo.Genome;

            Console.WriteLine($" {result.Fitness} - {thing.Sum} = {thing.A} + {thing.B} + {thing.C} + {thing.D} + {thing.E}");
        }