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

Что мы называем Pyne code?

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

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

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

Как Pyne связан с Python?

Pyne code использует правила записи Python. Они называются синтаксисом: определяют, например, расположение скобок и обозначение связанных строк. Учить Python заранее не нужно: необходимые правила вы освоите на примерах.

Поэтому файлы имеют обычное для Python расширение .py. Pyne code можно выполнять и в среде Python с установленным PyneCore. Python предоставляет среду исполнения, а PyneCore обеспечивает поведение Pyne и библиотеку функций.

Как программа обрабатывает данные?

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

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

Это отличается от поведения обычной программы Python. Метка @pyne в начале файла сообщает PyneCore, как подготовить и выполнить код. В главе с разбором кода мы изучим точную форму метки и значение edge, которое стоит рядом в примерах книги.

Чем это отличается от векторной обработки?

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

В PyneCore вы описываете действия на текущей свече. Система выполняет их и переходит к следующей. Историей вычислений и сохраняемым состоянием она управляет по правилам языка Pyne.

Шаги записываются в простой функции

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

В примерах Pyne code вы описываете в функции main(), что вычислить и при каких условиях действовать. Её строки выполняются по порядку на каждой свече: вычисление значения, проверка условия, затем отображение сигнала или отправка приказа. Обходом свечей занимается PyneCore.

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

Правило можно проследить во времени

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

Сложнее случайно использовать будущее

При векторной обработке может быть доступен весь набор данных. Сдвиг не в ту сторону или неверно выбранное среднее могут включить цену, ещё неизвестную на момент решения. Например, средняя цена за весь год в январском решении использует цены будущих месяцев. Программа при этом может работать и показывать убедительные результаты; ошибку бывает трудно заметить. Это называется заглядыванием в будущее, или look-ahead bias.

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

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

Возможен компромисс по скорости

Некоторые программы при посвечном исполнении могут работать медленнее хорошо написанного векторного расчёта. Это особенно заметно при проверке множества вариантов стратегии или параметров на больших данных. Векторные системы часто ускоряют массовые вычисления оптимизированными численными библиотеками. Реальная разница зависит от программы и объёма данных.

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

Другие подходы: векторная обработка в VectorBT и посвечные стратегии в Backtrader (на английском).

Для чего нужны PyneIDE и PyneCore?

PyneIDE работает как расширение редактора Visual Studio Code. В нём вы пишете программу, выбираете данные и запускаете её. Там же смотрите результаты на графике и ищете ошибки.

PyneCore выполняет программу. Он загружает и подготавливает её, обрабатывает свечи и формирует результаты расчётов и сделок. PyneIDE использует его в фоновом режиме и отображает результаты.

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