Brutforce оптимизация + Wfa
Простой сценарий, который показывает, как реализовать оптимизацию BruteForce + walk forward тестирование на интервале данных вне выборки.
Сценарий работает с простой стратегией кроссовера SMA.
public class MyScenario : Scenario
{
public override void Run()
{
// set in-sample data interval
Solution.StartDate = new DateTime(1995, 1, 1);
Solution.StopDate = new DateTime(2001, 1, 1);
// get reference to strategy project
Project project = Solution.Projects[0];
// define variables
int best_length1 = 0;
int best_length2 = 0;
double best_objective = 0;
// brute force optimization loop
for (int length1 = 3;length1 <= 7;length1++)
for (int length2 = 3;length2 <= 7;length2++)
if (length2 > length1)
{
// set new parameters
project.Parameters["Length1"].Value = length1;
project.Parameters["Length2"].Value = length2;
// print parameters
Console.Write("Length1 = " + length1 + " Length2 = " + length2);
// start backtest
Start();
// calculate objective function
double objective = Solution.Portfolio.GetValue();
// print objective
Console.WriteLine(" Objective = " + objective);
// check best objective
if (objective > best_objective)
{
best_objective = objective;
best_length1 = length1;
best_length2 = length2;
}
}
// print best parameters
Console.WriteLine("BEST PARAMETERS");
Console.WriteLine();
Console.WriteLine("SMA1 Length = " + best_length1);
Console.WriteLine("SMA2 Length = " + best_length2);
Console.WriteLine("Objective = " + best_objective);
// run strategy with the best parameters on out-of-sample data interval
project.Parameters["Length1"].Value = best_length1;
project.Parameters["Length2"].Value = best_length2;
Solution.StartDate = new DateTime(2001, 1, 1);
Solution.StopDate = new DateTime(2005, 1, 1);
Start();
}
}