/// <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); }
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); }
//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); }
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); }
//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); }
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); }
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.##})"); }
/// <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; }
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(); } } }
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}"); }