Модели рядов > LinReg (Linear Regression) – линейная регрессия

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

LinReg (Linear Regression) – линейная регрессия

Непрочитанное сообщение evge » 07 фев 2016, 10:21

Линейная регрессия (LinReg) – это индикатор, который отображает в каждый момент последнюю точку текущей линейной модели ценового движения за указанный период, посчитанную на основании метода наименьших квадратов.

Пример:

LinReg-00.png
LinReg-00.png (26.98 КБ) 29676 просмотров


Исходный текст:

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

function Initialize()
{
  IndicatorName = "LinReg";      
  PriceStudy = true;   
  AddInput("Input", Inputs.Price);      
  AddSeries("LinReg", DrawAs.Line, Color.Red);      
  AddParameter("Period", 20);
  AddParameter("Extr", 10);
  AddGlobalVariable("ZN", Types.Double, 0.0);
  AddGlobalVariable("t2", Types.Double, 0.0);
  AddGlobalVariable("t4", Types.Double, 0.0);
}

function Evaluate()
{
// AlfaDirect. 2015. OX
// LinReg (Linear Regression) - Линейная регрессия 
  if (CurrentIndex == 0 )
  {
    // Расчет неизменных коэффициентов по времени
    for (int i = 0; i < Period; i++)
    {
      t2 = t2 + i;
      t4 = t4 + i * i;
    }
    ZN = ((double)Period * t4 - t2 * t2);
  }

  if (CurrentIndex < Period + Extr )
     LinReg = Input[0];
  else
  {
    // Вариант t = [0...N-1]
    double a1 = 0.0;
    double a3 = 0.0;
    for (int i = 0; i < Period; i++)
    {
      a1 = a1 + i * Input[-(int)Period + 1 + i];
      a3 = a3 + Input[-i];
    }
    var alfa = (Period * a1 - t2 * a3) / ZN;
    var beta = (a3 - alfa * t2) / Period;
    LinReg = alfa * ((double)Period-1.0 + Extr) + beta ;
  }
}
никогда такого не было и вот опять

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: LinReg (Linear Regression) – линейная регрессия

Непрочитанное сообщение Prohar » 23 фев 2020, 05:05

simple.png
simple.png (38.47 КБ) 26809 просмотров

Ниже еще один из популярных приемов МНК.
Может быть не так наглядно как у вас, но на моем компе делает оптимизацию в несколько раз быстрее.

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

/**
линейная регрессия МНК

20200222 prohar
**/

function Initialize()
{
  IndicatorName = "i_LinReg";     
  PriceStudy = true;   
  AddInput("Input", Inputs.Price);     
  AddSeries("LinReg", DrawAs.Line, Color.Red);     
  AddParameter("Period", 20);
  AddParameter("Extr", 10);
}

function Evaluate()
{
   double S = SMA(Input, Period);
   double W = WMA(Input, Period);
   LinReg =  (6*(W-S)/(Period-1)) *((double)Period+Extr) + (S-3*(W-S)/(Period-1)*(Period+1));
}


Вроде можно упростить, но тогда регрессор и коэффициенты альфа и бета перестанут быть явными.

Up. если Extr = 0, то

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

function Evaluate()
{
   LinReg =  3*WMA(Input, Period) - 2*SMA(Input, Period);
}


Вернуться в «Модели рядов»

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

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