TradingView固定区间线性回归线开发需求:含标准误差、R²、角度读数
自定义固定区间线性回归线指标(TradingView Pine Script v5)
需求概述
- 在股票图表上绘制任意两个起始与结束K线间的固定区间线性回归线(非连续曲线),支持手动指定区间(TradingView内置Regression Trend工具无公开代码,故采用手动指定区间方案)
- 标注每个K线的标准误差,用于识别极端异常值
- 添加R²读数作为趋势拟合度的量化对比指标
- 提供线性回归线的斜率与角度测量值
- 基于TradingView内置Linear Regression Channel指标代码进行开发
实现方案(完整代码)
//@version=5 indicator("自定义固定区间线性回归线", shorttitle="CustomLinReg", overlay=true) // 区间设置:手动指定起始与结束K线索引 startBarIndex = input.int(bar_index - 100, title="区间起始K线索引", tooltip="输入目标区间的起始K线bar_index值") endBarIndex = input.int(bar_index, title="区间结束K线索引", tooltip="输入目标区间的结束K线bar_index值") sourceInput = input.source(close, title="数据源") // 显示设置 showStdErrInput = input.bool(true, title="显示逐K标准误差") showRSquaredInput = input.bool(true, title="显示R²拟合度") showSlopeAngleInput = input.bool(true, title="显示斜率与角度") extendLineInput = input.bool(false, title="扩展回归线") // 计算线性回归核心参数 calcLinearRegParams(source, startIdx, endIdx) => length = endIdx - startIdx + 1 if length <= 1 or startIdx < 0 or endIdx > bar_index [float(na), float(na), float(na), float(na), float(na)] sumX = 0.0 sumY = 0.0 sumXSqr = 0.0 sumXY = 0.0 sumResidualSqr = 0.0 sumYMeanSqr = 0.0 // 计算基础统计值 for i = startIdx to endIdx by 1 val = source[i] x = i - startIdx + 1.0 sumX += x sumY += val sumXSqr += x * x sumXY += val * x yMean = sumY / length slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX) intercept = yMean - slope * sumX / length + slope // 计算R²和标准误差 for i = startIdx to endIdx by 1 val = source[i] x = i - startIdx + 1.0 regVal = intercept + slope * x residual = val - regVal sumResidualSqr += residual * residual sumYMeanSqr += (val - yMean) * (val - yMean) stdErr = math.sqrt(sumResidualSqr / (length - 2)) rSquared = sumYMeanSqr == 0 ? 1 : 1 - (sumResidualSqr / sumYMeanSqr) // 计算回归线角度(基于价格刻度,近似值) angle = math.degrees(math.atan(slope)) [slope, intercept, stdErr, rSquared, angle] // 获取计算结果 [slope, intercept, stdErr, rSquared, angle] = calcLinearRegParams(sourceInput, startBarIndex, endBarIndex) // 绘制固定区间线性回归线 if not na(slope) startPrice = intercept + slope * 1 endPrice = intercept + slope * (endBarIndex - startBarIndex + 1) line.new(startBarIndex, startPrice, endBarIndex, endPrice, width=2, color=color.blue, extend=extendLineInput ? extend.both : extend.none) // 标注逐K标准误差 if showStdErrInput and not na(stdErr) var label[] stdErrLabels = array.new_label() // 清除旧标签 if barstate.islast for lbl in array.all(stdErrLabels) label.delete(lbl) array.clear(stdErrLabels) // 绘制区间内的标准误差标签 for i = startBarIndex to endBarIndex by 1 regVal = intercept + slope * (i - startBarIndex + 1) errVal = sourceInput[i] - regVal lbl = label.new(i, low[i] - ta.atr(10)*0.2, str.tostring(errVal, "#.##"), color=color.new(color.white, 100), textcolor=errVal>0 ? color.green : color.red, size=size.small) array.push(stdErrLabels, lbl) // 显示R²、斜率与角度 var label statsLabel = na label.delete(statsLabel[1]) if (showRSquaredInput or showSlopeAngleInput) and not na(rSquared) statsText = "" if showRSquaredInput statsText += "R²: " + str.tostring(rSquared, "#.####") + "\n" if showSlopeAngleInput statsText += "斜率: " + str.tostring(slope, "#.####") + "\n角度: " + str.tostring(angle, "#.##") + "°" statsLabel := label.new(bar_index, high + ta.atr(10)*0.5, statsText, color=color.new(color.black, 70), textcolor=color.white, size=size.normal, style=label.style_label_down)
功能说明
- 区间自定义:通过输入起始和结束K线的
bar_index值,精准指定线性回归的分析区间 - 标准误差标注:区间内每个K线下方显示该价格点与回归线的偏差值,绿色代表高于回归线,红色代表低于回归线,可快速识别异常值
- 拟合度与趋势强度:显示R²值(越接近1表示拟合度越高)、回归线斜率(正数为上升趋势,负数为下降趋势)和角度(直观展示趋势陡峭程度)
- 回归线绘制:仅在指定区间内绘制蓝色回归线,可选择是否向两端扩展显示
内容的提问来源于stack exchange,提问作者lvbx9
相关产品推荐
相关产品推荐

