Страница 1 из 1

Как протестировать канал линейной регрессии??

Добавлено: 15 фев 2017, 11:51
Max
Как протестировать стратегию на пробой канала LR на исторических данных? Индикатор LinRegChannel строится "задним числом" только по последнему периоду ценового ряда, как получить данные в робот за прошлые периоды - непонятно. Кто-нибудь решал такую задачу? В доступной литературе и в инете я не находил сведений по тестированию стратегий на основе этого канала.

Re: Как протестировать канал линейной регрессии??

Добавлено: 15 фев 2017, 13:05
evge
Вот, изменил код, чтоб индикатор сохранял свои значения на истории. Чтобы можно было провести тестирование.
Если его вывести на график, то на каждой точке истории он рисует свое значение уже не в виде прямолинейного канала, а то значение которое было в тот момент истории.

Можете проверить:

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

LineRegChannelST-01.png
На рисунке ломаные линии - LineRegChannelST, прямые линии - LineRegChannel, значения их совпадают в последней точке всегда на истории. Отличия на последнем участке, где LineRegChannel рисует задним числом прямые.
LineRegChannelST-01.png (34.32 КБ) 16627 просмотров


В истории они совпадают, можно делать тесты на этом индикаторе.

Код: Выделить всё

function Initialize()
{
IndicatorName = "LinRegChannelST";   
PriceStudy = true;   
AddInput("Input", Inputs.Price);   
AddSeries("LineUp", DrawAs.Line, Color.Red);   
AddSeries("LineDn", DrawAs.Line, Color.Red);   
AddSeries("LineU2", DrawAs.Line, Color.Gray);   
AddSeries("LineD2", DrawAs.Line, Color.Gray);   
AddParameter("Period", 100, 1);
AddParameter("Delay", 5);
}

function Evaluate()
{
// AlfaDirect 2016. OX
// Канал линейной регрессии за период (Period) с запаздыванием (Delay)
// Отклоенение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия.

//if (CurrentIndex == MaxIndex)
{
double a1 = 0.0;
double a2 = 0.0;
double a3 = 0.0;
double a4 = 0.0;
if (CurrentIndex >= Period+Delay )
{
double N = Period;
for (var i = 0; i < N; i++)
{
a1 = a1 + i * Input[-(int)N + 1 + i -Delay];
a2 = a2 + i;
a3 = a3 + Input[-i -Delay];
a4 = a4 + i * i;
}
var alfa = (Period * a1 - a2 * a3) / (N * a4 - a2 * a2);
var beta = (a3 - alfa * a2) / N;
double Sigma1 = 0.0;
double Sigma2 = 0.0;
for (var i = 0; i < N; i++)
{
// Расчет отклонения 1
double a = ((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma2 )
Sigma2 = a;
}
//for (var i = 0; i < N+Delay; i++)
{
LineUp[0] = alfa * (N+Delay-1) + beta + Sigma1;
LineU2[0] = alfa * (N+Delay-1) + beta + Sigma2;
LineDn[0] = alfa * (N+Delay-1) + beta - Sigma1;
LineD2[0] = alfa * (N+Delay-1) + beta - Sigma2;
//LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1;
//LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma2;
//LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1;
//LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma2;
}
}
}
}

Re: Как протестировать канал линейной регрессии??

Добавлено: 15 фев 2017, 13:27
Max
Благодарю. Интересный индикатор получился, что-то типа лент Боллиджера, буду разбираться как он работает :D

Re: Как протестировать канал линейной регрессии??

Добавлено: 15 фев 2017, 14:00
evge
Небольшое изменение. Надо закомментировать строку

Код: Выделить всё

for (var i = 0; i < N+Delay; i++)


вот так

Код: Выделить всё

//for (var i = 0; i < N+Delay; i++)


выше код я поправил.

На результат это не повлияет, но существенно повлияет на скорость работы индикатора, в т.ч. при тестировании стратегий (если вызов неоднократный в стратегии).

Re: Как протестировать канал линейной регрессии??

Добавлено: 15 фев 2017, 19:51
Max
Протестировал Сбер. на дневках. Простая реверсная пробойная ТС, не самый трендовый участок истории. Вполне сносно работает, получше Боллинджера, можно брать за основу и дальше дорабатывать ;)

1.jpg