如何用Python找到股票的支撑位和压力位?——枢轴点法

如何用Python找到股票的支撑位和压力位?——枢轴点法

大家好,我是花姐。常常有小伙伴问我:“股票的支撑位、压力位怎么找?有没有办法用 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 五条线,公式如下:

  1. PP(Pivot Point)

PP=High+Low+Close3PP=3High+Low+Close

  • 这是当天的中轴价格。
  • 可以简单理解为“当天价格的平均水平”。
  1. 第一阻力位 R1

R1=2⋅PP−LowR1=2⋅PP−Low

  • 高于 PP,第一个压力区。
  • 一般价格接近 R1 时,如果反转下跌,说明压力有效。
  1. 第一支撑位 S1

S1=2⋅PP−HighS1=2⋅PP−High

  • 低于 PP,第一个支撑区。
  • 价格接近 S1,如果反弹,说明支撑有效。
  1. 第二阻力位 R2

R2=PP+(High−Low)R2=PP+(High−Low)

  • 高于 PP 的强化压力位,比 R1 更强,突破难度大。
  1. 第二支撑位 S2

S2=PP−(High−Low)S2=PP−(High−Low)

  • 低于 PP 的强化支撑位,比 S1 更强。

基本用法

  1. 短线交易
  2. 当天价格接近 S1/S2 → 可以观察是否出现买入信号
  3. 当天价格接近 R1/R2 → 可以观察是否出现卖出信号
  4. 趋势判断
  5. 收盘价 > PP → 市场偏多
  6. 收盘价 < PP → 市场偏空
  7. 突破策略
  8. 价格突破 R2 → 强势上涨
  9. 价格跌破 S2 → 强势下跌
  10. 结合其他指标
  11. 可以和均线、成交量、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 线形态等二次确认,贸然出手很容易被假信号误导。

  1. 判定条件(二次确认)
  2. 不提议盲目挂单,而是观察:
  3. K 线形态(如锤子线/射击之星)
  4. 成交量(放量突破 or 缩量反弹)
  5. 技术指标(如 RSI<30 配合 S1,信号更强)
  6. 止损设置
  7. S1 买入 → 止损放在 S2 下方
  8. R1 做空 → 止损放在 R2 上方
  9. 这样即便判断错,损失有限。
  10. 目标位选择
  11. S1 反弹买入 → 第一目标看 PP,再看 R1
  12. R1 回落做空 → 第一目标看 PP,再看 S1
  13. 突破 vs 震荡
  14. 震荡行情 → R1/S1 更有效,适合反转操作
  15. 趋势行情 → 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)

日线枢轴点

如何用Python找到股票的支撑位和压力位?——枢轴点法

周线枢轴点

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')

如何用Python找到股票的支撑位和压力位?——枢轴点法

月线枢轴点

如何用Python找到股票的支撑位和压力位?——枢轴点法

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 → 压力明显,突破难度大

实战提议

  1. 先看 大周期(月、周) → 确定市场大方向(偏多/偏空)
  2. 再看 小周期(日) → 找具体的入场点位

这样避免“顺大势做小节奏”的错误。


今天关于枢轴点的介绍就到这里了,下一篇我们介绍局部极值法获取阻力和支撑位。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
尤鱼丝丝丝丝丝的头像 - 鹿快
评论 共1条

请登录后发表评论