Пытаясь подобрать оптимальные параметры для статегии, я обнаружил, что шестой Wealth-Lab при бэктестинге использует лишь одно ядро процессора. Таким образом, при оптимизации параметров четырех-ядерный процессор загружается лишь на 25%.
Это навело меня на мысль, что хорошо бы написать свою программку, которая делает то же самое, что оптимизация в Wealth-Lab, но быстрее. Был использован C# 4.5 в Visual Studio 2012.
Я поставил перед собой три задачи:
- Программа должна работать быстро.
- Программа должны выдавать на выходе параметры стратегии, при которых в Wealth-Lab в точности воспроизводятся все трейды и результаты полностью совпадают.
- Программа должна уметь последовательно просчитывать несколько разных стратегий в пакетном режиме.
В сущности, данное консольное приложение делает следующее:
1) Считывает данные из текстовых файлов (формат Wealth-Lab).
2) Считывает исходные параметры из файла input.txt.
3) Вычисляет DataSeries, так как стратегия предполагает их использование.
4) Запускается перебор значений параметров (как в оптимизаторе Wealth-Lab).
5) Результаты оптимизации записываются в файл output.txt.
Все три задачи были реализованы.
- Для ускорения вычислений используется Parallel.For, так что процессор задействован на 100%. Скорость вычисления оптимальных параметров превосходит Wealth-Lab в десятки раз.
- Параметры на выходе моей программы позволяют запустить стратегию в Wealth-Lab и получить в точности такие же результаты.
- Пакетный режим позволяет запустить программу на ночь, параметры различных стратегий будут рассчитаны последовательно.
В процессе отладки было выявлено несколько интересных моментов.
Первое (и самое важное): тип double совершенно не подходит для параметров стратегии, потому что погрешность этого типа может сыграть злую шутку: при запуске одного и того же кода, результаты вычислений будут различными. Для параметров приходится использовать integer.
Далее. Для повышения производительности необходимо было оптимизировать код приложения.
- Избавился от «лишних» вычислений.
- При переборе элементов for будет работать несколько быстрее, чем foreach.
- По возможности избегал создания объектов, так как это действие занимает машинное время.
- Так как данные загружаются единожды, но используются множество раз, то целесообразно использовать массив, а не List.
Кстати, нашёл два интересных бага в Wealth-Lab:
- При условном размере депозита в 5000, Wealth-Lab вычисляет количество инструментов для трейда не по цене открытия, а по цене закрытия свечи. Хотя покупает по цене открытия.
- При закрытия позиции на последнем баре комиссионные не учитываются.
Вот такие результаты даёт текущая стратегия после оптимизации параметров:
В завершение хочу отметить, что Wealth-Lab превосходная программа. Настоятельно рекомендую.
Но, по сути, List это обертка над массивом. Скажем, если данные загружены в массив и больше изменяться не будут, то нам не нужно динамически изменять размер массива. И нам без надобности методы List, такие как Add(), Remove() и т.п.
В случаях, когда нам нужно динамически менять размер, предпочтительнее использовать List, будет быстрее.
напомню…
есть интервал оптимизации… например 2 года…
есть прараметры оптимизации например их 1… тогда после оптимизации можно гарантировать что бот будет работать 12месяцев… параметров 2 — будет раотать 6мес… 3 параметра дадут 3мес… 4ре это 1.5 месяца… т.е каждый параметр сокращае время работы бота вдвое…
Получила ли развитие ваша разработка?
Где еще можно посмотреть о вашей разработке?
Хотелось бы увидеть подробные результаты работы приложения?
Или идея оказалась не работоспособной?