forked from Jay-Jay-D/LeanOptimization
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOptimizerFitness.cs
92 lines (73 loc) · 2.47 KB
/
OptimizerFitness.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using GeneticSharp.Domain.Fitnesses;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GeneticSharp.Domain.Chromosomes;
namespace Optimization
{
public class OptimizerFitness : IFitness
{
public string Name { get; protected set; }
protected IOptimizerConfiguration Config;
double scale = 0.02;
public OptimizerFitness(IOptimizerConfiguration config)
{
Config = config;
}
public virtual double Evaluate(IChromosome chromosome)
{
try
{
string output = "";
var list = ((Chromosome)chromosome).ToDictionary();
foreach (var item in list)
{
output += item.Key + ": " + item.Value.ToString() + ", ";
}
var result = AppDomainManager.RunAlgorithm(list);
var fitness = CalculateFitness(result);
output += string.Format("{0}: {1}", this.Name, fitness.Value);
Program.Logger.Info(output);
return fitness.Fitness;
}
catch (Exception ex)
{
Program.Logger.Error(ex);
return 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.000");
fitness.Fitness = (double)(System.Math.Max(sharpe, -10) + 10) * scale;
return fitness;
}
public virtual double GetValueFromFitness(double? fitness)
{
return fitness.Value / scale - 10;
}
protected class FitnessResult
{
public string Value { get; set; }
public double Fitness { get; set; }
}
}
}