d9e5a92d

Код модели обращенного Медленного %К





static void PrepareNeurallnputs (float *var, float *cls, int cb) {
// Преобразование исходных цен закрытия
// во входную информацию для нейронной сети.
// var - вывод: массив [1..18] переменных для нейросети
// cls - ввод: массив [1..] цен закрытия
// cb - ввод: индекс текущего дня
static pbars[] = { 0, 0,1,2,3,4,5,6,8,10,12,16,20,24,32,34,
40,48,64,96 };
static float pfac[19], amp;
static int notfirstpass, k;
// инициализируем таблицу фактора корректировки разницы
if(notfirstpass == FALSE) (
for(k = 1; k <= 18; k++)
pfac [k] = 1.0 / sqrt (pbars [k+1] - pbars[k]);
notfirstpass = TRUE;
}


// считаем откорректированные ценовые разницы и квадраты амплитуды
amp = 0.0;
for (k = 1; k <= 18; k++) (
var [k] = pfac [k] *
(cls[cb - pbars[k]] - cls (cb - pbars[k+1] ]);
amp += var [k] * var [k] ;
}
// нормирование вектора ценовых разниц к единице амплитуды
amp = 1.0 / sqrt(amp);
for(k = 1; k <= 18; k++)
var[k] = amp * var[k];
}
static void Model (float *parms, float *dt, float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM its, float *eqcls) (
// Выполняет простую торговую модель на нейросетях. Она
// торгует с помощью предсказания обратного Медленного %К.
// File = xl5modOl.c
// parms - набор [1..MAXPRM] параметров
// dt — набор [1..nb] дат в формате ГГММДД
// орn - набор [l..nb] цен открытия
// hi — набор [l..nb] максимальных цен
// 1о — набор [l..nb] минимальных цен
// cls - набор [l..nbj цен закрытия
// vol — набор [l..nb] значений объема
// oi — набор [l..nb] значений открытого интереса
// dlrv - набор [1..пЬ] средних долларовой волатильности
// nb — количество дней в наборе данных
// ts — ссылка на класс торгового симулятора
// eqcls — набор [l..nb] уровней капитала при закрытых позициях
//объявляем локальные переменные
static int rc, cb, ncontracts, maxhold, ordertype;
static int mode, signal, factcount, k, netnum;
static FILE *fil;
static NEURALNET *nnet; static char netname [20];
static float thresh, netout, var[19];
static float mmstp, ptlim, stpprice, limprice, tmp;
static float exitatr[MAXBAR+1], revstoch[MAXBAR+1];

// копируем параметры в локальные переменные для удобного обращения
thresh = parms[l]; // порог выходных значений для сети
netnum = parms[2]; // число нейросети
mode = parms[6] ; // обучение (режим=1) или тест (режим=2)
ordertype = parms[9]; // тип входного приказа
maxhold = 10; // период максимального удержания позиции
ptlim = 4; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности
//выполняем вычисления по всему объему данных с помощью векторных процедур
AvgTrueRangeS(exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для
// выхода
RevStochOsc(revstoch,hi,lo,cls,2,10,nb); // обратный Медленный %К
// готовим набор фактов для обучения нейросети
if(mode == 1) { // режим подготовки
// фактов (р6=1)
// открываем выходной файл и записываем N- TRAIN в файл
// заголовок перед обработкой первого рынка
if(strcmp(ts.symbol(), "SP") == 0) (
fil = fopen("yl5fac01.dat", "wt");
fprintf(fil, "%d\n%d\n", (int)18, (int)l);
factcount = 0;
}
// записываем действительные факты в файл
// делаем для каждого рынка в портфеле
for(cb = 1; cb <= nb; cb++) (
if(dt[cb] < ISJATE) continue; // период анализа
if(dt[cb+10] > OOS_DATE) break; // игнорируем данные вне пределов выборки
fprintf(fil, "%6d", ++factcount) ; // номер факта
PrepareNeurallnputs(var, cls, cb) ;
for(k = 1; k <= 18; k++)
fprintf(fil, "%7.3f", var[k]); // входные значения
fprintf(fil, "%7.3f\n",revstoch[cb] ); // цель
if((cb % 1000) == 1)
printf("CB = %d\n", cb); // информация о прогрессе
}
// закрываем выходной файл и выходим после обработки последнего рынка
if(strcmp(ts.symbol(), "LB") == 0) (
fclose(fil);
exit(0);
}
}
// моделируем торговлю с обученной нейросетью
if(mode == 2) { // режим торгового симулятора (рб=2)
// загружаем обученную сеть перед обработкой первого рынка
if (strcmp(ts.symbol(), "SP") == 0) (
sprintf(netname, "/nets/nn%d.net", netnum);
nnet = ntlload(netname) ;
if(nnet == NOLL) nrerror(ntlerrm(ntlerrc()));
}
// проходим через дни, чтобы смоделировать реальную торговлю
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");
egcls[cb] = ts.currentequity(EQ_CLOSETOTAL);
// считаем количество контрактов для позиции
// ... мы хотим торговать эквивалентом долларовой волатильности
// ... 2 новых контрактов на S&P- 500 от 12/31/98
ncontracts = RoundToInteger(5673 .0 / dlrv[cb]);
if(ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+l] == lo[cb+l]) continue;


// генерируем входные сигналы, цены стоп- и лимитных приказов,
// используя обученную нейросеть
signal=О;
PrepareNeurallnputs(var, cls, cb) ;
ntlset_inputv(nnet, &var[l]); // принимаем входные параметры сети
ntlfire (nnet); // запускаем сеть
netout = ntlget_output(nnet, 0); // получаем выходные данные
if(netout > thresh) signal = - 1; // сигнал на продажу
if(netout < (100 - thresh))
signal = 1; // сигнал на покупку
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.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);
} // обрабатываем следующий день
// выгружаем обученную сеть после обработки последнего рынка
if(strcmp(ts.symbol(),"LB") == 0) ntldisp(nnet) ;
}
}

Код включает две функции — обычную функцию Model, реализующая торговую модель, и процедуру подготовки входов нейронной сети PrepareNeurallnputs. Процедура, которая подготавливает входы, требует для работы индекса текущего дня (cb) и серии цен закрытия (cls).
Функция PrepareNeurallnputs при наличии индекса текущего дня и серии цен закрытия рассчитывает для данного факта все входы, необходимые нейронной сети. В списке параметр pbars указывает на относительный по сравнению с текущим (приравненным к нулю) номер дня из прошлых данных, используемый для вычисления вышеописанных разностей цен. Первый блок кода после объявления переменных запускает таблицу факторов подстройки цен. Таблица запускается на первом проходе функции и содержит квадратные корни количества дней между каждой из пар цен, используемых для расчета разностей. Следующий блок кода рассчитывает скорректированные разности, а также суммы их квадратов, т.е. квадрат амплитуды или длину результирующего вектора.
Код, реализующий торговую модель, основан на наших обычных принципах. После объявления переменных ряд параметров копируется в локальные переменные для простоты ссылок. Затем рассчитываются средний истинный интервал, используемый для стандартного выхода, и обращенный во времени Медленный %К с периодом 10 дней.
Один из параметров (mode) выбирает режим работы кода. Mode = 1 запускает код для подготовки факта; файл открывается, заголовок (состоящий из числа входов — 18 и числа целей — 1) записывается, и счет фактов начинается с нуля. Это производится только при открытии первого из рынков в составе портфеля. Файл остается открытым все время дальнейшей обработки, вплоть до конца обработки последнего символа в портфеле. После заголовка в файл записываются факты. Все данные до начала периода выборки и после окончания периода вне выборки игнорируются. Используются только данные в пределах выборки. Каждый факт, записанный в файл, состоит из номера факта, 18 переменных входов, рассчитанных процедурой PrepareNeurallnputs, и цели (значения обращенного во времени Медленного %К). Пользователю сообщается информация о продвижении работы.
Если mode выбирается равным 2, то нейронная сеть, обученная на вышеописанномфайле с фактами, используется для генерации торговых входов. Первый блок кода открывает и загружает нужную сеть до начала расчетов по первому рынку. После выполнения стандартных функций обновления симулятора, расчета количества контрактов, избежания дней с остановленной торговлей и т.п. запускается блок, генерирующий сигналы входа и выхода. Функция PrepareNeurallnputs вызывается для получения входных данных, соответствующих текущему дню. Сеть обрабатывает эти данные, и на основании ее выхода генерируются сигналы на вход в рынок.
Правила генерации сигналов таковы: если на выходе нейронной сети значение превышает порог thresh, то подается сигнал на продажу — сеть предсказывает высокое значение обращенного во времени Медленного %К, т.е. текущая цена закрытия, возможно, близка к максимуму на ближайшее будущее. Если на выходе сети значение составляет менее 100 — thresh, то подается сигнал на покупку. Например, если thresh установлен на уровне 80, то любой предсказанный Медленный %К более 80 будет вызывать сигнал на продажу, а любой Медленный %К менее 20 — сигнал на покупку.
Кроме того, встроены еще два блока, обеспечивающие отдачу собственно приказа на вход в рынок и работу стандартизированного выхода.
Эти блоки подобны использованным в предыдущих главах.


Содержание раздела