Первая стратегия отработала. Теперь проверим, следуют ли сделки заданным правилам и что означают результаты.

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

Сначала изучите одну сделку

Запустите crossover_strategy.py с длинами 5 и 20. Дождитесь окончания и откройте Trades под графиком. Закрытая панель открывается стрелкой справа.

Таблица содержит вход и выход сделки. Для длинной сделки вход означает покупку, выход продажу.

СтолбецСодержание
TradeНомер сделки и идентификатор входа
Entry timeВремя исполнения входа
Entry priceЦена исполнения входа
Exit timeВремя исполнения выхода
Exit priceЦена исполнения выхода
QtyКоличество
ProfitДенежный итог закрытой сделки
Profit %Процентный итог
Под графиком PyneIDE открыта таблица Trades со временем, ценами и результатами сделок.
Trades позволяет отдельно проверять исполненные входы и выходы.

Нажмите строку сделки и найдите её период на графике. Изучите пересечение перед входом и пересечение, вызвавшее закрытие.

Исходный код не задавал commission_value и slippage, поэтому базовый запуск не содержит расходов, которые мы добавим. Сначала проверьте направление, время и количество без них.

Посчитайте результат простой сделки

Если купить одну единицу по 100 и продать по 103, разница 3. При единичной стоимости пункта и без расходов это и денежный результат.

В общем виде ценовой результат длинной сделки:

(цена выхода − цена входа) × количество × стоимость пункта

Стоимость пункта входит в рыночные метаданные. Она задаёт денежную стоимость изменения цены на одну единицу для позиции размером в одну единицу. В DEMO она равна 1.

Комиссии уменьшают чистый итог. Проскальзывание меняет цену исполнения и уже включено в ценовую разницу. Повторно вычитать его из изменённых цен не нужно.

Представление Performance

Performance показывает изменение капитала за весь запуск. Поля:

  • Cumulative P&L: изменение относительно начального капитала;
  • Max drawdown: наибольшее падение от прежнего максимума исследуемой кривой;
  • Final equity: капитал на последней обработанной свече;
  • Max run-up: наибольший рост от прежнего минимума.
В Performance PyneIDE видны Cumulative P&L, Max drawdown, Final equity и кривая капитала.
Performance показывает кривую капитала и итоги всего запуска.

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

Изучайте промежуточные участки, не только конец кривой. К одинаковому итогу могут привести разные просадки и длительные убыточные периоды.

Представление Stats

Stats показывает подробную статистику в конце. Total Trades помогает проверить число закрытых сделок, Net Profit их суммарный чистый итог.

Profit Factor равен сумме прибылей, делённой на абсолютную сумму убытков. Если убыточных сделок нет, это не обычное конечное число для сравнения.

Доля прибыльных сделок не определяет суммарную прибыль сама по себе. Несколько крупных убытков могут перекрыть много малых прибылей.

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

Расходы в Properties

Откройте настройки шестерёнкой Strategy properties в нижней панели и выберите Properties. Здесь меняются капитал, количество и расходы.

Следующие два запуска нужны для сравнения. Указанные расходы учебные; для реального рынка их задают отдельно.

  1. Проверьте Initial capital 10000 и Order size 1 Contracts.
  2. В Commission задайте 0,1 и единицу % of order value. Можно ввести 0.1.
  3. Установите Slippage 2 тика.
  4. Сохраните через Save, запустите Run Pyne code и дождитесь окончания.
Вкладка Properties настроек стратегии показывает Commission и Slippage.
Properties задаёт комиссию в процентах, проскальзывание в тиках.

0,1 процента не означает 10 процентов: поле выражено в процентных единицах. При исполнении на сумму 100 комиссия равна 0,1. Вход и выход являются исполнениями, расходы возможны у обоих.

Тик является минимальным шагом цены. В DEMO он 0,01, поэтому два тика равны 0,02. Проскальзывание сдвигает рыночное исполнение в невыгодную для стратегии сторону.

У другого рынка тик и стоимость пункта могут отличаться. Не переносите автоматически смысл расходов DEMO на другой инструмент.

Настройка исполнения тоже часть эксперимента

On bar close в Fill orders влияет на время рыночных приказов. Для базовой стратегии оставьте выключенным, чтобы приказ от сигнала исполнялся на следующем открытии.

After order is filled может запрашивать пересчёт после исполнения. Using bar magnifier может исследовать внутрисвечное исполнение на данных меньшего таймфрейма. Это другие условия; при сравнении базового запуска оставьте выключенными.

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

Сохраните условия сравнения

Кнопка Open trades output CSV на панели графика открывает экспорт сделок, Open plot output CSV таблицу нарисованных значений. Файлы есть и в Output проекта.

Перед повторным запуском скопируйте нужный экспорт под другим именем. Имя результата само не определяет все настройки.

В собственных записях сохраните минимум:

ЗапускДанныеБыстрая/медленная длинаКоличествоКомиссияSlippage
БазовыйDEMO5 / 201 единица0%0 тиков
С расходамиDEMO5 / 201 единица0,1%2 тика

Добавьте реальные результаты. Заполните таблицу в своих заметках по выполненным запускам.

Попробуйте самостоятельно

Сравните одну сделку без расходов и с ними. Проверьте цены входа, выхода и прибыль. Что изменилось и что осталось в правиле сигнала?

Решение

Средние и пересечения не вычисляются из комиссии и проскальзывания, поэтому исходные сигналы прежние. Цены рыночного входа и выхода могут стать хуже из-за проскальзывания. Комиссия дополнительно уменьшает чистый итог.

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

Выберите другие данные

После DEMO можно получить рыночные данные через загрузчик PyneIDE. У них другие цены, тик, ограничения количества и сделки. Сначала изучите данные, потом сравнивайте результаты.

  1. Наведите указатель на Data в Pyne слева и нажмите Download Data…, значок стрелки вниз из облака. Откроется Symbol Browser. То же доступно правой кнопкой по заголовку Data.
  2. Выберите Provider. На снимке ccxt; для него конкретный источник выбирается в Broker.
  3. Введите рынок в фильтр. На снимке выбран спотовый BTC/USD из coinbase. Проверяйте полное имя: похожие префиксы могут обозначать разные рынки.
  4. Установите Timeframe 1D, From 365 days back. В To значение now запрашивает данные до времени загрузки.
  5. Нажмите Download и дождитесь завершения.
В Symbol Browser PyneIDE выбран ccxt, источник coinbase, спотовый BTC/USD и дневной таймфрейм.
Источник, рынок, таймфрейм и период вместе определяют загрузку в Symbol Browser.

Справа mintick показывает тик, pointvalue стоимость пункта, mincontract минимальное количество. Проверяйте их и для своих данных. Доступность и требования доступа зависят от поставщика; выбранный запрос данных не использует торговый счёт.

Загруженные данные появятся в Data. Нажмите имя рынка в верхней строке графика стратегии, чтобы выбрать новый набор. График пересчитается; inputs и свойства всё равно проверяйте.

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

Интерпретация запуска

Бэктест считает по правилу, данным и модели исполнения вместе. Он проверяет, делает ли код задуманное и как повёл бы себя в модели. Будущих данных в результате нет.

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