Блог им. kurd

Алготрейдинг. Импорто-замещение своими руками


До недавнего времени я испытывал торговые стратегии в программе WealthLab. Но на днях возникла потребность проверки её результатов. Поэтому состряпал частичный аналог на C++.
Проверка показала значительное превосходство самоделки по быстродействию и полное совпадение результатов с фирменной системой — до копейки.

Вот как выглядит скрипт на C# в WealthLab
for (int bar = 1; bar != Bars.Count; ++bar) {
  if (IsLastPositionActive && (bar == Bars.Count-1 ||
      Close[bar] > Open[bar])) {
    while (ActivePositions.Count > 0)
      ExitAtClose (bar, ActivePositions[0]);
  } else if (bar < Bars.Count-10 && Close[bar] < Open[bar])
    BuyAtClose (bar);
}
и его аналог на C++
for (unsigned bar = 1; bar != Count; ++bar) {
  if (IsLastPositionActive() && (bar == Count-1 ||
      Close[bar] > Open[bar])) {
    while (ActivePositions.size() > 0)
      ExitAtClose (bar, ActivePositions.front());
  } else if (bar < Count-10 && Close[bar] < Open[bar])
    BuyAtClose (bar);
}
На всё-про-всё ушла рабочая неделя — годы уже не те. Правда, импорто-замещение не совсем полное — Microsoft Visual C++ всё-таки импорт. Более полное замещение было бы на открытом дистрибуте Liberica JDK (Java) или на совместимом с Java языке Kotlin. Выбор C++ обусловлен лучшей связью с Lua из Quik'а.

Почему самоделки так необходимы? — В сравнении с мощными фирменными продуктами самоделки дают наиболее полное управление расчётами. При любом сомнении можно разобрать алгоритм по самым элементарным шагам. В закрытом фирменном продукте такое невозможно и окончательный результат придётся принять на веру.

Выбор наиболее подходящего инструмента, такого как C++, Java-Kotlin или C#, даёт более высокую скорость счёта, необходимую при оптимизации параметров торговой системы. Полное управление распараллеливанием счёта, чтобы использовать все ядра процессора.
Авторитетнейший псевдоним А.Г. выбрал среду C# (Си-шарп).

PS Модный ныне Python имеет ничтожное быстродействие, а использование библиотеки Numpy, написанной на С, требует противоестественного подлаживания под его структуры. Простые в универсальном языке конструкции в Numpy могут требовать чрезвычайных усилий.

PPS Главный козырь Python — весьма удачная библиотека Keras-TensorFlow для построения нейросетей.
Начало ссылки sourestdeeds.github.io/pdf/Deep Learning with Python.pdf Конец ссылки
«Deep Learning with Python 2Ed» Fransois Chollet
Однако, в прогонозировании временных рядов и биржевых цен нейросети работают хуже стандартных статистических методов
Начало ссылки www.inf.u-szeged.hu/~korosig/teach/books/Jason Brownlee — Deep Learning for Time Series Forecasting — Predict the Future with MLPs, CNNs and LSTMs in Python (2018).pdf Конец ссылки
А самые усовершенствованные сети хуже более простых многоуровневых персептронов MLP.
Ахтунг! С-Л в интернет-ссылках заменяет дефис "-" символом тире!

★1
#33 по плюсам, #35 по комментариям
9 комментариев
Хочешь сделать хорошо — сделай сам.
Rostislav Kudryashov, а где отчет смотрите по сделкам, или обратно в WL сделки закидываете?
avatar
Denis, 13:13 Отчёт по сделкам смотрю в Quik'е — там где сделки делаю.
А вспомогательные приложения — для вспоможения. Отладка стратегий или трудоёмкая оптимизация на лету по запросу из Quik через Lua-робот.
Rostislav Kudryashov, ясно. Я к тому, что в WL удобный отчет по сделкам в разрезе статистики. Плюс у них walk-forward тест есть. Хоть все и медленно.
avatar
А дальше то что?
Как это можно соединить с Lua из Quik'а?
avatar
advocat, 10:04 Самая быстрая и удобная связь — библиотека DDEML через Lua C API.
В сравнении с протоколом TCP/IP в программе-сервере не требуется явно заводить параллельный поток (thread) для связи с клиентом из Quik'а.
А связь через COM-интерфейс, как в AMI-broker, это вообще архаизм для 32-битовых систем.

Обычно базовый флоу бэктестинг простых стратегий и прочее запилить не сложно и не сильно долго. Но потом оказывается, что тебе ещё вот это нужно и вот это и вот это. И оно уже в сильно большее время на имплементацию выливается.

 

А какая в итоге разница в скорости работы?

avatar
Replikant_mih, 11:22 Прямой проход быстрее в несколько раз, оптимизация прямым перебором (brute force) более десяти раз.
Но никто не мешает реализовать параллелизм и более изощрённые методы.
А написание самого кода — те же усилия.

Полностью согласен! Базовый бэктест — это только вершина айсберга, а потом начинается самое интересное: нюансы учета комиссий, спредов, ликвидности, управление капиталом, стресс-тестирование на редкие события… и вот тут самописные решения проявляют себя на 100%.

По поводу скорости: если сравнивать со стандартными инструментами типа WealthLab, самописные решения на C++ действительно могут дать прирост в разы, особенно при брутфорс-оптимизации. Но параллелизм и алгоритмические оптимизации — это ключ. Вопрос в том, какие задачи в приоритете: максимальная гибкость или удобство работы.

Наша команда занимается алготрейдингом, алгоритмическим программированием и бэктестингом, поэтому можем закодить любые идеи, адаптировать их под нужный рынок и платформу. Если есть интерес  и готовые тоговые идеи  — можем обсудить детали!

4you.us/cdzv  готовые торговые стратегии
4you.us/vytcdzvr закодим ваши торговые идеи

avatar

теги блога Rostislav Kudryashov

....все тэги



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