Джеффри Оуэн Кац и Донна Л. МакКормик. Энциклопедия торговых стратегий

  • Автор темы Автор темы FXWizard
  • Дата начала Дата начала

FXWizard

Гуру форума
attachment.php


Рисунок 6-2. Графики изменения капитала для комбинаций моделей и скользящих средних.

Результаты тестов систем, основанных на скользящих средних и пробоях, показывают, что при использовании моделей следования за трендом лимитный приказ всегда улучшает характеристики; для противотрендовых моделей огромное преимущество иногда дает стоп-приказ. Эта тенденция может быть результатом того, что у моделей следования за трендом уже есть элемент обнаружения тренда: добавление еще одного обнаруживающего или проверяющего элемента (такого, как вход по стоп-приказу) является избыточным; однако добавление лимитного приказа вносит в систему противотрендовый элемент и обеспечивает более выгодный вход, повышая, тем самым, эффективность. В случае с противотрендовыми моделями добавление элемента подтверждения тренда придает системе новое качество и, следовательно, улучшает результаты. Иногда это настолько выгодно, что компенсирует менее благоприятные цены входа, чем при использовании стоп-приказов.
Для таких рынков, как рынок казначейских облигаций, японской йены, немецкой марки, швейцарского франка, неэтилированного бензина, кофе, апельсинового сока и свиной грудинки, можно найти высокоприбыльные комбинации типов модели и приказа.
На рис. 6-2 представлены графики изменения капитала для различных комбинаций моделей и скользящего среднего. Капитал каждой системы был усреднен по типу приказа. Лучшими двумя моделями были модель поддержки/сопротивления на основе треугольного скользящего среднего с передним взвешиванием и модель поддержки/сопротивления на основе простого скользящего среднего. Эти модели работали значительно лучше, чем любые из противотрендовых моделей, основанных на пересечении. Можно выделить три временных периода, в каждом из которых эти модели вели себя по-разному: от начала выборки до октября 1987 г., с октября 1987 г. по июнь 1991 г. и с июня 1991 г. по декабрь 1998 г.
Наихудшие результаты были получены в течение последнего периода.
Графики изменения капитала, представленные на рис. 6-2, показывают, что противотрендовые модели лучше работали в прошлом, в то время как модели следования за трендом лучше работали в последнее время. В пределах выборки стоп-приказ оказался наилучшим видом входного приказа для каждой комбинации модели и скользящего среднего. Вне пределов выборки стоп-приказ был наихудшим для трех комбинаций модели и скользящего среднего из шести (по двум комбинациям не было сделок, поэтому они не рассматривались). Рыночный приказ по цене открытия следующего дня оказался наихудшим во всех случаях, за исключением двух. Стоп-приказ, как правило, был лучше лимитного приказа в пределах выборки. Однако вне выборки лимитный приказ был немного лучше стоп-приказа.

ЗАКЛЮЧЕНИЕ

В общем, модели следования за трендом в тестах с 1 по 24 работали лучше, чем противотрендовые модели в тестах с 25 по 48, за некоторыми исключениями, рассмотренными выше.
Лучшие модели, несомненно, сочетают в себе как противотрендовые элементы, так и элементы следования за трендом. Например, покупка при откате рынка с использованием лимитного приказа после пробоя скользящего среднего обеспечивает лучшие результаты, чем другие комбинации. Противотрендовые модели, основанные на скользящих средних и имеющие элемент следования за трендом (например, стоп-приказ), так-же показывают наилучшие результаты. Чистые противотрендовые модели и модели следования за трендом значительно им уступают. Более того, добавление трендового фильтра к системе следования за трендом не дает преимуществ, но может увеличивать затраты при входе. С другой стороны, комбинация противотрендовых моделей с трендовым фильтром ADX может повысить эффективность системы. Хотя фильтр ADX не имеет
 

Вложения

  • pic62.png
    pic62.png
    77,8 КБ · Просмотры: 83

FXWizard

Гуру форума
Входы на основе осцилляторов

Осцилляторы популярны у трейдеров, использующих технические системы, в течение многих лет. Статьи, посвященные осцилляторам, нередко появляются в таких журналах, как Technical Analysis of Stocks and Commodities и Futures. Описанию осцилляторов посвящено множество книг по техническому анализу.
Наиболее широко применяются в классическом виде и различных вариантах осциллятор Аппеля (1990) — осциллятор схождения-расхождения скользящих средних (так называемый MACD) и гистограмма MACD (MACD-H). Кроме того, популярны стохастический осциллятор Лэйна и индекс относительной силы Вильямса (RSI). В литературе упоминается множество их вариантов. Также следует упомянуть индекс товарных каналов Ламберта (CCI), индекс случайного блуждания, который тоже можно считать осциллятором, и осциллятор Геда,а на основе регрессионных каналов (1997). В этой главе будут рассмотрены в первую очередь три самых известных осциллятора — MACD, стохастический и RSI.

ЧТО ТАКОЕ ОСЦИЛЛЯТОР?

Осциллятор — это индикатор, обычно основанный на ценах и имеющий тенденцию колебаться или «осциллировать» в некоторых фиксированных или достаточно жестко ограниченных пределах. Осцилляторы характеризуются нормализацией диапазона и удалением долговременных трендов уровня цен — информация извлекается осцилляторами из таких эфемерных показателей, как импульс и перенапряжение. Импульс — это состояние, когда цены мощно 'двигаются в данном направлении. Перенапряжение — это состояние избыточно высоких или низких цен («перекупленность» и «перепроданность»), когда цены готовы резко вернуться на более разумный уровень.
 
Последнее редактирование:

FXWizard

Гуру форума
ВИДЫ ОСЦИЛЛЯТОРОВ

Существуют два главных вида осцилляторов. Один из них — линейные полосовые фильтры, анализирующие частоту колебаний. К этому классу относятся MACD и MACD-H. Другой класс приводит к некоторой нормализованной шкале какой-либо аспект поведения цен (к этому классу относятся RSI, стохастический осциллятор и CCI); в отличие от первой категории эти осцилляторы не являются, по сути, линейными фильтрами с определенным фазовым и частотным алгоритмом. Оба вида осцилляторов реагируют на импульс цен и циклические движения, при этом снижая роль трендов и игнорируя долговременные сдвиги; в общем, построенные ими графики имеют ломаный, колеблющийся вид.
Осциллятор MACD (осциллятор схождения/расхождения скользящих средних) и его гистограмма MACD-H работают как грубые полосовые фильтры, удаляя тренды и сдвиги, а также высокочастотный шум. При этом анализируются волны или циклы с частотой, близкой к середине полосы пропускания. MACD сглаживает данные, подобно скользящему среднему, в некоторой степени удаляет тренды, выделяет циклы и иногда не запаздывает по отношению к рынку. Хорошим источником по этому осциллятору можно считать работу Элерса (Ehlers,1989).
MACD рассчитывается путем вычитания скользящего среднего с длинным периодом из скользящего среднего с более коротким периодом. В принципе можно использовать любые виды средних или фильтров низких частот (в классическом MACD использованы экспоненциальные скользящие средние). Ряд вариантов MACD построен на более сложных средних, например VIDYA (рассмотрено в главе о скользящих средних), а также на треугольных средних. Помимо собственно MACD используется гистограмма — разность MACD и его скользящего среднего. Во многих случаях скользящее среднее MACD называется сигнальной линией.
Стохастический осциллятор часто еще называют индикатором перекупленности/перепроданности. Согласно Лупо (Lupo, 1994), «стохастичёский-осциллятор определяет положение последнего рыночного действия по отношению к минимальной и максимальной цене за последние n дней». В этом отношении стохастический осциллятор измеряет импульс цены, он показывает, стремится ли рынок к новому максимуму или минимуму или находится где-то посередине.
К стохастическим относится ряд родственных индикаторов: Быстрый %К, Медленный %К (также называемый Быстрым %D) и Медленный %D.
Быстрый %К измеряет в процентах расположение последней цены закрытия относительно максимального максимума и минимального минимума за последние n дней, где n — длина заданного периода индикатора.
Медленный %К, он же Быстрый %D, рассчитывается аналогично Быстрому %К, за тем исключением, что числитель и знаменатель формулы для Быстрого %К предварительно усредняются за последние 3 дня. Медленный % D — просто скользящее среднее Медленного %К с периодом 3 дня. Его иногда используют как сигнальную линию, подобно тому, как скользящее среднее MACD используют как сигнальную линию для MACD.

A(i) = Максимум из H(i), H(i - 1), ... Н(1 - n + 1)
B(i) = Минимум из L(i), L(i - 1), ... L(1 - n + 1)
D(i) = [A(i) + A(i - 1) + A(i - 2)]/3
E(i) = [B(i) + B(i - 1) + B(i - 2)]/3
F(i) = [C(i)+C(i- 1) + C(i-2)]/3

Быстрый %К для i-го дня = 100 X [C(i) - B(i)]/[A(i) - B(i)]
Медленный %K = Быстрый %D = 100 X [F(i) - E(i)]/[D(i) - E(i)]
Медленный %D = простое скользящее среднее Медленного %К с периодом 3 дня

U(i) = Максимум из 0, C(i) - C(i - 1)
D(i) = Максимум из 0, C(i - 1) - C(i)
АU(i) = [(n - 1) X АU(i - 1) + U(i)]/n
AD(i) = [(n - 1) X AD(i - 1) + D(i)]/n
RSI(i) = 100 X AU(i)/AU(i) + AD(i)]

В этих уравнениях i означает номер торгового дня, H(i) — максимум дня i, L(i) — минимум дня i, C(i) — цену закрытия дня i. Все остальные переменные — производные серии данных, необходимые для расчета различных стохастических осцилляторов. Как видно из уравнений, стохастические осцилляторы выделяют относительное положение цены закрытия в пределах, установленных недавними максимумами и минимумами: высокие значения (до 100) возникают, когда цена закрытия близка к высшим значениям недавних цен, низкие (до 0) — когда цена закрытия близка к низшим.
Индекс относительной силы (RSI) — еще один популярный осциллятор, который оценивает по процентной шкале относительное движение вверх или вниз. Классический RSI использует экспоненциальные скользящие средние, отдельно рассчитанные для движения вверх и вниз. Их сумма и дает процент общего движения. Один из вариантов использует для вычисления простые скользящие средние. Формула классического RSI приведена ниже:
Известно много вариантов стохастического осциллятора; например, Блау (Blau) в 1993 г. описывал вариант с двойным сглаживанием. Уравнения для классического стохастического осциллятора Лэйна опубликованы в статье Мейбаха (Meibahr, 1992). Ниже приведена одна из версий этих уравнений:
Период индикатора обозначен как n, движение вверх — U, движение вниз — D, среднее движение вверх — AU, среднее движение вниз — AD.
Номер торгового дня обозначен буквой i. Обычно рассчитывается RSI с периодом 14 дней (n = 14). У Стара (Star, 1993) можно найти подробное обсуждение этого индикатора.
 
Последнее редактирование:

FXWizard

Гуру форума
Кроме того, существует индекс товарных каналов, или CCI, рассмотренный в работе Девиса (Davies, 1993). Этот осциллятор подобен стохастическому с усиленным акцентом на статистику: вместо оценки последней цены закрытия в рамках недавних максимумов и минимумов он оценивает ее относительно границ, определяемых медианой и средним отклонением цены за последнее время. Хотя далее этот осциллятор не будет рассматриваться, для заинтересованных читателей мы приводим его определение:

Х(i) = H(i) + L(i) + C(i)
A(i) = Простое скользящее среднее от X(i) с периодом n дней
D(i) = Среднее от [Х(i - k) - A(i)] для k от 0 до n - 1
CCI(v) = [Х(i) - A(i)]/[0,015 X D(i)]

В уравнениях индекса товарных каналов X — так называемая медианная цена, А — скользящее среднее X, D — среднее абсолютное отклонение, n — период индикатора, i — номер торгового дня.
На рис.7-1 изображен график S&P 500, к которому приложены графики трех наиболее популярных осцилляторов с прилагающимися к ним сигнальными линиями, медленными версиями и т.п. На графике стохастического осциллятора также изображены фиксированные пороги на уровнях 80 и 20, для RSI эти пороги традиционно помещают на уровнях 70 и 30. Рисунок показывает графики осцилляторов и их реакцию на изменения цен, а также иллюстрирует метод расхождения, о котором речь пойдет ниже.
 

FXWizard

Гуру форума
ПОЛУЧЕНИЕ СИГНАЛОВ ВХОДА ПРИ ПОМОЩИ ОСЦИЛЛЯТОРОВ

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

attachment.php


Рисунок 7-1. Осцилляторы и расхождение графиков цены и осцилляторов.

Еще один известный метод — поиск расхождений осциллятора и цены, описанный МакХортером (McWhorter, 1994). Расхождение получается тогда, когда цены образуют новый минимум (ниже предыдущих минимумов) , а осциллятор — более высокий минимум (выше предыдущих минимумов). Такое расхождение дает сигнал к покупке. В противоположной ситуации, когда цены образуют новый максимум, а осциллятору не удается достичь предыдущего максимума, что является признаком потери ценового импульса, генерируется сигнал к продаже. Расхождение иногда легко увидать глазами, но для программы с простыми правилами найти его почти всегда затруднительно. Механическая генерация сигналов на основе расхождения требует алгоритма распознавания образов, что усложняет систему и, следовательно, затрудняет ее тестирование. Впрочем, получать такие сигналы можно, хорошим примером служит программа Divergengine от Ruggiero Associates. Пример расхождения можно увидеть на рис. 7-1.
В использовании осцилляторов для получения сигналов существует ряд принципиальных моментов, например сглаживание данных и своевременность входов. Например, MACD иногда обеспечивает сглаживание данных в реальном времени, что позволяет получать лучшие результаты, чем при использовании моделей, основанных на скользящих средних, где пики и провалы на графике значительно запаздывают по сравнению с ценами, а поздние входы снижают эффективность. MACD, со своей стороны, при совпадении собственного периода с циклической активностью рынка
обеспечивает примерное совпадение пиков и провалов и сглаживание графика, что также позволяет избежать характерных для скользящих средних многочисленных сделок, вызванных шумом, и повысить прибыль за счет своевременности сделок.
Помимо MACD, другие осцилляторы также, как правило, не отстают или даже опережают цены. По рассмотренным ниже причинам обгоняющие или одновременные индикаторы вовсе не обязательно дают большие прибыли, чем запаздывающие скользящие средние — своевременность сигналов не обязательно означает их прибыльность. Проблема в том, что даже при наличии некоторых абсолютно точных сигналов, осцилляторы будут генерировать множество ложных. В условиях сильного тренда многие из ожидаемых разворотов никогда не происходят, и система входит в рынок в неверном направлении. Таким образом, за счет точности теряется надежность. Что важнее — поздний, но надежный вход или ранний, но менее надежный — вопрос отдельного эмпирического исследования. В принципе эта проблема возникает при использовании любого прогностического метода — чем больше задержка, тем точнее (и бесполезнее) прогноз и, чем больше опережение, тем он полезнее (и ошибочнее). Эта логика напоминает принцип неопределенности Гейзенберга.
В качестве примера получения сигналов входа рассмотрим стохастический осциллятор: простая модель производит покупку, если значение осциллятора падает ниже традиционного порога перепроданности на уровне 20 и затем поднимается. Продажа производится, когда значение осциллятора поднимается выше традиционного порога перекупленности на уровне 80 и затем снова опускается. Поскольку при таких торговых правилах сигнал на закрытие текущей позиции вряд ли появится скоро, требуется вводить независимый критерий выхода. Трейдеры также ищут модель, называемую «стохастический крюк»: осциллятор достигает минимума, немного поднимается, а затем образует еще один минимум на более высоком уровне. Как только определяется второй минимум, подается сигнал на покупку. Когда эта же модель встречается в перевернутом виде, производится продажа.
Как и в случае с пробоями и скользящим средними, для осуществления входов могут быть использованы различные приказы, а именно рыночный приказ по цене открытия, лимитный приказ и стоп-приказ. Преимущества и недостатки этих входов уже обсуждались в двух предыдущих главах.
 

Вложения

  • pic7_1.png
    pic7_1.png
    138,6 КБ · Просмотры: 78
Последнее редактирование:

FXWizard

Гуру форума
ХАРАКТЕРИСТИКИ ВХОДОВ НА ОСНОВЕ ОСЦИЛЛЯТОРОВ

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

FXWizard

Гуру форума
МЕТОДИКА ТЕСТИРОВАНИЯ

Все приведенные ниже тесты были осуществлены с помощью осцилляторных моделей на портфеле разнообразных ценных бумаг. Можно ли получать прибыльные сделки с осцилляторными моделями? Как они работают во времени — ухудшается или улучшается их функционирование за последние годы? Целью нашего тестирования был ответ на эти вопросы.
Во всех тестах использовался стандартный выход, описанный в предыдущих главах. Правила входов будут рассмотрены параллельно с кодом модели и отдельными тестами. Сделки закрывались при поступлении приказа на вход в обратном направлении или при исполнении стандартного выхода. Платформа тестирования тоже была стандартной.
За последние годы мы закодировали на языке C++ ряд осцилляторов, описанных в Technical Analysis of Stocks and Commodities и в ряде других источников. В этой главе мы сравниваем работу версий C++ осцилляторов MACD, RSI и стохастического с их версиями в TradeStation.
В большинстве случаев результаты идеально совпадали, но в одном случае, а именно для Медленного %К, результат разительно отличался. Разбор кода показал, что TradeStation рассчитывает Медленный %К как экспоненциальное скользящее среднее от Быстрого %К. В нашем же коде отдельно рассчитываются простые скользящие средние с периодом 3 дня для числителя и знаменателя формулы Быстрого %К. Согласно уравнениям, приведенным Мейбахом (Meibahr, 1992) и другими источниками, правильной является наша версия на C++. Если читатели захотят повторить наши расчеты в TradeStation и обнаружат расхождения, мы настоятельно рекомендуем проверить функции индикаторов TradeStation.
Кроме того, при попытке закодировать правильную версию Медленного %К для TradeStation на EasyLanguage мы неожиданно обнаружили, что TradeStation без предупреждения может выдать неверные результаты, если одна пользовательская функция вызывает другую. Когда мы изменили код так, чтобы рассчитывалась промежуточная переменная (чтобы избежать совместных вызовов), были получены правильные результаты. В этих тестах использовалась версия TradeStation 4.02 от 29 июля 1996 г.
Нижеследующий код включает большинство использованных в тестах моделей входов на основе осцилляторов. Реальный расчет осцилляторов достигается путем вызова внешних функций.


static void Model (float *parms, float *dt, float *opn, float *hi,
float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb,
TRDSIM &ts, float *eqcls) (
// Выполнение тестирования моделей на осцилляторах
// File = xllmodOl.c
// parms - набор [1.. MAXPRM] параметров
// dt - набор [l..nb] дат в формате ГГММДД
// орn - набор [l..nb] цен открытия
// hi — набор [l..nb] максимальных цен
// 1о - набор [1..пЬ] минимальных цен
// cls — набор [l..nb] цен закрытия
// vol - набор [l..nb] значений обьема
// oi — набор [l..nb] значений открытого интереса
// dlrv — набор [l..nb] средних долларовой волатильности
// nb — количество дней в наборе данных
// ts — ссылка на класс торгового симулятора
// eqcls — набор [l..nb] уровней капитала при закрытых позициях
// объявляем локальные переменные
static int rc, cb, ncontracts, maxhold, len1, len2, len3;
static int modeltype, ordertype, osctype, signal, i, j, k;
static float mmstp, ptlim, stpprice, limprice, tmp;
static float exitatr[MAXBAR+1];
static float sigline[MAXBAR+1], oscline[MAXBAR+1];
static float upperband[MAXBAR+1] , lowerband [MAXBAR+1] ;
// копируем параметры в локальные переменные для удобного обращения
lenl = parms[l]; // более короткий для первого параметра длины
1еn2 = parms[2] ; // более длинный для второго параметра длины
1епЗ = parms[3]; // длина теста дивергенции
modeltype = parms[7]; // тип осцилляторной модели входа
osctype - parms[8]; // тип осциллятора
ordertype = parms[9]; // тип входного приказа
maxhold =10; // период максимального удержания позиции
ptlim =4; // целевая прибыль в единицах волатильности
mmstp =1; // защитная остановка в единицах волатильности
// пропускаем неправильные комбинации параметров,
if ( (osctype==4 && len1>=len2) ) (
set_vector(eqcls, 1, nb, 0.0);
return;
}
// выполняем вычисления для всех данных, используя процедуры быстрой обработки
// массивов
AvgTrueRangeS{exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для выхода
switch(osctype} { // выбираем осциллятор
case 1: // классические быстрые стохастики
StochOsc(oscline,hi,lo,cls,1,len1,nb); //Быстрый %К
MovAvg(sigline, oscline, 1, 3, nb); //Быстрый %D
set_vector(upperband, 1, nb, 80.0); //верхняя граница
set_vector(lowerband, 1, nb, 20.0); //пробой нижней границы
break;
case 2: // классические медленные стохастики
StochOsc(oscline,hi,lo,cls,2,lenl,nb); //Медленный %К
MovAvg(sigline, oscline, 1, 3, nb); //Медленный %D
set_vector(upperband, 1, nb, 80.0); //верхняя граница
set_vector(lowerband, 1, nb, 20.0); //пробой нижней границы
break;
case 3: // классический RSI
RsiOsc(oscline, cls, 1, lenl, nb); //RSI
MovAvgtsigline, oscline, 1, 3, nb) ; //3-дневное ПСС
set_vector(upperband, 1, nb, 70.0); //верхняя граница
set_vector(lowerband, 1, nb, 30.0); //пробой нижней границы
break;
case 4 : // классический MACD
MacdOsc(oscline,cls,1,lenl,len2,nb); //классический MACD
MovAvg(sigline, oscline, 2, 9, nb) ; //9-дневное ЭСС
for{i=l; i<=nb; i++}
lowerband=1.5*fabs(oscline ) ; //пороги
MovAvg(upperband,lowerband,1,120,nb); //как долгосрочная
for{i=l; i<=nb; i++} //отклонение от среднего
lowerband= -upperband; //полосы
break;
default: nrerror("Invalid moving average selected");
};
// проходим через штрихи (дни), чтобы смоделировать реальную торговлю
for{cb = 1; cb <= nb; cb++} {
// не открываем позиций до начала периода выборки
// ... то же самое, что и установка MaxBarsBack в TradeStation
166 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК
if(dt[cb] < IS_DATE) { egcls[cb] = 0.0; continue; )
// выполняем ожидающие приказы и считаем накопленный капитал
rс = ts.update{opn[cb], hi[cb], lo[cb], cls[cb], cb);
if(rc = 0) nrerror("Trade buffer overflow"};
eqcls[cb] = ts.currentequity(EQ_CLOSETOTAL);
// считаем количество контрактов для позиции
//... мы хотим торговать эквивалентом долларовой волатильности
//... 2 новых контрактов S&P-500 от 12/31/98
ncontracts = RoundToInteger(5673.0 / dlrvfcbj);
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+l] == lo[cb+l]) continue;
// генерируем входные сигналы, цены стоп- и лимитных приказов,
// используя определенную модель входа на осцилляторах
#define CrossesAbove (a,b,c) (а[с]>=b[с] && а[с-1]<b[с-1])
#define CrossesBelow(a,b, с) (a[c]<b[c] && а [с-1] >=b [с-1] )
#define TurnsUp(a,c) (а[с]>=а[с-1] && а[с-1]<а[с-2])
#define TurnsDn(a,c) (a[c]<a[c-l] && а [с-1] >=а [с-2] )
signal=0;
switch (modeltype) {
case 1: // модель перекупленности-перепроданности
if(CrossesAbove(oscline, lowerband, cb)}
signal = 1;
else if(CrossesBelow(oscline, upperband, cb))
signal = -1;
limprice = 0.5 * (hi [cb] + lo [cb] ) ;
stpprice = cls[cb] +0.5 * signal * exitatr[cb];
break;
case 2: // модель сигнальной линии
if(CrossesAbove(oscline, sigline, cb))
signal = 1;
else if(CrossesBelow(oscline, sigline, cb))
signal = -1;
limprice = 0.5 * (hi [cb] + lo[cb]) ;
stpprice = cls[cb] + 0.5 * signal * exitatr[cb];
break;
case 3: // модель дивергенции
i = LowestBar(cls, len3, cb) ;
j = LowestBar(oscline, len3, cb);
if(i < cb && i > cb-6 && j > cb-len3+l && i-j > 4
&& TurnsUp(oscline, cb)) signal = 1;
else {
i = HighestBar(cls, len3, cb} ;
j = HighestBar(oscline, len3, cb);
if(i < cb && i > cb-6 && j > cb-len3+l && i-j > 4
&& TurnsDn(oscline, cb)) signal = -1;
)
limprice = 0.5 * (hi[cb] + lo[cb]);
stpprice = cls[cb] + 0.5 * signal * exitatr[cb];
break;
default: nrerror("Invalid model selected");
)
#undef CrossesAbove
#undef CrossesBelow
#undef TurnsUp
#undef TurnsDn
// входим в сделку, используя определенный тип приказа
if (ts.position() <= 0 && signal == 1) {
switch(ordertype) { // выбираем нужный вид приказа
case 1: ts.buyopen('1', ncontracts); break;
case 2: ts.buylimit('2', limprice, ncontracts); break;
case 3: ts.buystop('3', stpprice, ncontracts); break;
default: nrerror("Invalid buy order selected");
}
}
else if(ts.position1) >= 0 && signal == -1) {
switch(ordertype) { // выбираем желаемый тип приказа
case 1: ts.sellopen('4', ncontracts); break;
case 2: ts.selllimit('5', limprice, ncontracts); break;
case 3: ts.sellstop('6', stpprice, ncontracts); break;
default; nrerror("Invalid sell order selected");
}
}
// симулятор использует стандартную стратегию выхода
tmp = exitatr[cb];
ts.stdexitcls ('Х', ptlim*tmp, nmstp*tmp, maxhold) ;
} // обрабатываем следующий день

Логика кода весьма напоминает программу, использованную для тестирования скользящих средних. Сначала копируется ряд параметров в местные переменные для простоты ссылок и считывания дальнейшим кодом. Затем проверяется наличие непригодных сочетаний параметров, например для MACD (osctype = 4) длина короткого скользящего среднего должна быть меньше, чем длинного, иначе тест будет пропущен. В следующем крупном блоке osctype выбирает вид рассчитываемого осциллятора (1 — быстрый стохастический, 2 — медленный стохастический, 3 — классический RSI, 4 — классический MACD) . Осциллятор oscline затем рассчитывается в виде ряда данных или вектора, генерируются дополнительные кривые, связанные с ним, например сигнальная линия sigline или медленная версия осциллятора. Верхний (upperband) и нижний (lowerband) пороги либо рассчитываются, либо задаются. Для стохастического осциллятора используются стандартные пороги 80 и 20, для RSI — пороги на уровне 70 и 30. Хотя MACD как таковой не имеет порогов, пороги для него устанавливаются на уровне плюс-минус полтора стандартных отклонения от нуля. Затем начинается процесс перебора данных, день за днем. В цикле перебора данных представляют интерес два главных блока — первый генерирует сигналы покупки и продажи, а также цены для лимитного и стоп-приказов, используемых выбранной моделью. Параметр mode/type выбирает модель: 1 — модель перекупленности/перепроданности, 2 — модель сигнальной линии, 3 — модель на расхождении. При этом используется один из вышеперечисленных осцилляторов, выбранный параметром osctype. Последний блок производит вход в рынок согласно выбранному значению параметра ordertype: 1 — для входа по цене открытия, 2 — по лимитному приказу, 3 — по стоп-приказу. Затем симулятор использует стандартную модель выхода для закрытия сделок.
Точные логические основания для входа будут обсуждаться ниже в контексте индивидуальных тестов, что не требует от читателя понимания или обращения к коду.
 
Последнее редактирование:

FXWizard

Гуру форума
РЕЗУЛЬТАТЫ ТЕСТОВ

Проводилось тестирование трех осцилляторных моделей входа: на основе понятия перекупленности/перепроданности (осцилляторы RSI и стохастический), на основе взаимодействия осциллятора с сигнальной линией (стохастический осциллятор и MACD) и на основе расхождения (статистический осциллятор, RSI и MACD). Все индивидуальные комбинации были исследованы с входами по цене открытия, по лимитному приказу и по стоп-приказу. Сравнение результатов всех трех видов входов приведено ниже в данной главе.
Табл. 7-1 и 7-2 содержат результаты каждого из 21 тестов. Данные распределены по торгуемым финансовым инструментам, по моделям, показавшим прибыль и убыток в пределах выборки (табл. 7-1) и вне пределов выборки (табл. 7-2). Первый столбец (SYM) — это символ рассматриваемого рынка, первая строка — номер теста. Степень прибыльности и убыточности рынков для каждой модели указана следующим образом: один минус (—) означает убыток в $2000 — 4000, два минуса (- -) — убыток более $4000; один плюс ( + ) означает прибыль $1000 — 2000, два плюса (++) — прибыль более $2000; пустая ячейка означает прибыль до $ 1000 или убыток до $1999 со сделки.
 

FXWizard

Гуру форума
ТЕСТИРОВАНИЕ МОДЕЛЕЙ, ОСНОВАННЫХ НА ПОНЯТИИ ПЕРЕКУПЛЕННОСТИ/ПЕРЕПРОДАННОСТИ

Входы генерировались, когда осциллятор пересекал верхний порог вниз или нижний порог вверх. Эти модели являются противотрендовыми. Когда осциллятор указывает на импульс цен, направленный вниз, производится покупка. В противоположном случае производится продажа. В тестах от 1 до 6 использовались стохастический осциллятор и RSI, поскольку для них существуют стандартные пороги, часто применяемые вышеописанным способом.
Тесты 1—3. Стохастические модели на основе понятия перекупленности/перепроданности. Эти тесты оценивают работу модели с входом по цене открытия (тест 1), по лимитному приказу (тест 2) и по стоп-приказу (тест 3). Использован оригинальный Быстрый %К по Лэйну, период — от 5 до 25 с шагом 1. Наилучшие значения для тестов 1, 2 и 3 составили 25, 20 и 16 соответственно. Для стохастического осциллятора традиционные пороговые значения составляют 20 (нижнее) и 80 (верхнее). В целом эти модели несли тяжелые убытки как в пределах, так и вне выборки (табл. 7-3). Как и в предыдущих тестах, вход по лимитному приказу был наилучшим (т.е. имел минимальный убыток со сделки). Процент прибыльных сделок (37% в пределах, 36% вне пределов сделки) также был максимальным при использовании этого входа. Вход по стоп-приказу дал промежуточные результаты, по цене открытия — наихудшие. Торговая стратегия работала достаточно плохо в обеих выборках и на всех рынках. Вне пределов выборки небольшие прибыли были получены на рынке британского фунта и апельсинового сока со всеми видами входов, а при входе по стоп-приказу — на рынке леса, соевых бобов и живых свиней; отмечались еще некоторые неупорядоченные мелкие прибыли. В общем, эта модель принадлежит к числу худших из тестировавшихся.

Таблица 7—1. Эффективность в пределах выборки по тестам и рынкам

attachment.php


Таблица 7—2. Эффективность вне пределов выборки по тестам и рынкам

attachment.php


Тесты 4—6. Модели RSI на основе понятия перекупленности/перепроданности. Эта модель оценивалась с входом по цене открытия (тест 4), по лимитному приказу (тест 5) и по стоп-приказу (тест 6). Рассчитывался оригинальный RSI по Вильямсу, период — от 5 до 25 с шагом 1. Наилучшее значение для всех тестов составило 25. Использованы традиционные пороговые значения: 30 (нижнее) и 70 (верхнее). Модель работала еще хуже, чем стохастическая, процент прибыльных сделок в общем случае колебался от 26 до 37%. Средний убыток в сделке достигал $7000. Общая прибыль была лучше, чем в тесте стохастического осциллятора, и, поскольку было совершено меньше сделок, хотя убыток на сделку был больше, общий убыток оказался меньше. Модель не нашла какого-либо «слабого места рынка, которое можно было бы использовать для получения прибыли. Лучше всего работал вход по лимитному приказу, прочие — примерно одинаково. Прибыль получена на значительно большем количестве отдельных рынков, особенно в тесте 5, где при входе по лимитному приказу прибыльными были в пределах выборки казначейские облигации, золото, серебро, платина, скот, овес и кофе; вне пределов выборки — золото, серебро, платина, скот и овес. Кроме того, вне пределов выборки прибыль удалось получить на рынках NYFE, британского фунта, мазута, кукурузы, сахара, апельсинового сока и леса.
 

Вложения

  • tab7_1.jpg
    tab7_1.jpg
    92,2 КБ · Просмотры: 64
  • tab7_2.jpg
    tab7_2.jpg
    94,6 КБ · Просмотры: 64

FXWizard

Гуру форума
Тесты моделей на основе сигнальной линии

В принципе, это модели, основанные на пересечении цены и скользящего среднего, с тем отличием, что ценовой ряд заменяется значениями осциллятора. В таком случае скользящее среднее называется сигнальной линией. Когда осциллятор опускается ниже сигнальной линии, открывают короткую позицию, когда поднимается выше, открывают длинную позицию.
Осцилляторы имеют меньшее запаздывание, чем скользящие средние, и менее зашумлены, чем собственно цены. Поэтому при использовании данной торговой системы можно надеяться на получение более своевременных и надежных сигналов. В тестах 7-12 использованы стохастический осциллятор и MACD. Медленный %К обычно имеет сильно выраженное циклическое поведение, что делает его пригодным для входов на основе сигнальной линии. График MACD обычно строится с сигнальной линией, даже когда пересечения не рассматриваются как критерий входа.
Тесты 7—9. Модели на основе стохастического осциллятора с сигнальной линией. Эта модель оценивалась с входом по цене открытия (тест 7), по лимитному приказу (тест 8) и по стоп-приказу (тест 9). Рассчитывался оригинальный Медленный %К по Лэйну, поскольку в предварительном тестировании Быстрый %К приводил к избыточному числу сделок, вызванных высоким уровнем шума. Сигнальная линия представляла собой простое скользящее среднее Медленного %К с периодом 3 дня. Период осциллятора — от 5 до 25 с шагом 1. Наилучшие значения для тестов 7, 8 и 9 составили 15, 14 и 11 соответственно. В целом модель несла тяжелые убытки в расчете на одну сделку. Ввиду большого количества сделок убытки были астрономическими. Вход по лимитному приказу был наилучшим (т.е. имел минимальный убыток в сделке и максимальный процент прибыльных сделок). Хуже всего работал вход по цене открытия. Эта модель положительно реагирует на использование стоп-приказов. Возможно, это связано с тем, что они действуют подобно фильтрам трендов: если обнаружено движение против тренда, прежде, чем сработает вход, разворот рынка должен подтвердиться. Входы по стоп-приказу также работали лучше в системах на пересечении скользящих средних. В общем, только на двух рынках была получена прибыль в пределах выборки, вне пределов — несколько мелких прибылей на других рынках; на рынке кофе удалось получить более $2000 в сделке.
Тесты 10—12. Модели MACD на основе сигнальной линии. Эта модель оценивалась с входом по цене открытия (тест 10), по лимитному приказу (тест 11) и по стоп-приказу (тест 12). Рассчитывался классический MACD с использованием экспоненциальных скользящих средних. Период короткого скользящего среднего прогонялся от 3 до 15 с шагом 2, период длинного скользящего среднего — от 10 до 40 с шагом 5. Скользящее среднее, служащее сигнальной линией, имело традиционный фиксированный период, равный 9. В общем, этот осциллятор работал лучше, чем какой-либо из испытанных до сих пор. В пределах выборки лучшим был вход по лимитному приказу, худшим — по цене открытия. Вне пределов выборки вход по стоп-приказу давал максимальный (из полученных до сих пор) процент прибыльных сделок (40%) и минимальный средний убыток в сделке. В пределах выборки только рынок леса давал ощутимую прибыль при входе по лимитному приказу. При входе по стоп-приказу в пределах выборки были прибыльны также рынки живых свиней, свиной грудинки, кофе и сахара. Из них вне пределов выборки остались прибыльными лес, живые свиньи, свиная грудинка и кофе. Многие рынки, убыточные в пределах выборки, дали прибыль вне ее. Положительные результаты по максимальному количеству рынков были получены при использовании входа по стоп-приказу.
 

FXWizard

Гуру форума
ТЕСТЫ МОДЕЛЕЙ, ОСНОВАННЫХ НА РАСХОЖДЕНИИ

Тесты 13 — 21 рассматривают расхождения графиков цены и стохастического осциллятора, RSI и MACD. Расхождение — это концепция, используемая техническими трейдерами для описания явления, легко заметного на графике, но трудно поддающегося алгоритмическому определению и анализу. Примеры расхождения изображены на рис. 7-1. Расхождение появляется, когда рынок образует провал, более низкий, чем провал или пара провалов, образованных в это время осциллятором, указывая, таким образом, на покупку. Сигнал к продаже возникает в противоположной ситуации. Поскольку формы волн могут быть самыми разными, определение расхождений — нетривиальная задача. Хотя наш алгоритм устроен элементарно и далек от совершенства, при исследовании графиков он дает достаточно надежные результаты, чтобы сулить о качестве основанных на расхождении систем.
Мы будем обсуждать только сигналы покупки, поскольку сигналы продажи представляют собой их точную противоположность. Логика алгоритма такова: в течение обозреваемого исторического периода (1епЗ) находят дни с минимальным значением в ценовой серии и в значениях осциллятора. Затем проверяют ряд условий: во-первых, минимум ценового ряда не должен приходиться на текущий день (т.е. должно начаться повышение), но попадать в пределы прошлых шести дней (т.е. этот провал должен быть близок к текущему моменту). Минимум в ценовой последовательности должен иметь место не менее чем через четыре дня в последовательности значений осциллятора (глубочайший провал осциллятора должен опережать глубочайший провал цен). Еще одно условие состоит в том, чтобы минимальное значение осциллятора не приходилось на первый день в обозреваемом периоде (т.е. должен быть сформирован минимум). Лучше, чтобы осциллятор был в самом начале обратного движения (что определяет второй провал как сигнал к покупке). Если все условия выполнены, то расхождение налицо и отдается приказ на покупку. Если приказ на покупку не отдан, то подобным же образом производится поиск расходящихся пиков, и при их обнаружении и соответствии подобным критериям отдается приказ на продажу. Такая методика достаточно хорошо находит расхождения на графиках. За исключением вида входов, единственное различие в тестах с 13 по 21 — это используемый вид осциллятора.
Тесты 13—15. Модели расхождения цены и стохастического осциллятора. Со стандартными входами использовался Быстрый %К. Оптимизация состояла в прогонке периода стохастического осциллятора от 5 до 25 с шагом 1 и обозреваемого периода расхождения от 15 до 25 с шагом 5. Лучшие параметры для периода и длины составили 20 и 15 для входа по цене открытия, 24 и 15 для входа по лимитному приказу и 25 и 15 для входа по стоп-приказу. Как в пределах, так и вне пределов выборки эффективность этой модели была в числе худших; в пределах выборки несколько лучше работал вход по лимитному приказу, вне пределов — вход по стоп-приказу. В пределах выборки при использовании всех видов входов прибыль была получена на рынках неэтилированного бензина, соевых бобов и соевой муки; при входе по лимитному приказу также были прибыльны рынки золота и свиной грудинки. Вне пределов выборки неэтилированный бензин был прибыльным со всеми видами входов, соевые бобы — при входах по цене открытия и по стоп-приказу. Вне пределов выборки прибыль была получена на большем количестве рынков, причем наилучших результатов удалось достичь при использовании входа по стоп-приказу. Такое явление, несомненно, показывает, что оптимизация не оказывала влияния на результаты, а также то, что на рынках в последние годы произошли изменения, повысившие эффективность использования подобных моделей. Это может быть объяснено снижением числа трендов и более неровным характером торговли на многих рынках.
Тесты 16—18. Модели расхождения цены и RSI. Оптимизация состояла в прогонке периода RSI от 5 до 25 с шагом 1 и обозреваемого периода расхождения от 15 до 25 с шагом 5. В общем, результаты были плохими. В пределах выборки наименее убыточным был вход по стоп-приказу, за ним следовал вход по лимитному приказу. Поскольку RSI — один из излюбленных индикаторов, используемых при поисках расхождения, такие плохие результаты достойны особого внимания. Мазут приносил прибыли со всеми видами входов, неэтилированный бензин был весьма прибылен
при входе по цене открытия и по стоп-приказу, сырая нефть — при входе по лимитному приказу и по стоп-приказу. В пределах выборки со всеми входами были прибыльны соевые бобы, с входом по стоп-приказу неплохо работали апельсиновый сок, кукуруза, соевое масло и свиная грудинка. Вне пределов выборки рынок нефтепродуктов не приносил устойчивых прибылей, а соевые бобы оставались прибыльными со всеми видами входов; апельсиновый сок и соевое масло по-прежнему приносили прибыль при входе по стоп-приказу.
Тесты 19—21. Модели расхождения цены и MACD. Период короткого скользящего среднего прогонялся от 3 до 15 с шагом 2; период длинного скользящего среднего — от 10 до 40 с шагом 5; обозреваемый период расхождения — от 15 до 25 с шагом 5. Исследовались только те наборы параметров, где период длинного скользящего среднего был значительно больше, чем период короткого.
Наконец-то модели, которые работают, принося положительную прибыль и в пределах, и вне пределов выборки! При входе по цене открытия торговля была прибыльной в обоих образцах данных. В пределах выборки средняя сделка приносила $1393, прибыльными были 45% сделок, а вероятность случайности результатов была всего 8,7% (после коррекции 99,9%). И длинные, и короткие позиции были прибыльными. Несмотря на низкую статистическую достоверность в пределах выборки, вне ее пределов прибыли продолжались: с учетом проскальзывания и комиссионных средняя прибыль в сделке составила $140 при 38% прибыльных сделок (только короткие позиции были прибыльны).
Вход по лимитному приказу в пределах выборки работал несколько хуже, но вне пределов выборки — значительно лучше. На рис. 7-2 изображен график изменения капитала для теста с входом по лимитному приказу. В пределах выборки средняя прибыль в сделке составила $1250 при 47% прибыльных сделок (максимальное из полученных значений); прибыльными были и длинные, и короткие позиции, причем вероятность случайности прибылей составила 13,1% (после коррекции 99,9%).

Вне пределов выборки модель приносила в среднем $985 в сделке, была прибыльной в 44% сделок, а вероятность случайности прибыли составляла всего 27,7%.
В пределах выборки вход по стоп-приказу давал максимальную среднюю прибыль в сделке, но вел к минимальному количеству сделок, из которых прибыльными были только короткие. Вне пределов выборки система терпела средний убыток размером в $589 в сделке, причем прибыльными были только короткие позиции. Вне зависимости от вида входов эта модель совершала сравнительно немного сделок.
Анализ отдельных рынков (табл. 7-1 и 7-2) подтверждает потенциал этих моделей. В пределах выборки больше рынков приносили прибыль, в обоих образцах данных по всем трем видам входов выгодны были рынки сырой нефти и кофе, многие рынки были прибыльными с двумя видами входов (например, мазут, живой скот, соевые бобы, соевая мука и лес).

attachment.php


Рисунок 7-2. График изменения капитала для теста расхождения цены и MACD со входом по лимитному приказу.
 

Вложения

  • pic7_2.png
    pic7_2.png
    101,4 КБ · Просмотры: 60
Последнее редактирование:

FXWizard

Гуру форума
СУММАРНЫЙ АНАЛИЗ

Табл. 7-3 содержит результаты, разбитые по виду модели, выборке данных и виду входа. Последние два столбца и последние две строки содержат средние значения. Колонки справа — усреднения для всех видов входов. Строки внизу — усреднения для всех видов моделей.

Таблица 7—3. Эффективность осцилляторных моделей по моделям, входам и образцам данных

attachment.php


Наилучшие результаты в обеих выборках данных получены для модели на расхождении цены и MACD. Вход по лимитному приказу дает наилучшие результаты, как в пределах, так и вне пределов выборки: доходность в процентах годовых — 12,5% и средняя прибыль в сделке — $1250 в пределах выборки. Данные показатели вне пределов выборки равны 19,5% и $985 соответственно. Такие показатели кардинально отличаются от прочих моделей.
Наихудшей (при усреднении результатов по видам приказов) оказывается модель на основе перекупленности/перепроданности RSI, особенно по показателю среднего убытка в сделке. Также среди худших были модели расхождения цены и стохастического осциллятора, перекупленности/перепроданности на основе стохастического осциллятора и расхождения цены и RSI.
При сравнении между собой видов входов (при усреднении по моделям) лучше всего проявил себя вход по лимитному приказу и хуже всего вход по цене открытия.
 

Вложения

  • tab 7_3.png
    tab 7_3.png
    86,2 КБ · Просмотры: 59

FXWizard

Гуру форума
ЗАКЛЮЧЕНИЕ

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

ЧТО МЫ УЗНАЛИ?

Для получения наилучших результатов требуется применять вход по лимитному приказу. Впрочем, следует также протестировать вариант со стоп-приказом, поскольку иногда он работает лучше.
При тестировании моделей, где применимы различные индикаторы, следует проверить несколько индикаторов в поисках оптимального.
Пытайтесь алгоритмизировать идеи, обычно используемые субъективно и бессистемно. Иногда это может быть чрезвычайно сложным, потребует применения методов нечеткой логики или нейронных сетей, а также других специализированных методов.
 

FXWizard

Гуру форума
ГЛАВА 8 Сезонность

Представьте себе, что завтра — 7 июня 1997 г. И перед вами стоит вопрос: торговать или нет? Если вы будете торговать, то входить надо будет по открытию и выходить по закрытию. Вам также необходимо решить, как войти в рынок. Открыть длинную или короткую позицию? В качестве части процесса принятия решения Вы исследуете поведение рынка в каждое 7 июня за несколько последних лет (например, за 10). Вы заносите в таблицу следующие данные: количество дней с датой 7 июня, когда проводились торги, среднее изменение цены с открытия до закрытия и процент времени, когда рынок поднимался или падал. Предположим, за последние 10 лет было 8 случаев, когда рынок был открыт и проводились торги. Из этих случаев, допустим, рынок закрылся выше открытия 6 раз (75%), и среднее изменение цены равнялось 2,50 (правдоподобная цифра для S&P 500). На основе этой информации вы размещаете торговый приказ на покупку завтра по открытию и выход по закрытию. Завтрашним вечером вы повторяете процедуру для 8 июня, на следующий вечер для 9 июня и т.д. Это одна из форм сезонной торговли. Сделаете ли Вы таким образом Вашу торговлю прибыльной? Будет ли Ваша торговля хоть немного лучше случайной? Вот вопросы, которые возникают при обсуждении сезонной торговли и на которые эта глава пытается ответить.

ЧТО ТАКОЕ СЕЗОННОСТЬ?

Термин «сезонность» используется трейдерами по-разному. Некоторые рассматривают сезонность как явление, строго связанное с четырьмя временами года: например, увеличение спроса на мазут для систем отопления зимой и на бензин летом. Другие допускают более широкую трактовку, которая учитывает погодные условия и предвыборные ситуации.
Годами многочисленные статьи в научных журналах демонстрировали, что акции наиболее быстро растут в первых числах каждого месяца. Предпринимались обсуждения так называемого «эффекта января», согласно которому акции имеют тенденцию к росту в январе. Ганнула (Hannula, 1991) использовал сезонные циклы в своей собственной торговле, предоставляя в качестве примера график цены акций EXABYTE с отмеченными сильными сезонными проявлениями. Он также обсуждал другое явление, иногда наблюдаемое в связи с сезонными моделями, при котором максимумы и минимумы меняются местами. Эту картину мы также наблюдали, и она, возможно, может заслуживать исследования. Другие факторы, которые влияют на различные рынки, возникают в определенные календарные даты и, следовательно, должны вызывать сезонные эффекты. Например, заполнение налоговых деклараций повторяется из года в год в одно и то же время. Легендарный трейдер Ганн явно учитывал ежегодно повторяющиеся особенности в своей торговле. В курсе домашнего обучения по проблемам сезонности Бернстейн (Bernstein, 1995) советует открывать позиции при достижении существенных минимумов и максимумов, а также в случае, когда имеет место существенное движение цены в течение ряда лет. Этот подход, как и подход Ганнулы, может привести к включению в рассмотрение сделок, продолжительностью от нескольких недель до нескольких месяцев.
В 1990 г. мы первыми опубликовали Диаграмму Календарных Эффектов — набор таблиц и график, которые показывают связь поведения индекса S&P с текущей календарной датой. Диаграмма показывает общий восходящий тренд с января по сентябрь, а затем медленное падение до 24 октября. Затем рынок, как правило, достигает своего дна, после чего резко растет до конца года. При более детальном рассмотрении видно, что резкий рост цен случается на протяжении большей части января, первой половины апреля и первой половины июля. Пик достигается 8 октября, после чего следует резкое падение вплоть до минимума 24 октября.
При подготовке таблиц и диаграмм для этой публикации все экстремальные изменения цен были ограничены на уровне ±2% для предотвращения их чрезмерного влияния на результаты. Следовательно, сезонное понижение цен в октябре и другие упомянутые явления не могут объясняться одиночными событиями определенных лет, например кризисом 1987 г.
Некоторые даты отличаются чрезвычайно стабильно повторяющимися ценовыми моделями. Например, если вход в рынок осуществлялся по закрытию 14 апреля, а выход — днем позже, в более чем 90% случаев можно было получить определенную прибыль. Вход 6 мая с выходом на день позже давал в результате прибыль в 100% случаев, как и вход 13 июля с продажей на следующий день. Рынок падал в 90% случаев с 18 по 19 октября и в 89% случаев с 16 до 17 октября. Хотя кризис 1987 г. привел к значительно большему, чем обычно, падению цен, наличие спада на момент кризиса совсем не было неожиданным. Чтобы попытаться уловить высокую вероятность кратковременных движений рынка, можно использовать Диаграмму Календарных Эффектов для открытия позиций продолжительностью в один или два дня. Например, такая методология могла бы побудить трейдера открыть короткую позицию 16 октября и выйти из рынка 19 октября, получив колоссальную прибыль на обвале рынка 1987 г. Данные, представленные в этой публикации, могли бы также помочь сохранять позиции в течение периодов значительных подъемов и спадов.
Были и другие исследования, указывающие на наличие ярко выраженных сезонных эффектов на рынке, которые могут быть использованы для прибыльной торговли. Проведенные нами исследования (Katz, McCormick, апрель 1997) показали, что кратковременное сезонное поведение может быть использовано для торговли индексом S&P 500. Система использовала пересечение быстрых скользящих средних, которые вычислялись на основе ценовых прогнозов, проведенных с помощью сезонной методологии. В связи с тем, что ожидаемые цены могут вычисляться, по крайней мере, на год вперед, запаздывание пересечения скользящего среднего легко компенсировалось смещением, что дало системе возможность производить сделки на пересечениях, происходящих через несколько дней после факта. Сделки, выполняемые системой, обычно длятся 7 — 8 дней — весьма краткосрочная модель сезонной торговли. Система оказалась прибыльной: она заработала $329 900 на S&P 500 с 3 января 1986 г. по 8 ноября 1996 г. Тест не учитывал затраты на осуществление сделок, но, если вычесть общие комиссионные ($15) и затраты на проскальзывание (по $75 на сделку), все равно полученная прибыль составит $298 310 (понижение около 10%). Доход за весь период— 732%. Если предположить, что торговля осуществлялась фиксированным количеством контрактов, это дает в среднем более 70% годовых при условии отсутствия реинвестирования прибыли. Была осуществлена 351 сделка, 60% которых были выигрышными. Прибыльными были как длинные, так и короткие позиции. Средняя сделка приносила $939 — неплохо для простой сезонно-ориентированной торговой системы. Подобные открытия позволяют предположить наличие на рынке сильных сезонных тенденций, которыми могут воспользоваться трейдеры. Таким образом, исследования в этой области вполне оправданы.
Для наших текущих целей сезонность определяется как циклический или повторяющийся феномен, жестко привязанный к календарю. Этот термин используется в широком смысле для обозначения особенностей поведения рынка, привязанных к времени года или к конкретным датам, включая годовщины критических событий (например, обвал 16 октября 1987 г.). Короче говоря, сезонность определена как календарно-зависимый циклический феномен. При этом очевидно, что, хотя все сезонные проявления являются циклическими, не все циклы являются сезонными.
 
Последнее редактирование:

FXWizard

Гуру форума
ФОРМИРОВАНИЕ СЕЗОННЫХ ВХОДОВ

Существует большое количество способов определения времени входа с использованием сезонных ритмов. Проанализируем два основных подхода: импульс цены и пересечение. Для вычисления импульса цены подсчитывается ряд ценовых изменений и используется центрированное сглаживание (сглаживание, которое не вносит никаких задержек или сдвигов фазы; в данном случае используется центрированное треугольное скользящее среднее). Каждое изменение (или разница) в ряду ценовых изменений нормируется и делится на 50-дневный средний истинный диапазон. Для каждого торгового дня определяется календарная дата. Примеры одинаковых календарных дат ищутся в прошлом. Для каждого такого момента рассматривается ценовой импульс, величина которого усредняется для каждой календарной даты. Усредненный импульс помещается в ряд сезонных импульсов для текущей даты. Ряд сезонных импульсов определяет ожидаемую скорость изменения цен в заданный момент времени. Основанием для этого служит история движения цен в указанный день в разные годы. Значение сезонного импульса для некоторой календарной даты определяется только событиями однолетней или большей давности.
Вот почему возможно использование центрированного скользящего среднего и других методик, заглядывающих вперед во времени относительно рассматриваемого дня. Когда сезонный импульс пересекает сверху некий положительный порог, происходит покупка. Когда импульс пересекает снизу некий отрицательный порог, происходит продажа. Покупка или продажа могут осуществляться по одному из трех стандартных приказов; по открытию, лимитному приказу или стоп-приказу. Входы могут также быть получены путем вычисления ценовых различий, их нормировки, применения процедуры интегрирования или суммирования рядов (для получения варианта псевдоценовых рядов, основанных на всех имеющихся примерах каждой календарной даты) и последующего использования модели пересечения скользящих средних. Поскольку значение сезонного импульса для каждой календарной даты в ряду определяется только по торговым дням, относящимся к предыдущему или более отдаленным годам, задержка системы пересечения скользящих средних может быть компенсирована простой экстраполяцией на несколько дней вперед.
Оба описанных выше метода по природе адаптивны, т.е. не требуют точной информации о дате размещения ордера на продажу или покупку.
Адаптивные свойства вышеупомянутых методов важны, поскольку разные рынки по-разному реагируют на сезонные влияния, что понятно логически и подтверждается предыдущими исследованиями.
В этом исследовании также тестировались несколько правил, использующих подтверждения и инверсии для поиска вариантов, работающих лучше основной модели. Подтверждение означает, что для поддержки генерируемого моделью сигнала используются дополнительные данные. Например, представьте, что модель генерирует сигнал на покупку для данного торгового дня. Если все идет так, как ожидается, то ко времени покупки рынок будет близок к минимуму. Если же рынок в это время образует вершину, то достоверность сигнала находится под сомнением, поскольку рынок не следует типичному сезонному поведению. При существовании таких видимых противоречий было бы полезно иметь дополнительные критерии для принятия решения. Модель на основе пересечения с подтверждением использует принцип пересечения с дополнительным правилом, которое должно выполняться для срабатывания сигнала:
например, если подается сигнал на покупку, то показатель Медленного %К должен быть менее 25%, что означает близость рынка к минимуму за последнее время. Соответственно, если подается сигнал на продажу, то Медленный %К должен быть выше 75%, означая близость рынка к максимуму за последнее время, соответственно ожидаемому циклическому поведению. Модель на принципе подтверждения и инверсии добавляет еще один элемент: если основная модель подает сигнал на покупку, а в это время рынок по показателю Медленного %К близок к максимуму (более 75%), то считается, что произошел разворот, и вместо приказа на покупку отдается сигнал на продажу. Если система подает сигнал на продажу, а рынок близок к минимуму (Медленный %К менее 25%), то отдается приказ на покупку.
 

FXWizard

Гуру форума
ХАРАКТЕРИСТИКИ СЕЗОННЫХ ВХОДОВ

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

FXWizard

Гуру форума
ВИДЫ ПРИКАЗОВ, ИСПОЛЬЗУЕМЫХ ДЛЯ ОСУЩЕСТВЛЕНИЯ СЕЗОННЫХ ВХОДОВ

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

FXWizard

Гуру форума
МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ

Для тестирования методов сезонных входов использованы данные с 1 августа 1985 г. по 31 декабря 1994 г. (оптимизационная выборка) и с 1 января 1995 г. по 1 февраля 1999 г. (период вне пределов выборки). Для исследования сезонности выборка размером около 10 лет является недостаточно протяженной. При обсуждении сезонных сигналов упоминалась практика расчета сезонного импульса (или же среднего поведения цен) на основе данных за предыдущие годы. Ввиду небольшого размера выборки расчеты будут основываться не только на прошедших, но и на будущих годах. Для этого используется специальная методика — так называемый подход «складного ножа».
Метод перебирает целевые даты, перемещаясь вдоль временного ряда.
Если при усреднении сезонных эффектов использовать только соответствующие календарные даты прошлых лет, то для точек, приходящихся на начало выборки, таких данных очень мало или вообще нет. Поскольку для получения приемлемого сезонного среднего требуется не менее 6 лет, то для большей части периода выборки (всего 10 лет) расчет будет невозможен. Следовательно, данных для оптимизации важных параметров или анализа эффективности работы модели в пределах выборки явно недостаточно. Хорошо известный статистический метод «складного ножа»
помогает решить проблему с недостатком данных.
Представьте, что рассчитывается сезонное поведение начиная с 1 июня 1987 г. Если использовать только данные из пределов выборки, то пришлось бы ограничиться данными за 1986 и 1985 гг. При использовании метода «складного ножа» в расчет можно включать даты не только из прошлого, но и из относительного «будущего», т.е. с 1988 г. по 1994 г. Если год, для которого значение целевой даты рассчитывается (1987), удалить из пределов выборки, то сезонное поведение можно будет рассчитывать на основе 9 лет данных, а этого вполне достаточно. Подобная процедура оправданна, поскольку данные, исследуемые для получения прогноза, не зависят от прогнозируемых данных. Данные, используемые для получения прогнозов, отстоят от целевой даты не менее чем на год — следовательно, они не «загрязнены» текущим состоянием рынка. Этот метод позволяет значительно увеличить размер выборки, не снижая количество степеней свободы.
Для оценки влияния сезонных факторов вне пределов выборки были использованы все прошедшие годы. Например, для получения данных, соответствующих 14 января 1999 г., был использован метод всех прошедших лет: в анализ были включены данные с 1998 г. по 1985 г. Таким образом, ни один из расчетов вне пределов выборки не основывается на данных из будущего или настоящего времени.
Все тесты, следующие ниже, проведены с использованием сезонных входов на основе разнообразного портфеля рынков. Использованы стандартные выходы, как и в других исследованиях моделей в этой книге.
Позиции закрываются при срабатывании стандартного выхода или при получении сигнала на вход в противоположном направлении. Использована стандартная платформа тестирования. Ниже приведен код для тестирования сезонной торговли.

void SeasonalAvg (float *a, float *v, float *dt, int mode,
int m, int n) {
// Подсчитывает сезонное среднее для каждой календарной даты,
// основанное на предыдущих и (в некоторых случаях) на последующих
// годах. Работает на всех сериях данных.
// а — вне: значений [1..n] сезонных средних
// v — в: оригинальных сериях данных [1..n]
// dt — в: сериях [1..n] соответствующих дат
// mode — в: методе анализа:
// 1 = «складной нож» в пределах выборки, все
последние годы вне выборки
// 2 = фиксированный период анализа, выраженный в
// годах
// m — в: дата (режим = 1) или период анализа (режим = 2)
// n — в: число дней во всех рядах данных
static int i, j, cnt;
static unsigned long k;
static float sum, sdate;
if(mode == 1) { // режим «складного ножа»
for(i = 1; i <= n; i++) { // для каждой текущей даты
sum = 0.0; cnt = 0;
for{j = 1; j < 100; j++) { // двигаемся назад к
sdate = f(int)dt - 10000 * j); // исходной дате
if (sdate < dt[3]) break; // переход к началу
k = max(0, (int){i-260.893*j)); // приблизительный индекс
hunt(dt, n, sdate, &k) ; // находим точный индекс
if(sdate > dt[k]) k++;
if(sdate = dt[k]) continue;
cnt++; sum += v[k]; // накапливаем среднее
)
for(j = 1; j < 100; j++) { // двигаемся вперед
sdate = ((int)dt + 10000 * j); //к исходной дате
if(sdate > m) break; // избегаем данных вне выборки
k = min(n, (int)(i+260.893*j); // приблизительный индекс
hunt(dt, n, sdate, &k); // находим точный индекс
if(sdate > dt[k]) k++;
if(sdate = dt[k]) continue;
cnt++; sum += v[k]; // накапливаем среднюю
}
a = sum / (cnt + l.OE-20); // заканчиваем среднюю
} // следующая текущая дата
}
else if(mode == 2) { // режим фиксированного периода
// анализа
for {i = 1; i <= n; i++) { // для каждой текущей даты
sum = 0.0; cnt = 0;
for(j = 1; j < 100; j++) ( // идем вперед
if(cnt >= m) break; // достаточность лет для теста
sdate = ((int)dt - 10000 * j); // исходная дата
if (sdate < dt[3]) break; // идем к началу
k = max(0, (int)(i-260.893*j)); // приблизительный индекс
hunt(dt, n, sdate, &k) ; // находим точный индекс
if(sdate > dt[k]) k++;
if(sdate = dt[k]) continue;
cnt++; sum += v[k]; // накапливаем среднюю
}
for(j = 1; j < 100; j++) ( // идем вперед
if (cnt >= m) break; // достаточность лет для теста
sdate = ((int)dt + 10000 * j); // исходная дата
k = min(n, (int)(i+26Q.893*j)); // приблизительный индекс
hunt(dt, n, sdate, &k); // находим точный индекс
if(sdate > dt[k]) k++;
if(sdate = dt[k]) continue;
cnt++; sum += v[k]; // накапливаем среднюю
}
a = sum / cnt; // заканчиваем среднюю
} // следующая текущая дата
}
}
static void Model (float *parms, float *dt, float *opn, float *hi,
float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb,
TRDSIM &ts, float *eqcls) {
// Использование моделей, основанных на факторе сезонности.
// File = x12mod01.c
// parms — набор [1..MAXPRM] параметров
// dt - набор [l..nb] дат в формате ГГММДД
// орn — набор [1..nb] цен открытия
// hi - набор [l..nb] максимальных цен
// 1о — набор [1..nb] минимальных цен
// cls - набор [l..nb] цен закрытия
// vol — набор [1..nb] значений объема
// oi — набор [1..nb] значений открытого интереса
// dlrv — набор [1..nb] средних долларовой волатильности
// nb - количество торговых дней в наборе данных
// ts — ссылка на класс торгового симулятора
// eqcls — набор [1..nb] уровней капитала при закрытых позициях
// объявляем локальные переменные
static int rc, cb, neontracts, maxhold, ordertype, signal;
static int avglen, disp, k, modeltype, rnatype;
static float mmstp, ptlim, stpprice, limprice, tmp, thresh;
static float exitatr[MAXBAR+1];
static float savg[MAXBAR+1] , pchg[MAXBAR+1] , stoch[MAXBAR+1] ;
static float ma1[MAXBAR+1] , ma2 [MAXBAR+1] ;
// копируем параметры в локальные функции для удобного обращения
avglen = parms[1]; // длина скользящей средней
disp - parms[2]; // фактор смещения
thresh = parms[3]; // пороги для импульсных моделей
matype = parms[7]; // тип скользящей:
// 1=простое скользящее среднее
// 2-экспоненциальное
// 3=треугольное с передним взвешиванием
// 4-треугольное
// 5=простое центрованное
// 6 =экспоненциальное центрированное
// 7 =треугольное центрированное
modeltype = parms[8]; // тип модели:
// 1-импульс
// 2-пересечение
// 3=пересечение с подтверждением
// 4=пересечение с подтверждением и инверсией
ordertype = parms[9]; // вход: 1-на открытии, 2-по лимитному приказу,
// 3 -по стоп - приказу
maxhold = 10; // период максимального удержания позиции
рt1irn = 4 ; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности
// выполняем вычисления для всех данных, используя процедуры быстрой
// обработки массивов
AvgTrueRangeS(exitatr,hi,lo, cls, 50, nb) ; // средний истинный диапазон для
// выхода
ГЛАВА 8 СЕЗОННОСТЬ 187
pchg[l] = 0.0;
for(cb =2; cb <= nb; cb++) {
tmp = cls[cb] - cls[cb-l]; // изменение цены
tmp = tmp / exitatr[cb]; // нормирование
pchg[cb] = clip(tmp, -2.0,2.0); // клиппинг
}
switch(modeltype) {
case 1 // данные для импульсной модели
SeasonalAvg(savg,pchg,dt,1,OOS_DATE,nb); // сезонности
MovAvg{savg,savg,matype,avglen,nb); // сглаживание
// скользящей
for(cb = 1; cb <= nb; cb++)
rna2 [cb] = fabs (savg [cb] } ;
MovAvg(mal, ma2, 1, 100, nb}; // среднее отклонение
break;
case 2: case 3: case 4: // данные для модели пересечения
SeasonalAvg(savg,pchg,dt,1,OOS_DATE,nb); // сезонности
for(cb =2; cb <= nb; cb++)
savg [cb] = savg[cb-l] ; // объединение
MovAvg{mal,savg,matype,avglen,nb); // сглаживание среднего
MovAvg(ma2,rnal,matype,avglen,nb) ; // пересечение средней
if(modeltype ==3 || modeltype == 4) // стохастический
// осциллятор
StochOsc(stoch,hi,lo,cls,1,9 , nb) ; // 9-дневный Быстрый %К;
break;
default: nrerror{"TRAPSMOD: invalid modeltype");
}
// проходим через торговые дни, чтобы смоделировать реальную торговлю
for(cb = 1; cb <= nb; cb++) {
// не открываем позиций в периоде подсчета
// ... то же самое, что установка MaxBarsBack в TradeStation
if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0; continue; }
// выполняем ожидающие приказы и считаем кумулятивный капитал
rc = ts.update (opn [cb] , hi [cb] , lo [cb] , cls [cb] , cb) ;
if(rc = 0) nrerror("Trade buffer overflow");
eqcls [cb] = ts.currentequity(EQ_CLOSETOTAL) ;
// не входим в сделки в последние 30 дней внутри выборки
// оставляем место в массивах для будущих сезонностей
if(cb > nb-30) continue;
// считаем количество контрактов для позиции
// ... мы хотим торговать эквивалентом долларовой волатильности
// ... двух новых контрактов на S&P-500 от 12/31/98
neontracts = RoundToInteger{5673 . О / dlrv[cb]) ;
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+l] == lo[cb+l]) continue;
// генерировать входные сигналы, цены стоп- и лимитных приказов
// для всех моделей сезонного входа
signal = 0;
switch{modeltype) {
case 1: // основная модель входа на основе порогов импульса
k = cb + disp;
tmp = thresh * mal[k];
if(savg[k] > tmp && savg [k-1] <= tmp)
signal = 1;
else if (savg [k] < -tmp && savg[k-1] >= -tmp)
signal = -1;
188 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК
break;
case 2: // основная модель входа на пересечении
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) signal = 1;
else if{CrossesBelow(mal, ma2, k)} signal = -1;
break;
case 3: // пересечение с подтверждением
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) {
if(stoch[cb] < 25.0) signal = 1;
}
else if(CrossesBelow(mal, ma2, k)) (
if(stoch[cb] > 75.0) signal = -1;
}
break;
case 4: // пересечение с подтверждением и инверсией
k = cb + disp;
if(CrossesAbove(mal, ma2, k)) (
if(stoch[cb] < 25.0) signal = 1;
else if(stoch[cb] > 75.0) signal = -1;
}
else if(CrossesBelow(mal, ma2, k)) {
if(stoch[cb] > 75.0) signal = -1;
else if(stoch[cb] < 25.0) signal = 1;
)
break;
default: nrerror("TRAPSMOD: invalid modeltype");
}
limprice = 0.5 * (hi[cb] + lo[cb]);
stpprice = cls[cb] + 0.5 * signal * exitatr[cb] ;
// входим в сделку, используя определенный тип приказа
if (ts.position)) <= 0 && signal == 1) (
switch(ordertype) { // выбираем желаемый тип приказа
case 1: ts.buyopen('1', ncontracts) ; break;
case 2: ts.buylimit('2', limprice, ncontracts); break;
case 3: ts.buystop('3' , stpprice, ncontracts); break;
default: nrerror("Invalid buy order selected");
}
}
else if (ts.position1) >= 0 &&. signal == -1) (
switch(ordertype) { // выбираем желаемый тип приказа
case 1: ts.sellopen('4', ncontracts); break;
case 2: ts.selllimit('5', limprice, ncontracts); break;
case 3: ts.sellstop('6' , stpprice, ncontracts); break;
default: nrerror("Invalid sell order selected");
}
}
// симулятор использует стандартную стратегию выхода
tmp = exitatr[cb];
ts.stdexitcls('X', ptlim*tmp, mmstp*tmp, maxhold);
} // обрабатываем следующий день
 

FXWizard

Гуру форума
Определив локальные переменные и векторы, первый блок программы копирует различные параметры в соответствующие переменные для более удобного и понятного обращения к ним. Параметры описаны в ссылках, размещенных в коде.
Следующий блок проводит все расчеты на полной серии данных. Средний истинный интервал для 50 дней рассчитывается и сохраняется в векторе (exitatr). Впоследствии он будет использоваться для размещения защитных остановок управления капиталом и целевых уровней прибыли в стандартизованной стратегии выхода. Средний истинный интервал в этом векторе (или в ряду данных) также используется для нормализации возникающих в ходе работы программы изменений цен.
После вычисления среднего истинного интервала рассчитываются нормализованные и «обрезанные» изменения цен. Каждая точка в ряду данных pchg отражает изменение цены между ценами закрытия текущего и предшествующего дней. Изменения цены затем нормализуются путем деления их на средний истинный интервал и «обрезаются» для снижения влияния экстремальных перепадов цены (статистических выбросов). Нормализация необходима, поскольку волатильность рынков меняется со временем иногда очень сильно. Например, сейчас индекс S&P 500
в 5 и более раз дороже, чем 15 лет назад. Очевидно, что и средняя дневная волатильность изменилась соответствующим образом. Если бы изменения цены не подвергались нормализации и не представлялись в единицах текущей волатильности, сравнение сезонных явлений за разные годы было бы искаженным. Годы, когда волатильность была выше, давали бы больший вклад, чем годы с низкой волатильностью. В случае S&P 500 последние годы полностью доминировали бы при проведении усреднения, а при нормализованном представлении каждый год вносит почти одинаковый вклад. Срезание выбросов проводится на уровне — 2 и + 2 средних истинных интервала, чтобы удалять случайные и аномальные значения, не искажая общую оценку.
Опция выбора modeltype определяет, какие операции проводятся далее. Значение 1 выбирает основную импульсную модель. Сезонные показатели рассчитываются для обрезанных и нормализованных изменений цен, причем в пределах выборки используется метод «складного ножа», а вне пределов выборки — метод «всех прошедших лет». Эти операции обеспечиваются вызовом функции SeasonalAvg. Временной ряд сезонных показателей затем сглаживается скользящим средним (вид среднего устанавливается параметром matype, а длина— параметром avglen). Затем рассчитывается временной ряд средних абсолютных отклонений сезонных импульсов. Этот ряд представляет собой простое скользящее среднее с периодом 100 дней от ряда абсолютных значений сезонных импульсов, которое затем используется в дальнейших расчетах уровней порогов. Значения modeltype 2, 3 и 4 представляют собой вариации моделей, основанных на пересечении. Сезонные показатели рассчитываются, и показатель изменения цены для каждого дня интегрируется (вычисляется «бегущая сумма»), в результате образуется новый ряд, ведущий себя подобно ценовому ряду. Эта синтезированная серия отображает движение цен на основе типичного поведения рынка в предшествующие и, возможно, в будущие годы. Затем рассчитываются два скользящих средних:
та! (скользящее среднее интегрированного сезонного ряда типа matypeс периодом avglen) и та2 (сигнальная линия для определения момента пересечения, представляет собой скользящее среднее ma1 с теми же параметрами matype и avglen). Если же выбран modeltype 3 или 4, то проводятся дополнительные расчеты для моделей с подтверждением и/или инверсией; в данном случае рассчитывается значение Быстрого %К с периодом 9 дней, которое затем сохраняется в векторе stoch.
Следующий блок кода включает цикл, последовательно перебирающий все торговые дни в ряду данных, — такой же цикл, как и во всех предыдущих главах, посвященных стратегиям входа. Первые его строки обеспечивают обновление симулятора, рассчитывают количество контрактов в сделке и пропускают дни с ограниченной торговлей. Следующие строки генерируют сигналы входа для моделей, основанных на сезонных факторах. В зависимости от значения параметра modeltype используется один из четырех подходов.
Modeltype 1 представляет базовую модель, основанную на пороге ценового импульса. Порог рассчитывается как произведение множителя, определяющего относительную величину порога (thresh) на среднее абсолютное отклонение сезонного импульса за прошлые 100 дней. Сигнал к покупке генерируется, если сумма сезонного импульса (savg) и параметра смещения (disp) поднимается выше уровня порога. Если данная сумма опускается ниже величины, равной значению порога со знаком минус, подается сигнал на продажу. Иными словами, если для данного дня плюс-минус несколько дней (disp) предсказывается достаточно сильный сезонный импульс цен, то торговля ведется в направлении ожидаемого движения.
Modeltype 2 представляет базовую модель пересечения и использует скользящие средние интегрированных сезонных показателей текущего дня плюс фактор смещения. Если первое скользящее среднее поднимается выше второго, генерируется сигнал к покупке. В противоположном случае генерируется сигнал к продаже. Фактор смещения позволяет модели искать моменты пересечения, которые произойдут в будущем через несколько дней. Таким образом, преодолевается запаздывание, свойственное скользящим средним. Поскольку сезонные средние основываются на исторических данных, отстоящих от текущей даты не менее чем на один год, вполне приемлемо прогнозировать на несколько дней вперед.
Modeltype 3 представляет собой ту же модель на основе пересечения, но с добавлением подтверждения. Подтверждение обеспечивается проверкой стохастического осциллятора ценового ряда, определяющей, совпадает ли его динамика с ожидаемым поведением на основе сезонных факторов.
Modeltype 4 использует модель, основанную на пересечении с добавлением подтверждения и инверсии. При использовании modeltype 4 сигнал к покупке подается, если первое скользящее среднее пересекает второе снизу вверх. При этом значение стохастического осциллятора должно быть не менее 25. Если же при верхнем пересечении стохастический показатель превышает уровень 75, то модель подает сигнал к продаже исходя из предположения, что произошла инверсия. Если первое скользящее среднее ниже второго, и нормальная сезонная модель подтверждается значением стохастического осциллятора, превышающим уровень 75, генерируется сигнал к продаже. Если в этом случае показатель составит менее 25, предполагается инверсия и отдается сигнал к покупке.
В свою очередь цена лимитного приказа (limprice) устанавливается на уровне середины ценового диапазона текущего дня. Цена входного стоп-приказа (stpprice) устанавливается на уровне закрытия текущего дня плюс (для покупки) или минус (для продажи) половина среднего истинного диапазона последних 50 дней. Остальные блоки кода идентичны приводившимся в предыдущих главах: они обеспечивают размещение приказов указанного вида (ordertype) и стандартные выходы.
 
Последнее редактирование:

FXWizard

Гуру форума
РЕЗУЛЬТАТЫ ТЕСТОВ

Проводились тесты двух основанных на сезонных явлениях моделей входа: модели на пересечении (с подтверждением и инверсией и без них) и модели, основанной на ценовом импульсе. Каждая модель исследовалась с тремя видами обычных входных приказов: вход по цене открытия, по лимитному и стоп-приказу.
В табл. 8-1 и 8-2 показаны результаты тестирования этих моделей по отдельным рынкам в пределах выборки (табл. 8-1) и вне пределов выборки (табл. 8-2). В первом столбце указаны обозначения рынка. Последняя колонка показывает, сколько прибыльных тестов было получено для данного рынка. Цифры в верхней строке указывают номер теста, последняя строка — на скольких рынках данная модель была прибыльной. Эти данные достаточно подробно показывают степень прибыльности системы:
один минус (—) означает умеренные средние убытки в сделке ($2000 — 4000), два минуса ( ) — крупные убытки (более $4000). Один плюс (+) означает умеренную прибыль ($1000 — 2000), два плюса (+ +) означают крупную прибыль — более $2000 в сделке. Пустая ячейка обозначает прибыль до $ 1000 или убыток до $ 1999. (Названия рынков и их символы соответствуют обозначениям табл. II-1; часть II, введение.)
 

Посмотрели (2) Посмотреть

Отслеживают (1) Посмотреть

Верх