Промежуточный отчет по развитию ИИ и оптимизации производительности кода

Изображение заголовка рассказа

Покерный бот мертв, да здравствует BitSurfer! - Нет, серьезно, что случилось?

PokerBot и Poker Advisor были двумя очень интересными проектами, и я многому научился у них обоих! PokerAdvisor берет карты с экрана, автоматически вводит их в ИИ и предсказывает исход рук. Пока планировалось играть в покербот самому - все было подготовлено, но в Швейцарии онлайн-покер был практически запрещен.

Так что пришло время двигаться дальше. Но что могло бы стать следующим большим вызовом?

график цен биткойн

Я наткнулся на Coinbase, крипто-брокера, где меня больше всего интересовал Bitcoin.

Они аккуратно имеют API, через который вы можете подключить ваше любимое торговое программное обеспечение, такое как Metatrader и тому подобное. Но нет.

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

Первая альфа-версия готова. Интерфейс очень уродливый, но форма следует за функцией. Моя идея хорошо продуманного программного обеспечения в первую очередь не является причудливым пользовательским интерфейсом. Скорее, я хочу, чтобы моя программа просто делала свое дело. Абсолютно. На заднем плане. Нечего устанавливать, нечего сидеть перед экраном и говорить программе, что делать дальше. Просто запусти его и смотри в увлечении.

Интерфейс, по сути, состоит из визуализации рыночных данных, а также нормализованных входных данных для ИИ.

Чему я научился? Сначала мне пришлось подключиться к Coinbase. Я много узнал о API и, к счастью, с доступными пакетами это было довольно просто.

Введение в аспект производительности программирования

Мне пришлось многому научиться в структурировании данных для AI, и это в основном включало в себя много знаний о производительности кода. До такой степени, что это становится совершенно безумным. В основном это было связано с тем, что я до сих пор работаю на 7-ми летней машине, которую я вернул с тренировок. Он хорошо состарился, но ты действительно можешь почувствовать возраст..... Со следующего ближайшего компьютера я могу рассчитывать на 10-кратное увеличение производительности для моих случаев использования! Один только процессор примерно на 400% быстрее, если он потребляет много потоков (что я и делаю).

Я оказался в следующей ситуации:

Мой код занимает около недели на обработку 8 лет данных (каждая точка данных 2s ~ 126,000,000 ценовых пунктов). Между тем, до следующего поколения процессоров и видеокарт осталось всего несколько месяцев, и это очень многообещающе.

Объем обрабатываемых данных огромен, поэтому я занялся оптимизацией производительности кода. У меня уже был некоторый опыт работы с многопоточными работниками для решения нескольких задач одновременно. В результате у меня уже была производительность чуть менее 3.5x, так как мой процессор имеет 4 ядра. Теперь на обработку данных за 8 лет ушло 2 дня. Это все еще было слишком. Когда я провожу обратные тесты, я хочу видеть результаты. И я хочу их быстро.

Пришлось больше заниматься оптимизацией производительности и разработать собственную абстракцию работника на основе задачи на C#. По сути, в нем реализован метод изготовления, которому я научился во время стажировки в INA Lahr. Это как иметь машину (или рабочего) с входной и выходной очередью. Очередь действует как буфер и может помочь каждому ядру процессора равномерно распределить работу. Это как модульный, масштабируемый рабочий конвейер, где рабочие могут брать предметы из очереди или сумки и обрабатывать их.

Это также дало большой прирост производительности. Теперь я смог обработать все данные примерно за ночь, но я решил повторить их еще дальше, чтобы посмотреть, как далеко они могут зайти. Я подписался на расширение Visual Studio "dotTrace", которое отлично работает при поиске узких мест в коде. Вы можете записать трассу, а затем посмотреть по функциям, как долго она будет выполняться. Я обнаружил особенность, которой вообще не ожидал - конструктор выходных струн дросселировал весь трубопровод. Подробнее об этом можно прочитать ввопрос о переполнении стека

В общем, процесс довольно простой:

  1. Определить наибольшую мощность нагрузки
  2. Ликвидировать его
  3. Продолжайте делать это до тех пор, пока не получите разумное представление.

В приведенном выше примере это был бы рабочий процесс CLR с ID 10584. На данный момент это звучит немного запутанно, но JetBrains имеет дерево вызовов справа, где мы можем увидеть, какая функция используется:

Выводы и выводы

Я знаю, что в этой области было бы больше власти, но пока что я очень доволен результатом.

Сейчас 2 года пролетает менее чем за 4 минуты, и я переключил передачи, если за действиями нужно следить более внимательно.

скриншот тестера

Сохраняются также строка капитала и статистика. Можно смоделировать / запустить столько счетов и стратегий, сколько вы хотите, с небольшим падением производительности.

Я уже пробовал разные стратегии с индикаторами и так далее. Без многообещающих результатов. В конце концов, я нашел выигрышную стратегию, которая не делает ничего из этого. Он не следует за трендом и не делает против него ставок. Он не пытается ничего предсказать. Ни идеальная точка входа, ни идеальный выход. Это довольно просто, но я не буду вдаваться в детали стратегии. Думай нестандартно и можешь найти что-нибудь.

увеличение капитала

Это огромная 20-процентная годовая прибыль. Честно говоря, я бы сделал больше места со стратегией "покупай и держи", но с другой стороны, я ничего не предсказываю, у нас нет этих безумных шипов (и падений).

Теперь это то, на чем я могу строить и видеть, что возможно, а что нет. Полное моделирование рынка в песочнице. Тестовая среда с практически неограниченными возможностями.

На сегодня все, и я надеюсь, вам понравилось заглянуть в некоторые из моих текущих проектов.