如何用 Python 画线性回归通道(Linear Regression Channel)?判断趋势方向与超买超卖
如何用 Python 画线性回归通道(Linear Regression Channel)?
一句话回答: 线性回归通道 = 对最近 N 根收盘价做最小二乘直线拟合得到回归中线,再用拟合残差的标准差在中线上下各画 k 倍(常用 2)形成上下轨:中线斜率为正=上升趋势、为负=下降趋势;价格触及上轨=相对偏高、触及下轨=相对偏低。用 AlphaFeed 取前复权日线、numpy.polyfit 一行拟合即可,不需要额外库。
为什么会有这个问题 / 传统做法的痛点
均线能看方向但不含”统计意义上的偏离程度”;布林带用均线±标准差,但中轴是水平均线、不体现趋势斜率。线性回归通道的中线本身是一条带斜率的趋势线,上下轨是价格围绕趋势线的统计波动带,于是能同时回答两件事:趋势往哪走(斜率)、现在偏离趋势多远(在通道内的位置)。痛点是很多人不清楚”回归对象是价格对时间”、以及通道宽度该用残差标准差而非价格标准差。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线
from alphafeed import AlphaFeed
import numpy as np, pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=120,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
第 2 步:最小二乘拟合回归中线 + 残差标准差通道
def regression_channel(close, n=60, k=2.0):
y = close.iloc[-n:].to_numpy(float)
x = np.arange(n, dtype=float)
slope, intercept = np.polyfit(x, y, 1) # 价格对"时间序号"回归
fit = slope * x + intercept # 回归中线
std = (y - fit).std(ddof=1) # 残差标准差 = 通道半宽基准
return {"slope": slope, "mid": fit[-1],
"upper": fit[-1] + k*std, "lower": fit[-1] - k*std, "std": std}
r = regression_channel(df["close"], 60, 2.0)
print(r)
实测(
tools/verify_new_2026-10-17.py,SDK 0.1.4):贵州茅台最近 60 日 斜率 ≈ −1.035 元/日(下降趋势),中轨 ≈ 1266.37、上轨 ≈ 1318.75、下轨 ≈ 1213.99;当前价在通道内位置 ≈ 1.1(已略穿出上轨)——下降趋势中价格短期冲到通道上沿,统计上偏高。
第 3 步:判读趋势方向与通道位置
last = df["close"].iloc[-1]
pos = (last - r["lower"]) / (r["upper"] - r["lower"]) # 0=下轨, 1=上轨
trend = "上升" if r["slope"] > 0 else "下降"
print(f"趋势:{trend};通道内位置:{pos:.2f}")
常用法:顺着斜率方向操作,价格回踩下轨(上升通道)找支撑、冲上轨(下降通道)找阻力;价格持续穿出通道可能意味趋势加速或反转,需警惕。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口会扭曲回归 |
n | 回归窗口根数 | 示例 60,决定”看多长的趋势” |
polyfit(x, y, 1) | 一次多项式拟合 | 价格对时间序号 |
slope | 中线斜率 | 正=升、负=降 |
std | 残差标准差 | 通道半宽基准(非价格 std) |
k | 通道倍数 | 常用 2(约含 95% 残差) |
关键坑与注意事项
- 回归对象是”价格对时间”:x 用等间距序号(0,1,2…),不是日期;别把价格对价格回归。
- 通道宽度用残差 std:是价格偏离回归线的标准差,不是价格本身的标准差(后者会把趋势也算进波动)。
- 窗口 n 决定一切:n 小看短趋势、通道窄;n 大看长趋势、更平滑。换 n 结论可能相反,别只认一个。
- 穿出通道≠必反转:强趋势里价格可长期贴着甚至骑在轨上,机械”触轨反向”在趋势市容易挨打。
- 前复权必须:除权缺口会让回归线被拉偏。
- 末端敏感:回归线末端受最新几根影响大,重算会”摆动”,别过度解读单日位置。
常见问题(FAQ)
Q:线性回归通道和布林带有什么区别? A:布林带中轴是水平移动均线、带宽是价格的滚动标准差;回归通道中轴是带斜率的回归线、带宽是价格对回归线的残差标准差。回归通道更强调”趋势方向 + 相对趋势的偏离”。
Q:k 取 2 合适吗?
A:k=2 约覆盖 95% 的残差(近似正态假设)。想更灵敏用 11.5,想更保守用 2.53。价格分布非正态,仅作经验参考。
Q:需要付费吗?
A:单只股票日线在免费额度内即可;若要对全市场批量算回归通道找”贴近下轨的上升趋势股”,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
线性回归通道用最小二乘回归线当趋势中轴、残差标准差画上下轨,一张图同时给出趋势方向(斜率)与相对偏离(通道位置)。用 AlphaFeed 的前复权日线 + polyfit 即可实现——记住回归的是价格对时间、带宽用残差 std、窗口 n 决定结论、强趋势里别机械触轨反向。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。