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))
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.
what additional value are you getting from the calculations of your library?