作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:今天给大家分享一个用Python开发的选股小工具,专门抓那些横盘很久突然爆发的大牛股。本文就把代码和思路全部分享给你,从原理到实战代码都有,学会了你也能自己快速找到强势突破股。
一、什么是横盘突破?
朋友们,炒股的你是不是经常感觉自己“运气不好”?
眼睁睁看着一只股票横盘整理了好几个月,纹丝不动,你刚失去耐心卖掉,它就“嗖”地一下拔地而起,开启一波轰轰烈烈的主升浪。等你反应过来追进去,往往就成了“接盘侠”。这种“一卖就涨,一买就跌”的魔咒,几乎是每个散户投资者的痛。
其实,这背后并非运气问题,而是你没有读懂市场发出的信号。那些看似沉闷的横盘,往往是主力资金在悄悄“吸筹”。而当它结束盘整,向上突破的那一刻,就是我们梦寐以求的“起爆点”。
所以我决定用Python写个小工具,自动筛选出那些“起爆点”。说白了,我就是想找个“机器人”帮我24小时盯盘,一旦有好机会就马上提醒我。今天我就把这个工具的完整制作方法分享给大家,就算你是新手,跟着做也能搞出来。
首先,我们需要理解一些理论知识。
横盘突破(也有人形象的将其称为箱体突破),简单说就是股票价格在一个很小的范围内上下波动了一段时间,然后突然向上冲破了这个波动区间。
你可以把它想象成一个弹簧。在盘整期,主力资金就像一只手,不断地把弹簧往下压(打压股价吸筹),然后又稍微松开(拉升测试抛压)。这个过程持续越久,积蓄的能量就越强。

搞懂了原理,动手编写程序时,我们只要抓准下面三个关键:
- 股票至少横盘整理了3周以上(时间太短容易是假信号)。
- 价格必须明确突破之前的震荡区间。
- 突破后最好能接近或创出一年新高。
这三条法则,就像一个层层递进的筛子,能帮我们从几千只股票中,筛选出那些真正具有爆发潜力的“种子选手”。
二、手把手教学
理论说完了,接下来就是激动人心的“干货”环节。我把整个筛选过程分解为三个步骤,每一步都是一个简单的判断条件。别担心,就算你是编程小白,跟着我的步骤也能轻松“抄作业”。
第一步:准备工作与数据获取
首先,你需要一个Python环境,并安装一个数据分析库——`pandas`。数据方面,你可以通过各种财经数据接口获取股票的日线数据(开盘价、收盘价、最高价、最低价等)。现在有很多免费或付费的资源,比如Tushare、Baostock等。
# 引入pandas库,我们用它来处理数据
import pandas as pd
# 假设这是你获取到的某只股票的日线数据
# 每一行代表一天,包含'Date', 'Open', 'High', 'Low', 'Close'等列
# df = ... (此处省略数据获取代码)
# 为了能运行示例,我们创建一个模拟的DataFrame
days = 100
dates = pd.to_datetime(pd.date_range(end='2025-09-22', periods=days))
data = {
'Open': [10 + i*0.05 + (1 if i > 80 else 0) for i in range(days)],
'High': [10.2 + i*0.05 + (1.5 if i > 80 else 0) for i in range(days)],
'Low': [9.8 + i*0.05 + (0.8 if i > 80 else 0) for i in range(days)],
'Close': [10.1 + i*0.05 + (1.2 if i > 80 else 0) for i in range(days)]
}
df = pd.DataFrame(data, index=dates)
# 让我们模拟一个盘整后突破的场景
# 60天到80天是盘整期
for i in range(60, 80):
df.loc[df.index[i], ['Open', 'High', 'Low', 'Close']] = [13.0, 13.5, 12.5, 13.2]
# 80天后开始突破
df.loc[df.index[80], 'Close'] = 13.6 # 突破
for i in range(81, days):
df.loc[df.index[i], 'Close'] = df.loc[df.index[i-1], 'Close'] + 0.3
print("数据准备完毕,最后5天的数据:")
print(df.tail())
为了方便演示,上面我们假设你已经把某只股票的历史数据存入了一个名为 `df` 的 `pandas DataFrame` 结构中。
第二步:用代码实现“三条黄金法则”
接下来,我们把前面提到的三条法则,逐一翻译成Python代码。
法则一:判断是否在盘整 (is_consolidating)
def is_consolidating(df, threshold=0.20, weeks=3):
"""
判断股票是否处于盘整状态
:param df: 股票历史数据的DataFrame
:param threshold: 盘整区间的振幅阈值,比如0.20代表20%
:param weeks: 盘整持续的周数
:return: True或False
"""
# 计算需要回看多少个交易日(一周约5个交易日)
window = weeks * 5
# 取出最近一段时间的数据
recent_data = df.iloc[-window:]
# 找到这段时间的最高价和最低价
max_price = recent_data['High'].max()
min_price = recent_data['Low'].min()
# 计算振幅是否小于我们设定的阈值
if max_price == 0: return False # 避免除以0的错误
return (max_price - min_price) / max_price < threshold
法则二:判断是否已突破 (has_broken_out)
def has_broken_out(df, weeks=3):
"""
判断股票是否刚刚突破了盘整区间
:param df: 股票历史数据的DataFrame
:param weeks: 盘整持续的周数
:return: True或False
"""
window = weeks * 5
# 我们关注的是突破前的盘整区间,所以不包含最后一天
consolidation_period = df.iloc[-window:-1]
# 获取最后一天的收盘价
last_close = df['Close'].iloc[-1]
# 获取盘整区间的最高价
consolidation_high = consolidation_period['High'].max()
# 判断最后一天的收盘价是否高于盘整区间的“天花板”
return last_close > consolidation_high
法则三:判断是否接近新高 (is_near_high)
def is_near_high(df):
"""
判断股价是否接近或创下52周新高
:param df: 股票历史数据的DataFrame
:return: True或False
"""
# 52周大约有252个交易日
window_52_weeks = 252
# 获取最后一天的收盘价
last_close = df['Close'].iloc[-1]
# 计算过去52周的最高收盘价
# rolling()函数可以帮我们做移动窗口计算
high_52wk = df['Close'].rolling(window=window_52_weeks).max().iloc[-1]
# 判断最新收盘价是否大于等于年内最高价
# 我们给一点容错空间,比如达到年内最高价的98%就算接近
return last_close >= high_52wk * 0.98
第三步:整合逻辑,一键扫描
有了这三个“零件”,我们就可以把它们组装成一个完整的扫描器函数了。
def run_screener(df):
"""
对单只股票运行完整的“箱体突破”扫描
"""
# 依次调用三个法则函数进行判断
# 使用 and 连接,意味着必须同时满足三个条件
if is_consolidating(df) and has_broken_out(df) and is_near_high(df):
print("发现目标!这只股票可能正处于起爆点!")
return True
else:
print("未满足条件,继续观察。")
return False
# 对我们模拟的股票数据运行扫描器
run_screener(df)
现在,你只需要写一个循环,遍历你股票池里的所有股票代码,对每一只都运行 `run_screener` 函数,就能自动找出那些符合我们“黄金法则”的潜力股了!
提升:数据赛选与预计算
功能做好后,还可以添加更多筛选条件,比如:
筛选条件 | 说明 | 代码实现建议 |
---|---|---|
市值筛选 | 只看大盘股或只看小盘股 | 添加市值数据源 |
行业筛选 | 专注于特定行业 | 使用行业分类数据 |
成交量筛选 | 避免成交量太小的股票 | 计算平均成交量 |
价格筛选 | 只关注特定价格区间的股票 | 简单价格区间判断 |
当你开始扫描全市场几千只股票时,你会发现一个问题:程序跑得太慢了!每次查询都要实时计算,用户体验极差。这正是业余和专业量化系统的区别所在。
我们的秘诀是——预计算(Pre-computation)。
我们不会在用户查询时才去计算,而是每天收盘后,用服务器在后台默默地把所有股票的“盘整”和“突破”状态都算好,并存入数据库。比如,我们会提前算好每只股票是否满足“10%振幅盘整3周”、“15%振幅盘整4周”等多种组合,并打上标签。
这样一来,当打开软件想要筛选“盘整20%以内,持续4周且刚刚突破”的股票时,系统根本不需要重新计算。它要做的,只是从数据库里把已经贴好这些标签的股票找出来。整个过程,快如闪电,瞬间完成!
这就是专业量化平台,如 vn.py 等框架设计时所遵循的核心思想之一:将耗时的计算与快速的查询分离。虽然对个人开发者来说实现起来复杂一些,但这个思路值得你学习和借鉴。
基于Python的开源量化交易开发框架地址:https://github.com/vnpy/vnpy
三、实战小贴士
有了这个强大的工具,是不是就可以躺着赚钱了?千万别这么想!
任何量化策略都只是一个辅助工具,而不是一个能预测未来的水晶球。 当扫描器给你发来警报时,它只是帮你完成了大海捞针的第一步。接下来,你必须像一个侦探一样,进行人工确认:
- 看图表形态: 打开K线图,亲眼看看这个“箱体”是否标准,突破是否干脆利落。
- 查成交量: 突破时是否伴随着成交量的显著放大?无量上涨往往是“假突破”的信号。
- 分析基本面和消息面: 公司最近有没有发布利好消息?所处行业是否是当前热点?
- 设置止损: 任何交易都有风险。在买入前,必须想好如果判断失误,股价跌回箱体内,你应该在哪个位置果断止损离场。
记住,工具帮你提高效率,但最终做决策的,永远是你自己。纪律和风控,才是你在市场长期生存的根本。
常见问题解答
问:需要多少编程基础才能做这个?
答:只要会一点Python基础就行,上面的代码都很简单。
问:数据从哪里获取?
答:可以用tushare、baostock等免费库,或者付费的数据API。
问:多长时间能做好?
答:快的话一个周末就能搭出基本框架。
问:准确率有多高?
答:没有任何工具100%准确,这个工具主要是帮你提高筛选效率。
四、观点总结
自己做量化选股工具并没有想象中那么难,关键是要有清晰的思路和简单的工具。今天分享的这个横盘突破筛选器,虽然代码简单,但实战中很管用。
- 核心思路:用三步判断法找出横盘突破的股票。
- 技术关键:用固定阈值和批量处理保证速度。
- 实战价值:提高选股效率,及时发现机会。
- 扩展性:可以方便地添加更多筛选条件。
- 学习价值:是学习量化投资的好起点。
从追着K线跑,到用逻辑和数据去驾驭市场,这是一个质的飞跃。它能让你摆脱情绪的干扰,建立一套属于自己的、可重复、可验证的交易体系。这,就是量化的魅力。
#关键词
#量化交易 #Python选股 #量化投资 #横盘突破 #箱体理论 #A股 #股票筛选 #编程入门
本文代码我已经尽量写得简单易懂,大家可以直接复制使用。如果对文中内容有任何疑问,欢迎留言,我会尽快回复。祝您投资顺利,收益长虹!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment