Regression Line Formula

A regression line is simply a single line that best fits the data.

In the pinescript you can plot a linear regression line using the linreg function.

Here i share the entire calculation of the linear regression line, you are free to take the code and modify the functions in the script for creating your own kind of filter.

Hope you enjoy :)
Remove from Favorite Scripts Add to Favorite Scripts
Hey Alex,
I'm just trying to get the exact function ported from pine to python,
do you have any idea how the "correlation" function works internally, or in other words could you mokup your formula without using any build in pine functions?

+1 Reply
@cmos, Hi cmos, in python try using pandas with .rolling(window).corr where window is the correlation coefficient period, pandas allow you to compute any rolling statistic by using rolling(). The correlation coefficient from pine is calculated with : sma(y*x,length) - sma(y,length)*sma(x,length) divided by stdev(length*y,length)*stdev(length*x,length) where stdev is based on the naïve algorithm.
cmos alexgrover
@alexgrover, you nailed it works perfectly!
+1 Reply
Hi Alex this is very useful thanks!

I am trying to us the homodyne discriminator from ehlers ideal rsi, to set a variable length based on the price cycle for some of my indicators. this does work but the pinescript standard functions do not like dealing with a variable length, so i normally have to code out the functions... i am having such a problem with linreg, so finding your formula is very useful but it has the stock function 'sma' stdev' and 'correlation' which stops the code dead...

I wondered if you might be able to write out the stdev and the correlation functions in pinescript, if you have time.

Let me know what you think


+1 Reply
alexgrover DannyBaker
@DannyBaker, Hi, you might want to check my adaptive least square moving average here . The function m() is an adaptive exponential moving average, in you case you can either use the frequency as alpha (1/DominantPeriod), if you want an adaptive simple moving average then use : a = cum(source), b = (a - a)/P where P is round(DominantPeriod)
DannyBaker alexgrover
@alexgrover, thanks for the suggestion! sadly your answer is a bit beyond my knowledge right now... also it looks like the ma is to responsive for my needs.



I'm trying to code a Linear Regression Band indicator that has the same standard deviations as the built in Linear Regression indicator/drawing tool.

The mean of my indicator (code below) is correct but the standard deviation bands are always in the wrong place when I compare them to the same length LR indicator or drawing tool.

Does anyone know how to fix this issue so that the bands match the built in drawing tool/indicator?

Here is my code ...

study(shorttitle="LRB", title="Linear Regression Bands", overlay=true)
source = close
length = input(50, minval=1)
offset = 0
mult = input(2, title="StDev", minval=0.001, maxval=5)
basis = linreg(source, length, offset)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev
plot(basis, color=red)
plot(upper, color=blue)
plot(lower, color=blue)

Many thanks! Pete
alexgrover peterlondon