Блог им. AndreyKogan

Wealth-Lab: Оптимизируем параметры сами в С#

 Пытаясь подобрать оптимальные параметры для статегии, я обнаружил, что шестой Wealth-Lab при бэктестинге использует лишь одно ядро процессора. Таким образом, при оптимизации параметров четырех-ядерный процессор загружается лишь на 25%.
 
Это навело меня на мысль, что хорошо бы написать свою программку, которая делает то же самое, что оптимизация в Wealth-Lab, но быстрее. Был использован C# 4.5 в Visual Studio 2012.
 
Я поставил перед собой три задачи:
  1. Программа должна работать быстро.
  2. Программа должны выдавать на выходе параметры стратегии, при которых в Wealth-Lab в точности воспроизводятся все трейды и результаты полностью совпадают.
  3. Программа должна уметь последовательно просчитывать несколько разных стратегий в пакетном режиме.
 
В сущности, данное консольное приложение делает следующее:
1)      Считывает данные из текстовых файлов (формат Wealth-Lab).
2)      Считывает исходные параметры из файла input.txt.
3)      Вычисляет DataSeries, так как стратегия предполагает их использование.

4)      Запускается перебор значений параметров (как в оптимизаторе Wealth-Lab).
5)      Результаты оптимизации записываются в файл output.txt.
 
Все три задачи были реализованы.
  1. Для ускорения вычислений используется Parallel.For, так что процессор задействован на 100%.  Скорость вычисления оптимальных параметров превосходит Wealth-Lab в десятки раз.
  2. Параметры на выходе моей программы позволяют запустить стратегию в Wealth-Lab и получить в точности такие же результаты.
  3. Пакетный режим позволяет запустить программу на ночь, параметры различных стратегий будут рассчитаны последовательно.
 
В процессе отладки было выявлено несколько интересных моментов.

 Первое (и самое важное): тип double совершенно не подходит для параметров стратегии, потому что погрешность этого типа может сыграть злую шутку: при запуске одного и того же кода, результаты вычислений будут различными. Для параметров приходится использовать integer.
 
  Далее. Для повышения производительности необходимо было оптимизировать код приложения.
  1. Избавился от «лишних» вычислений.
  2. При переборе элементов for будет работать несколько быстрее, чем foreach.
  3. По возможности избегал создания объектов, так как это действие занимает машинное время.
  4. Так как данные загружаются единожды, но используются множество раз, то целесообразно использовать массив, а не List.
 
Кстати, нашёл два интересных бага в Wealth-Lab:
 
  1. При условном размере депозита в 5000, Wealth-Lab вычисляет количество инструментов для трейда не по цене открытия, а по цене закрытия свечи. Хотя покупает по цене открытия.
  2. При закрытия позиции на последнем баре комиссионные не учитываются.
 
Вот такие результаты даёт текущая стратегия после оптимизации параметров:
 
 Wealth-Lab: Оптимизируем  параметры сами в С#
 
В завершение хочу отметить, что Wealth-Lab превосходная программа. Настоятельно рекомендую.
★3
7 комментариев
на истории можно подобрать оптимальные параметры для любых торговых систем. а как поведет себя система на реальной торговле?
avatar
vfreeman, думаю, только торговля покажет.
«Так как данные загружаются единожды, но используются множество раз, то целесообразно использовать массив, а не List.» Не очень понятен постулат. А чем Лист плох в этом случае?
avatar
xp-trade, List хорош.
Но, по сути, List это обертка над массивом. Скажем, если данные загружены в массив и больше изменяться не будут, то нам не нужно динамически изменять размер массива. И нам без надобности методы List, такие как Add(), Remove() и т.п.

В случаях, когда нам нужно динамически менять размер, предпочтительнее использовать List, будет быстрее.
тут уже пробегало на сайте…
напомню…
есть интервал оптимизации… например 2 года…
есть прараметры оптимизации например их 1… тогда после оптимизации можно гарантировать что бот будет работать 12месяцев… параметров 2 — будет раотать 6мес… 3 параметра дадут 3мес… 4ре это 1.5 месяца… т.е каждый параметр сокращае время работы бота вдвое…
avatar
А софтинкой не поделитесь? :)
avatar
Привет, Андрей.
Получила ли развитие ваша разработка?
Где еще можно посмотреть о вашей разработке?
Хотелось бы увидеть подробные результаты работы приложения?
Или идея оказалась не работоспособной?

теги блога Андрей Коган

....все тэги



UPDONW
Новый дизайн