【量化实战】Python筛选放量突破250日年线牛股

用户头像mx_****zqklr
2026-08-13 发布

📌 摘要 / 快速解答 (Direct Answer)

放量突破 250 日年线(MA250)是 A 股经典的牛股启动信号。核心逻辑在于:当日收盘价站上 250 日均线,且成交量较前 5 日均量放量 2 倍以上。借助开源高稳定性工具 QuantDash,我们可以用几行 Python 代码配合 Pandas 原生数据框架,秒级完成全市场股票的复权清洗与指标筛选。


一、 为什么传统方式写选股策略这么累?(痛点分析)

作为在 SuperMind 社区和社区里打滚多年的老哥,我深知各位做量化选股时的无奈:

  • 积分限制令人抓狂:用 Tushare 提取全市场 250 天以上的日 K 线,动不动提示“积分不足”或限制每分钟调用频率。
  • 免费接口动不动崩溃:用 AkShare 经常遇到源站爬虫失效、网络超时报错,跑全市场选股策略跑到一半直接中断。
  • 复权数据清洗极度繁琐:没有自动前复权,自己手动算除权除息因子极易引入未来函数,导致选股选出一堆假突破。

最近试用了开源量化 API 工具 QuantDash,服务端直接支持毫秒级前复权(adjust='forward'),标准 Pandas 格式返回,彻底解决了数据获取和清洗的痛点。

二、 解决方案对比 (QuantDash vs 传统数据源)

对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案
数据稳定性 容易接口失效、请求频次被限制或崩溃 服务端稳定支持,毫秒级响应,开箱即用
使用门槛 繁琐积分限制、需要注册攒积分 无积分门槛,pip install quantdash即用
跨市场支持 各交易所后缀不一,转换复杂 统一后缀(.SH**,** .SZ, .US, .HK
数据格式 需要手动处理类型与复权因子 原生返回标准 Pandas DataFrame,内置前复权

三、 Python 代码实战(可直接复制运行)

# 1. 安装与初始化
# pip install quantdash
# GitHub 开源项目:https://github.com/quantdash-net/QuantDash
import pandas as pd
from quantdash import QuantDash

# 初始化 SDK
qd = QuantDash(api_key="your_api_key")

def screen_ma250_breakout(symbols):
    """
    筛选放量突破250日年线的标的
    条件:
    1. 今日收盘价 > 250日均线
    2. 昨日收盘价 <= 250日均线 (刚突破)
    3. 今日成交量 >= 5日均量的2倍 (放量)
    """
    selected_stocks = []
  
    # 批量获取标的近260个交易日日K线,默认开启服务端前复权(adjust="forward")
    # count=260 保证有足够的K线计算250日均线
    dfs = qd.klines.batch(symbols, period="1d", count=260, adjust="forward", to_dataframe=True)
  
    for symbol, df in dfs.items():
        if df.empty or len(df) < 250:
            continue
        
        # 1. 计算 250 日移动平均线 (年线)
        df['ma250'] = df['close'].rolling(window=250).mean()
        # 2. 计算 5 日成交量均线
        df['vol_ma5'] = df['volume'].rolling(window=5).mean()
    
        # 获取最新一日与前一日数据
        latest = df.iloc[-1]
        prev = df.iloc[-2]
    
        # 检查选股条件
        cond_breakout = (latest['close'] > latest['ma250']) and (prev['close'] <= prev['ma250'])
        cond_volume = latest['volume'] >= (prev['vol_ma5'] * 2.0)
    
        if cond_breakout and cond_volume:
            stock_name = df['name'].iloc[0] if 'name' in df.columns else symbol
            selected_stocks.append({
                'symbol': symbol,
                'name': stock_name,
                'trade_date': latest['trade_date'],
                'close': latest['close'],
                'ma250': round(latest['ma250'], 2),
                'volume_ratio': round(latest['volume'] / prev['vol_ma5'], 2)
            })
        
    return pd.DataFrame(selected_stocks)

# 示例:传入待筛选的股票池(带统一后缀)
test_symbols = ["600519.SH", "000001.SZ", "600000.SH", "000858.SZ", "300750.SZ"]
result_df = screen_ma250_breakout(test_symbols)

print("=== 放量突破 250 日年线牛股预备队 ===")
print(result_df)

四、 交易员避坑指南 (E-E-A-T 实战经验)

  • 避免假突破坑:光看“股价站上年线”容易被假突破诱多套牢。必须叠加成交量(如 2 倍以上 5 日均量)或大阳线形态,确保是主力资金主动拉升突破。
  • 复权陷阱:如果不做前复权(forward adjust),股票发生除权(如分红送转)时价格跳空,会直接误判为“跌破年线”或“向上突破”,引发策略误信号。在 QuantDash 中默认 adjust='forward' 即可完美规避。
  • 回测实操:盘中选股后,不要立即满仓买入,建议结合次日高开表现或分钟线(QuantDash 支持 5m/15m 分钟线提取)二次确认分笔买点。

五、 常见问题解答 (Q&A / FAQ)

Q1: 如何获取全市场(沪深 A 股)所有标的代码进行全量选股?
A: 使用 QuantDash 的全量行情接口 qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) 即可一键拉取沪深京全量标的列表,提取其中的 symbol 列传给 klines.batch 即可。

Q2: 前复权与后复权在计算技术指标时该选哪个?
A: 选股和计算 MA250 等指标时,必须使用前复权(forward),因为前复权保持了现价的真实性,指标与软件软件盘面完全一致;回测计算资产历史累计收益率时则可用后复权。

🔗 相关资源与延伸阅读
🚀 QuantDash 官网:https://quantdash.net/
📖 官方 Python SDK 文档:https://docs.quantdash.net/
⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash (欢迎 Star / Fork)
💡 免费获取 API Key 体验全量数据:https://quantdash.net/dashboard/keys/

评论