Transcription
Всем привет!
Представляю вашему вниманию курс «Трейдинг на Python». Цель курса: показать вам, как бесплатно автоматизировать торговые стратегии. К сожалению, с помощью языка Pine Script реализовать бесплатную автоматизацию стратегий невозможно. Однако с этой задачей прекрасно справляется Python.
Поэтому давайте разберёмся, как с помощью языка Python написать торговый терминал для бесплатной автоматизации стратегий. Разработка торгового терминала предполагает знание основ некоторых пакетов Python. Пакет Python — это набор модулей.
В первом уроке мы познакомимся с пакетом для обработки и анализа данных pandas. В первую очередь посмотрим, как устанавливаются пакеты Python через Visual Studio. Нажимаем кнопку «Управление пакетами для этой среды». В открывшемся окне «Окружения Python» нажимаем «Добавить среду». Далее в новом окне выбираем «Среда Conda» и нажимаем создать.
Так создается пользовательское окружение, которое можно использовать из Visual Studio. После того, как окружение создано, в него можно установить необходимые пакеты Python. Для этого выбираем созданное окружение, затем из этого списка выбираем «Пакеты PyPI», и ниже указываем название пакета, который необходимо установить. После этого кликаем по следующей строке. Таким образом, пакет pandas установится в пользовательское окружение.
Помимо этого, пакеты Python можно устанавливать в системное окружение. Стоит показать, как это делается без Visual Studio. Запускаем командную строку и пишем pip install, а затем название пакета. В данном случае менеджер пакетов pip установит pandas в системное окружение.
Именно это окружение используется по умолчанию при запуске проектов Visual Studio. Однако при работе с Visual Studio использовать пакеты системного окружения не рекомендую. В некоторых случаях это может привести к ошибке, и программа не запустится. Поэтому советую создать пользовательское окружение и установить в него необходимые пакеты Python.
Приступим к изучению основ пакета pandas. Работа с pandas начинается с его подключения. При этом, как правило, в инструкцию import включают общепринятый псевдоним pd. В pandas можно выделить две основные структуры данных.
Первая структура называется серия. Это упорядоченный изменяемый одномерный массив, способный хранить данные любого типа. Получить серию можно путём передачи классу Series какой-либо структуры данных или последовательности. В этом примере классу передаётся список. При выводе серии слева от её элементов отображаются метки, которые указывают на конкретный элемент. Метками могут быть данные любого типа. Вместе метки называются индексом.
При создании серии индекс можно указать явно, передав параметру index объект, содержащий необходимые метки. Здесь же параметру name можно передать имя серии. В результате получим серию с именем close, метками которой являются строки.
Вторая основная структура данных называется датафрейм. Это упорядоченный изменяемый двумерный массив, способный хранить данные любого типа. Создать датафрейм можно с помощью вызова класса DataFrame. Первым аргументом классу передаётся структура данных. В данном случае двумерный список.
Помимо этого, параметру columns можно передать объект, содержащий имена столбцов. В результате получим таблицу из пяти строк и пяти столбцов. Обратите внимание, что датафрейм, как и серия, имеет индекс. Индекс можно явно указать при вызове класса DataFrame. Однако в нашем случае индексом удобно сделать столбец time.
Для этого из датафрейма необходимо вызвать метод set_index и передать ему имя столбца. Данный метод вернёт изменённый датафрейм, который можно присвоить той же переменной. Так мы получим датафрейм с индексом из столбца time.
Следует знать, что датафрейм также можно получить с помощью функции read_csv. Этой функции достаточно передать путь к csv файлу. Причем по умолчанию данные из первой строки файла функция превращает в имена столбцов. Поэтому будущие имена столбцов датафрейма удобно расположить в первой строке csv файла.
Рассмотрим некоторые методы и атрибуты, предназначенные для просмотра данных датафрейма и серии. Метод head возвращает первые n строк датафрейма или первые n элементов серии. По умолчанию параметр n метода head равен 5. Следовательно, если методу ничего не передавать, то он вернёт максимум пять начальных строк датафрейма или пять начальных элементов серии.
Аналогичный метод tail возвращает последние n строк датафрейма или последние n элементов серии. Параметр n также по умолчанию равен 5. Перейдем к атрибутам. Первый атрибут называется shape. Вообще shape является свойством. Свойство, проще говоря, — это метод, который не нужно вызывать.
Эту конструкцию языка Python в прошлых уроках мы не разбирали. Поэтому для упрощения будем говорить о свойствах, как об атрибутах, за той лишь разницей, что такие атрибуты будут не ссылаться на объекты, а возвращать их. Итак, атрибут shape возвращает кортеж, содержащий размеры датафрейма или размер серии.
В случае датафрейма первый элемент кортежа означает количество строк, а второй элемент — количество столбцов. В случае серии кортеж будет содержать только одно число — количество элементов серии. Следующий атрибут index ссылается на индекс датафрейма или серии. С помощью этого атрибута индекс можно изменить.
Например, воспользоваться функцией to_datetime и заменить UNIX-время датами и временем. Последние два атрибута в этом примере — это columns и name. Первый атрибут ссылается на имена столбцов датафрейма, а второй атрибут возвращает имя серии.
Теперь давайте разберём несколько способов выбора данных из датафрейма. Для выбора данных, как и при работе со списками, используются квадратные скобки. Первый способ заключается в том, чтобы ставить данный оператор после атрибута iloc. В таком случае выбор данных осуществляется по позиции. Нумерация позиций строк и столбцов датафрейма начинается с 0.
Результатом следующей команды будет серия из элементов первой строки датафрейма. В первую очередь в квадратных скобках указывается номер позиции строки. Номер позиции столбца при необходимости указывается через запятую. Такой командой мы получим число из первой строки и первого столбца датафрейма.
Кроме того, оператору через двоеточие можно передавать индексы для извлечения среза. В данном случае срез происходит одновременно по строкам и столбцам. Обратите внимание, что удаленные друг от друга столбцы получены благодаря указанию через второе двоеточие шага для среза по столбцам.
Также в квадратных скобках допускается указывать списки с номерами позиций строк или столбцов датафрейма. Следующий способ выбора данных заключается в том, чтобы ставить квадратные скобки после атрибута loc. Данный способ отличается от предыдущего тем, что выбор данных происходит по меткам строк и именам столбцов. То есть по названию.
Чтобы вы могли лучше сориентироваться, вторая группа выражений эквивалентна первой группе. И третий способ выбора данных, который мы рассмотрим — это упрощенная смесь первых двух способов. Без использования атрибута iloc или loc из датафрейма можно выбирать либо строки, либо столбцы.
В случае выбора строк в квадратных скобках указываются индексы для извлечения среза, а в случае выбора столбцов — имя одного столбца или список из нескольких имен столбцов датафрейма. Следующее, что хочу вам показать, — это некоторые операции, применимые к сериям и датафреймам.
В первую очередь отмечу арифметические операции. Серии и датафреймы можно складывать, умножать, делить и т.д. В этом примере складываются элементы двух серий. Результатом такой операции будет серия, каждый элемент которой является суммой элементов отдельных серий.
Также к структурам pandas применимы операции с константами. Например, каждый элемент серии можно умножить на число 5. Далее в этом скрипте идут операции сравнения и логические операции. Результатами таких операций являются серии или датафреймы, элементы которых имеют логический тип.
В логических операциях со структурами pandas используются побитовые операторы. Тильда — это побитовое отрицание (аналог оператора not). Амперсанд — это побитовое «И» (аналог оператора and). И вертикальная черта — это побитовое «ИЛИ» (аналог оператора or).
Важно отметить, что приоритет побитовых и логических операторов не совпадает. Поэтому советую открыть документацию Python и посмотреть приоритеты побитовых операторов относительно других. Переходим к третьей группе операций. Серии и датафреймы имеют множество методов для вычисления статистических показателей.
В качестве примера вызовем из датафрейма метод max. В результате получим серию, каждый элемент которой является максимальным значением столбца датафрейма. То есть поиск максимальных значений был проведён по индексу для каждого столбца. При этом поиск можно провести по столбцам для каждой метки индекса. За это отвечает параметр axis.
По умолчанию он равен 0. Если же параметру передать 1, тогда получим серию, каждый элемент которой является максимальным значением строки датафрейма. Следующие три метода позволяют некоторым образом преобразовывать серии или датафреймы. Метод transpose используется для транспонирования датафреймов.
Метод возвращает новый датафрейм, в котором строки и столбцы поменяны местами. Второй метод shift сдвигает строки датафреймов или элементы серий на указанный шаг. По умолчанию шаг равен 1. Это означает, что каждая строка датафрейма или каждый элемент серии увеличат номер позиции на 1.
То есть это смещение вниз и потеря последних данных. При этом на место начальных данных вставляются значения nan (nan расшифровывается как not a number или не число). Для смещения данных вверх шаг необходимо сделать отрицательным.
И третий метод rolling реализует метод скользящего окна. Если вы не слышали о таком методе, то посмотрите на датафреймы скользящего окна, и вам станет понятна логика данного метода. Метод rolling открывает массу возможностей. Например, если из объекта, который вернул метод rolling, вызвать метод mean, то получится серия или датафрейм из значений простого скользящего среднего.
При этом период скользящего среднего будет равен размеру окна, который передаётся методу rolling. Также следует знать о конкатенации объектов pandas. Для конкатенации серий или датафреймов используется функция concat. В этом примере объединяются две серии, и в результате получается датафрейм.
Обратите внимание, что серии передаются функции списком. Кроме того, параметру axis передается 1, чтобы серии объединились по горизонтали. Если же параметру передать 0, тогда серии объединятся по вертикали в одну серию.
В заключение урока хочу предложить вам самостоятельную работу. Работа заключается в том, чтобы переписать данные функции, протестировать их и детально изучить. Это функции для анализа временных рядов. Разрабатывались они как аналогичные одноименным функциям языка Pine Script.
Следовательно, общую информацию об этих функциях можете найти в справочнике языка Pine Script. Данный модуль является частью торгового терминала. Поэтому, переписав его, вы уже начнёте разработку терминала.
Поскольку мы коснулись лишь основ пакета pandas, у вас наверняка возникнет потребность в дополнительной информации при изучении показанных функций. Дополнительную информацию советую искать на официальном сайте пакета pandas. Ссылку найдёте в описании данного урока.
На этом сайте помимо множества полезных статей есть также поисковик, с помощью которого можно быстро найти информацию о любом объекте pandas. Причем помимо описания объекта вы также найдете примеры его использования. Это весьма удобный способ получения исчерпывающей информации о компонентах пакета pandas.
На этом закончим первый урок. Свои вопросы оставляйте в комментариях. Всем пока!