Erweiterte Optimierung
Überblick
StockSharp bietet erweiterte Werkzeuge zur Feinabstimmung des Strategieoptimierungsprozesses. Dieser Abschnitt beschreibt erweiterte Komponenten: Konfiguration genetischer Algorithmen über GeneticSettings, Kompilierung benutzerdefinierter Fitnessformeln über FitnessFormulaProvider und Fortschrittsüberwachung über OptimizationProgressTracker.
GeneticSettings
Die Klasse GeneticSettings verwaltet alle Aspekte des genetischen Optimierungsalgorithmus. Sie befindet sich im Namespace StockSharp.Algo.Strategies.Optimization.
Populations- und Generationsparameter
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
Population |
int | 8 | Größe der Anfangspopulation |
PopulationMax |
int | 16 | Maximale Populationsgröße |
GenerationsMax |
int | 20 | Maximale Anzahl von Generationen |
GenerationsStagnation |
int | 5 | Stopp bei Stagnation (Generationen ohne Verbesserung) |
Wahrscheinlichkeitsparameter
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
MutationProbability |
decimal | 0.1 | Mutationswahrscheinlichkeit (0-1) |
CrossoverProbability |
decimal | 0.8 | Crossover-Wahrscheinlichkeit (0-1) |
Genetische Operatoren
| Eigenschaft | Standard | Beschreibung |
|---|---|---|
Reinsertion |
ElitistReinsertion | Strategie zum Ersetzen von Generationen |
Mutation |
UniformMutation | Mutationsoperator |
Crossover |
OnePointCrossover | Crossover-Operator |
Selection |
TournamentSelection | Selektionsoperator |
FitnessFormulaProvider
Die Klasse FitnessFormulaProvider kompiliert C#-Stringausdrücke in Funktionen vom Typ Func<Strategy, decimal>, die zur Bewertung von Strategien während der Optimierung verwendet werden.
Compile-Methode
var fitnessProvider = new FitnessFormulaProvider();
Func<Strategy, decimal> fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
Verfügbare Variablen
Die folgenden Variablen stehen in Formeln der Fitnessfunktion zur Verfügung und entsprechen statistischen Kennzahlen der Strategie:
| Variable | Beschreibung |
|---|---|
| PnL | Nettogewinn |
| WinTrades | Gewinntrades |
| LosTrades | Verlusttrades |
| TCount | Gesamtzahl der Trades |
| RTrip | Round-Trips |
| AvgTPnL | Durchschnittlicher Gewinn pro Trade |
| AvgWTrades | Durchschnittlicher Gewinntrade |
| AvgLTrades | Durchschnittlicher Verlusttrade |
| MaxLong | Maximale Long-Position |
| MaxShort | Maximale Short-Position |
| MaxPnL | Maximaler Gewinn |
| MaxDD | Maximaler Drawdown |
| MaxRelDD | Maximaler relativer Drawdown |
| Ret | Rendite |
| Recovery | Recovery-Faktor |
| MaxLatReg | Maximale Registrierungslatenz |
| MaxLatCan | Maximale Stornierungslatenz |
| MinLatReg | Minimale Registrierungslatenz |
| MinLatCan | Minimale Stornierungslatenz |
| OrdCount | Anzahl der Orders |
| OrdRegErrCount | Registrierungsfehler |
| OrdCancelErrCount | Stornierungsfehler |
| OrdFundErrCount | Fehler wegen unzureichender Mittel |
Variablen können in beliebigen mathematischen Ausdrücken kombiniert werden: "PnL - MaxDD * 2", "Recovery * WinTrades", "PnL / (MaxDD + 1)".
OptimizationProgressTracker
Die Klasse OptimizationProgressTracker bietet eine bequeme Überwachung des Optimierungsprozesses.
Eigenschaften
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
TotalIterations |
int | Gesamtzahl der Iterationen |
CompletedIterations |
int | Anzahl der abgeschlossenen Iterationen |
TotalProgress |
double | Gesamtfortschritt (0-100) |
StartedAt |
DateTimeOffset | Startzeit der Optimierung |
Elapsed |
TimeSpan | Verstrichene Zeit |
Remaining |
TimeSpan | Geschätzte verbleibende Zeit |
Methoden
| Methode | Beschreibung |
|---|---|
IterationCompleted() |
Markiert eine Iteration als abgeschlossen |
Reset(totalIterations) |
Setzt den Tracker für einen neuen Lauf zurück |
Optimizer-Klassen
StockSharp stellt zwei Optimierer bereit, die von BaseOptimizer erben:
- BruteForceOptimizer -- vollständige Enumeration aller Parameterkombinationen. Geeignet für kleine Parameterräume.
- GeneticOptimizer -- genetischer Algorithmus. Effizient bei einer großen Anzahl von Parametern und konvergiert automatisch zur optimalen Lösung.
Verwendungsbeispiel
var geneticSettings = new GeneticSettings
{
Population = 16,
PopulationMax = 32,
GenerationsMax = 50,
GenerationsStagnation = 10,
MutationProbability = 0.15m,
CrossoverProbability = 0.75m,
};
// Benutzerdefinierte Formel für die Fitnessfunktion
var fitnessProvider = new FitnessFormulaProvider();
var fitness = fitnessProvider.Compile("PnL / (MaxDD + 1)");
// Genetischen Optimierer erstellen
var optimizer = new GeneticOptimizer(
new CollectionSecurityProvider(new[] { security }),
new CollectionPortfolioProvider(new[] { portfolio }),
storageRegistry,
Paths.FileSystem);
optimizer.Settings.Population = geneticSettings.Population;
optimizer.Settings.PopulationMax = geneticSettings.PopulationMax;
optimizer.Settings.GenerationsMax = geneticSettings.GenerationsMax;
optimizer.Settings.GenerationsStagnation = geneticSettings.GenerationsStagnation;
optimizer.Settings.MutationProbability = geneticSettings.MutationProbability;
optimizer.Settings.CrossoverProbability = geneticSettings.CrossoverProbability;
// Fortschrittsüberwachung
var tracker = new OptimizationProgressTracker();
tracker.Reset(totalIterations: 100);
optimizer.SingleProgressChanged += (strategy, parameters, progress) =>
{
if (progress == 100)
{
tracker.IterationCompleted();
Console.WriteLine($"Progress: {tracker.TotalProgress:F1}%, " +
$"Remaining: {tracker.Remaining:hh\\:mm\\:ss}");
}
};