
大家好,我是花姐。常常有小伙伴问我:“股票的支撑位、压力位怎么找?有没有办法用 Python 程序自动算出来?”
从今天开始花姐将带大家从零开始,把市场上常见的几种支撑/阻力识别方法,用Python代码一一实现出来,并告知你它们的优缺点、适用场景。即使你是量化小白,也能看懂、能上手。
一、为什么支撑/压力不是一条线,而是一个“区域”?
许多人一开始会画一条直线:列如某个高点画水平线就是压力。问题是,股价从来不会乖乖地停在那条线,往往会有点“虚破”或者“差一点到”。
所以,正确的做法是把支撑/压力看成“区间(zone)”。常见的做法是用波动率(列如 ATR)来决定这个区间的宽度。这样画出来的带子更贴近真实市场。
我挑了 8 种常见或实用的算法,既有经典的交易员工具,也有更量化的统计方法。你完全可以挑几种组合起来用。
今天讲的是枢轴点短线战法。
开始前的准备
我这里用的行情数据源是 xtquant + miniQMT。
后续示例里会用到一些常见的 Python 库:pandas, numpy, matplotlib,进阶部分还会涉及 scipy, sklearn。在实际运行代码之前,记得先把环境配置好:
pip install pandas numpy matplotlib scipy scikit-learn xtquant
这样就能避免由于依赖缺失导致的报错啦。
以下是一个基于xtquant + miniQMT获取股票行情的方法,后面的行情Dataframe数据都会通过这个方法来获取:
def get_hq(code,start_date='19900101',period='1d',dividend_type='front_ratio',count=-1):
'''
基于xtquant下载某个股票的历史行情
盘中运行最后一个K里存了最新的行情
period 1d 1w 1mon
dividend_type - 除权方式,用于K线数据复权计算,对tick等其他周期数据无效
none 不复权
front 前复权
back 后复权
front_ratio 等比前复权
back_ratio 等比后复权
'''
xtdata.enable_hello = False
xtdata.download_history_data(stock_code=code, period='1d',incrementally=True)
history_data = xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose','suspendFlag'],[code],period=period,start_time=start_date,count=count,dividend_type=dividend_type)
print(history_data)
df = history_data[code]
df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
df['date'] = df.index
return df
枢轴点(Pivot Points,日/周/月)
原理:经典交易员手法,基于上一个周期的 High/Low/Close 计算中心点 PP 与 R1/S1、R2/S2 等。简单、易解释,适合做日内或日线短期阻力。
R = Resistance 阻力位S = Support 支撑位PP = Pivot Point 枢轴点/中轴价
公式详解:
在枢轴点里计算了 PP, R1, S1, R2, S2 五条线,公式如下:
- PP(Pivot Point)
PP=High+Low+Close3PP=3High+Low+Close
- 这是当天的中轴价格。
- 可以简单理解为“当天价格的平均水平”。
- 第一阻力位 R1
R1=2⋅PP−LowR1=2⋅PP−Low
- 高于 PP,第一个压力区。
- 一般价格接近 R1 时,如果反转下跌,说明压力有效。
- 第一支撑位 S1
S1=2⋅PP−HighS1=2⋅PP−High
- 低于 PP,第一个支撑区。
- 价格接近 S1,如果反弹,说明支撑有效。
- 第二阻力位 R2
R2=PP+(High−Low)R2=PP+(High−Low)
- 高于 PP 的强化压力位,比 R1 更强,突破难度大。
- 第二支撑位 S2
S2=PP−(High−Low)S2=PP−(High−Low)
- 低于 PP 的强化支撑位,比 S1 更强。
基本用法
- 短线交易:
- 当天价格接近 S1/S2 → 可以观察是否出现买入信号
- 当天价格接近 R1/R2 → 可以观察是否出现卖出信号
- 趋势判断:
- 收盘价 > PP → 市场偏多
- 收盘价 < PP → 市场偏空
- 突破策略:
- 价格突破 R2 → 强势上涨
- 价格跌破 S2 → 强势下跌
- 结合其他指标:
- 可以和均线、成交量、K线形态结合,提升准确性。
示例
假设最后几天的枢轴点输出:
PP R1 S1 R2 S2
2025-09-05 200.0 210.0 190.0 220.0 180.0
2025-09-06 202.0 212.0 192.0 222.0 182.0
解读:
- 当天价格在 190-210 区间波动 → 可视作正常区间
- 突破 220 或跌破 180 → 强趋势信号
优缺点
✅ 优点:
- 简单直观,计算快速
- 易于结合日内交易策略
⚠️ 缺点:
- 仅用前一日数据,忽略长期趋势
- 在极端行情或高波动市场中,可能信号不够可靠
进阶用法
枢轴点本身只是参考位,如果不结合成交量、K 线形态等二次确认,贸然出手很容易被假信号误导。
- 判定条件(二次确认)
- 不提议盲目挂单,而是观察:
- K 线形态(如锤子线/射击之星)
- 成交量(放量突破 or 缩量反弹)
- 技术指标(如 RSI<30 配合 S1,信号更强)
- 止损设置
- 在 S1 买入 → 止损放在 S2 下方
- 在 R1 做空 → 止损放在 R2 上方
- 这样即便判断错,损失有限。
- 目标位选择
- 在 S1 反弹买入 → 第一目标看 PP,再看 R1
- 在 R1 回落做空 → 第一目标看 PP,再看 S1
- 突破 vs 震荡
- 震荡行情 → R1/S1 更有效,适合反转操作
- 趋势行情 → R2/S2 更关键,突破后往往会加速
可以结合一个趋势指标(如 MA20 或 ADX):
- 趋势强 → 用突破逻辑
- 趋势弱 → 用反转逻辑
代码(按日枢轴):
import pandas as pd
import numpy as np
def compute_daily_pivots(df):
# df: datetime index, columns ['high','low','close']
ohlc = df.resample('D').agg({'high':'max','low':'min','close':'last'}).dropna()
pp = (ohlc['high'] + ohlc['low'] + ohlc['close']) / 3
r1 = 2*pp - ohlc['low']
s1 = 2*pp - ohlc['high']
r2 = pp + (ohlc['high'] - ohlc['low'])
s2 = pp - (ohlc['high'] - ohlc['low'])
pivots = pd.DataFrame({'PP':pp,'R1':r1,'S1':s1,'R2':r2,'S2':s2}, index=ohlc.index)
return pivots
def plot_daily_pivots(df, pivots, days=10,title='Daily Pivot Points & Support/Resistance'):
# 只画最近 N 天
df_plot = df.tail(days)
pivots_plot = pivots.loc[df_plot.index]
plt.figure(figsize=(12,6))
# 当日收盘价折线
plt.plot(df_plot.index, df_plot['close'], label='Close', marker='o', color='blue')
# 绘制枢轴点和支撑压力位
plt.plot(pivots_plot.index, pivots_plot['PP'], label='PP', linestyle='--', color='black')
plt.plot(pivots_plot.index, pivots_plot['R1'], label='R1', linestyle=':', color='red')
plt.plot(pivots_plot.index, pivots_plot['R2'], label='R2', linestyle=':', color='darkred')
plt.plot(pivots_plot.index, pivots_plot['S1'], label='S1', linestyle=':', color='green')
plt.plot(pivots_plot.index, pivots_plot['S2'], label='S2', linestyle=':', color='darkgreen')
plt.title(title)
plt.xlabel("Date")
plt.ylabel("Price")
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.show()
if __name__ == "__main__":
code = '600519.SH' # 贵州茅台
df = get_hq(code, start_date='20220101', period='1d', count=200)
pivots = compute_daily_pivots(df)
print(pivots.tail())
plot_daily_pivots(df, pivots, days=20)
日线枢轴点

周线枢轴点
code = '600519.SH' # 贵州茅台
df = get_hq(code, start_date='20200101', period='1w', count=200)
pivots = compute_daily_pivots(df)
plot_daily_pivots(df, pivots, days=20,title='Weekly Pivot Points & Support/Resistance')

月线枢轴点

code = '600519.SH' # 贵州茅台
df = get_hq(code, start_date='20200101', period='1mon', count=200)
pivots = compute_daily_pivots(df)
plot_daily_pivots(df, pivots, days=20,title='Monthly Pivot Points & Support/Resistance')
多周期枢轴点对比(进阶)
除了日枢轴(Daily Pivot),我们一般还会关注 周枢轴(Weekly Pivot)、月枢轴(Monthly Pivot)。
核心逻辑:
- 日枢轴 → 适合日内、短线交易
- 周枢轴 → 适合波段交易,能过滤掉部分日内噪音
- 月枢轴 → 更像“大周期航向”,适合中线持仓参考
当不同周期的枢轴点在同一区间出现时,支撑/阻力更强(多周期共振)。
举例:
- 如果日线 S1 ≈ 周线 PP → 支撑更可靠,反弹概率大
- 如果日线 R2 ≈ 月线 R1 → 压力明显,突破难度大
实战提议:
- 先看 大周期(月、周) → 确定市场大方向(偏多/偏空)
- 再看 小周期(日) → 找具体的入场点位
这样避免“顺大势做小节奏”的错误。
今天关于枢轴点的介绍就到这里了,下一篇我们介绍局部极值法获取阻力和支撑位。















- 最新
- 最热
只看作者