/// <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); }
/// <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)); }
/// <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; }
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()); }
/// <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")); }
public override string MakeFitnessScore() { FitnessScore = HelperFunctions.ReflFitnessScore(ReflData.Instance.GetReflData, ReflectivityMap, HighQOffset, LowQOffset, ParamSize()); return(FitnessScore.ToString("#.### E-0")); }
public override string MakeFitnessScore() { FitnessScore = HelperFunctions.EDFitnessScore(RealRho, ElectronDensityArray, 0, 0, ParamSize()); return(FitnessScore.ToString("##.### E-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 }; }