TradingView
tbiktag
19. Okt. 2021 15:35

LinearRegressionLibrary 

SPDR S&P 500 ETF TRUSTArca

Beschreibung

Library "LinearRegressionLibrary" contains functions for fitting a regression line to the time series by means of different models, as well as functions for estimating the accuracy of the fit.

Linear regression algorithms:

RepeatedMedian(y, n, lastBar) applies repeated median regression (robust linear regression algorithm) to the input time series within the selected interval.
Parameters:
  • y :: float series, source time series (e.g. close)
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)

Output:
  • mSlope :: float, slope of the regression line
  • mInter :: float, intercept of the regression line



TheilSen(y, n, lastBar) applies the Theil-Sen estimator (robust linear regression algorithm) to the input time series within the selected interval.
Parameters:
  • y :: float series, source time series
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)

Output:
  • tsSlope :: float, slope of the regression line
  • tsInter :: float, intercept of the regression line


OrdinaryLeastSquares(y, n, lastBar) applies the ordinary least squares regression (non-robust) to the input time series within the selected interval.
Parameters:
  • y :: float series, source time series
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)

Output:
  • olsSlope :: float, slope of the regression line
  • olsInter :: float, intercept of the regression line


Model performance metrics:

metricRMSE(y, n, lastBar, slope, intercept) returns the Root-Mean-Square Error (RMSE) of the regression. The better the model, the lower the RMSE.
Parameters:
  • y :: float series, source time series (e.g. close)
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)
  • slope :: float, slope of the evaluated linear regression line
  • intercept :: float, intercept of the evaluated linear regression line

Output:
  • rmse :: float, RMSE value


metricMAE(y, n, lastBar, slope, intercept) returns the Mean Absolute Error (MAE) of the regression. MAE is is similar to RMSE but is less sensitive to outliers. The better the model, the lower the MAE.
Parameters:
  • y :: float series, source time series
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)
  • slope :: float, slope of the evaluated linear regression line
  • intercept :: float, intercept of the evaluated linear regression line

Output:
  • mae :: float, MAE value


metricR2(y, n, lastBar, slope, intercept) returns the coefficient of determination (R squared) of the regression. The better the linear regression fits the data (compared to the sample mean), the closer the value of the R squared is to 1.
Parameters:
  • y :: float series, source time series
  • n :: integer, the length of the selected time interval
  • lastBar :: integer, index of the last bar of the selected time interval (defines the position of the interval)
  • slope :: float, slope of the evaluated linear regression line
  • intercept :: float, intercept of the evaluated linear regression line

Output:
  • Rsq :: float, R-sqared score



Usage example:

//@version=5
indicator('ExampleLinReg', overlay=true)
// import the library
import tbiktag/LinearRegressionLibrary/1 as linreg
// define the studied interval: last 100 bars
int Npoints = 100
int lastBar = bar_index
int firstBar = bar_index - Npoints
// apply repeated median regression to the closing price time series within the specified interval
{square bracket}slope, intercept{square bracket} = linreg.RepeatedMedian(close, Npoints, lastBar)
// calculate the root-mean-square error of the obtained linear fit
rmse = linreg.metricRMSE(close, Npoints, lastBar, slope, intercept)
// plot the line and print the RMSE value
float y1 = intercept
float y2 = intercept + slope * (Npoints - 1)
if barstate.islast
{indent} line.new(firstBar,y1, lastBar,y2)
{indent} label.new(lastBar,y2,text='RMSE = '+str.format("{0,number,#.#}", rmse))
Kommentare
BobbyBanksX
running the example code 2-3x takes longer than 40k ms to calculate.

what additional value are you getting from the calculations of your library?
RemarcAx
Wondering the same, how do I add this to my chart?
tbiktag
@RemarcAx, answered this question in the reply to @vinikumar72. You cannot directly add it to the chart, but you can import it if you want to build your own script based on linear regression.
vinikumar72
Hi..it doesn't show in favourite list...how to add on chart
tbiktag
@vinikumar72, thanks for the question! This is a library, not a conventional indicator (the library feature came out just recently with Pine version 5). You can import it to your own script (see the description above) and thus use these functions. So it's mostly dedicated to code developers - but not only.

However, I have a couple of tools that use the functionality of this library (and a couple more are under development):
tradingview.com/script/XLhHmv2h-Repeated-Median-Regression-with-Interactive-Range-Selection/
tradingview.com/script/IsgFiwOH-Repeated-Median-Regression-Channel/
RemarcAx
Thanks! Can’t wait to go home from work to try it!
Mehr