<< Пред. стр.

стр. 26
(общее количество: 46)

ОГЛАВЛЕНИЕ

След. стр. >>

// file = xl3modOl.c
// parms — набор [1..MAXPRM] параметров
// dt — набор [l..nb] дат в формате ГГММДД
// орn — набор [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 = 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; // период максимального удержания позиции
ptlim = 4; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности

// Выполняем вычисления по всему объему данных, которые не подвержены
// воздействию каких-либо параметров. Выполняется один раз для каждого
// рынка, результаты сохраняются в таблицах для повторного использования.
// Таким образом, значительно снижается время выполнения программы.
mktindx = ts.modelf) ; // индекс рынка
if (exitatrtab[mktindx] == NOLL) { // размещен?
exitatrtab[mktindx] = vector(1, nb); // таблица exitatr
savgtab[mktindx] = vector{1, nb); // таблица savg
AvgTrueRangeS(exitatrtab[mktindx],
hi, lo, cls, 50, nb); //50-дневный средний истинный
// диапазон
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}; // показывать прогресс
}

// выполняем вычисления для всех данных
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) // стохастический осц.
ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ 213
ГЛАВА 9




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.О / 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] < 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 (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', limprice, ncontracts); break;
case 3: ts.buystop('3', 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, управляет
периодом всех скользящих средних: в модели на основе импульса он
215
ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ
ГЛАВА 9




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


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


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

Модель В пределах выборки Вне пределов выборки Среднее Среднее

В Вне
Открытие Лимитный Стоп- Открытие Лимитный Стоп-
приказ приказ приказ приказ пределах пределов

-11,6
Лунное -9,3 -6,0 -5,6 -14,3 -10,2 -10,4 -7.0
пересечение -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
с подтвержд. -3465 -3896 -2449 -3270
-1251 -655 234 -557

Пересечение с -9,4 -10,0 -7,8 -20,6 -20,9 -20,1 -9,1 -20.5
подтвержд. и -2937 -3203 -2995 -3405
-1546 -1078 -998 -1207
инверсией

Среднее -9,3 -8,1 -4,9 -17,6 -18,0 -14,4 -7,4 -16,6
-2068
-1624 -925 -685 -2153 -2421 -1630 -1078
ИССЛЕДОВАНИЕ входов в РЫНОК
ЧАСТЬ II
216



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




нием и инверсией. Каждая модель тестировалась с входами по цене от-
крытия, по лимитному приказу и по стоп-приказу. В табл. 9-1 приведены
все результаты, распределенные по виду выборки, приказу и модели. Для
каждой модели даны ряд значений, содержащий годовую доходность пор-
тфеля, и ряд значений средней прибыли или убытка в сделке. В двух пра-
вых столбцах — средние по всем видам приказов в пределах и вне преде-
ГЛАВА 9 ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ 217



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




лов выборки, в двух нижних строках — средние по всем моделям для каж-
дого вида приказов.
В табл. 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 г., после чего наметился подъем. При использовании же входа по стоп-
приказу отмечалось медленное снижение капитала на протяжении всего
периода тестирования.
ЛУННЫЕ и СОЛНЕЧНЫЕ РИТМЫ 219
ГЛАВА 9




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


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

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

<< Пред. стр.

стр. 26
(общее количество: 46)

ОГЛАВЛЕНИЕ

След. стр. >>