当前位置: 首页 > news >正文

【量化交易实践】Python 实现股票箱体突破选股策略(完整代码 + 结果验证)

本文为《如何使用箱体突破做股票》下篇,承接上篇的策略思路讲解,本文将给出完整可运行的 Python 实现代码、全市场选股逻辑、实盘筛选结果以及策略风险提示,适合量化入门者参考复用。

一、策略核心逻辑回顾

箱体突破策略采用价格破位 + 量能确认双重过滤规则,核心逻辑如下:

  1. 价格突破条件:当日收盘价突破过去 N 个交易日的最高价(箱体上沿),确认趋势向上破位
  2. 量能验证条件:当日成交量大于过去 5 日均量的指定倍数,确认突破有资金承接,降低假突破概率

本文默认参数:

  • 突破周期:20 个交易日
  • 成交量放大阈值:1.5 倍

二、完整代码实现

本方案基于 Python+MySQL 本地股票数据库开发,可批量扫描全市场个股,自动筛选当日符合箱体突破条件的标的。

2.1 环境依赖与数据库配置

import pandas as pd import numpy as np from sqlalchemy import create_engine # 本地股票数据库配置 - 替换为自身数据库信息 engine = create_engine("mysql://root:12345678@localhost/db_stock?charset=utf8")

2.2 箱体突破选股核心函数

def get_breakout_stocks(breakout_days=20, volume_multiplier=1.5): """ 筛选向上突破股票 参数: breakout_days: 突破周期(默认20日) volume_multiplier: 成交量放大倍数(默认1.5倍) 返回: 符合条件的股票字典列表 """ # 1. 获取最近有效交易日 recent_dates_query = """ SELECT DISTINCT trade_date FROM stock_daily ORDER BY trade_date DESC LIMIT 2 """ recent_dates = pd.read_sql(recent_dates_query, engine) if len(recent_dates) < 2: print("数据量不足,需要至少2个交易日的数据") return [] latest_date = recent_dates.iloc[0]['trade_date'] # 2. 计算回看起始日期,增加缓冲天数保证数据完整性 lookback_days = breakout_days + 10 start_date_query = f""" SELECT DISTINCT trade_date FROM stock_daily WHERE trade_date <= '{latest_date}' ORDER BY trade_date DESC LIMIT {lookback_days} """ all_dates = pd.read_sql(start_date_query, engine) if len(all_dates) < breakout_days + 5: print("历史数据不足") return [] lookback_start_date = all_dates.iloc[-1]['trade_date'] # 3. 拉取全市场个股日线数据 data_query = f""" SELECT sd.trade_date, sd.ts_code, sb.name, sd.close, sd.high, sd.low, sd.vol as volume FROM stock_daily sd LEFT JOIN stock_basic sb ON sd.ts_code = sb.ts_code WHERE sd.trade_date >= '{lookback_start_date}' AND sd.trade_date <= '{latest_date}' ORDER BY sd.ts_code, sd.trade_date """ df = pd.read_sql(data_query, engine) if df.empty: print("未找到匹配数据") return [] # 4. 逐股校验突破条件 results = [] for ts_code in df['ts_code'].unique(): try: stock_data = df[df['ts_code'] == ts_code].copy() stock_data = stock_data.sort_values('trade_date') if len(stock_data) < breakout_days + 5: continue # 提取最新交易日行情 latest_data = stock_data[stock_data['trade_date'] == latest_date] if latest_data.empty: continue current_close = latest_data['close'].iloc[0] current_volume = latest_data['volume'].iloc[0] stock_name = latest_data["name"].iloc[0] if pd.notna(latest_data["name"].iloc[0]) else ts_code # 计算箱体阻力位:突破周期内的最高价 historical_data = stock_data[stock_data['trade_date'] < latest_date] if len(historical_data) < breakout_days: continue historical_high = historical_data["high"].tail(breakout_days).max() # 计算基准均量 avg_volume = historical_data['volume'].tail(5).mean() if avg_volume == 0: continue # 双重突破判定 price_breakout = current_close > historical_high volume_breakout = current_volume > avg_volume * volume_multiplier if price_breakout and volume_breakout: # 计算突破强度与量比 breakout_strength = round((current_close - historical_high) / historical_high * 100, 2) volume_ratio = round(current_volume / avg_volume, 2) results.append({ 'ts_code': ts_code, 'name': stock_name, 'trade_date': latest_date, 'close_price': round(current_close, 2), 'resistance_level': round(historical_high, 2), 'breakout_strength': f"{breakout_strength}%", 'volume_ratio': f"{volume_ratio}倍", 'breakout_days': breakout_days }) except Exception as e: print(f"处理{ts_code}时出错: {str(e)}") continue return results

2.3 个股成交量模式分析函数

def analyze_volume_patterns(ts_code, days=30): """ 深度分析个股成交量结构 参数: ts_code: 股票代码 days: 分析周期(默认30日) 返回: 包含量能均线的个股行情DataFrame """ # 获取市场最新交易日 end_date_query = "SELECT MAX(trade_date) as max_date FROM stock_daily" end_date = pd.read_sql(end_date_query, engine).iloc[0]['max_date'] # 计算分析起始日期 start_date_query = f""" SELECT DISTINCT trade_date FROM stock_daily WHERE trade_date <= '{end_date}' ORDER BY trade_date DESC LIMIT {days} """ dates_df = pd.read_sql(start_date_query, engine) start_date = dates_df.iloc[-1]['trade_date'] # 拉取个股日线数据 data_query = f""" SELECT sd.trade_date, sd.close, sd.high, sd.low, sd.vol as volume FROM stock_daily sd WHERE sd.ts_code = '{ts_code}' AND sd.trade_date >= '{start_date}' ORDER BY sd.trade_date """ df = pd.read_sql(data_query, engine) if df.empty: return None # 计算量能均线与涨跌幅 df['vol_ma5'] = df['volume'].rolling(5).mean() # 5日均量 df['vol_ma10'] = df['volume'].rolling(10).mean() # 10日均量 df['price_change'] = df['close'].pct_change() * 100 return df

2.4 主程序入口

if __name__ == "__main__": print("开始筛选向上突破股票..") # 可自定义突破周期与量能阈值 results = get_breakout_stocks(breakout_days=20, volume_multiplier=1.5) if results: print(f"\n找到 {len(results)} 只向上突破股票:") print("=" * 80) result_df = pd.DataFrame(results) for _, stock in result_df.iterrows(): print(f"股票代码: {stock['ts_code']}") print(f"股票名称: {stock['name']}") print(f"突破日期: {stock['trade_date']}") print(f"收盘价: {stock['close_price']}") print(f"阻力位: {stock['resistance_level']}") print(f"突破强度: {stock['breakout_strength']}") print(f"量比: {stock['volume_ratio']}") print("-" * 50) # 输出单只股票量能深度分析 volume_analysis = analyze_volume_patterns(stock['ts_code']) if volume_analysis is not None: latest_vol = volume_analysis['volume'].iloc[-1] avg_vol = volume_analysis['vol_ma5'].iloc[-1] print(f"成交量分析: 最新 {latest_vol:.0f} 手,5日均量 {avg_vol:.0f} 手") print("-" * 50) else: print("当日无符合条件的突破股票")

三、选股结果展示

以 2025 年 12 月 5 日全市场行情数据为例,使用默认 20 日周期、1.5 倍量能参数,筛选出的部分标的如下:

股票代码股票名称突破日期收盘价阻力位突破强度量比突破周期
000100.SZTCL 科技202512054.554.471.79%2.31 倍20 日
000415.SZ渤海租赁202512053.883.850.78%1.68 倍20 日
000725.SZ京东方 A202512054.264.084.41%3.16 倍20 日
000823.SZ超声电子2025120514.3914.161.62%2.63 倍20 日
002023.SZ海特高新2025120513.5813.262.41%3.87 倍20 日
002031.SZ巨轮智能202512058.047.882.03%5.10 倍20 日
002268.SZ电科网安2025120518.3617.872.74%3.55 倍20 日
002300.SZ太阳电缆2025120510.369.429.98%5.55 倍20 日
002520.SZ日发精机202512056.626.403.44%7.43 倍20 日

四、策略风险与优化方向

箱体突破是经典的趋势跟踪策略,但不存在 100% 胜率的交易方法,实盘应用中需注意以下要点:

  1. 防范假突破风险震荡行情中极易出现价格短暂破位后快速回落的假突破。建议设置止损位,通常放置在突破点下方 2%-3% 或箱体上沿内侧,跌破则及时离场。

  2. 适配市场环境牛市趋势行情下,突破策略的成功率与盈亏比显著更高;震荡市或熊市中建议降低仓位、提高量能过滤阈值,或仅参与主线板块内的突破标的。

  3. 多指标共振过滤单一突破信号容错率较低,可结合 MACD 金叉、RSI 未超买、均线多头排列等条件做二次筛选,能有效提升信号质量。

五、写在最后

箱体突破策略逻辑简单、可解释性强,非常适合量化新手入门实践。大家可以基于这份基础代码,叠加行业过滤、基本面筛选、动态止损止盈等模块,迭代出适配自身交易风格的专属策略。

风险提示:

本文只做教学,不做任何投资建议,投资有风险,入市需谨慎,本文作者享有一切解释权

http://www.jsqmd.com/news/1077110/

相关文章:

  • 垂直大模型实战指南:法律/医疗/金融领域精准落地方法论
  • Outfit字体:9种字重解决你的品牌视觉统一难题
  • 专利查新报告出具部门有哪些?官方机构介绍
  • Outfit字体:构建品牌一致性视觉系统的开源几何无衬线字体解决方案
  • 128k 长上下文实测,Strix Halo 如何轻松读懂十万字小说
  • 源码私有化部署,你的用户数据,永远只在你自己的服务器上,教你快速搭建属于自己的婚恋平台,建立交友婚恋小程序
  • Ryujinx:在PC上体验Nintendo Switch游戏的全方位指南
  • C#串口通讯实战:双线程协作与AutoResetEvent同步机制详解
  • Code Llama 70B本地部署与评测实战指南
  • 大模型稀疏激活原理:MoE架构中2%激活率的技术本质
  • 什么是DDS直接数字合成技术?它与传统AWG模式有何区别?
  • 什么是 TaoToken?
  • Shiro反序列化漏洞手工复现:从原理到实战的完整指南
  • VMware替代方案私密评估矩阵首次公开:CPU/内存/存储I/O/热迁移4维打分表,附下载链接
  • 2027最新计算机毕业设计选题推荐
  • Python的__getattr__中的应用AOP
  • 关于图算法中的边松弛与最短路径更新机制的技术7
  • Java毕设项目: 于 SpringBoot 的网上书店管理系统设计与实现 SpringBoot 框架下在线图书销售管理系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2026算得准的命理软件推荐怎么看?八字排盘App要看时间规则校验
  • 嵌入向量与向量数据库实战:语义搜索落地核心指南
  • 文件包含漏洞:从代码复用到服务器失控的渗透测试实战解析
  • STM32-S80+RTC时钟+校时+吃药检测+药品分类+药量显示+3次定时+声光提醒+TFT彩屏+(无线方式选择)-3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 一文完整拆解 DDoS 攻击全知识点!深度讲解攻击原理、作用方式,附带网站防护方案,全方位搞懂 DDoS 攻防逻辑
  • 【小白向】AI 智能体零基础学习,虾壳云一键部署 OpenClaw v2.7.9 完整拆解教学(最新安装包)
  • 国产老牌羊乳品牌拆解,从产业链看懂产品稳定性
  • Trivy:36k Star 的安全扫描工具,到底好用在哪?
  • 宝可梦存档编辑器终极指南:用PKHeX.Mobile轻松管理你的宝可梦收藏
  • Crossplane:不用写代码就能搭云原生控制平面
  • 利用Burp Collaborator精准检测XXE漏洞的DNS外带攻击
  • 深度学习创新探索