В прошлые выходные мне было скучно, и я искал вызов. Я решил попробовать разработать механизм сопоставления сделок. Для тех, кто не знает, что такое система сопоставления, последует краткое объяснение. Если вы знаете, что такое система сопоставления, перейдите к разделу Моделирование.

Итак, что такое система сопоставления? Ну, если вы хотите купить акции ING (например), вы отправляете заявку на покупку на финансовый рынок («Я хочу купить 10 акций ING за 25 долларов США»). Теперь система сопоставления видит ваш заказ и начинает поиск желающих продать акции ING за 25 долларов США (или меньше). Если есть, транзакция произойдет. Если нет или если ваши ордера совпадают только частично (= вы можете купить только 6 акций за 25 долларов), ваш оставшийся ордер появится в «книге ордеров» на стороне покупки (например, в таблице Excel). с двумя колонками купить и продать (см. также рисунок ниже). Теперь все видят, что есть желающие купить некоторое количество акций ING за 25 долларов.

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

Скачать код можно здесь https://github.com/Bobbakov/orderbook. Это простой механизм сопоставления, поскольку вы можете отправлять ордера только одного типа (лимитные ордера) и существует только один рынок. Я добавлю функции позже.

Симуляторы

Это все хорошо, но что можно сделать с системой сопоставления? Что ж, теперь у нас есть способ сопоставлять входящие заказы (и инициировать транзакции), мы можем моделировать финансовый рынок!

Допустим, мы последовательно отправляем 10 000 ордеров, некоторые из которых являются ордерами на покупку, а некоторые — ордерами на продажу (выбранными случайным образом). Все они имеют цену от 1 до 100 (случайно) и количество от 1 до 10 (случайно). Что случается?

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

Тип:

# Import module
from orderbook_module.py import *
# Initialize market
a = market()
# Start market. We want to see the orderbook and transactions between
# consecutive orders sent. We set speed to 1.
a.orderGenerator(10000, sleeptime = 1, mute_orderbook = False, mute_transactions = False)

Рынок начинает генерировать ордера, и вы увидите:

Примечание: 4-й столбец — цена, а 5-й — количество. Мы зовем этого парня «Берт».

Наблюдение за изменением стакана заявок с течением времени может быть интересно для тех, кто увлечен микроструктурой финансовых рынков (таких как я), но если вы не в восторге, вы также можете просто построить график изменения цены с течением времени:

a.plot()

Таким образом, это цены транзакций, происходящих путем случайной отправки 10 000 заказов подряд. Синим цветом обозначена «цена», зеленым и красным — «волатильность».

Добавим алгоритм маркет-мейкера

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

На практике также может существовать маркет-мейкер, например, всегда готовый купить или продать по определенной цене.

Что произойдет, если мы добавим на рынок маркет-мейкера? Давайте проверим это! У нашего маркет-мейкера есть «алгоритм десять центов», который всегда проверяет, является ли он лучшим предложением (самой высокой ценой покупки в книге заказов) и лучшим предложением (самой низкой ценой продажи в книге заказов). Если он есть, хорошо. Если нет, улучшите лучшую ставку/предложение на 1 евро.

# Initialize new market
b = market()
# Generate 10000 random orders and (possible) market maker orders, 
# one after the other
b.orderGenerator(10000, dime_algo = True)
# Plot the result
b.plot()

Что случается?

Понятно: волатильность (= колебания цены) уменьшается (как и следовало ожидать). Это можно увидеть еще яснее, смоделировав рынок, который сначала отправляет случайные заказы, а затем вводит комбинацию случайных заказов и алгоритм десяти центов:

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

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

Вы можете использовать аналогичную настройку для проверки влияния других алгоритмических торговых стратегий на финансовые рынки. Например: алгоритм следования за трендом, новостной алгоритм и т.д.

Почему вы хотите это сделать? Различные торговые стратегии могут по-разному влиять на рынок (с точки зрения волатильности, спреда и т. д.). Как для регулирующих органов, так и для участников рынка может быть сложно оценить преимущества/риски, связанные с конкретными алгоритмическими торговыми стратегиями.

Возможно (по крайней мере частично) это связано с тем, что разные торговые алгоритмы могут иметь разный эффект в разных рыночных условиях. Используя симуляции, вы можете контролировать окружающую среду, следовательно, сравнивая алгоритмы, использующие одинаковые «входные данные». Таким образом, вы сравниваете яблоки с яблоками. Моделирование — отличный способ сделать это.

Моделирование позволяет проводить «стресс-тестирование» торговых алгоритмов. Вы можете увидеть, как они будут вести себя в различных рыночных условиях. В нашем примере мы предположили, что рынок случайный. Но что, если рынок «напуган»? Готовы продавать в геометрической прогрессии, если цена упадет? Вы можете измерить эффект любого алгоритма на таком рынке. Маркет-мейкер может по-прежнему снижать волатильность. Но алгоритм следования за трендом? Посмотрим (в другой статье).

Вы также можете ввести несколько рынков и алгоритмы торговли между рынками. Я сделаю это в будущей статье.

Это становится особенно интересно, если вы добавите в смесь несколько торговых алгоритмов. Что произойдет, если у вас, например, есть дваалгоритма десятицентовика? Или дваалгоритма следования тренду? Один может быть «хорошим» (по некоторым критериям), а другой — нет.

Обучение с подкреплением

Мы говорим об алгоритмах, основанных на правилах. Например: алгоритм, который отправляет заказ на покупку, если он не является лучшей ставкой. Алгоритм отправляет рыночный ордер на покупку, еслиценовой тренд восходящий. Это интересно, но мы можем добавить уровень сложности.

Что, если мы не будем говорить алгоритму, что делать, кроме того, что он должен максимизировать прибыль? Мы можем обучить его с помощью обучения с подкреплением, чтобы он сам догадался, как он это сделает. Что произойдет, если мы добавим такой алгоритм в смесь? Можем ли мы увидеть, например, что алгоритмы изучают формы манипулирования стаканами только потому, что это оказывается прибыльным? И в какой среде это произойдет? Посмотрим в будущем.

Мне интересно, что вы, ребята, думаете обо всем этом.