用 KMeans 聚类寻找股票支撑位与压力位(上):基于 QMT 量化平台实现

前言

本文将详细讲解如何通过KMeans 无监督聚类算法,定位股票历史价格的密集成交区,进而精准识别关键支撑位与压力位。整套方案基于 miniQMT 量化终端的 xtquant 行情接口实现,全程采用 Python 代码开发,适合量化交易从业者、股票技术分析爱好者、Python 金融数据分析人群学习参考。

本篇为系列文章的上篇,核心内容包括:开发环境搭建、QMT 行情数据获取、KMeans 算法原理详解,以及该算法在量化交易中的经典应用场景;下篇将进入实战环节,完成聚类算法落地、支撑压力位可视化与策略有效性验证。


一、开发环境准备

1.1 依赖库安装

本文代码基于 Python 开发,需要提前安装行情接口、数据处理、算法计算、可视化相关的依赖库,打开终端执行以下 pip 命令即可一键安装:

复制代码
pip install pandas numpy matplotlib scipy scikit-learn xtquant

各依赖库核心作用说明:

  • pandas/numpy:金融数据处理与数值计算核心库
  • matplotlib:K 线与聚类结果可视化
  • scipy/scikit-learn:KMeans 聚类算法实现与科学计算
  • xtquant:miniQMT 终端官方 Python 行情 & 交易接口

1.2 基于 xtquant 的行情数据获取函数

我们先封装一个通用的股票历史行情获取函数,后续所有聚类分析的数据源均通过该函数生成,支持日 K、周 K、月 K 多周期,以及多种复权方式配置。

复制代码
import pandas as pd
from xtquant import xtdata

def get_hq(code, start_date='19900101', period='1d', dividend_type='front_ratio', count=-1):
    """
    基于xtquant下载并获取股票历史行情数据
    :param code: 股票代码,格式如 600000.SH
    :param start_date: 行情起始日期,格式YYYYMMDD
    :param period: K线周期,支持 1d(日K)/1w(周K)/1mon(月K) 等
    :param dividend_type: 除权方式,可选 none(不复权)/front(前复权)/back(后复权)/front_ratio(等比前复权)/back_ratio(等比后复权)
    :param count: 获取K线数量,-1为获取起始日期以来全部数据
    :return: 包含OHLCV数据的DataFrame,索引为日期
    """
    # 关闭接口hello打印
    xtdata.enable_hello = False
    # 增量下载历史行情数据
    xtdata.download_history_data(stock_code=code, period=period, incrementally=True)
    # 获取行情数据
    history_data = xtdata.get_market_data_ex(
        field_list=['open', 'high', 'low', 'close', 'volume', 'amount', 'pre_close'],
        stock_list=[code],
        period=period,
        start_time=start_date,
        count=count,
        dividend_type=dividend_type
    )
    # 转换为DataFrame并格式化日期索引
    df = history_data[code]
    df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
    df['date'] = df.index
    return df

函数使用示例:获取贵州茅台 2023 年以来的前复权日 K 行情

复制代码
df = get_hq('600519.SH', start_date='20230101', period='1d', dividend_type='front_ratio')
print(df.head())

二、KMeans 聚类算法核心原理

2.1 什么是 KMeans 聚类

KMeans 是经典的无监督机器学习算法,核心特点是无需提前标注数据标签,算法可自主从数据中挖掘规律,完成数据的自动分类。

它的核心任务是:将输入的 N 个数据点,自动划分为 K 个互不重叠的「簇(Cluster)」,每个簇对应一个「聚类中心点(Center)」,最终保证同一簇内的数据点相似度最高,不同簇间的数据点差异最大。

对应到股票分析场景中,我们将股票的历史价格(收盘价 / 高低价)作为输入数据点,KMeans 就能自动帮我们找到历史走势中成交最密集的几个价格水平,而这些价格密集区,正是市场共识最强的支撑位与压力位。

2.2 通俗理解:股价与电梯的类比

我们用一个生活化的例子,彻底搞懂 KMeans 在价格分析中的逻辑:我们可以把股价比作一部大楼里的电梯,不同的股价水平就是大楼的不同楼层,每天的收盘价就是电梯的停靠记录。

  • 过去一段时间,电梯在很多楼层都停过,但有的楼层只短暂停靠 1 次,有的楼层却反复停靠,人流量极大;
  • 作为大楼管理员,我们核心想知道的,就是这部电梯最常停靠的核心楼层有哪些

而 KMeans 算法,就是帮我们找到这些核心楼层的工具,对应关系如下:

电梯场景 股票价格分析场景
电梯楼层 股价水平
电梯停靠次数 股价在该价位的出现频率 / 成交量
核心停靠楼层 聚类中心点(价格密集区)

这些市场记忆最深刻的「核心楼层」,就是我们要找的关键位置:

  • 股价上行时,到达该价位容易遇到大量卖盘,形成压力位
  • 股价下行时,到达该价位容易遇到大量买盘,形成支撑位

2.3 KMeans 的迭代计算步骤

KMeans 算法的执行过程,就是不断优化聚类中心点位置的迭代过程,核心分为 4 步,我们继续沿用电梯的例子讲解:

  1. 初始化中心点:随机选择 K 个楼层,作为初始的「核心停靠楼层」(K 为我们提前设定的聚类数量);
  2. 数据点分配:把每一次电梯的停靠记录(每一个历史价格),全部分配到离它最近的那个核心停靠楼层,形成 K 个分组;
  3. 更新中心点:针对每个分组,重新计算该分组内所有停靠楼层的平均值,将这个平均值作为新的「核心停靠楼层」;
  4. 迭代收敛:重复执行步骤 2 和步骤 3,直到核心停靠楼层的位置不再发生显著变化,算法收敛,最终输出 K 个聚类中心点。

2.4 数学定义:最小化平方误差和 SSE

KMeans 算法的优化目标,是最小化所有数据点到其所属聚类中心的平方误差和(SSE),对应的数学公式如下:

公式中各参数含义:

  • k:提前设定的聚类簇数量;
  • Ci:第i个聚类簇的数据集合;
  • μi:第i个聚类簇的中心点;
  • ∥x−μi∥2:数据点x到其所属簇中心点μi的欧氏距离平方。

简单来说,算法的核心目标,就是找到一组最优的中心点,让每个价格数据点,到它所属的聚类中心点的距离之和最小,最终得到的中心点,就是价格最集中的区域。


三、KMeans 在量化交易中的经典应用

除了本文核心讲解的「价格密集区与支撑压力位识别」,KMeans 在量化交易领域还有诸多成熟的应用场景,这里给大家做一个全面的梳理:

  1. 股票池聚类分组:将全市场股票的因子特征(市盈率、市净率、波动率、换手率、动量等)作为输入,算法会自动将特征相似的股票归为一类,帮助我们识别同风格、同走势的股票,构建差异化股票池。
  2. 板块与行业效应分析:对同一行业 / 概念板块内的个股进行聚类,识别板块内走势高度联动的核心个股,挖掘板块龙头与跟风标的,辅助板块轮动策略开发。
  3. 量化因子分层回测:对单因子或多因子合成值进行聚类,自动完成因子值的分层(如高动量、中动量、低动量),替代传统的等频 / 等距分层方式,更贴合因子的实际分布特征,为多因子策略的分层回测与选股打下基础。
  4. 异常交易行为识别:对股票的量价特征、分时成交数据进行聚类,识别出与正常走势差异极大的异常数据点,辅助捕捉异动个股、规避极端行情风险。
  5. 交易策略参数优化:对策略的历史回测参数与收益结果进行聚类,找到最优的参数区间,避免参数过拟合,提升策略的样本外稳健性。

下篇预告

本篇我们完成了算法原理的讲解与基础环境的搭建,下篇我们将进入核心实战环节:

  1. 基于上文的行情函数,提取股票价格数据,完成 KMeans 聚类的代码实现;
  2. 讲解聚类数量 K 的最优值选择方法(肘部法则);
  3. 完成支撑位、压力位的可视化绘制,与 K 线图叠加展示;
  4. 基于聚类结果,构建简单的支撑压力位交易策略,并完成回测验证。
相关推荐
所谓伊人,在水一方3332 小时前
【Python数据科学实战之路】第12章 | 无监督学习算法实战:聚类与降维的奥秘
python·sql·学习·算法·信息可视化·聚类
MoRanzhi12032 小时前
Pillow 灰度化、二值化与阈值处理
图像处理·python·pillow·二值化·图像预处理·阈值处理·灰度化
飞Link2 小时前
告别复杂调参:Prophet 加法模型深度解析与实战
开发语言·python·数据挖掘
测试人社区—66792 小时前
当代码面临道德选择:VR如何为AI伦理决策注入“人性压力”
网络·人工智能·python·microsoft·vr·azure
独行soc3 小时前
2026年渗透测试面试题总结-36(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
witAI3 小时前
**Kimi小说灵感2025推荐,从零到一的创意激发指南**
人工智能·python
飞Link3 小时前
深度解析:基于专家的监管方法(Expert-Based Supervision)在复杂系统中的应用
python·数据挖掘·回归
Shining05963 小时前
Triton & 九齿系列《Triton 练气术》
开发语言·人工智能·python·学习·其他·infinitensor
天远Date Lab3 小时前
天远企业司法认证API实战:Python构建企业级供应链合规审查防火墙
大数据·开发语言·网络·python