Блог им. Nu_kak_by
Поскольку предыдущую часть мы завершили на том, как задавать условия и цену для открытия/закрытия позиций, то в начале этой части рассмотрим две распространённые ошибки, допускаемые при тестировании систем: открытие позиции внутри гэпа и заглядывание в будущее.
Большинство эффективных торговых систем основаны на пробое определённого экстремума, будь то экстремум сигнальной свечи или же некоторый ценовой уровень. Соответственно при тестировании подобных систем цена открытия позиции обычно определяется как «ценовое значение экстремума + один пипс». Например, имеется сигнальная свеча — и мы задаём условие: если хай последующей свечи будет выше хая сигнальной свечи, то на этой последующей свече будет открыта позиция по цене «хай сигнальной свечи + один пункт» (проскальзывание мы не учитываем). Но в этом случае мы всегда должны помнить, что указанной цены «хай сигнальной свечи + один пункт» в действительности может не существовать, поскольку та свеча, на которой должна быть открыта позиция может открыться с гэпом по отношению к сигнальной свече. Поэтому при определении цены открытия позиции всегда нужно задавать дополнительное условие: если последующая свеча открылась с гэпом, то позиция открывается по цене открытия этой свечи (без учёта проскальзывания):
Теперь приведём простой пример заглядывания в будущее. Например, наша система подразумевает открытие позиции после пробоя хая сигнальной свечи и размещение стоп-лосса ниже минимума этой же сигнальной свечи. Но в этом случае может возникнуть следующая ситуация:
Как видим, уровни открытия позиции и стоп-лосса были достигнуты на одной и той же свече. Однако мы не можем заранее (на сигнальной свече) знать, какой уровень был достигнут первым: возможно цена сначала пошла вниз и только потом перебила сигнальный хай, но может быть, сперва была открыта позиция и только потом сработал стоп. В этой ситуации, задавая условия для постановки стоп-лосса, нужно учитывать, что стоп-лосс мог сработать на той же свече, на которой была открыта позиция. Конкретно я всегда считаю в такой ситуации стоп сработавшим, исключая возможность того, что цена сперва могла достич уровня стопа, а только потом была открыта позиция, — то есть задаю заведомо худшие условия.
Что же касается нашей тестируемой системы, то легко убедиться, что в даном случае обе эти ошибки неактульны: покупка внутри гэпа невозможна потому, что открытие позиции всегда происходит на открытии последующей свечи, так же, как и закрытие убыточных позиций.
Теперь же продолжим разбор формул, используемых для тестирования нашей системы.
4.) Мы определили условия и цены для открытия, удержания и закрытия позиций. Теперь нам нужно определить объём открытой позиции в количестве контрактов и по цене. А также определить цену закрытой позиции.
В столбце W мы рассчитаем количество контрактов, открываемых в каждой сделке — напоминая что в этом тестировании мы используем полное инвестирование, то есть открываем позицию на все имеющиеся денежные средства (без расчёта риска) — то есть по сути мы не производим никакого мани-менеджмента. В ячейку W22 пишем следующую формулу:
=ЕСЛИ(O22>0;AB21/O22; ЕСЛИ(R22>0;-(AB21/R22);0))
Эта формула отсылает нас к столбцу AB, где указан размер нашего депозита, а также к столбцам O и R, где указаны цены открытия лонговых и шортовых позиций соответственно.
Читается она так: «Если открыт лонг, объём открытой позиции равен предыдыдущему значению депозита, делёному на цену открытия лонга; в ином случае — если открыт шорт, объём открытой позиции равен предыдыдущему значению депозита, делёному на цену открытия шорта; в ином случае — если открытых позиций нет — в столбце объёма ставится ноль». При этом нужно учитывать, что в случае открытия шорта значение объёма должно быть отрицательным — поэтому формулу расчёта объёма шорта мы берём со знаком «минус».
В столбце X мы рассчитаем объём открытых позиций в денежных средствах.
Используем следующую формулу (ячейка X22):
=ЕСЛИ(W22>0;W22*O22; ЕСЛИ(W22<0;W22*R22;0))
«Если значение объёма позиции в контрактах положительное, объём контрактов умножается на цену открытия лонга; в ином случае — если значение объёма отрицательное, объём контрактов умножается на цену открытия шорта; в ином случае ставится ноль».
И наконец рассчитаем денежный объём закрытой позиции, чтобы впоследствии определить величину полученной прибыли/убытка.
В ячейке Y22 пишем формулу:
=ЕСЛИ(U22>0;U22*W21; ЕСЛИ(V22>0;V22*W21;0))
Напоминаю, что в столбце U указана цена закрытия лонга, а в столбце V — цена закрытия шорта.
Формула читается так: «Если поступил сигнал на закрытие лонга, предыдущее количество открытых контрактов умножается на цену закрытия лонга… и т.д.»
Умножать на предыдущее (а не текущее) количество контрактов необходимо для того, чтобы избежать ошибок в тех случаях, когда при закрытии одной позиции — например, лонга — одновременно открывается противоположная позиция — шорт — и текущее количество контрактов становится отрицательным (поскольку рассчитываеться уже по шортовой позиции).
Все формулы растягиваем по столбцам методом, описанным в первой части.
5.) Посчитаем результаты сделок и изменения депозита. Для этого у нас имеются три столбца: Z — «Издержки», AA — «Результат», AB — «Депо». Поскольку мы тестируем систему в идеальных условиях (без учёта комиссионных и проскальзывания), то столбец «Издержки» мы пропустим.
В столбце AA посчитаем результат каждой сделки по следующей формуле:
=ЕСЛИ(ИЛИ(U22>0;V22>0);Y22-X21-Z22;0)
В этой формуле мы использовали функцию ИЛИ, которая позволяет произвести рассчёт при наличии одного из заданных условий.
Формула читается так: «Если произошло закрытие лонга или закрытие шорта, из объёма закрытой позиции вычитается объём открытой позиции (в деньгах) и вычитаются издержки (в данном случае издержки не принципиальны); в ином случае — ноль».
Все формулы растягиваем по столбцам методом, описанным в первой части.
Теперь, когда результат тестирования системы получен, мы должны оценить нашу систему и решить готовы ли мы психологически по ней торговать и имеет ли это финансовую целесообразность.
6.) Посчитаем количество сделок, процент прибыльных сделок и профит-фактор.
Для этого мы будем использовать данные из столбца AA, где показаны результаты сделок.
В столбце AC — количество убыточных сделок. В столбце AD — прибыльных сделок. В столбце AE — общее количество сделок. В столбце AF — процент прибыльных сделок. В столбце AG — профит фактор.
Для подсчёта количества прибыльных и убыточных сделок используем функцию СЧЁТЕСЛИ. Эта функция посчитывает количество ячеек, значение которых соответствует заданному условию.
Например в столбец AC пишем формулу:
=СЧЁТЕСЛИ(AA2:AA15283;"<0")
Она читается так: «В диапазоне столбца AA от ячейки AA2 до ячейки AA15283 посчитать количество ячеек, значение которых меньше нуля (результаты убыточных сделок).
Таким же образом считаем количество прибыльных сделок (но вместо „<0“ соответственно „>0“).
Затем в ячейке AE пишем формулу =AC2+AD2 и получаем общее количество сделок.
В столбце AF делим количество прибыльных сделок на общее количество и умножаем на 100 (=AD2/AE2*100) — получаем процент прибыльных сделок.
Профит фактор — это отношение суммы прибыльных сделок к сумме убыточных. Для его подсчёта используем функцию СУММЕСЛИ. Эта функция считает сумму значений ячеек, которые соответствуют заданному условию.
В столбце AG пишем формулу:
=СУММЕСЛИ(AA2:AA15283;»>0")/-СУММЕСЛИ(AA2:AA15283;"<0")
Как можно заметить, знаменатель (сумма убыточных сделок) указан со знаком минус — в противном случае порфит фактор всегда будет иметь отрицательное значение.
Вот что у нас получается:
Также мы можем отдельно посчитать количество лонговых и шортовых сделок и их результативность. Это может понадобиться для оптимизации системы. Например, если в системе результативны только лонговые сделки — это может означать наличие на большем отрезке времени восходящего тренда и соответственно в систему можно добавить трендовый фильтр и т.п.
7.) Посчитаем просадки.
Столбец AH будет носить название «Новые максимумы». В этом столбце будут отображаться новые максимумы кривой капитала. Для этого используем функцию МАКС, котрая находит максимальные значения в дипазоне ячеек.
В ячейку AH3 пишем формулу:
=МАКС($AB$2:AB3)
Протягиваем эту формулу через весь столбец.
Эта формула отсылает к столбцу AB, где указаны изменения размера депозита. Для определения первого значения диапазона ячеек мы использовали абсолютную ссылку — значок доллара ($AB$2). Эта ссылка означает, что каждый раз высичление максимального значения будет вестись с самого начала столбца (от ячейки AB2). В противном случае мы получим скользящее окно, где максимумы каждый раз будут получены от новых данных. Фактически, это будет аналог верхней границы канала Дончиана:).
Теперь мы должны выделить те значения депозита, которые отличались от новых максимумов в худшую сторону и которые образовывались уже после появления новых максимумов (в общем, просадки).
Формула в ячейке AI4:
=ЕСЛИ(И(AH4=AH3;AB4<AH4);AB4;"")
«Если соблюдены два условия (последний достигнутый максимум эквити не перебит и нынешний размер депозита меньше последнего максимума) в ячейку заносится нынешний размер депозита; в ином случае ячейка остаётся пустой (пустые кавычки означают, что в ячейке не будет даже нолика)».
В столбце AJ посчитаем просадки в процентном выражении. Формула в AJ4:
=ЕСЛИ(AI4<AH4;(AI4-AH4)/AH4*100;0)
«Если текущее значение в ячейки AI меньше значения в текущей ячейке столбца новых максимумов, из значения текущей ячейки AI вычитаем значение текущей ячеки AH… ну и т.д.».
Таким образом мы получаем отрицательное процентное значение:
Теперь найдём максимальную просадку.
Поскольку в столбце AJ все процентные изменения указаны со знаком «минус», нам необходимо найти самое маленькое из этих значений. Используем функцию МИН. В ячейке AK2 пишем:
=МИН(AJ2:AJ15283)
И получаем максимальную из всех просадок.
Теперь при желании мы можем посчитать дополнительные коэффициенты. Например посчитать среднегодовую доходность и разделить её на максимальную просадку. Либо посчитать также среднегодовую просадку — и разделить среднегодовую доходность на неё. Кроме того мы можем построить график просадок — так называемую «подводную кривую».
8.) Теперь построим графики Эквити и «Подводной кривой».
— Выделяем столобец AB («Депозит»).
— Выбираем на панели инструментов вкладку «Вставка».
— Выбираем тип диаграммы «Гистограмма», затем — «Гистограмма с группировкой»
— Нажимаем на графике правой кнопкой мыши, нажимаем «Вырезать», затем выбираем новый лист (Лист 2) — и вставляем график в новый лист (можно перименовать лист например в «Эквити»).
- Щёлкаем по самой гистограмме правой кнопкой мыши, выбираем «Добавить линию тренда»; на панеле инструментов вкладка «Главная» — «Шрифт» — «Цвет заливки» — зелёный.
Возвращаемся на Лист 1:
— Выделяем столбец AJ («Просадки в процентах»)
— Вкладка «Вставка» — Тип диаграммы — «График» — «График» или «График с накоплением»
— Убираем с графика «Горизонтальную ось (категорий)».
— Переносим график на Лист 2, размещаем под гистограммой эквити.
Вот что должно получиться:
Теперь мы можем сравнить наши результаты с результатами, которые получил Юрий Иваныч несколько лет назад:
Как видим, есть заметные расхождения.
Сложно объяснить, с чем это связано. Возможно, причина — в использовании разных ценовых рядов — разных методов склейки. К тому же у Юрия Иваныча в тесте начальные даты сделок — в августе, в то время как у нас — в середине сентября. Также стоит обратить внимание на то, что в обоих тестах совпадает процент прибыльных сделок, однако различается профит-фактор.
В качестве проверочного исследования я протестировал ту же систему с теми же параметрами на том же ценовом ряду, который я использовал в Экселе (финамовская склейка), в программе MetaStock 11. Вот результат. Два графика — слева график эквити, полученный в Метастоке, справа — график, полученный в Экселе:
Как видим, принципиальных различий нет. Единственное, на что стоит обратить внимание — так это на то, что в Метастоке было совершено 180 сделок, а не 174, как в Экселе. Чем это вызвано, опять же объяснить сложно — вероятно, есть погрешность в расчётах самого сигнального индикатора. Однако принципиально на результат это не повлияло, а значит некототое расхождение между Экселем и Метастоком можно отнести на счёт статистической погрешности.
Теперь нам осталось посчитать коэффициенты Шарпа и Сортино. А также потестировать систему на новейших данных ( посмотреть, в частности, как работала система с осени 2012 года — после изменения шага цены).
Но это будет в третьей — заключительной — части. Фуф:)
Допишу третью часть и буду думать, что за школа трейдинга такая и как туда статьи добавлять…
ИМХО, средств чистого Excel недостаточно для тестирования серьезной ТС с динамическими условиями входа/выхода в сделки.
Возможно, следует расширить систему тестирования за счет процедур/функций более низкого уровня, написанных на встроенном Бэйсике.
Мда, «были времена, теперь моменты» ©
да, часовики с Финама с 01.01.2012.
algoritmus.ru/vkalyivayut-robotyi-a-ne-chelovek/
«Создание торгового робота в Excel (Специальные навыки не требуются)»
Ну как бы, зацените.