Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Анализ отклонения линейной регрессии Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
max



Зарегистрирован: 01.08.2008
Сообщения: 253

СообщениеДобавлено: Пт Апр 10, 2009 4:53 pm Ответить с цитатой Вернуться к началу

Добрый день.
Накопал и чуть поправил (для себя) код, который рисует линейную регрессию и хотел бы создать Исследование на её основе.
Мысль следующая:

1.назовем точку начала канала Start Y и конца End Y (как у ами, если посмотреть Настройку Регрессионого канала)
2.берем длину канала равной 9 баров
3.задаем промежуток для исследования (в настройках) - скажем 300 рабочих дней
И просим Ами просканировать этот промежуток и показать нам все дни End Y когда выполнялось следующее условие :
a1 = abs(Start Y - End Y) ;
a2 = (Start Y - End Y)/2;
Условие = (а1/а2)*100<=0.5

Т.е. канал имел наклоне не более 0.5% (можно в градусах наверно, но % как-то привычнее) между крайними точками

Ну и отсюда два вопроса:
1.как можно определить эти две точки (получить их значение)
2.вот что-то мне формула не нравится - нет 100% совпадения с каналом, который рисует AMI

Спасибо!


Сам код


Код:

P = ParamField("Price field",4);

//  =============================== Math Formula =============================================================
x = Cum(1);
lastx = LastValue(x);
aa = LastValue(LinRegIntercept(p, 9));
bb = LastValue(LinRegSlope(p, 9));
y = Aa + bb * (x - (Lastx - 9 +1));

// ==================Plot the Linear Regression Line ==========================================================

LRLine =  IIf( x > (lastx - 9) AND BarIndex() < Lastx, y, Null );
Plot( LRLine , "LinReg", colorRed, styleDots );

//  ==========================  Plot 2d SD Channel ===============================================================

width2 = LastValue(2*StDev(p, 9));   
SDU2 = IIf( x > (lastx - 9) AND BarIndex() < Lastx, y+width2 , Null ) ;
SDL2 = IIf( x > (lastx - 9) AND BarIndex() < Lastx, y-width2 , Null ) ;

Plot( SDU2 , "Upper Lin Reg", colorRed,styleLine);
Plot( SDL2 , "Lower Lin Reg", colorRed,styleLine);
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 11, 2009 9:13 pm Ответить с цитатой Вернуться к началу

max писал(а):

1.назовем точку начала канала Start Y и конца End Y (как у ами, если посмотреть Настройку Регрессионого канала)
2.берем длину канала равной 9 баров
3.задаем промежуток для исследования (в настройках) - скажем 300 рабочих дней
И просим Ами просканировать этот промежуток и показать нам все дни End Y когда выполнялось следующее условие :
a1 = abs(Start Y - End Y) ;
a2 = (Start Y - End Y)/2;
Условие = (а1/а2)*100<=0.5

Т.е. канал имел наклоне не более 0.5% (можно в градусах наверно, но % как-то привычнее) между крайними точками

Ну и отсюда два вопроса:
1.как можно определить эти две точки (получить их значение)

Start Y и End Y определить нельзя. Их можно только задать руками или по какому либо критерию.
Вообще задача очень сложная (в смысле придумывания алгоритма)
max писал(а):

2.вот что-то мне формула не нравится - нет 100% совпадения с каналом, который рисует AMI

Угу. Я точно не знаю. Скрее всего Ами при расчете канала берет не цену закрытия, а какую либо другую (или середмну бара или (H+L+C)/3 или еще какую)...

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
max



Зарегистрирован: 01.08.2008
Сообщения: 253

СообщениеДобавлено: Сб Апр 11, 2009 9:31 pm Ответить с цитатой Вернуться к началу

000 писал(а):

Ну и отсюда два вопроса:
1.как можно определить эти две точки (получить их значение)

Start Y и End Y определить нельзя. Их можно только задать руками или по какому либо критерию.
Вообще задача очень сложная (в смысле придумывания алгоритма)

2.вот что-то мне формула не нравится - нет 100% совпадения с каналом, который рисует AMI

Угу. Я точно не знаю. Скрее всего Ами при расчете канала берет не цену закрытия, а какую либо другую (или середмну бара или (H+L+C)/3 или еще какую)...[/quote]

1. Хм... странно. А можно ли попросить Ами "считай с первого бара 300 баров назад. а далее просто сдвигайся вправо."
Т.е. мы указываем, что в начале точка Start находится на ref(Close,-300) а точка End(Close,-293) После того как проверили сдвигаемся на один бар вперед - 299 и 292 соответственно?
И тогда мы получаем две точки во времени и соответственно после этого пытаемся как-то определить их значение (они же явно не клоуз будут)?

Ну или хотя бы для начала смотреть последние 7 баров и определять величину точек там (усложняет тесты но хоть как-то)


2/ну это мелочи - потом можно найти в чем причина
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 11, 2009 10:03 pm Ответить с цитатой Вернуться к началу

Вот глянь. Скорее всего есть неточности, но для примера сойдет.
Код:

P = C;

procedure LinReg(n)
{
   x = Cum(1);
   lastx = n;
   aa = LinRegIntercept(p, 9);
   aa = aa[n];
   bb = LinRegSlope(p, 9);
   bb = bb[n];
   y = Aa + bb * (x - (Lastx - 9));
   LRLine =  IIf( x > (lastx - 9) AND x <= Lastx, y, Null );

   Plot( Ref(LRLine, -1) , "LinReg", colorRed, styleNoTitle|styleNoLabel );
}

for( i = BarCount -30; i < BarCount; i++ )
{
   LinReg(i);
}

Plot(C, "", colorBlack, styleCandle);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
max



Зарегистрирован: 01.08.2008
Сообщения: 253

СообщениеДобавлено: Вс Апр 12, 2009 12:26 pm Ответить с цитатой Вернуться к началу

Доброго дня!
Спасибо за код! Он рисует то что нужно и почти совпадает с каналом от Ами (разница не существенна и не принципиальноа - главное градус наклона совпадает)

Но вот не программист я Sad не пойму (честно пытался накалякать разные коды) как определить значение крайних точек...
чтобы выяснить величину наклона. Хотя может попытаться померить градус наклона вместа процента? Как вы считаете
(кстати а как в ами градусы мерить - я порылся в хелпе но что-то не понял)

Спасибо!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 12, 2009 5:37 pm Ответить с цитатой Вернуться к началу

А зачем именно градус? Главное измерить наклон а уж в градусах или в чем другом по моему не важно. А наклон линии определяет LinRegSlope (в коде bb)
Примерно таким макаром.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
max



Зарегистрирован: 01.08.2008
Сообщения: 253

СообщениеДобавлено: Вс Апр 12, 2009 8:21 pm Ответить с цитатой Вернуться к началу

000 писал(а):
А зачем именно градус? Главное измерить наклон а уж в градусах или в чем другом по моему не важно. А наклон линии определяет LinRegSlope (в коде bb)
Примерно таким макаром.


Согласен на все 100
Спасибо большое
Посмотреть профиль Отправить личное сообщение
pitero



Зарегистрирован: 09.06.2008
Сообщения: 65
Откуда: Екатеринбург

СообщениеДобавлено: Пн Апр 13, 2009 12:59 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Вот глянь. Скорее всего есть неточности, но для примера сойдет.
Код:

P = C;

procedure LinReg(n)
{
   x = Cum(1);
   lastx = n;
   aa = LinRegIntercept(p, 9);
   aa = aa[n];
   bb = LinRegSlope(p, 9);
   bb = bb[n];
   y = Aa + bb * (x - (Lastx - 9));
   LRLine =  IIf( x > (lastx - 9) AND x <= Lastx, y, Null );

   Plot( Ref(LRLine, -1) , "LinReg", colorRed, styleNoTitle|styleNoLabel );
}

for( i = BarCount -30; i < BarCount; i++ )
{
   LinReg(i);
}

Plot(C, "", colorBlack, styleCandle);


этот код строит все возможные линии регрессий?
а как построить "внутридневную" регрессию, ну то есть с начала дня строить после х баров и до конца дня. как ни пробовал - пила получается. Естественно для каких-то конкретных указанных параметров. Еще интересно будет понять "перелом" регресси внутри дня. Типа как в примере про индикатор стандартной ошибки, только хочется чтоб и канал строился визуально и так для каждого дня.
сложно?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 13, 2009 1:23 pm Ответить с цитатой Вернуться к началу

Цитата:
этот код строит все возможные линии регрессий?

да
Цитата:
а как построить "внутридневную" регрессию, ну то есть с начала дня строить после х баров и до конца дня

Вот код который рисует регрессию до кнца дня. Длинна задается переменной length. Таким макаром можно

Код:
Plot(C, "", colorBlack, styleCandle);

P = C;
length = 15;

NewDay = Day() != Ref(Day(), 1);

procedure LinReg(n, m)
{
   x = Cum(1);
   lastx = n;
   aa = LinRegIntercept(p, m);
   aa = aa[n];
   bb = LinRegSlope(p, m);
   bb = bb[n];
   y = Aa + bb * (x - (Lastx - m));
   LRLine =  IIf( x >= (lastx - m) AND x <= Lastx, y, Null );

   Plot( Ref(LRLine, -1) , "LinReg", colorRed, styleNoTitle|styleNoLabel|styleNoRescale );
}

for( i = BarCount -200; i < BarCount; i++ )
{
   if(NewDay[i] OR i == BarCount-1)
      LinReg(i, length);
}

Цитата:
Еще интересно будет понять "перелом" регресси внутри дня. Типа как в примере про индикатор стандартной ошибки, только хочется чтоб и канал строился визуально и так для каждого дня.

А вот это уже сложно. Тут надо алгоритм придумать как оценивать начало перелома. А Канал добавить очень просто. В процедуру LinReg вставить как в твоем коде.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
pitero



Зарегистрирован: 09.06.2008
Сообщения: 65
Откуда: Екатеринбург

СообщениеДобавлено: Пн Апр 13, 2009 2:31 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Вот код который рисует регрессию до кнца дня. Длинна задается переменной length. Таким макаром можно

Код:
Plot(C, "", colorBlack, styleCandle);

P = C;
length = 15;

NewDay = Day() != Ref(Day(), 1);

procedure LinReg(n, m)
{
   x = Cum(1);
   lastx = n;
   aa = LinRegIntercept(p, m);
   aa = aa[n];
   bb = LinRegSlope(p, m);
   bb = bb[n];
   y = Aa + bb * (x - (Lastx - m));
   LRLine =  IIf( x >= (lastx - m) AND x <= Lastx, y, Null );

   Plot( Ref(LRLine, -1) , "LinReg", colorRed, styleNoTitle|styleNoLabel|styleNoRescale );
}

for( i = BarCount -200; i < BarCount; i++ )
{
   if(NewDay[i] OR i == BarCount-1)
      LinReg(i, length);
}


визуально линии меняются и скачут в зависимости от положения графика при скролле. Построить систему используя линии регрессии не получится никак. В хэлпе есть пример там используется lastvalue - вроде тоже рисует, но тока для последнего дня, а я хочу на всех днях на графике. Как-то зафиксировать расчет регресси внутри дня можно?
Ну то есть интересует не регрессия 15 последних баров графика, а например 15 первых с начала дня, а потом только продолжать линии регрессии (как-то зафиксировав наклон линий) а расчет регрессии остановить.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пн Апр 13, 2009 2:51 pm Ответить с цитатой Вернуться к началу

pitero писал(а):

визуально линии меняются и скачут в зависимости от положения графика при скролле. Построить систему используя линии регрессии не получится никак. В хэлпе есть пример там используется lastvalue - вроде тоже рисует, но тока для последнего дня, а я хочу на всех днях на графике. Как-то зафиксировать расчет регресси внутри дня можно?
Ну то есть интересует не регрессия 15 последних баров графика, а например 15 первых с начала дня, а потом только продолжать линии регрессии (как-то зафиксировав наклон линий) а расчет регрессии остановить.

Скачут только справа (на правом конце графика), потому, что я сделал чтобы дя последнего дня рисовалось не дожидаясь начала нового дня (OR i == BarCount-1). Можно убрать.
Вот код который рисует с начала дня 15 баров.

Код:

Plot(C, "", colorBlack, styleCandle);

P = C;
length = 15;

NewDay = Day() != Ref(Day(), -1);

procedure LinReg(n, m)
{
   x = Cum(1);
   lastx = n + m;
   aa = LinRegIntercept(p, m);
   aa = aa[n + m];
   bb = LinRegSlope(p, m);
   bb = bb[n + m];
   y = Aa + bb * (x - (Lastx - m));
   LRLine =  IIf( x >= n AND x <= Lastx, y, Null );

   Plot( Ref(LRLine, -1) , "LinReg", colorRed, styleNoTitle|styleNoLabel|styleNoRescale );
}

for( i = BarCount -200; i < BarCount-length; i++ )
{
   if(NewDay[i] OR i == BarCount-1)
      LinReg(i, length);


_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ZSV



Зарегистрирован: 23.10.2009
Сообщения: 2

СообщениеДобавлено: Пн Окт 26, 2009 7:11 am Ответить с цитатой Вернуться к началу

Давно пользуюсь этим форумом, но отвечаю впервые. На сайте ами есть формула линейной регрессии с настройками
http://www.amibroker.com/library/detail.php?id=438&hilite=Cum
Посмотреть профиль Отправить личное сообщение
Sysopaty



Зарегистрирован: 26.08.2010
Сообщения: 5

СообщениеДобавлено: Пт Ноя 26, 2010 10:43 am Ответить с цитатой Вернуться к началу

000 писал(а):
Вот код который рисует с начала дня 15 баров.


Олег, проверь пожалуйста последнюю формулу, может там ошибка?
Причина таких мыслей - существует разбежность со стандартной рисовалкой AMI для Regression channel.

Сделал еще один скрин. На нем линия нарисованная с помощью формулы синяя, нарисованная стандартной рисовалкой - красная.

Линию рисую простым вызовом процедуры со статическими числами, типа:

LinReg(5388, 18);
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen