Создание алгоритмической торговой стратегии

Часть 1:

Я уже написал несколько блогов об алгоритмической торговле о том, как войти в систему и получить необходимые токены и получить исторические данные с помощью исторического API Kite здесь, а также как размещать заказы на основе условий и получать данные потоковой передачи в реальном времени с помощью веб-сокета здесь.

В этой статье я соберу знания обеих статей и сделаю полноценный рабочий и автоматизированный скрипт для ведения AlgoTrading.

ЗНАКОМСТВО

Можно в любой момент разместить ордер на покупку или продажу с помощью Kite API. Но AlgoTrading — это все о том, когда размещать эти заказы на основе стратегий и, самое главное, как автоматизировать этот процесс. Используя Python и Selenium, можно полностью автоматизировать этот процесс без какого-либо вмешательства человека.

СОДЕРЖАНИЕ

1. Стратегия, подлежащая автоматизации

2. Параметры и файлы учетных данных

3. Автоматизация процесса входа в систему

4. Кодирование стратегии

— 4.1 Высокий интервал выборки и низкий интервал

— 4.2 Создать условие для входа в сделку.

— 4.3 Создать условия для выхода из сделки.

5. Заключение

6. Дальнейшие улучшения

1. Стратегия, подлежащая автоматизации

AlgoTrading — это больше о торговле, основанной на стратегии, построенной на тестировании исторических показателей акций. Проведение обширного тестирования на основе предыдущих данных может помочь понять будущее поведение.

Стратегия, которая будет автоматизирована, выглядит следующим образом:

  1. Автоматический вход в учетную запись zerodha с помощью веб-драйвера Selenium.
  2. Проверка интервала максимума и минимума ровно в 11 часов утра в режиме реального времени.
  3. Вход в сделку при пробое ценой интервала максимума или минимума.
  4. Вход в сделку запрещен, если не пробиты ни максимум, ни минимум.
  5. Если сделка открыта, выход из сделки, когда цена пробивает заранее определенную цель или стоп-лосс.
  6. Выход из сделки в 15 часов. Какой бы ни была позиция.

2. Файлы параметров и учетных данных

Для автоматического входа в систему учетные данные, такие как идентификатор пользователя, пароль, totp, ключ API и секрет API, должны быть переданы функциям. Лучше всего хранить эту информацию в формате json или yaml.

Формат JSON — это стандартный текстовый формат для представления структурированной базы данных. Можно хранить информацию в виде словарной пары ключ-значение в json, как показано ниже

https://wire.insiderfinance.io/media/fdb538376b9f7462a217fdaffd8af706

Доступ к этим параметрам и их хранение в переменных в python можно получить, используя следующий код:

https://wire.insiderfinance.io/media/6a2cd6e63473d8c74e7c25065c0b4133

Точно так же торговые параметры, такие как торговый символ, тикер, количество, время выхода из сделки и т. Д. также должны храниться в yaml следующим образом…

https://wire.insiderfinance.io/media/648b047faaa9e9db368ec6a28e6163da

ticker_symbol : символ инструмента, который необходимо передать в функции, чтобы получить интервал High Low. например, ‘NSE:ONGC’ или ‘NFO:BANKNIFTYMAYFUT’.

trading_symbol торговое название инструмента, который будет использоваться для размещения ордеров. например, «ONGC» или «BANKNIFTYMAYFUT».

Количествоколичество акций, которые будут торговаться.

exit_hour & exit_minute : час и минута, в течение которых сделка будет закрыта, если она не вызовет условий выхода.

target_param если сделка открыта, целью будет интервальный максимум/минимум плюс/минус этот target_param например, если интервальный максимум пробит, целью будет интервальный максимум + target_param, а если пробит минимум, целью будет интервальный минимум target_param.

sl_param : если интервальный максимум пробит, стоп-лосс будет интервальным максимумом -sl_param а если минимум пробит, это будет интервальный минимум + target_param.

Чтение и сохранение переменных файла yaml с помощью следующего кода:

https://wire.insiderfinance.io/media/e2f55211f0c2535fe8122e293f7a2945

Заметка:

1. Имя файла JSON должно заканчиваться расширением .json, например, login_credentials.json, а имя файла yaml должно заканчиваться расширением .yaml, например login.yaml

2. Убедитесь, что эти файлы находятся в том же месте, где хранится основной код.

3. Автоматизация процесса входа в систему

Процесс AlgoTrading начинается с автоматического входа в вашу учетную запись Zerodha и генерирует сессию Kite. Используя Python и библиотеку Kite kiteconnect, процесс входа в систему может быть легко автоматизирован при условии, что все учетные данные для входа хранятся в переменной.

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

https://wire.insiderfinance.io/media/6156582a8add53a9c90341c9d9ec1edf

после того, как будет сгенерирована кайт-сессия; Маркер запроса и доступа может быть сгенерирован из следующего кода;

https://wire.insiderfinance.io/media/31abe8dc2b095890c50f4356345d43e7

Мы будем перенаправлены на страницу входа. Используя Selenium, учетные данные для входа могут быть вставлены автоматически…

https://wire.insiderfinance.io/media/9769f159aa36e44e10fd2a4315a28381

После успешного входа в систему выполните следующий код, чтобы получить токен доступа и установить соединение между python и kite API.

https://wire.insiderfinance.io/media/1dac602832c2ce59a9ffc763f9ff3d4c

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

4. Кодирование стратегии

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

4.1 Интервал выборки высокого и низкого интервала

Интервальный максимум — это самая высокая цена для определенного интервала времени, а интервальный минимум — самая низкая цена для этого конкретного интервала времени. Допустим, наша стратегия состоит в том, чтобы войти в сделку, когда ltp (последняя торгуемая цена) пробивает интервальный максимум или интервальный минимум.

Их можно получить с помощью функции kite.quote воздушного змея.

https://wire.insiderfinance.io/media/0c24c2d4d53d305c99bced6f9f307071

Выполните приведенный выше код в то время, до которого требуется интервал максимум или минимум. Мы запустим приведенный выше код ровно в 11 часов утра, чтобы получить высокий минимум до 11 часов утра.

4.2 Создать условие для входа в сделку

Мы не хотим следить за ltp каждую секунду, чтобы увидеть, когда он пробивает интервальный максимум или минимум, и входить в сделку вручную. Мы можем автоматизировать этот процесс с помощью python.

Перед созданием условий мы создаем функцию, которая является функцией заказа, используемой для размещения заказа. Функция kite.place_order() используется для размещения ордеров.

https://wire.insiderfinance.io/media/54a79264df9dc33d0bb30b4753afcaf3

Следующая функция — условие входа, которое будет проверять ltp каждые 5 секунд, и как только цена пробьет максимум или минимум, функция ордера будет выполнена, и ордер будет размещен.

https://wire.insiderfinance.io/media/74ced1fc6957d6f7336558992f822b7c

Одна из возможностей заключается в том, что цена не пробивает ни максимум, ни минимум. В этом случае функция ордера не будет выполнена, и цикл прервется при выходе. 15:25 в данном случае. (убедитесь, что время указано в 24-часовом формате)

Мы используем метод try and exception, чтобы игнорировать такие ошибки, как ошибки подключения или ошибки времени выполнения, которые могут возникнуть во время этого процесса, и продолжать работу без перерыва.

4.3 Создать условия для выхода из сделки

Если сделка была введена автоматически, сделка также может быть закрыта на основе условия и стратегии автоматически. Предполагая, что интервальный максимум был пробит, происходит вход в сделку и покупка акций, т.е. ПОКУПКА.

Target и Stop-loss могут быть установлены на основе максимума и минимума интервала. В этом случае### In case of High breach :target = int_high + target_param = (170 + 5)
stop-loss = int_high — sl_param = (170 — 7)Target trigger : ltp ≥ target
stoploss trigger : ltp ≤ stoploss### Stock has to be sold in Exit condition

Функция Follow Exit condition проверяет наличие ltp каждые 5 секунд. Как только цель пробита, функция ордера выполняется, акции продаются, а сделка выходит с прибылью. Если стоп-лосс пробит, акция продается, и сделка закрывается, но с убытком.

https://wire.insiderfinance.io/media/a529c5faec666b577bd5b1b84a232b59

Одна из возможностей заключается в том, что ни цель, ни стоп-лосс не пробиты. В этом случае мы выходим из сделки в определенное время выхода, которое заранее определено (exit_hour, exit_minute. 15:00 здесь).

Вместо высокого прорыва, если бы был низкий прорыв, торговля была бы короткой, а не длинной. Параметры изменятся в таких случаях, как:### In case of low breach :target = int_low — target_param = (165 — 5)
stop-loss = int_low + sl_param. = (165 + 7)Target trigger : ltp ≤ target
stop-loss trigger : ltp ≥ stoploss### stock has to be bought in Exit condition.

В этом случае функцией заказа будет order(trading_symbol, «BUY», количество, кайт)

Заметка:

1. В случае торговли фьючерсами и опционами «NSE» следует заменить на «NFO» в параметре обмена в функции ордера

2. Order_type может быть «рыночным» или «лимитным» в зависимости от требований.

3Продукт является «MIS» для внутридневного использования. Это может быть «NRML» для ночного положения

4. Для получения дополнительной информации о функции place_order() ознакомьтесь с официальной документацией здесь.

5. Заключение

  • Мы увидели, как хранить учетные данные для входа и торговые параметры в формате json или yaml.
  • Мы увидели, как автоматизировать процесс входа в учетную запись zerodha с помощью веб-драйвера selenium.
  • Мы увидели, как пример стратегии может быть закодирован на python.
  • Как получать высокие и низкие интервалы в режиме реального времени с помощью API Kite.
  • Мы создавали условия входа и исполняли ордера автоматически.
  • Мы создавали условия выхода и исполняли ордера автоматически.

6. Дальнейшие улучшения

Я буду писать больше статей о том, как сделать этот процесс алгоритмической торговли еще более эффективным.

  • В своих последующих блогах я расскажу о том, как хранить данные в реальном времени. т.е. как записать информацию в файл, чтобы мы могли проанализировать, что произошло во время выполнения кода и все ли работало нормально. Загляните в блог здесь
  • Мы создадим Telegram-бота и интегрируем его с нашим кодом, чтобы получать обновления в мессенджере Telegram о том, когда была совершена сделка и по какой цене, и многое другое…

Часть 2

В моих последних статьях рассказывалось о том, как развернуть стратегию для алгоритмической торговли. От процесса автоматического входа в систему до входа и выхода из рынка все было автоматизировано. Проверьте это здесь

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

СОДЕРЖАНИЕ

1. Введение в ведение журнала

2. Использование логирования в AlgoTrading

3. Ведение журнала и его уровни серьезности событий

4. Сохранение событий в лог-файле

5. Интеграция логирования с нашим предыдущим кодом

6. Заключение

7. Дальнейшие улучшения

1. Введение в ведение журнала

Хранение информации и ее сохранение очень важно в любой сфере. Анализ данных после событий дает представление о том, что на самом деле произошло во время процесса, и может помочь нам понять, что может произойти дальше.

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

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

К счастью, у нас есть библиотека на python, которая позволяет нам создавать файлы журналов, чтобы мы могли хранить информацию. Модуль ведения журнала Python можно использовать для регистрации событий.

2. Использование логирования в AlgoTrading

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

Таким образом, ведение журнала играет важную роль в нашем коде для понимания событий. Допустим, мы записали всю эту информацию в файл. Мы регистрировали ltp (последнюю торгуемую цену) акции каждые 2 секунды, когда происходил вход в сделку и когда сделка выходила, это выглядело бы так…

Здесь мы видим, что записывается ltp за каждые 2 секунды, а также отображаются дата и время входа в сделку.

Допустим, произошла ошибка в соединении, и кайт не смог получить ltp из своего API, в таком случае возникает ошибка HTTPSConnectionPool. Он также может быть зарегистрирован в файлах, как показано ниже… Далее мы увидим, как регистрировать эти события.

3. Ведение журнала и его уровни серьезности событий

Уровни серьезности и их эквивалентные числовые значения

Logging — это модуль Python в стандартной библиотеке, который предоставляет возможность работать с фреймворком для выпуска сообщений журнала из программ Python. Модуль ведения журнала предлагает пять уровней, определяющих серьезность событий.

  1. ОТЛАДКАОн используется для предоставления подробной информации и используется только при наличии диагностических проблем.
  2. ИНФОРМАЦИЯ Он предоставляет информацию о том, что все работает так, как мы хотим.
  3. ПРЕДУПРЕЖДЕНИЕ Он используется, чтобы предупредить о том, что что-то произошло неожиданно, или мы столкнемся с проблемой в ближайшее время.
  4. ОШИБКАОн используется для информирования, когда у нас серьезные проблемы, программное обеспечение не выполнило некоторые программы.
  5. КРИТИЧЕСКИЙ В нем указывается серьезная ошибка, сама программа может быть неспособна продолжать выполняться.

Эти уровни можно использовать в соответствии с нашими потребностями и регистрировать события. Давайте посмотрим на пример…

https://medium.com/media/f56f8698b8c63f22c97934a954f2d451

Обратите внимание, что сообщения debug() и info() не отображали сообщения, так как по умолчанию модуль журнала регистрирует сообщения с уровнем серьезности WARNING, ERROR и CRITICAL. Хотя мы можем установить уровень серьезности и регистрировать события по своему усмотрению.

4. Сохранение событий в лог-файле

Приведенный выше пример дает вывод только в консоли. Если мы хотим сохранить их в файле, мы должны использовать функцию basicConfic(). Модуль ведения журнала предоставляет basicConfig(**kwarg), используемый для настройки ведения журнала.

https://medium.com/media/793375e72452ab4ea7edc2a7f36e97f6

BasicConfig принимает четыре основных аргумента…

  • Имя файла В нем указывается имя файла.
  • Файловый режимОн открывает файл в определенном режиме. Режим открытия файла по умолчанию — «a», что означает, что мы можем добавить содержимое. «w» означает написание.
  • ФорматФормат определяет формат сообщения журнала.
  • Уровень Указанный уровень серьезности задается корневым уровнем.

Файл будет сохранен с именем test.log а содержимое будет выглядеть так…

Мы можем установить уровень серьезности в basicConfig(), передав аргумент level. Установив для серьезности значение INFO, каждое сообщение будет регистрироваться в файле.

https://medium.com/media/66c6d7c9bb3a9abbce13b8f522abd412

5. Интеграция логирования с нашим предыдущим кодом

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

Сначала мы создаем объект ведения журнала, устанавливаем серьезность и имя файла.

https://medium.com/media/41cd8a9d4c033a4b801320b620ff4f62

Приведенный выше код будет регистрировать события в файле с именем, например, 13_5_2022_BANKNIFTYMAYFUT.log

  1. Допустим, мы хотим регистрировать интервал максимума, минимума, ltp запаса каждые несколько секунд в файле. Как только условие входа удовлетворит, в файл войдет информация о том, что сделка введена и по какой цене.

https://medium.com/media/e6225ccd958c5ecb9e8d6d2c96546c52

Если условие входа выполнено, но во время процесса возникло мало ошибок. Файл журнала будет выглядеть так…

2. Теперь, допустим, после входа в сделку мы хотим увидеть, когда было выполнено условие выхода и что было целевым и стоп-лоссом. Код будет таким…

https://medium.com/media/f74571486a26e7d5591d236498a97805

Если условие выхода выполнено, файл журнала будет выглядеть так…

6. Заключение

  • Мы увидели, что такое модуль Logging в python.
  • Чем может быть полезна запись серии событий в AlgoTrading.
  • Уровни серьезности (отладка, информация, предупреждение, ошибка и критический).
  • Как создать файл журнала, изменить уровень серьезности и определить его формат.
  • И, наконец, как интегрироваться с нашим кодом, чтобы регистрировать каждое событие, происходящее во время процесса.

7. Дальнейшие улучшения

Очевидно, что регистрация событий в файле полезна для понимания того, что происходит, но нельзя постоянно следить за событиями. Если бы можно было получать обновления в режиме реального времени, было бы здорово…

Итак, в своей следующей статье я расскажу о том, как получать обновления (сообщения) в режиме реального времени в вашем приложении Telegram. Мы создадим Telegram-бота, который будет сообщать нам о том, когда была совершена сделка и завершена в режиме реального времени. 

В моих последних двух статьях, Deploying AlgoTrading Strategy Part-1 и Part-2рассказывалось о том, как развернуть торговую стратегию на python с помощью API Kite и как регистрировать торговые события в файле журнала в режиме реального времени. В этом блоге мы еще больше усовершенствуем нашу стратегию, получая обновления телеграмм на наши устройства о торговых событиях…

СОДЕРЖАНИЕ

1. Внедрение и использование ботов в AlgoTrading

2. Создайте Telegram Bot и активируйте его

3. Создайте идентификатор чата

4. Отправить сообщение через бота

5. Интеграция бота с нашей стратегией

6. Заключение

1. Внедрение и использование ботов в AlgoTrading

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

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

Чтобы получать такие обновления, нам нужно создать бота и активировать его, получить его токен бота, получить идентификатор чата и, наконец, интегрировать его с нашим кодом.

2. Создайте Telegram Bot и активируйте его

Чтобы создать телеграм-бота, выполните следующие действия:

1. Войдите в приложение Telegram на своем устройстве или в Telegram Web для ПК.

2. После входа в систему в строке поиска наберите @BotFather. Нажмите на результат, который имеет синюю галочку.

3. Откроется окно чата… Вам нужно нажать на Пуск

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

5. Нажмите на /newbot или введите /newbot в чате и нажмите Enter.

6. Теперь вам нужно ввести имя вашего бота.

7. Теперь введите имя пользователя вашего бота. Он должен быть уникальным и должен заканчиваться словом «бот».

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

9. После завершения этого процесса найдите имя пользователя в поле поиска и выберите своего бота. Нажмите кнопку Пуск. Теперь ваш бот готов к отправке сообщений.

Заметка: Если у вас уже есть бот и вы не знаете токен доступа, просто перейдите в @BotFather > /start > /mybots > API Token

3. Создайте идентификатор чата

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

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

1. Перейдите по следующей ссылке в вашем браузере… Не забудьте передать маркер доступа бота

Токен доступа https://api.telegram.org/bot<bot>/getUpdates

Если все прошло нормально, вы получите что-то подобное в результате

2. Теперь отправьте любое сообщение своему боту, например «Привет», и снова обновите ссылку. У вас должно получиться что-то вроде этого…

Теперь вы можете увидеть свой чат. Это 10-значное число. Сохраните его, так как нам нужно использовать его в нашем коде вместе с маркером доступа.

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

4. Отправить сообщение через бота

Теперь, когда мы знаем токен доступа и идентификатор чата, мы можем отправлять сообщения через бота с помощью python. Есть много способов сделать это с помощью таких модулей, как телемарафон, телебот и т. Д. Но мы отправим его с помощью модуля requests. Модуль requests позволяет отправлять HTTP-запросы с помощью Python

https://medium.com/media/a17d9ec4a486d5a0209b0ccce1e7e748

После выполнения вышеуказанного кода мы получим сообщение

5. Интеграция телеграм-бота с нашим кодом

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

https://medium.com/media/5ac24563624522a5898b1ff53a5e2b1e

Мы добавим эту функцию в наши условия входа и выхода в коде, чтобы получать сообщения, когда она запускает условие

https://medium.com/media/4bf041e4a638654fd15fa043bb746300

Точно так же мы можем добавить эту функцию к нашему условию выхода…

https://medium.com/media/fec3d85619d96fbf01123044e97be028

Допустим, сработали условия входа и выхода, мы бы получили такие обновления…

Итак, вот как мы можем просмотреть события торговли с помощью бота в телеграмме.

6. Заключение

  • Мы увидели использование ботов в AlgoTrading.
  • Мы создали бота в телеграме и активировали его.
  • Мы увидели, как получить токен доступа для нового бота (или существующего бота) и идентификатор чата.
  • Мы увидели, как отправлять сообщения через бота с помощью модуля запросов.
  • Наконец, мы интегрировали бота с нашим кодом, чтобы получать своевременные обновления событий.

Источник