Читайте результаты бэктеста
Проверьте стратегию по сделкам и сравните влияние расходов.
Первая стратегия отработала. Теперь проверим, следуют ли сделки заданным правилам и что означают результаты.
Демонстрационные данные книги искусственные. Они позволяют проверить программу, но не определяют ожидаемую доходность реального рынка.
Сначала изучите одну сделку
Запустите crossover_strategy.py с длинами 5 и 20. Дождитесь окончания и откройте Trades под графиком. Закрытая панель открывается стрелкой справа.
Таблица содержит вход и выход сделки. Для длинной сделки вход означает покупку, выход продажу.
| Столбец | Содержание |
|---|---|
Trade | Номер сделки и идентификатор входа |
Entry time | Время исполнения входа |
Entry price | Цена исполнения входа |
Exit time | Время исполнения выхода |
Exit price | Цена исполнения выхода |
Qty | Количество |
Profit | Денежный итог закрытой сделки |
Profit % | Процентный итог |

Нажмите строку сделки и найдите её период на графике. Изучите пересечение перед входом и пересечение, вызвавшее закрытие.
Исходный код не задавал commission_value и slippage, поэтому базовый запуск не содержит расходов, которые мы добавим. Сначала проверьте направление, время и количество без них.
Посчитайте результат простой сделки
Если купить одну единицу по 100 и продать по 103, разница 3. При единичной стоимости пункта и без расходов это и денежный результат.
В общем виде ценовой результат длинной сделки:
(цена выхода − цена входа) × количество × стоимость пунктаСтоимость пункта входит в рыночные метаданные. Она задаёт денежную стоимость изменения цены на одну единицу для позиции размером в одну единицу. В DEMO она равна 1.
Комиссии уменьшают чистый итог. Проскальзывание меняет цену исполнения и уже включено в ценовую разницу. Повторно вычитать его из изменённых цен не нужно.
Представление Performance
Performance показывает изменение капитала за весь запуск. Поля:
- Cumulative P&L: изменение относительно начального капитала;
- Max drawdown: наибольшее падение от прежнего максимума исследуемой кривой;
- Final equity: капитал на последней обработанной свече;
- Max run-up: наибольший рост от прежнего минимума.

Equity может учитывать изменяющуюся стоимость открытой позиции. Поэтому финальный капитал не всегда равен начальному плюс прибыли закрытых сделок. Проверьте позицию, оставшуюся открытой.
Изучайте промежуточные участки, не только конец кривой. К одинаковому итогу могут привести разные просадки и длительные убыточные периоды.
Представление Stats
Stats показывает подробную статистику в конце. Total Trades помогает проверить число закрытых сделок, Net Profit их суммарный чистый итог.
Profit Factor равен сумме прибылей, делённой на абсолютную сумму убытков. Если убыточных сделок нет, это не обычное конечное число для сравнения.
Доля прибыльных сделок не определяет суммарную прибыль сама по себе. Несколько крупных убытков могут перекрыть много малых прибылей.
Малое число сделок легко даёт обманчивые итоги. Всегда рассматривайте количество вместе с другими показателями и изучайте отдельные убыточные сделки.
Расходы в Properties
Откройте настройки шестерёнкой Strategy properties в нижней панели и выберите Properties. Здесь меняются капитал, количество и расходы.
Следующие два запуска нужны для сравнения. Указанные расходы учебные; для реального рынка их задают отдельно.
- Проверьте Initial capital 10000 и Order size 1 Contracts.
- В Commission задайте 0,1 и единицу % of order value. Можно ввести
0.1. - Установите Slippage 2 тика.
- Сохраните через Save, запустите Run Pyne code и дождитесь окончания.

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 |
|---|---|---|---|---|---|
| Базовый | DEMO | 5 / 20 | 1 единица | 0% | 0 тиков |
| С расходами | DEMO | 5 / 20 | 1 единица | 0,1% | 2 тика |
Добавьте реальные результаты. Заполните таблицу в своих заметках по выполненным запускам.
Попробуйте самостоятельно
Сравните одну сделку без расходов и с ними. Проверьте цены входа, выхода и прибыль. Что изменилось и что осталось в правиле сигнала?
Решение
Средние и пересечения не вычисляются из комиссии и проскальзывания, поэтому исходные сигналы прежние. Цены рыночного входа и выхода могут стать хуже из-за проскальзывания. Комиссия дополнительно уменьшает чистый итог.
Прямое сравнение допустимо при одинаковых inputs, количестве, данных и режиме исполнения, если приказы могут исполниться в обоих случаях.
Выберите другие данные
После DEMO можно получить рыночные данные через загрузчик PyneIDE. У них другие цены, тик, ограничения количества и сделки. Сначала изучите данные, потом сравнивайте результаты.
- Наведите указатель на Data в Pyne слева и нажмите Download Data…, значок стрелки вниз из облака. Откроется Symbol Browser. То же доступно правой кнопкой по заголовку Data.
- Выберите Provider. На снимке
ccxt; для него конкретный источник выбирается в Broker. - Введите рынок в фильтр. На снимке выбран спотовый
BTC/USDизcoinbase. Проверяйте полное имя: похожие префиксы могут обозначать разные рынки. - Установите Timeframe
1D, From 365 days back. В To значение now запрашивает данные до времени загрузки. - Нажмите Download и дождитесь завершения.

Справа mintick показывает тик, pointvalue стоимость пункта, mincontract минимальное количество. Проверяйте их и для своих данных. Доступность и требования доступа зависят от поставщика; выбранный запрос данных не использует торговый счёт.
Загруженные данные появятся в Data. Нажмите имя рынка в верхней строке графика стратегии, чтобы выбрать новый набор. График пересчитается; inputs и свойства всё равно проверяйте.
Период не гарантирует число свечей: важны доступная история, торговые дни и пропуски. Новая загрузка может изменить ряд. Для сравнения сохраняйте файл данных и метаданные.
Интерпретация запуска
Бэктест считает по правилу, данным и модели исполнения вместе. Он проверяет, делает ли код задуманное и как повёл бы себя в модели. Будущих данных в результате нет.
Многократная настройка параметров на одних данных может подобрать правило именно к ним. Отдельный период, не участвовавший в настройке, отвечает на другой вопрос. Поэтому в итоговом проекте проверка поведения и сравнение настроек разделены.