用 KMeans 聚类精准识别股票支撑位与压力位:基于 QMT 量化平台的完整实现
在量化交易与股票技术分析中,精准识别关键支撑位与压力位是制定交易策略的核心环节。本文将深入讲解如何利用 KMeans 无监督聚类算法,自动定位股票历史价格中的密集成交区,从而高效挖掘市场共识最强的关键价位。整套方案基于 miniQMT 量化终端的 xtquant 行情接口,采用 Python 语言开发,兼顾易用性与专业性。无论你是量化交易从业者、技术分析爱好者,还是金融数据分析学习者,都能从中获得实用价值。本文为系列上篇,重点涵盖开发环境搭建、QMT 行情数据获取、KMeans 算法原理及其在量化交易中的经典应用;下篇将进入实战,完成聚类落地、可视化绘制与策略回测验证。
一、开发环境搭建:依赖库与数据接口
在开始编码之前,我们需要配置好运行环境。本文所有代码均基于 Python 开发,因此请确保已安装 Python 3.7 及以上版本。打开终端或命令行,执行以下命令即可一键安装所有依赖库:
pip install pandas numpy matplotlib scipy scikit-learn xtquant
各库的核心作用如下:
pandas/numpy:金融数据处理与数值计算核心库,提供 DataFrame 和矩阵运算支持。matplotlib:用于绘制 K 线图与聚类结果可视化。scipy/scikit-learn:集成 KMeans 算法实现,同时提供科学计算工具。xtquant:miniQMT 官方 Python 行情与交易接口,用于获取实时与历史数据。
提示:如果你对 JavaScript 或 TypeScript 更熟悉,也可以参考本文逻辑,将核心算法迁移到 Node.js 环境中,但数据接口与可视化部分需要自行适配。
二、基于 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())
⚠️ 注意:使用 xtquant 接口前,请确保已安装并启动 miniQMT 终端,且网络连接正常。数据返回后,建议先进行缺失值检查与异常值过滤,以保证聚类结果的准确性。
三、KMeans 聚类算法核心原理
3.1 什么是 KMeans 聚类
KMeans 是经典的无监督机器学习算法,其最大特点是无需提前标注数据标签,算法能够自主从数据中挖掘内在结构,完成自动分类。它的核心任务是将输入的 N 个数据点划分为 K 个互不重叠的“簇(Cluster)”,每个簇对应一个“聚类中心点(Center)”。最终目标是:同一簇内的数据点相似度最高,不同簇间的差异最大。
对应到股票分析场景,我们将股票的历史价格(如收盘价、最高价、最低价)作为输入数据点,KMeans 会自动找出历史走势中成交最密集的几个价格水平。这些价格密集区正是市场参与者共识最强的位置,即关键的支撑位与压力位。
3.2 通俗理解:股价与电梯的类比
为了更好地理解 KMeans 在价格分析中的逻辑,我们用一个生活化的例子来类比:
把股价比作一栋大楼里的电梯,不同的股价水平就是不同的楼层,每天的收盘价就是电梯的停靠记录。过去一段时间里,电梯在很多楼层都停过,但有的楼层只短暂停靠一次,有的楼层却反复停靠,人流量极大。我们作为大楼管理员,核心想知道的,就是这部电梯最常停靠的核心楼层有哪些。
KMeans 算法正是帮助我们找到这些核心楼层的工具。对应的映射关系如下:
| 电梯场景 | 股票价格分析场景 |
|---|---|
| 电梯楼层 | 股价水平 |
| 电梯停靠次数 | 股价在该价位的出现频率 / 成交量 |
| 核心停靠楼层 | 聚类中心点(价格密集区) |
这些市场记忆最深刻的“核心楼层”,就是我们要找的关键位置:当股价上行时,到达该价位容易遇到大量卖盘,形成压力位;当股价下行时,到达该价位容易遇到大量买盘,形成支撑位。
3.3 KMeans 的迭代计算步骤
KMeans 算法的执行过程,就是不断优化聚类中心点位置的迭代过程,核心分为四步:
- 初始化中心点:随机选择 K 个楼层,作为初始的“核心停靠楼层”(K 为我们提前设定的聚类数量)。
- 数据点分配:将每一次电梯的停靠记录(每一个历史价格),全部分配到离它最近的那个核心停靠楼层,形成 K 个分组。
- 更新中心点:针对每个分组,重新计算该分组内所有停靠楼层的平均值,将这个平均值作为新的“核心停靠楼层”。
- 迭代收敛:重复执行步骤 2 和步骤 3,直到核心停靠楼层的位置不再发生显著变化,算法收敛,最终输出 K 个聚类中心点。
关键点:这一迭代过程与 C++ 或 Go 中常见的数值优化算法类似,强调收敛性与效率。在实际实现中,Python 的 sklearn 库已经高度优化了这些步骤,我们只需调用 API 即可。
3.4 数学定义:最小化平方误差和 SSE
KMeans 算法的优化目标,是最小化所有数据点到其所属聚类中心的平方误差和(SSE)。对应的数学公式如下:
公式中各参数含义:
- k:提前设定的聚类簇数量。
- Ci:第 i 个聚类簇的数据集合。
- μi:第 i 个聚类簇的中心点。
- ∥x−μi∥²:数据点 x 到其所属簇中心点 μi 的欧氏距离平方。
简单来说,算法的核心目标就是找到一组最优的中心点,让每个价格数据点到其所属聚类中心点的距离之和最小。最终得到的中心点,就是价格最集中的区域。
四、KMeans 在量化交易中的经典应用
除了本文重点讲解的“价格密集区与支撑压力位识别”,KMeans 在量化交易领域还有诸多成熟的应用场景,这里做一个系统梳理:
- 股票池聚类分组:将全市场股票的因子特征(市盈率、市净率、波动率、换手率、动量等)作为输入,算法会自动将特征相似的股票归为一类,帮助我们识别同风格、同走势的股票,构建差异化股票池。
- 板块与行业效应分析:对同一行业或概念板块内的个股进行聚类,识别板块内走势高度联动的核心个股,挖掘板块龙头与跟风标的,辅助板块轮动策略开发。
- 量化因子分层回测:对单因子或多因子合成值进行聚类,自动完成因子值的分层(如高动量、中动量、低动量),替代传统的等频或等距分层方式,更贴合因子的实际分布特征,为多因子策略的分层回测与选股打下基础。
- 异常交易行为识别:对股票的量价特征、分时成交数据进行聚类,识别出与正常走势差异极大的异常数据点,辅助捕捉异动个股、规避极端行情风险。
- 交易策略参数优化:对策略的历史回测参数与收益结果进行聚类,找到最优的参数区间,避免参数过拟合,提升策略的样本外稳健性。
五、下篇预告与实践建议
本篇我们完成了算法原理的讲解与基础环境的搭建。下篇将进入核心实战环节:
- 基于上文的行情函数,提取股票价格数据,完成 KMeans 聚类的代码实现。
- 讲解聚类数量 K 的最优值选择方法(肘部法则)。
- 完成支撑位、压力位的可视化绘制,并与 K 线图叠加展示。
- 基于聚类结果,构建简单的支撑压力位交易策略,并完成回测验证。
建议:在等待下篇的同时,你可以先尝试使用本文的行情函数,获取几只不同风格股票的数据,观察价格分布特点。另外,如果你对 TypeScript 或 JavaScript 更熟悉,也可以尝试用 Node.js 实现类似的数据处理管线,提升跨语言开发能力。
[AFFILIATE_SLOT_2]总结
本文系统讲解了如何利用 KMeans 聚类算法 识别股票支撑位与压力位,从开发环境搭建、数据获取到算法原理与应用场景,层层递进。KMeans 的无监督特性使其能够自动发现价格密集区,为量化策略提供客观依据。下篇我们将实战落地,完成完整的聚类、可视化与策略验证流程,敬请期待。
浙公网安备 33010602011771号