<<
>>

МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ ЛУННЫХ МОДЕЛЕЙ

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

Применены стандартные выходы, правила входов будут рассмотрены при обсуждении отдельных тестов.

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

int LunarEventDates (int n) {

// подсчитывает дату лунной фазы, начиная // с января 1900.

// n - ввод: номер фазы луны

// 0,4,8... новолуния

// 1,5,9... луна в первом квартале

// 2,6,10... полнолуние

/ / 3,7,11... луна во втором квартале

//возвращает - вывод: дата события по юлианскому календарю static long ndate;

static float timzon = -5.0 / 24.0; // восточное стандартное время static float fra^

flmoon {n >> 2, n & 3, &ndate, &frac); frac = 24.0 * {frac + timzon);

210

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

if(frac < 0.0) { // корректировка времени

ndate—; frac += 2 4.0;

)

if(frac > 12.0) ( ndate++;

frac -= 12.0;

)

else frac += 12.0;

return ndate; // юлианская дата события

}

int LunarEquivDate (int date, int n) (

// рассчитываем дату предыдущего n-го (n < 0) или

// будущего (n > 0) случая фазы луны, равной

/ / сегодняшней фазе

/ / date - ввод: текущая дата в формате ГГГММДД

// n - ввод: лунные циклы назад{-) или вперед (+)

/ / return - вывод: дату предыдущего или будущего цикла в формате ГГГММДД

static long nstar, ndatel, ndate2, curdate, ntarg, nans; static int mm, dd, yyyy;

curdate = julday((date/100)%100, date%10O, 1900+date/lOOOO) ; while(curdate >= ndate2) {

ndatel = LunarEventDates(++nstar);

ndate2 = LunarEventDates(nstar + 1) ;

}

while(curdate < ndatel) {

ndatel - LunarEventDates{—nstar); ndate2 = LunarEventDates(nstar + 1);

}

if(curdate < ndatel || curdate >= ndate2 | | abs(ndate2 - ndatel - 7) > 2) nrerror("LunarEquivDate: calculation error"); nans = LunarEventDates(nstar +4 * n); nans += (curdate - ndatel); caldatfnans, &mm, &dd, &yyyy) ;

return 10000*(yyyy-1900) + 100*mm + dd;

}

void LunarAvg (float *a, float *v, float *dt, int mode, int m, int n) {

// Подсчитываем лунное (в зависимости от даты и фазы) скользящее среднее

// для каждого дня, основанное на предыдущих днях и (в некоторых случаях)

// на последующих днях с эквивалентной лунной фазой.

// Работаем на всех имеющихся данных.

//а - вывод: значения [1..n] лунного среднего

//v - ввод: исходный ценовой ряд данных [1..n]

// dt - ввод: соответствующие [1..n] данные

// mode - ввод: метод анализа:

// 1 = «складной нож» IS, все прошлые циклы 008

// 2 - фиксированный период в лунных циклах

//m - ввод: дата (для режима - 1) или период анализа (для режима = 2)

// n - ввод: количество дней во всех рядах

static int i, j, cnt;

static unsigned long k;

static float sum, sdate, tiny=l.OE-20;

if(mode == 1) { // режим «складного ножа»

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ

211

for(i = 1; i <= n; { // для каждого текущего дня

sum = 0.0; cnt = 0;

for(j = 2; j < 1000; { // двигаемся назад

sdate - LunarEquivDate {dt[i] , -j ) ; //к исходной дате

if(sdate < dt[3]) break; / / переход к началу hunt(dt, n, sdate, &k) ; // находим индекс if (sdate > dt[k]) k++;

cnt++; sum += v[k] ; // накапливаем среднюю

}

for(j = 2; j < 1000; j ++) { // двигаемся вперед

sdate = LunarEquivDate {dt[i], j); //к исходной дате

if(sdate > m) break; // избегаем данных oos hunt(dt, n, sdate, &k); // находим индекс if(sdate > dt[k] ) k++;

cnt++; sum +- v[k]; // накапливаем среднюю

}

a[i] = sum / (cnt + tiny); // заканчиваем среднюю ) / / следующий день

}

else if(mode == 2) { // режим фиксированного периода анализа

for(i = 1; i <= n; i ++) { // для каждого текущего дня sum =0.0; cnt = 0;

for(j =2;j<1000 ;j++) { // двигаемся назад

if(cnt >= m) break; // выполняем достаточные условия

sdate = LunarEquivDate(dt[i] , -j); // исходная дата

if (sdate < dt[3]) break; // идем к началу

hunt(dt, n, sdate, &k) ; // находим индекс if{sdate > dt[k]} k++;

cnt++; sum +- v[k] ; // накапливаем среднюю

}

for(j = 2; -j < 1000; { // двигаемся вперед

if (cnt >= m) break; // выполняем достаточные условия

sdate = LunarEquivDate(dt[i] , j ) // исходная дата

hunt(dt, n, sdate, &k) ; // находим индекс if (sdate > dt[k]} k++;

cnt++; sum += v[k] ; // накапливаем среднюю

}

a[i] = sum / (cnt + tiny) // заканчиваем среднюю } // следующий день

}

}

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 = xl3modOl.c // parms — набор [1..MAXPRM] параметров // dt — набор [l..nb] дат в формате ГГММДД // ОРП — набор [1..nb] цен открытия // hi - набор [l..nb] максимальных цен // 1о — набор [1..nb] минимальных цен // cls — набор [l..nb] цен закрытия // vol - набор [l..nb] значений объема // oi — набор [1..nb] значений открытого интереса // dlrv — набор [1..nb] средних долларовых волатильностей / / nb — количество дней в наборе данных // ts — ссылка на класс торгового симулятора // eqcls — набор [1..nb] уровней капитала по ценам закрытия // объявляем локальные переменные

static int rc, cb, ncontracts, maxhold, ordertype, signal; static int avglen, disp, k, modeltype, matype, mktindx; static float mmstp, ptlim, stpprice, limprice, tmp, thresh; static float exitatr[MAXBAR+1] , savg[MAXBAR+1] ;

212

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

static float mal[MAXBAR+1] , ma2[MAXBAR+1] , stoch[MAXBAR+1] ; static float *exitatrtab[MAXMKT+1], *savgtab[MAXMKT+1] ;

//копируем avglen disp = thresh

matype

modeltype

ordertype

maxhold = ptlim = 4; mmstp = 1;

параметры в локальные переменные

= parms[1]; // период скользящей средней

parms[2]; // множитель смещения = parms[3]; // порог для импульсных моделей : parms[7]; // тип средней:

// 1=простое скользящее среднее

// 2=экспоненциальное

переднем взвешиванием

// 3=треугольное с // 4=треугольное // 5=простое центрованное / / 6=экспоненциальное центрованное // 7=треугольное центрованное parms[8]; // тип модели: // 1=импульс // 2=пересечение / / 3-пересечение с // 4=пересечение с parms[9]; // вход:

и инверсией

2=по лимитному приказу,

10;

подтверждением подтверждением 1=на открытии, // 3 =по стоп-приказу // период максимального удержания позиции // целевая прибыль в единицах волатильности // защитная остановка в единицах волатильности

// Выполняем вычисления по всему объему данных, которые не подвержены // воздействию каких-либо параметров.

Выполняется один раз для каждого / / рынка, результаты сохраняются в таблицах для повторного использования.

// Таким образом, значительно снижается mktindx = ts.modelf) ; if (exitatrtab[mktindx] == NOLL) {

exitatrtab[mktindx] = vector(1, nb);

savgtab[mktindx] = vector{1, nb) ;

AvgTrueRangeS(exitatrtab[mktindx], hi, lo, cls, 50, nb);

float *pchg = vector(1, nb) ; pchg[l] = 0.0;

for(cb =2; cb <= nb; cb++) { tmp = cls [cb] - els [cb-1]; tmp /= exitatrtab[mktindx] [cb]; pchg [cb] = clip(tmp, -2.0, 2.0);

}

LunarAvg(savgtab[mktindx],

pchg, dt, 2, 60, nb); free_vector(pchg, 1, nb); printf {"Mkt: %d\n", mktindx};

время выполнения программы. // индекс рынка

// размещен?

// таблица exitatr

// таблица savg

//50-дневный средний истинный

// //

// // //

диапазон вспомогательный

изменение цены

нормирование

обрезание

// лунная сезонность

// показывать прогресс

}

// выполняем вычисления для всех данных

memcpy(exitatr, exitatrtab[mktindx] , sizeof (float)*nb) ; memcpy(savg, savgtab[mktindx] , sizeof(float)*nb) ; switch(modeltype) {

case 1: // данные для импульсной модели

MovAvg{savg,savg,matype,avglen,nb) ; / / сглаживающее среднее for(cb = 1; cb <= nb; cb++)

ma2 [cb] = fabs(savg[cb]} ; MovAvg (mal, ma2, 1, 100, nb) ; // среднее отклонение

break;

case 2: case 3: case 4: // данные для моделей пересечения for(cb = 2; cb <= nb; cb++)

savg[cb] += savg [cb-1]; // интеграция

MovAvg(mal,savg,matype,avglen,nb); // сглаж. средн. MovAvg(ma2,mal,matype,avglen,nb); // пересеч. средн. if (modeltype == 3 | | modeltype == 4) // стохастический осц.

вектор

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ

213

StochOsc(stoch,hi,lo,cls,1,9,nb); // 9-дневный Быстрый %К break;

default: nrerror("TRAPSMOD: invalid modeltype");

}

// проходим через дни, чтобы смоделировать реальную торговлю for(cb = I; cb <= nb; cb++) {

// не открываем позиций до периода выборки

// ...

то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) { egcls[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);

/ / не проводим сделок в последние 3 0 дней выборки.

// для того, чтобы оставить место в массивах для будущих сезонностей if(cb > nb-30) continue;

// считаем количество контрактов для позиции

// ... мы хотим торговать эквивалентом долларовой волатильности // ... 2 новых контрактов на S&P-500 от 12/31/98 neontracts = RoundToInteger(5673.C) / dlrv[cb]}; if(ncontracts < 1) ncontracts = 1;

// избегаем устанавливать приказы на дни с ограниченной торговлей if(hi[cb+1] == lo[cb+1]) continue;

// генерируем входные сигналы, цены стоп- и лимитных приказов // для всех моделей signal = 0 ; switch(modeltype) {

case 1: // основная модель входа на основе импульса с порогом k = cb + disp; tmp = thresh * mal[k] ; if(savg[k] > tmp && savg[k-l] <= tmp) signal = 1;

else if(savg[k] < -tmp && savg[k-l] >= -tmp)

signal = -1; 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] < 2 5.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 (rnal, ma2 , k) } { if (stoch[cb] > 75.0) signal = -1; else if (stoch[cb] < 25.0} signal = 1;

}

break;

214

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

)

limprice = 0.5 * (hi [cb] + lo [cb] ) ;

stpprice = cls[cb] + 0.5 * signal * exitatr[cb] ;

// входим в сделку, используя определенный тип приказа

if (ts.position{) <= 0 && signal == 1) { switch(ordertype) { // select desired order type case 1: ts .buyopen('1' , ncontracts) ; break-case 2: ts.buylimit('2'f limprice, ncontracts); break-case 3: ts.buystop('3'f stpprice, ncontracts); break-default: nrerror{"Invalid buy order selected");

}

}

else if (ts.position{) >= 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); } // обрабатываем следующий день

}

Собственно коду предшествует ряд функций, необходимых для расчета лунных циклов на любом рынке с адаптивным подходом. Функция Model следует стандартным принципам: после объявления параметры копируются в местные переменные для простоты обращения. Комментарии указывают, что контролируют параметры. В следующем блоке рассчитывается средний истинный интервал за 50 дней (exitatrtab), используемый в выходах и при нормализации, а также лунные сезонные последовательности (savgtab) — прогнозируемые изменения цены для каждого дня. Эти ряды рассчитываются один раз для каждого рынка и заносятся в таблицы; это допустимо, поскольку при повторных вызовах Model в последующих тестах никакие важные параметры не изменяются. Второй блок рассчитывает специфические для моделей временные последовательности, необходимые для получения сигналов входа. Если modeltype = 1, используется простая импульсная модель; если modeltype = 2, то модель на основе пересечения; если modeltype = 3, то модель на основе пересечения с подтверждением, и если modeltype = 4, то модель на основе пересечения с подтверждением и инверсией. Среди возможных серий есть такие варианты, как сглаженная последовательность лунных импульсов, интегрированные импульсы (ценоподобный ряд), скользящие средние для моделей на пересечении и Медленный %К для подтверждений и инверсий. В зависимости от modeltype могут приобретать значение некоторые другие параметры. Один из них, avglen, управляет периодом всех скользящих средних: в модели на основе импульса он

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ

215

управляет длиной центрированного треугольного скользящего среднего, а в моделях на пересечении — длиной необходимых там средних. Другой параметр, disp, выставляет смещение, т.е. степень сдвига вперед для компенсации запаздывания скользящих средних. Параметр thresh означает величину порога, используемого в импульсной модели для длинных и коротких позиций (короткие используют отрицательное значение thresh). Переменная matype управляет видом скользящего среднего: 1 — простое, 2 — экспоненциальное, 6 — центрированное экспоненциальное, 7 — центрированное треугольное; существуют и другие виды средних, не использованные в анализе. После расчета всех рядов данных запускается цикл, который перебирает рыночные цены день за днем для моделирования торговли. Этот цикл содержит код для обновления симулятора, определения количества контрактов, избежания дней с ограниченной торговлей и т.п. В следующем блоке, расположенном внутри блока перебора текущих дней, происходит генерация сигналов входа. Правила определяются параметром modeltype. Последний блок управляет отдачей соответствующих приказов согласно параметру ordertype: 1 — вход по цене открытия, 2 — по лимитному приказу, 3 — по стоп-приказу.

Результаты тестирования лунных моделей

Проводилось тестирование четырех моделей: на основе пересечения, импульса, пересечения с подтверждением и пересечения с подтвержде

Таблица 9—1. Эффективность лунных моделей, распределенная по модели, виду приказа и выборке Модель В пределах выборки Вне пределов выборки Среднее Среднее Открытие Лимитный Стоп- Открытие Лимитный Стоп- В Вне приказ приказ приказ приказ пределах пределов Лунное -9,3 -6,0 -5,6 -14,3 -10,2 -10,4 -7.0 -11,6 пересечение -1287 -406 -686 -894 -643 -702 -793 -746 Лунный -10,1 -9,9 -8,1 -14,8 -19,7 -8,3 -9,4 -14,2 импульс -2410 -1560 -1288 -1316 -1942 -372 -1753 -1210 Пересечение -8,1 -6,6 1,8 -20,5 -21,3 -18,6 -4,3 -20,1 с подтвержд. -1251 -655 234 -3465 -3896 -2449 -557 -3270 Пересечение с -9,4 -10,0 -7,8 -20,6 -20,9 -20,1 -9,1 -20.5 подтвержд. и -1546 -1078 -998 -2937 -3203 -2995 -1207 -3405 инверсией Среднее -9,3 -8,1 -4,9 -17,6 -18,0 -14,4 -7,4 -16,6 -1624 -925 -685 -2153 -2421 -1630 -1078 -2068 216

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

Таблица 9—2. Эффективность в пределах выборки по тестам и рынкам SYM 01 02 03 [04 05 06 07 08 0» 10 11 12 итого SP + + 4 3 YX + + 4 4 4 + 4+ 7 US + ++ 2 ТВ + +? 2 TY 4 4 4+ 4 4 BP + 4 4 4 —f 44 S DM 4 4 4-4 4 + 4+ 4+ 8 SF + 4 44 44 + 44 4 4 4 9 JY +4 ++ 4 4 4 4 4+ ++ В CD +? 44 — 44 44 44 5 ED - 4+ 1 CL + * +4 4 4 5 HO 4+ 4 44 4 44 44 6 HU 44 4 4 44 4 GC + 4 4- 3 St 4 4 + 3 PL 4 + 2 PA - 4 44 ? * — 2 FC 44 4 2 LC + 1 LH — 44 1 PB + 4+ - 44 44 4 S + + 44 44 4 + В SM 4 4 44 +4 4 + 4 7 BO 44 + 2 с 0 о 0 w 0 KW + 44 2 MW 0 KG +4 4 4 3 cc + 4 44 4 4 SB 4 4 44 3 JO + + + 4 + 4 CT 4 4 4-4 44 44 4 в LB 44 4+ 2 итого OS 15 07 08 08 0» 11 0» 19 09 11 15 нием и инверсией. Каждая модель тестировалась с входами по цене открытия, по лимитному приказу и по стоп-приказу. В табл. 9-1 приведены все результаты, распределенные по виду выборки, приказу и модели. Для каждой модели даны ряд значений, содержащий годовую доходность портфеля, и ряд значений средней прибыли или убытка в сделке. В двух правых столбцах — средние по всем видам приказов в пределах и вне преде

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ 217

Таблица 9—3. Эффективность вне пределов выборки по тестам и рынкам SYM 01 02 03 04 05 08 07 08 09 10 11 12 №ТОГО; SP 0 YX 0 US 44 44 +4 4 + 4 - 44 44 7 ТВ 4 4+ 2 TY 4 44 +4 - 3 BP 44 44 44 - 44 44 4 44 7 ОМ 44 4+ + 4 3 SF 44 ++ 4 + +4 4+ 44 44 44 в JY 4+ 44 г CD +4 1 ED - - 4 +4 2 CL 4 4 2 НО + 4 ? + 4 3 но — 44 1 ОС 44 44 44 44 4 SI — 0 PL + 4 44 44 44 5 РА 44 ? - 44 г FC ++ 44 2 LC + + + 44 44 44 44 7 LH + + * г РВ 4+ 4 - + + 44 44 4 е S 0 SM + ? 4 2 ВО + 4 - 2 С +4 44 2 О - 0 W 4 ++ 4 - 3 KW ++ + 4 +4 44 44 44 4+ 4+ 4 9 MW 4+ 44 2 КС 44 44 44 3 сс 44 + + 44 + 4 4 SB ++ 4 ++ 4 4 JO 4 + 44 44 - 44 44 44 44 44 в ст 44 — 4 44 ++ 4 LB 4+ 44 4 44 44 +4 — 44 44 + в ИТОГО: 16 17 14 9 7 10 7 7 10 9 в 10 лов выборки, в двух нижних строках — средние по всем моделям для каждого вида приказов.

В табл. 9-2 и 9-3 собрана информация по каждому из 12 тестов отдельных рынков, прибыльных и убыточных в пределах (табл. 9-2) и вне пределов (табл. 9-3) выборки. В первом столбце приведено обозначение рассматриваемого рынка, в последнем — количество рынков, где данная мо

218

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

дель была прибыльна. В табл. 9-2 и 9-3 степень прибыльности и убыточности рынков для каждой модели указана следующим образом: один минус

( — ) означает убыток в $2000 — 4000, два минуса (-) — убыток более

$4000; один плюс ( + ) означает прибыль от $1000 до $2000, два плюса (+ +) — прибыль более $2000; пустая ячейка означает прибыль до $1000 или убыток до $1999 со сделки.

Тестирование базовой модели, основанной на пересечении

Скользящее среднее mat рассчитывалось на основе интегрированной ценоподобной лунной серии. На его основе рассчитывалось второе скользящее среднее та2. Для тестирования использовались следующие правила: сигнал на покупку генерируется, когда mat поднимается выше та2. Сигнал на продажу генерируется, когда та! опускается ниже та2. Эта модель практически совпадает с моделью пересечения скользящих средних, описанной в предыдущих главах. Их единственное отличие состоит в том, что в данном случае используются «лунные» ряды данных, а не непосредственно цены. Входы производились по цене открытия (тест 1), по лимитному приказу (тест 2) и по стоп-приказу (тест 3).

Оптимизация состояла в прогонке периода скользящих средних avglen от 5 до 15 с шагом 5 и смещения disp от 0 до 15 с шагом 1. Для входа по цене открытия наилучшая эффективность по показателю риска/прибыли в пределах выборки была достигнута при периоде скользящих средних 15 и смещении 8; для входа по лимитному приказу — при периоде 15 и смещении 6; для входа по стоп-приказу— при периоде 15 и смещении 12.

Ни один из тестов ни в одной из выборок не принес прибылей. Наилучшая эффективность (т.е. наименьшие убытки) были обнаружены при входе по лимитному приказу, средние результаты были показаны при входе по стоп-приказу, а максимальные убытки — при входе по цене открытия. При использовании входа по лимитному приказу 43% из 1759 сделок были прибыльными. Вне выборки вход по лимитному приказу дал минимальный средний убыток со сделки, а вход по стоп-приказу — максимальный убыток.-В общем, система на целом портфеле работала плохо, относительная эффективность длинных и коротких сделок носила неустойчивый характер. В пределах выборки длинные позиции часто были более убыточны, чем короткие, в отличие от исследовавшихся ранее моделей.

Капитал постоянно снижался на протяжении всего ряда данных при использовании входа по цене открытия. При входе по лимитному приказу капитал поднимался до сентября 1989 г. Затем наблюдались снижение до июля 1992 г., слабый подъем до февраля 1994 г. и новое падение до июля 1998 г., после чего наметился подъем. При использовании же входа по стоп-приказу отмечалось медленное снижение капитала на протяжении всего периода тестирования.

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ

219

В пределах выборки количество рынков, прибыльных при использовании входа по открытию, лимитному и стоп-приказу, составило 15, 8 и 7 соответственно. Вне пределов выборки больше всего рынков (17) принесли прибыль при использовании входа по лимитному приказу, 16 — при входе по цене открытия и 14 — при использовании стоп-приказа. Вне пределов выборки было больше прибыльных комбинаций рынков и видов входов, т.е. можно предположить, что в последнее время большее количество рынков испытывает воздействие лунных циклов. В пределах выборки только рынки немецкой марки и сырой нефти были прибыльными при использовании всех трех видов приказов. Вне пределов выборки рынок немецкой марки был высокоприбыльным при использовании всех трех видов приказов; на рынке сырой нефти при использовании входа по стоп-приказу отмечены небольшие убытки. Рынок казначейских облигаций был высокоприбылен в обеих выборках данных при входе лимитному приказу. На рынке свиной грудинки в обеих выборках при входах по цене открытия и по лимитному приказу получена прибыль. Учитывая только вход по лимитному приказу, в обеих выборках данных прибыльными были рынки немецкой марки, швейцарского франка, иены, платины, палладия, сахара и хлопка.

Тестирование базовой импульсной модели

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

100 дней для получения желаемого результата. Приказ на покупку отдавался, когда импульс на данный день с добавлением смещения disp превышал произведение порогового множителя thresh на среднее абсолютное отклонение лунного импульса. Приказ на продажу отдавался, когда значение импульса с добавлением смещения disp было меньше той же самой величины, взятой со знаком минус. Входы осуществлялись по цене открытия (тест 4), по лимитному приказу (тест 5) и по стоп-приказу (тест 6).

Оптимизация состояла в прогонке периода скользящих средних от 5 до 15 с шагом 5, смещения от 1 до 10с шагом 1 и порогового значения от

1,5 до 2,5 с шагом 0,5. Наилучшие результаты были достигнуты при значениях периода, смещения и порога 10, 10 и 2 для входа по цене открытия и

15, 9 и 1,5 для входа по лимитному и стоп-приказу.

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

220

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

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

При входе по цене открытия капитал снижался плавно и непрерывно с некоторым замедлением скорости снижения со временем. При входе по лимитному приказу снижение капитала было постоянным, при входе по стоп-приказу капитал резко падал с начала выборки до августа 1988 г., а затем плавно снижался.

В пределах выборки некоторую прибыль удалось получить на рынках S&P 500, NYFE, немецкой марки и швейцарского франка. Вне пределов выборки S&P 500 и NYFE не принесли ни прибылей, ни убытков, в то время как рынок немецкой марки был очень прибылен при входе по цене открытия, а швейцарского франка — при входе по лимитному приказу и по стоп-приказу. Как и в случае с моделью на основе пересечения, имелись и другие прибыльные сочетания рынков и приказов.

Тестирование модели на основе пересечения с подтверждением

Эта модель идентична базовой модели на основе пересечения, но в ней входы производятся после подтверждения сигнала стохастическим осциллятором — Быстрым %К Если лунный цикл давал сигнал к покупке, то приказ отдавался только в том случае, когда Быстрый %К был менее 25%. Это означает, что перед покупкой рынок должен был находиться в состоянии минимума или близком к нему. Подобным же образом сигнал на продажу принимался к исполнению только в тех случаях, когда Быстрый %К был выше 75%, т.е. рынок был близок к максимуму. Входы осуществлялись по цене открытия, по лимитному приказу и по стоп-приказу (тесты с 7 по 9 соответственно).

Оптимизация состояла в прогонке периода скользящих средних avglen от 3 до 15с шагом 3, а смещения disp — от 0 до 15с шагом 1. Наилучшие результаты были достигнуты при значениях периода и смещения 15 и 12 соответственно (вход по цене открытия и по лимитному приказу), а также при значении периода 12 и смещения 5 для входа по стоп-приказу.

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

В пределах выборки на рынках иены, мазута, соевых бобов и соевой муки была получена прибыль для всех трех видов приказов; вне преде

ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ

221

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

Тестирование модели на основе пересечения с подтверждением и инверсией

Эта модель подобна предыдущей модели с подтверждением. Их разница состоит в том, что в моменты возможного разворота рынка проводятся дополнительные сделки. Если пересечение скользящих средних генерировало сигнал на покупку, но показатель Быстрого %К был более 75% (т.е. рынок был близок к максимуму), отдавался приказ на продажу, а не на покупку. Подобным же образом, если пересечение давало сигнал к продаже, но рынок был близок к минимуму, генерировался приказ к покупке. Эти сигналы подавались в дополнение к стандартным сигналам, подаваемым основанной на пересечении базовой моделью. Входы осуществлялись по цене открытия (тест 10), по лимитному приказу (тест И) и по стоп-приказу (тест 12).

Оптимизация состояла в прогонке периода скользящих средних avglen от 3 до 15 с шагом 3, смещения disp от 0 до 15 с шагом 1. Наилучшие результаты были достигнуты при значениях периода и смещения 15 и 12 соответственно для входа по цене открытия, для входа по лимитному приказу — при периоде 15 и смещении 8, а для входа по стоп-приказу — при периоде 12 и смещении 15.

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

В пределах выборки рынок NYFE был прибыльным при всех входах, но рынок S&P 500 давал убытки для двух видов входов и нулевую прибыль для третьего. Рынок швейцарского франка также был прибыльным в пределах выборки для всех трех входов; вне пределов выборки он принес значительную прибыль при входе по цене открытия, но в других случаях был убыточен. В общем, в результатах разных выборок наблюдается высокая неустойчивость.

222

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК

<< | >>
Источник: Джеффри Оуэн Кац, Донна Л. МакКормик . Энциклопедия торговых стратегий / Пер, с англ. — М.: Альпина Паблишер. — 400 с. . 2002

Еще по теме МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ ЛУННЫХ МОДЕЛЕЙ:

  1. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ
  2. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ
  3. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ
  4. 10.4. Методология тестирования торговых систем для рынка FOREX
  5. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ ГЕНЕТИЧЕСКОГО КОМПОНЕНТА ВЫХОДОВ
  6. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ НЕЙРОННОГО КОМПОНЕНТА СТРАТЕГИИ ВЫХОДОВ
  7. Тестирование модели
  8. 6.4.3. Построение и тестирование модели APT
  9. 7.3.3. Результаты тестирования модели
  10. ГЛАВА 10. НЕПАРАМЕТРИЧЕСКИЕ МОДЕЛИ VaR И СТРЕСС-ТЕСТИРОВАНИЕ
  11. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ СОЛНЕЧНЫХ МОДЕЛЕЙ