mt1gglhk 327ee6e275326061 png

Пересмотр 3-дневной сделки

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

Перри Дж. Кауфман

Безусловно, мой любимый краткосрочный торговый метод — 3-дневная сделка. Это упрощённая версия торгового метода Джорджа Дугласа Тейлора, впервые опубликованного в 1950 году. Подумать только — 75 лет назад! В то время из фьючерсных рынков существовал только рынок зерновых.

Полную версию метода Тейлора можно найти в интернете.

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

У Тейлора также были правила, предписывавшие пропускать отдельные дни. Для учёта последовательности ценовых движений и волатильности он использовал специальную систему записей (book method). Пример такого графика можно найти в любой из моих книг «Торговые системы и методы». Полностью реализовать метод Тейлора непросто, однако современные инструменты позволяют облегчить задачу и обновить стратегию.

ИСПОЛЬЗОВАНИЕ БАЗОВОГО ПАТТЕРНА

Для начала посмотрим, как базовые правила 3-дневной сделки работают на фондовом индексе. Мы выбираем индекс, поскольку как среднее по большому числу акций он содержит больше шума — хаотичных движений цены вверх и вниз. Отдельные акции, например Amazon, Tesla или Nvidia, чаще демонстрируют серии продолжительностью более трёх дней и потому хуже подходят для стратегии возврата к среднему.

Применив с 2000 года к биржевому фонду SPY правила для длинных и коротких сделок, получаем сигналы, показанные на рисунке 1. Результаты стратегии представлены на рисунке 2.

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

mt1ggmbo dc83e984fd6235b8 png

РИСУНОК 1. ПРИМЕНЕНИЕ СТРАТЕГИИ К ФОНДОВОМУ ИНДЕКСУ. Как стратегия работает при торговле фондовым индексом? Показаны примеры длинных и коротких сигналов по SPY — биржевому фонду на индекс S&P 500 — при входе после трёх дней движения и выходе через два дня.

mt1ggnfo 879b7f7902ceecfd png

РИСУНОК 2. РЕЗУЛЬТАТЫ СТРАТЕГИИ. Пример совокупных результатов исходного теста стратегии с рисунка 1 начиная с 2000 года. Результаты неплохие — но можно ли их улучшить?

ДОБАВЛЕНИЕ ТИПИЧНЫХ ПРАВИЛ

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

  • несколько иные периоды входа и выхода

  • фильтр по тренду

  • фиксация прибыли, если до планового выхода цена совершает экстремальное движение

  • фильтр входа при низкой волатильности

  • фильтр входа при экстремально высокой волатильности

  • отказ от входа в определённый день недели

Моё личное правило: не добавлять ничего, что не даёт существенного улучшения. Иначе стратегия лишь напрасно усложняется. Чем меньше правил, тем обычно надёжнее система. Будем помнить об этом.

ПЕРИОДЫ ВХОДА И ВЫХОДА

Изменение периодов входа и выхода должно оказать наибольшее влияние. Оптимизация показывает, что лучший вход в длинную позицию происходит после одного дня снижения с выходом через два дня — далее обозначим это как 1×2. Для коротких сделок лучшим сочетанием оказалось 3×3. По сравнению с исходными правилами и прибыль, и риск заметно возрастают (рисунок 3).

Оптимизированные правила — покупка после одного дня снижения — используют устойчивый восходящий уклон SPY, открывая длинную позицию в любой день падения. В результате совершается 1 882 сделки против 140 при исходных правилах. Результаты коротких сделок улучшаются, но просадка также возрастает. Тем не менее прибыль $20 773 намного превышает $7 762. Такой результат трудно игнорировать. Далее мы будем параллельно проверять оба набора параметров.

mt1ggod7 d60ac7d810cb8727 png

РИСУНОК 3. ОПТИМИЗАЦИЯ ПЕРИОДОВ ВХОДА И ВЫХОДА. Улучшает ли результат изменение периодов входа и выхода? Сравниваются исходные правила и стратегия с оптимизированными периодами. Доходность оптимизированной стратегии выше, но выше и риск.

ФИЛЬТР ПО ТРЕНДУ

Фильтр по тренду помогает большинству краткосрочных стратегий. Здесь мы тестируем два варианта отдельно. Для исходной стратегии 3×2 / 3×2 оптимизация выбрала период 80 дней, а для варианта 1×2 / 3×3 — 120 дней. Результаты приведены на рисунке 4. Исходная модель улучшилась по всем показателям, тогда как оптимизированная выиграла на коротких сделках, но потеряла в общей прибыли и профит-факторе. Иными словами, исходная стратегия выиграла от фильтра по тренду, а оптимизированная — нет. На мой взгляд, результат оптимизированного варианта переоптимизирован и недостаточно устойчив.

Обратите внимание и на рисунок 4: показатели исходной стратегии теперь очень близки для длинных и коротких сделок. У оптимизированной стратегии результаты длинных сделок ухудшились, а коротких — улучшились. Как поступить дальше?

Я оставлю исходную модель с 80-дневным трендовым фильтром, а из оптимизированной модели фильтр уберу.

Во вставке «Модифицированная 3-дневная сделка на языке EasyLanguage» приведён код программы со всеми этими возможностями. Их можно тестировать по отдельности или в сочетании.

mt1ggpe5 52f8f3e7ae27ddb2 png

РИСУНОК 4. ФИЛЬТР ПО ТРЕНДУ. Такой фильтр обычно помогает краткосрочным стратегиям. Улучшает ли добавление периода тренда исходные и оптимизированные правила? 80-дневный фильтр в целом улучшил исходную стратегию с рисунка 1, тогда как 120-дневный фильтр не дал общего улучшения оптимизированной стратегии с рисунка 3.

ВОЛАТИЛЬНОСТЬ

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

В этом тесте волатильность рассчитывается как отношение текущего истинного диапазона к среднему истинному диапазону за N дней, то есть используется относительная волатильность. Вместо неё можно предпочесть подразумеваемую волатильность — например, индекс VIX.

Для исходного варианта 3×2 лучшими оказались период 15 дней, нижний порог 0,25 и верхний порог 3,25. Для оптимизированного варианта — период 30 дней, нижний порог 0,75 и верхний порог 3,75.

Улучшение оказалось небольшим, но затронуло все группы сделок (рисунок 5). Поэтому я бы использовал этот фильтр.

mt1ggqgi da4e7ba6d35b5451 png

РИСУНОК 5. ВОЛАТИЛЬНОСТЬ. Улучшает ли добавление верхнего и нижнего порогов волатильности исходные и оптимизированные правила? Результаты показывают небольшое улучшение во всех группах сделок.

ФИКСАЦИЯ ПРИБЫЛИ

Во время сделки цена всегда может совершить резкий скачок. В такой ситуации я предпочитаю зафиксировать прибыль до возможного разворота. Проверим цель по прибыли, рассчитанную как средний истинный диапазон (ATR), умноженный на коэффициент, обычно меньше 4,0.

Для исходных параметров 3×2 (левая таблица на рисунке 6) результаты смешанные. Лучший множитель цели по прибыли составил 1,25 как для длинных, так и для коротких сделок — немного больше одного ATR. Для оптимизированной стратегии лучшими оказались 2,0 для длинных и 1,0 для коротких сделок. Доходность немного снизилась, доля прибыльных сделок слегка выросла, а результаты коротких сделок улучшились. В оптимизированном тесте (правая таблица) уменьшились и доходность, и просадка.

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

mt1ggrga b2a8f380256d6c9d png

РИСУНОК 6. ФИКСАЦИЯ ПРИБЫЛИ. Стоит ли фиксировать прибыль после резкого скачка цены на случай разворота? Для исходной стратегии с рисунка 1 лучший множитель цели составил 1,25 для длинных и коротких сделок; для оптимизированной стратегии с рисунка 3 — 2,0 для длинных и 1,0 для коротких. Результаты исходной стратегии приемлемы, а оптимизированной — не слишком убедительны.

ДЕНЬ НЕДЕЛИ

Наконец, проверим, существует ли закономерность, из-за которой какой-либо день недели хуже подходит для входа. Программа из вставки «Модифицированная 3-дневная сделка на языке EasyLanguage» позволяет исключить только один день. При желании код можно изменить и протестировать каждый день отдельно, но я предпочитаю удалить единственный худший день.

На рисунке 7 видно, что исключение вторника даёт небольшое общее улучшение почти всех показателей, кроме доходности. Повышаются профит-фактор — отношение прибыли к убытку — и число прибыльных сделок. Улучшения сходны для исходной и оптимизированной версий по сравнению с рисунком 5. Пусть эффект невелик, зато отказ от входа по вторникам даёт вам ещё один выходной!

mt1ggsh3 0274b846d23a14f7 png

РИСУНОК 7. ДЕНЬ НЕДЕЛИ. Улучшатся ли результаты, если учитывать день входа? Исключение входов по вторникам даёт небольшое общее улучшение и в исходной, и в оптимизированной стратегии.

ИТОГОВЫЕ РЕЗУЛЬТАТЫ

Совокупные результаты по SPY показаны на рисунке 8. В исходную версию 3×2 мы добавили трендовый фильтр и пороги волатильности, а также исключили вторники. Можно было сохранить и фиксацию прибыли. В оптимизированной версии использованы пороги волатильности и исключены вторники.

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

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

При желании вы можете провести собственные тесты с помощью программы из вставки.

mt1ggtl7 30124011b642ad58 png

РИСУНОК 8. СТРАТЕГИЯ «3-ДНЕВНАЯ СДЕЛКА» С ОБНОВЛЁННЫМИ ПАРАМЕТРАМИ: ДВА ВАРИАНТА. Сравнение исходной стратегии с обновлёнными параметрами и оптимизированной версии. Общая статистика исходной стратегии лучше, но оба варианта имеют свои преимущества и компромиссы.

МОДИФИЦИРОВАННАЯ 3-ДНЕВНАЯ СДЕЛКА НА ЯЗЫКЕ EASYLANGUAGE

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

// PJK: модифицированная 3-дневная сделка
// © P. J. Kaufman, 2018, 2020, 2023–2024. Все права защищены.
// ATRprofitfactor — использовать период ATR для расчёта цели по прибыли
// Dayofweek: 1 = воскресенье
inputs: longentry(3), longexit(2), shortentry(4), shortexit(2),
trendper(0), profperiod(5), longproffactor(0), shortproffactor(0), longonly(true), dontusedayofweek(0),
usestocks(false), maxvol(0), minvol(0), volperiod(20);
vars: currentdir(0), upcount(0), downcount(0), prevupcount(0),
prevdowncount(0), trend(0), size(1), prevdir(0), positionATR(0), stockinvestment(10000), volOK(false), futuresinvestment(25000), basisperiod(20), DOW(0), avol(0), ATR(0), volratio(0), ATRprofit(0), raw(0);
if trendper > 0 then begin
if high > highest(high[1],trendper) then trend = 1 else if low < lowest(low[1],trendper) then trend = -1;
end;
DOW = dayofweek(date);
// волатильность на основе ATR
if volperiod <> 0 then begin
ATR = avgtruerange(volperiod);
if ATR[1] <> 0 then volratio = truerange/ATR[1];
end;
// размер позиции
if usestocks then begin
size = stockinvestment/close[1];
end
else begin
positionATR = avgtruerange(basisperiod);
if positionATR <> 0 then
size = futuresinvestment/ (positionATR*bigpointvalue);
end;
// цель по прибыли на основе ATR
if profperiod <> 0 then ATRprofit = avgtruerange(profperiod);
// подсчёт длины серии и её направления
prevupcount = upcount; prevdowncount = downcount;
prevdir = currentdir;
if close > close[1] then begin
if close[1] > close[2] then
upcount = upcount + 1 else begin
currentdir = 1;
upcount = 1;
downcount = 0;
end;
end
else if close < close[1] then begin
if close[1] < close[2] then
downcount = downcount + 1
else begin
currentdir = -1;
downcount = 1;
upcount = 0;
end;
end;
// выходы
if marketposition > 0 and ((barssinceentry >= longexit) or (trendper <> 0 and trend < 0)) then
sell ("Lexit") all contracts this bar on close
else if marketposition < 0 and ((barssinceentry >= shortexit) or
(trendper <> 0 and trend > 0)) then buy to cover ("Sexit") all contracts this bar on close;
// фиксация прибыли на второй день
if marketposition > 0 and profperiod <> 0 and longproffactor <> 0 then
sell ("LongPT2") all contracts next bar at entryprice + longproffactor*ATRprofit limit;
if marketposition < 0 and profperiod <> 0 and shortproffactor <> 0 then
buy to cover ("ShortPT2") all contracts next bar at entryprice - shortproffactor*ATRprofit limit;
// новая длинная позиция на закрытии или следующем открытии
// предыдущее направление было нисходящим, а длина серии достигла заданного значения
if currentdir <= 0 and downcount >= longentry then begin 
// закрыть предыдущую короткую позицию
if marketposition < 0 then buy to cover ("Lreverse") all contracts this bar on close;
// проверить условия для следующего дня
volOK = volperiod = 0 or ((minvol = 0 or volratio > minvol) and
(maxvol = 0 or volratio < maxvol));
if (trendper = 0 or trend > 0) and (dontusedayofweek = 0 or dontusedayofweek <> DOW) and volOK then begin
// ордер на закрытии
buy ("upday") size contracts this bar on close;
// задать цель по прибыли
if profperiod <> 0 and longproffactor <> 0 then
sell ("LongPT") all contracts next bar at entryprice + longproffactor*ATRprofit limit;
end;
end
// новая короткая позиция
else if longonly = false and currentdir >= 0 and upcount
>= shortentry then begin
// закрыть предыдущую длинную позицию
if marketposition > 0 then sell ("Sreverse") all contracts this bar on close;
if (trendper = 0 or trend < 0) and (dontusedayofweek
= 0 or dontusedayofweek <> DOW)
and volOK then begin
// ордер на закрытии
sell short ("downday") size contracts this bar on close;
// задать цель по прибыли
if profperiod <> 0 and shortproffactor <> 0 then
buy to cover ("ShortPT") all contracts next bar at entryprice - shortproffactor*ATRprofit limit;
end;
end;
// новые позиции на сегодняшнем закрытии
if marketposition = 0 and currentdir[1] <= 0 and
downcount[1] >= longentry and (trendper =
0 or trend[1] > 0) then begin
if close < close[1] and volOK[1] then begin
buy size contracts this bar on close;
end;
end
else if marketposition = 0 and longonly = false and currentdir >= 0 and
upcount[1] >= shortentry and (trendper = 0 or trend[1] < 0) then begin
if close > close[1] and volOK then begin
sell short size contracts this bar on close;
end;
end;

ОБ АВТОРЕ

Перри Дж. Кауфман — трейдер и финансовый инженер, автор множества книг о трейдинге и анализе рынков. Среди них шестое издание «Торговых систем и методов» (2020; первое издание 1978 года стало одной из основополагающих работ по техническому анализу), Kaufman Constructs Trading Systems (2020) и Learn To Trade (2022). Вопросы и комментарии: www.kaufmansignals.com.

КОД СТАТЬИ

Код из статьи доступен в разделе Article Code на сайте Traders.com.

ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА

Kaufman, Perry J. (2022). Learn To Trade. Amazon.

Kaufman, Perry J. (2020). Trading Systems and Methods, 6-е изд. Wiley.

Kaufman, Perry J. (2020). Kaufman Constructs Trading Systems. Amazon.

Перри Дж. Кауфман

Переведено для TLAP