Блог им. Nu_kak_by

Как потестить систему в Экселе. Пошагово. Часть 2

Поскольку предыдущую часть мы завершили на том, как задавать условия и цену для открытия/закрытия позиций, то в начале этой части рассмотрим две распространённые ошибки, допускаемые при тестировании систем: открытие позиции внутри гэпа и заглядывание в будущее.
 
  Большинство эффективных торговых систем основаны на пробое определённого экстремума, будь то экстремум сигнальной свечи или же некоторый ценовой уровень. Соответственно при тестировании подобных систем цена открытия позиции обычно определяется как «ценовое значение экстремума + один пипс». Например, имеется сигнальная свеча — и мы задаём условие: если хай последующей свечи будет выше хая сигнальной свечи, то на этой последующей свече будет открыта позиция по цене «хай сигнальной свечи + один пункт» (проскальзывание мы не учитываем). Но в этом случае мы всегда должны помнить, что указанной цены «хай сигнальной свечи + один пункт» в действительности может не существовать, поскольку та свеча, на которой должна быть открыта позиция может открыться с гэпом по отношению к сигнальной свече. Поэтому при определении цены открытия позиции всегда нужно задавать дополнительное условие: если последующая свеча открылась с гэпом, то позиция открывается по цене открытия этой свечи (без учёта проскальзывания):

Как потестить систему в Экселе. Пошагово. Часть 2

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

 Как потестить систему в Экселе. Пошагово. Часть 2

Как видим, уровни открытия позиции и стоп-лосса были достигнуты на одной и той же свече. Однако мы не можем заранее (на сигнальной свече) знать, какой уровень был достигнут первым: возможно цена сначала пошла вниз и только потом перебила сигнальный хай, но может быть, сперва была открыта позиция и только потом сработал стоп. В этой ситуации, задавая условия для постановки стоп-лосса, нужно учитывать, что стоп-лосс мог сработать на той же свече, на которой была открыта позиция. Конкретно я всегда считаю в такой ситуации стоп сработавшим, исключая возможность того, что цена сперва могла достич уровня стопа, а только потом была открыта позиция, — то есть задаю заведомо худшие условия.

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

Теперь же продолжим разбор формул, используемых для тестирования нашей системы.

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)

В этой формуле мы использовали функцию ИЛИ, которая позволяет произвести рассчёт при наличии одного из заданных условий.
Формула читается так: «Если произошло закрытие лонга или закрытие шорта, из объёма закрытой позиции вычитается объём открытой позиции (в деньгах) и вычитаются издержки (в данном случае издержки не принципиальны); в ином случае — ноль».
Все формулы растягиваем по столбцам методом, описанным в первой части.

Вот что мы получаем:

Как потестить систему в Экселе. Пошагово. Часть 2

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

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")

Как можно заметить, знаменатель (сумма убыточных сделок) указан со знаком минус — в противном случае порфит фактор всегда будет иметь отрицательное значение.
Вот что у нас получается:
Как потестить систему в Экселе. Пошагово. Часть 2

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

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… ну и т.д.».

Таким образом мы получаем отрицательное процентное значение:

Как потестить систему в Экселе. Пошагово. Часть 2

Теперь найдём максимальную просадку.
Поскольку в столбце AJ все процентные изменения указаны со знаком «минус», нам необходимо найти самое маленькое из этих значений. Используем функцию МИН. В ячейке AK2 пишем:

=МИН(AJ2:AJ15283)

И получаем максимальную из всех просадок.

Как потестить систему в Экселе. Пошагово. Часть 2
Теперь при желании мы можем посчитать дополнительные коэффициенты. Например посчитать среднегодовую доходность и разделить её на максимальную просадку. Либо посчитать также среднегодовую просадку — и разделить среднегодовую доходность на неё. Кроме того мы можем построить график просадок — так называемую «подводную кривую».

8.) Теперь построим графики Эквити и «Подводной кривой».
— Выделяем столобец AB («Депозит»).
— Выбираем на панели инструментов вкладку «Вставка».
— Выбираем тип диаграммы «Гистограмма», затем — «Гистограмма с группировкой»
— Нажимаем на графике правой кнопкой мыши, нажимаем «Вырезать», затем выбираем новый лист (Лист 2) — и вставляем график в новый лист (можно перименовать лист например в «Эквити»).
-  Щёлкаем по самой гистограмме правой кнопкой мыши, выбираем «Добавить линию тренда»; на панеле инструментов вкладка «Главная» — «Шрифт» — «Цвет заливки» — зелёный.
Возвращаемся на Лист 1:
— Выделяем столбец AJ («Просадки в процентах»)
— Вкладка «Вставка» — Тип диаграммы — «График» — «График» или «График с накоплением»
— Убираем с графика «Горизонтальную ось (категорий)».
— Переносим график на Лист 2, размещаем под гистограммой эквити.
Вот что должно получиться:
Как потестить систему в Экселе. Пошагово. Часть 2

Теперь мы можем сравнить наши результаты с результатами, которые получил Юрий Иваныч несколько лет назад:

Как потестить систему в Экселе. Пошагово. Часть 2

Как видим, есть заметные расхождения.
Сложно объяснить, с чем это связано. Возможно, причина — в использовании разных ценовых рядов — разных методов склейки. К тому же у Юрия Иваныча в тесте начальные даты сделок — в августе, в то время как у нас — в середине сентября. Также стоит обратить внимание на то, что в обоих тестах совпадает процент прибыльных сделок, однако различается профит-фактор.

Как потестить систему в Экселе. Пошагово. Часть 2

Как потестить систему в Экселе. Пошагово. Часть 2

В качестве проверочного исследования я протестировал ту же систему с теми же параметрами на том же ценовом ряду, который я использовал в Экселе (финамовская склейка), в программе MetaStock 11. Вот результат. Два графика — слева график эквити, полученный в Метастоке, справа — график, полученный в Экселе:

Как потестить систему в Экселе. Пошагово. Часть 2

Как видим, принципиальных различий нет. Единственное, на что стоит обратить внимание — так это на то, что в Метастоке было совершено 180 сделок, а не 174, как в Экселе. Чем это вызвано, опять же объяснить сложно — вероятно, есть погрешность в расчётах самого сигнального индикатора. Однако принципиально на результат это не повлияло, а значит некототое расхождение между Экселем и Метастоком можно отнести на счёт статистической погрешности.

Теперь нам осталось посчитать коэффициенты Шарпа и Сортино. А также потестировать систему на новейших данных ( посмотреть, в частности, как работала система с осени 2012 года — после изменения шага цены).


Но это будет в третьей — заключительной — части. Фуф:)
    

★108
36 комментариев
Ну как бы, вы трудяга!
avatar
VladMih, пора уже мне писать книжки по трейдингу))
avatar
Ну как бы, по крайней мере способности и трудолюбие есть. Остальное приложится и отшлифуется.
avatar
Ссылочку бы ещё на предыдущую часть и ну как бы вообще всё здорово
Вестников, собственно, она чуть ниже: smart-lab.ru/blog/280744.php#comments
avatar
Ну как бы, теперь дело за малым — на видное место в Школу Трейдинга. Чтобы удобно было ссылаться.
Вестников, я с местной инфраструктурой практически незнаком((
Допишу третью часть и буду думать, что за школа трейдинга такая и как туда статьи добавлять…
avatar
Ну как бы, в левом верхнем углу. Но, кажется, модераторы или сам Тимофей туда пристраивают материалы.
Ни и надо бы эти статьи в школу трейдинга.
Огромное спасибо! Очень люблю Excel, и всякий раз для себя открываю все новые и новые возможности его использования.
avatar
Интересно
avatar
интересно ктото так зарабатывает на формулах всяких там?
avatar
Спасибо за статью!!!
avatar
добавил в избранное спасибо!
avatar
+ в карму
спасибо, тоже пользуюсь таким методом.
avatar
Эксель! А если ещё прописать время каждой свечи, обозначить что свечи могут разных таймфреймов и начать тестировать с указанным спредом и проскальзованием + средне статистическое отклонение проскальзования в убыток. И прогнать так свыше 3000 сделок на тесте, то скажите до свидание своему компу. Он сгорит нафиг от такой массы вычислений:) Эксель не предназначен для тестирования серьёзных ТС. Нужно всётаки использовать что то более подходящее:)
avatar
Infernus, сгореть не сгорит, но повозиться придётся подольше. Я как-то загружал минутный график за год. Эксель пыхтел минут двадцать. С тех пор решил, что графики мелких таймфреймов за крупный период нужно разбивать на несколько файлов и загружать поочереди.
avatar
Ну как бы, Ну делали же знаем. За 12 лет историю 1М 11 инструментов под торговую систему с фильтрами в более 20 ти осях координат ставили и процессоры с винчесетерами горели, а на ВПСках акк ставили на заметку, а потом в ЧС. Так что это просто не адекватно в экселе это делать. Ну если только склейкой как ты предлагаешь, но тогда один тест пол дня занимать будет.
avatar
Infernus, Эксель прекрасно годится для нормальных рабочих систем на 15-минутках, часовиках и выше. Тест на этих таймфреймах много времени не занимает и систему не грузит. А для всяких мудрёных систем, основанных на кракосрочных корреляциях/раскорреляциях/неэффективностях (не говоря уже про ХФТ), конечно, лучше использовать что-то более узкоспециализированное.
avatar
Ну как бы, Эксель напичкан багами и устанешь их искать, исправлять под них данные и путаться в не верных результатах. Проще взять хорошую среду и в С++ набить код, чем таким извращением с экселем заниматься, а-ля потому что не умеешь программировать.
avatar
Infernus, для Экселя действителен тот же принцип, что и для программирования: работает — не трогай.
avatar
Ну как бы, код экселя слишком энерго затратный, а простота надуманная и только кажется.
avatar
Infernus, о простоте никто не говорит. Наоборот, Эксель заставляет голову работать: ты сам загоняешь формулы индикаторов, сам считаешь коэффициенты — для тебя это получаются не просто циферки или полосочки на графике — ты начинаешь понимать, для чего они в действительности нужны и какая ИДЕЯ за ними лежит, какая в них логика.
avatar
Ну как бы, Тогда уж проще кипятильник в ухо засунуть и включить что бы мозги сразу выкипели.
avatar
3000 сделок? сгорит комп? вы серьезно? Да задумается, но не более
avatar
Александр X, А склейкой эти 3000 сделок прогнать сколько тест займёт по времени?
avatar
можно у автора топика спросить, я не пробовал еще. но думаю что мой мак справиться с этим
avatar
Плюсанул.
ИМХО, средств чистого Excel недостаточно для тестирования серьезной ТС с динамическими условиями входа/выхода в сделки.
Возможно, следует расширить систему тестирования за счет процедур/функций более низкого уровня, написанных на встроенном Бэйсике.
мля, лучший пост за Год, Карл!!! за год!
avatar
StrJ, спасибо, но, думаю, на смарт-лабе ещё найдутся хорошие посты в том числе и за этот год)
avatar
С 2012 года

 

 

Мда, «были времена, теперь моменты»  ©

 
avatar
tim, в экселе тоже не ахти) Хорошо, что картинку прикрепили, сравним) Какую склейку использовали? Финамовскую?
avatar
Ну как бы,

да, часовики с Финама с 01.01.2012.
avatar
Наткнулся тут на статью, может кому поможет:
algoritmus.ru/vkalyivayut-robotyi-a-ne-chelovek/
«Создание торгового робота в Excel (Специальные навыки не требуются)»

Ну как бы, зацените.
avatar
VladMih, спасибо, обязательно почитаю.
avatar

теги блога Ну как бы

....все тэги



UPDONW
Новый дизайн