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

Обсуждение, описание стратегий и роботов, идеи для стратегий
Max
Сообщения: 9
Зарегистрирован: 07 фев 2017, 08:51
Благодарил (а): 3 раза

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

Непрочитанное сообщение Max » 15 фев 2017, 11:51

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

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 363 раза
Контактная информация:

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

Непрочитанное сообщение evge » 15 фев 2017, 13:05

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

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

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

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


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

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

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;
}
}
}
}
никогда такого не было и вот опять

Max
Сообщения: 9
Зарегистрирован: 07 фев 2017, 08:51
Благодарил (а): 3 раза

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

Непрочитанное сообщение Max » 15 фев 2017, 13:27

Благодарю. Интересный индикатор получился, что-то типа лент Боллиджера, буду разбираться как он работает :D

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 363 раза
Контактная информация:

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

Непрочитанное сообщение evge » 15 фев 2017, 14:00

Небольшое изменение. Надо закомментировать строку

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

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


вот так

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

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


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

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

Max
Сообщения: 9
Зарегистрирован: 07 фев 2017, 08:51
Благодарил (а): 3 раза

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

Непрочитанное сообщение Max » 15 фев 2017, 19:51

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

1.jpg


Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей