Построение симулятора торгового сценария на Python

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

Поскольку торговля была действительно популярна в течение длительного времени, нет недостатка в таких инструментах, как торговые симуляторы и различные другие платформы, которые позволят вам практиковаться в режиме реального времени. Существует множество бесплатных демо-счетов, где вы можете попробовать свои силы в торговле и увидеть, насколько вы хороши на самом деле. Торговые симы, как правило, дорогие,хотя (по крайней мере, хорошие), поэтому, будучи дешевым коньком, которым я являюсь, я решил попробовать сделать свою собственную бутлег-версию торгового симулятора. Идея заключалась в том, чтобы сделать его как можно более простым и воссоздать ощущение шахматных учебных пособий, где вы получаете конкретный сценарий и должны принять решение. Я создал этот очень простой симулятор на Python и покажу вам, как вы можете собрать эту же программу всего в несколько строк кода и проверить свои навыки на рандомизированных исторических данных. Итак, без лишних слов, давайте посмотрим, что нам понадобится для нашего сима.

Чтобы запустить нашу программу, нам сначала нужно будет установить несколько библиотек. Я лично использую Python 3.10, но вы можете использовать большинство других версий Python 3 с несколькими незначительными изменениями. Во-первых, нам нужно будет установить библиотеку панд, чтобы помочь нам обрабатывать и структурировать наши исторические данные о ценах. Мы также захотим получить хорошую библиотеку визуализации для просмотра наших диаграмм. Для этого я выбрал mplfinance, так как он поставляется со многими встроенными ключевыми функциями диаграммы и может использоваться в одной строке кода. Но если вы чувствуете себя предприимчивым, вы всегда можете использовать matplotlib и перестроить эти функции с нуля и адаптировать их по своему вкусу. С mplfinance в новых версиях есть некоторая ошибка, которая не позволяет ему правильно интерпретировать даты и время, поэтому я понизил свою библиотеку до более ранней версии.

pip3 установить панды
pip3 установить -Iv mplfinance==0.12.9 b7

С нашими двумя установленными пакетами мы можем получить кодирование. Во-первых, давайте импортируем все модули, которые нам понадобятся.

импорт запросы
импорт панд как pd
импорт дата-время
импорт случайный
импорт время
импорта mplfinance как mpf

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

def str_time_prop (начало, конец, time_format, реквизит):
"""Получить время в пропорции диапазона из двух форматированных времен.

start и end должны быть строками, указывающими время, отформатированными в заданном
формате (strftime-style), дающими интервал [start, end].
prop указывает, как определяется доля интервала, которая должна быть взята после
запуска. Возвращаемое время будет в указанном формате.
"""

stime = time.mktime(time.strptime(start, time_format))
etime = time.mktime(time.strptime(end, time_format))

ptime = stime + prop * (etime - stime)

return time.strftime(time_format, time.localtime(ptime))def


random_date(start, end, prop):
return str_time_ prop(начало, конец, '%m/%d/%Y %I:%M %p', prop)

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

def plot_candlestick(df):
# Установите столбец метки времени в качестве индекса
df.set_index('Timestamp', inplace=True)

# Постройте свечной график
mpf.plot(df, type='candle', style='night clouds', volume=True)

Наконец, мы можем определить нашу функцию main() для обработки наших обучающих образцов. В этом примере я буду использовать исторические данные из Binance и буду использовать данные BTCUSD. Но если вы предпочитаете практиковаться на другом инструменте, вы можете просто переключить источник данных. Пока он находится в формате OHLCV, он должен работать с незначительными изменениями. Я решил встроить свой код в цикл while, чтобы я мог продолжать работать, пока у меня не будет достаточно, без необходимости перезапускать программу для каждого примера.

Идея этого алгоритма очень проста:

  1. Выбор случайной даты из предопределенного диапазона дат
  2. Вытащите 100 свечей, начиная с даты/времени начала, которое мы выбрали случайным образом
  3. Отображение этих результатов на диаграмме
  4. (Ручной шаг) позвольте трейдеру принять решение о том, куда пойдет цена, и запишите решение
  5. Вытащите данные за время старта + еще 10 ценовых свечей, так что посмотрите, что произошло
  6. Показать график с «ответом»
  7. Повторите или закройте сценарий
def main():
play = True
while play:
symbol = timeframe "BTCUSD"
= '1h'
start_datetime_string = random_date("01/01/2022 1:30 PM", "01/01/2023 4:50 AM", random.random())
# Binance ожидает, что время будет пройдено в миллисекундах, поэтому нам нужно преобразовать
start_time = int (datetime.datetime.strptime(start_datetime_string, '%m/%d/%Y %I:%M %p').strftime("%s")) * 1000

свечей = requests.get('https://api.binance.us/api/v3/klines?symbol=' + symbol.upper() + '&interval=' + timeframe + '&startTime=' + str(start_time) + '&limit=100').json()

df = pd. DataFrame(candles, columns=['Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume', 'close_time', 'quote_asset_volume', 'trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'])
# Подготовьте данные для удаления неиспользуемых столбцов
df.drop(['close_time' , 'quote_asset_volume', 'trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'], axis=1, inplace=True)
# Установите для всех данных числовые значения
df = df.apply(pd.to_numeric)
df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='ms')

# Построение данных
plot_candlestick(df)

candles_new = requests.get('https://api.binance.us/api/v3/klines?symbol=' + symbol.upper() + '&interval=' + таймфрейм + '&startTime=' + str(start_time + 36000000) + '&limit=100').json()

df2 = pd. DataFrame(candles_new, columns=['Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume', 'close_time', 'quote_asset_volume', 'trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'])
df2.drop(['close_time', 'quote_asset_volume', 'trades' , 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'], axis=1, inplace=True)
df2 = df2.apply(pd.to_numeric)
df2['Timestamp'] = pd.to_datetime(df2['Timestamp'], unit='ms')

plot_candlestick(df2)

user_input = input( 'Нажмите enter, чтобы продолжить игру. Введите <x> если вы хотите остановиться: '),

если user_input == 'x':
play = False

, если __name__ == "__main__":
main()

Как только вы соберете все это вместе, у вас будет простая программа тренера, которую вы можете использовать в любое время и модифицировать в соответствии с вашими потребностями в практике. В будущем я планирую добавить функцию для регистрации моих рассуждений для каждой сделки на этапе принятия решения и сохранить ее в текстовый файл для ведения учета. Также было бы неплохо написать способ размещения ордеров на вход, стоп и прибыль и заставить бота автоматически тестировать их, чтобы увидеть, какие сделки заполняются первыми, и отслеживать PnL. Поэтому, если вам нравятся эти типы diy-скриптов для трейдеров, пожалуйста, следуйте за мной для получения дополнительных статей в ближайшее время. Я надеюсь, что вам понравится и улучшится этот простой инструмент и поделитесь своими мыслями и опытом в комментариях ниже. Желаем вам отличного дня и удачи в вашем торговом путешествии!

Источник