Блог им. stanislav_g_9yc

Перевод книги "Хакер фондового рынка". Торговля с помощью фильтра низких частот.

Перевод книги "Хакер фондового рынка". Торговля с помощью фильтра низких частот.
Ранее:
1. Предисловие.
2. Торговля деньгами.
3. Биржевая цена.
4. Золотоискатели и ломбарды.
5. Тики, бары, свечи.
6. Как работают торговые системы?
7. Технический анализ — смысл и бессмыслица.
8. Трехчасовой курс программирования.
9. Первый урок: Переменные.
10. Разновидность калькулятора.
11. Второй час: Функции. 
12. Функции с возвращаемым значением.
13. Третий час: ветвление.
14. Циклы.
15. Следуйте за тенденцией.

 

 

Торговля с помощью фильтра низких частот.

После этого разговора Алиса приступает к работе. Она пишет для Боба следующий скрипт следования за трендом на основе фильтра низких частот (Alice1a, плата: 5000 EUR):
function run()
{
  vars Price = series(price());
  vars Trend = series(LowPass(Price,500));
   Stop = 4*ATR(100);
  if(valley(Trend))
    enterLong();
  else if(peak(Trend))
    enterShort();
}

Это уже целая система. Мы видим, что главная функция теперь называется «run» вместо «main». «run» — это также имя специальной функции, но в то время как основная функция выполняется только один раз, функция run запускается после каждого бара. Период бара и торгуемый актив можно установить в Zorro с помощью ползунка и поля прокрутки. По умолчанию период бара составляет 60 минут. Таким образом, приведенная выше функция run выполняется раз в час, пока Zorro торгует.

Теперь мы шаг за шагом пройдемся по строкам кода. В начале мы замечаем две странные строки, похожие на объявления var:

vars Price = series(price());
vars Trend = series(LowPass(Price,500));

Однако эти специальные переменные объявляются с помощью vars и инициализируются вызовом series. Vars — это var с прошлым, серия. Серии состоят из множества отдельных элементов var. Первый содержит текущее значение переменной, следующий — значение, которое переменная имела за один бар до этого, следующий — значение, полученное два бара назад, и так далее. Серии в основном используются для анализа кривых цен и других данных. В частности, индикаторы и подобные функции в большинстве случаев предполагают в качестве параметров серии.

Чтобы получить текущее значение серии, добавьте [0] к названию серии; для значения на один бар раньше добавьте [1], на два бара раньше [2] и так далее. В приведенном выше коде Алисы Price[0] будет текущим значением серии Price, а Price[1] — значением 60 минут назад. В торговых сценариях мы будем очень часто сталкиваться с этими сериями, поэтому нам следует ознакомиться с ними.

Функция series принимает в качестве параметра одно число и превращает его в серию. Вместо того чтобы передавать ему число или переменную, мы можем просто взять возвращаемое значение другой функции:

vars Price = series(price());

Эта строка объявляет серию с именем Price и заполняет ее возвращаемым значением функции price. Как мы уже узнали, вызовы функций могут быть «вложенными» таким образом, передавая возвращаемое значение одной функции в качестве параметра следующей функции.

Функция price возвращает среднюю цену выбранного в данный момент актива за последний бар. Существуют также функции priceOpen, priceClose, priceHigh и priceLow, которые возвращают цену открытия, закрытия, высокую и низкую цену рассматриваемого бара. В основном, однако, используется средняя цена. Поскольку он усредняется по всем внутренним тикам бара, он менее подвержен шуму и случайным колебаниям.

Кстати, со всеми встроенными функциями вы можете легко увидеть, что они делают. Если вы наведете курсор на имя функции в редакторе SED, описание функции появится в окне ниже. А если нажать на кнопку [Help] Zorro, откроется электронное руководство, где перечислены все функции и можно искать по ключевым словам.

Далее в коде:

vars Trend = series(LowPass(Price,500));

Здесь мы снова имеем вложенный вызов. В строке объявляется серия под названием Trend и заполняется возвращаемым значением функции LowPass, которая в свою очередь вызывается с уже объявленной серией Price и числом 500 в качестве параметра. LowPass — это фильтр низких частот второго порядка Алисы, а 500 — его временной период в барах. 500 баров соответствуют примерно 4 неделям (1 неделя = 24 * 5 = 120 часов). Фильтр гасит все колебания ценовой кривой короче 4 недель, но не влияет на тренд или долгосрочные циклы. Возвращаемым значением функции LowPass является отфильтрованная цена.

С помощью таких спектральных фильтров — функций, которые удаляют или усиливают определенный диапазон частотного спектра ценовой кривой — можно выявить несколько типов неэффективности ценовых кривых. Фильтры второго порядка имеют более крутую кривую фильтрации, что на практике означает лучшее затухание и меньшую задержку. Известный индикатор «EMA» (Exponential Moving Average), например, представляет собой фильтр низких частот первого порядка. На рис. 15 показано поведение некоторых спектральных фильтров Zorro:

Перевод книги "Хакер фондового рынка". Торговля с помощью фильтра низких частот.

Рис. 15 — Некоторые спектральные фильтры

Первая кривая в верхней части рис. 15 (Chirp) — это смоделированная кривая цены, которая совершает регулярные колебания с периодом, увеличивающимся от 10 до 60 баров. Не очень реалистичная кривая цен, но это хороший способ увидеть, как различные спектральные фильтры влияют на эту кривую. Полосовой фильтр (BandPass, вторая кривая сверху) пропускает только определенный диапазон частот в середине. Фильтр высоких частот (HighPass) ослабляет тренд и все долгосрочные циклы. Фильтр низких частот второго порядка (LowPass) ведет себя наоборот, он ослабляет все короткие циклы. Внизу, для сравнения, индикатор EMA, фильтр низких частот первого порядка с гораздо менее эффективным затуханием.

Что же делает фильтр низких частот с реальной кривой цен? На рисунке светлая линия — это исходная кривая цены — здесь курс EUR/USD — а темная линия — результат применения функции низких частот.

Перевод книги "Хакер фондового рынка". Торговля с помощью фильтра низких частот.

Рис. 16 — Кривая EUR/USD с фильтром низких частот

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

Продолжение следует...

★4
10 комментариев
Данная система содержит дефект уже при рождении.
Доказательство? Пожалуйста: как известно, главными характеристиками любого колебательного процесса являются Амплитуда и Частота.
И оба эти фактора подвластны ММ.
Он может (и обязательно будет!) постоянно изменять частотность или амплитуду. Скорее всего, и то и другое одновременно.
Обнаружить «резонансные» характеристики не стоит большого труда. Достаточно запустить в «нейронку» поток текущих сделок…
avatar
Eugene Bright, нейронки плоховастенько с таким справляются вообще-то. Разве что… нейронки на линейных нейронах. Но да, свои тензорные процессоры надо чем-то загрузить ... 
avatar
Kot_Begemot, да тут и «нейронка» не понадобится, если уж строго подходить. Простая статистика ордеров всё покажет.
avatar
Что за язык программирования?
Евгений Гуревич, js
avatar
Евгений Гуревич, lite-C
avatar
Жалко, что нет применения к SPY.
avatar
А. Г., там интересненько? 
avatar
Kot_Begemot, да, интересно, если мы торгуем ликвидными акциями даже в России. А вот EURUSD имеет другие статистические свойства дневок.
avatar
если нарисовать трехдневную среднюю по закрытиям, примерно такая же кривая будет))) только строится гораздо проще. но так же будет опаздывать.
avatar

теги блога Stanislav Gribanov

....все тэги



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