量化入门:用Python筛选爆量上涨的股票

机构和量化最大的优势是资金规模,在多个行业板块均有底仓,是A股市场里少有的耐心资本,用量化工具来收割,更自动化而已。

大资金就是利用散户追求短期盈利的心理,把散户吸引到热门板块接盘,冲高收割一波,恐慌出尽再接回来。

散户就像鸭子一样,被热点赶来赶去,任人宰割。

散户最大的缺点就是本金少,所以缺少耐心。

比如揣10w入市,很多散户都在做一年翻几番的梦。

因为10万翻三番也才盈利几十万,跟一般的生意或者工资性收入相当。

何况算上风险因素,实际收入期望值非常低,甚至亏损。

如果本金10w,做耐心资本,年盈利20个点(2万)很多散户是瞧不上的。

毕竟很多人炒股频繁操作,投入的时间和精力成本极高,远不如上班划算。

这就是大部分散户没有耐心的原因。

好言难劝该死的鬼。劝散户耐心,如"挡人财路",杀人父母。

人最难抵御内心的鬼,永远相信幸存者偏差会发生在自己身上,却很少总结错误,改进方法。

在市场里要想活得久,就须不停反思总结,观察分析市场各类参与者的博弈过程,体现在账户上应该是:

1.重新分析各类股票的风险,停止剧烈的亏损;

2.账户止跌企稳,复盘各类操作的时间节点,把账户往正向做;

3.精进之后适当提高下注比,提升仓位,在确定性极强的位置出手。

降低期望,戒除赌性,捂好本金袋子,来日方长,不要想着毕其功于一役。

择时择股,机会一直有,把握最大时出手。

比如爆量的股票,可以加入自选重点关注。

企业基本面非常重要,至少要具有长期健康史,降低暴雷概率。

爆量上涨通常意味着资金关注度突然提升,可能是主力进场或者利好消息刺激。筛选逻辑应该是:

  • 沪深主板,排除ST风险票
  • 流通市值200-2000亿(盘子适中,避免庄股,太小风险高)
  • 年利润>0.5亿(基本面过得去)
  • 近100天涨幅<50%(不追高)
  • 基金持股比例>3%(有机构关注,一般不是垃圾票)
  • 当日成交量 ≥ 近100天平均成交量的3倍
  • 当日收阳线(收盘价>开盘价)

代码逻辑

复制可以直接跑一下

# -*- coding: utf-8 -*-
"""
量化筛选-爆量上涨筛选工具

功能说明:
    1. 筛选符合条件的股票
    2. 获取每只股票近100天前复权日K线数据
    3. 分析并筛选出爆量上涨的日期(成交量>=n倍均值且当日上涨)
    4. 按爆量倍数排序输出结果
"""

import jvQuant
import time

# ==================== 配置参数 ====================
TOKEN = "token"  

# 筛选条件
QUERY_CONDITION = "近100天涨幅小于50%,基金持股比例大于3%,沪深主板,非ST,流通市值200-2000亿,年利润大于0.5亿"

# 爆量阈值
VOLUME_RATIO_THRESHOLD = 3.0

# K线参数
KLINE_LIMIT = 100
KLINE_TYPE = "day"
KLINE_FQ = "前复权"


def safe_float(val, default=0.0):
    """安全转浮点数"""
    try:
        return float(val)
    except (ValueError, TypeError):
        return default


def main():
    db = jvQuant.sql_client.Construct(TOKEN)
    
    # 第一步:筛选股票
    print("=" * 60)
    print("第一步:筛选符合条件的股票,筛选条件:", QUERY_CONDITION)
    print("=" * 60)
    
    query_result = db.query(
        QUERY_CONDITION,
        page=1,
        sort_type=1,
        sort_key="TOTAL_MV"
    )
    
    if query_result['code'] != 0:
        print(f"查询失败: {query_result['message']}")
        return
    
    data = query_result['data']
    stock_list = data['list']
    
    print(f"筛选条件: {data['query']}")
    print(f"符合条件的股票数量: {data['count']}")
    print()
    
    # 第二步:获取K线分析爆量
    print("=" * 60)
    print("第二步:获取K线并分析爆量上涨")
    print("=" * 60)
    
    results = []
    
    for i, stock in enumerate(stock_list):
        code = stock[0]
        name = stock[1]
        
        print(f"[{i+1}/{len(stock_list)}] {code} {name}", end=" ")
        
        try:
            kline_result = db.kline(
                code=code,
                cate='stock',
                fq=KLINE_FQ,
                type=KLINE_TYPE,
                limit=KLINE_LIMIT
            )
            
            if kline_result['code'] != 0:
                print("失败")
                continue
            
            klines = kline_result['data']['list']
            
            if len(klines) < 20:
                print("数据不足")
                continue
            
            # 算平均成交量
            volumes = [safe_float(k[5]) for k in klines]
            avg_volume = sum(volumes) / len(volumes)
            
            # 找爆量上涨
            count = 0
            for k in klines:
                date = k[0]
                open_price = safe_float(k[1])
                close = safe_float(k[2])
                volume = safe_float(k[5])
                pct_chg = safe_float(k[8])
                turnover = safe_float(k[10])
                
                # 爆量且上涨
                if close > open_price and volume >= VOLUME_RATIO_THRESHOLD * avg_volume:
                    volume_ratio = volume / avg_volume
                    results.append({
                        'code': code,
                        'name': name,
                        'date': date,
                        'close': close,
                        'volume_ratio': volume_ratio,
                        'turnover': turnover,
                        'pct_chg': pct_chg
                    })
                    count += 1
            
            print(f"完成(爆量{count}次)")
            
        except Exception as e:
            print(f"错误: {e}")
        
        time.sleep(0.1)  # 别请求太快
    
    # 第三步:输出结果
    print()
    print("=" * 60)
    print("第三步:输出爆量上涨结果")
    print("=" * 60)
    
    if not results:
        print("没有找到符合条件的爆量上涨记录")
        return
    
    results.sort(key=lambda x: x['volume_ratio'], reverse=True)
    
    output_lines = []
    output_lines.append(f"共发现 {len(results)} 条爆量上涨记录\n")
    output_lines.append(f"{'序号':<4} {'代码':<8} {'名称':<10} {'日期':<12} {'收盘价':<8} {'爆量倍数':<8} {'换手率%':<8} {'涨幅%':<8}")
    output_lines.append("-" * 90)
    
    for i, r in enumerate(results, 1):
        line = f"{i:<4} {r['code']:<8} {r['name']:<10} {r['date']:<12} {r['close']:<8.2f} {r['volume_ratio']:<8.2f} {r['turnover']:<8.2f} {r['pct_chg']:<8.2f}"
        output_lines.append(line)
    
    output_text = "\n".join(output_lines)
    print(output_text)
    
    with open("result.txt", "w", encoding="utf-8") as f:
        f.write(output_text)
    
    print(f"\n结果已保存到 result.txt")


if __name__ == "__main__":
    main()

跑一下

筛选符合条件的股票,筛选条件: 近100天涨幅小于50%,基金持股比例大于3%,沪深主板,非ST,流通市值200-2000亿,年利润大于0.5亿
符合条件的股票数量: 180

获取K线并分析爆量上涨
[1/100] 601611 中国核建 完成(爆量1次)
[2/100] 600871 石化油服 完成(爆量1次)

Ctrl^c


第三步:输出爆量上涨结果
共发现 104 条爆量上涨记录

序号   代码       名称         日期           收盘价      爆量倍数     换手率%     涨幅%     
------------------------------------------------------------------------------------------
1    601868   中国能建       2026-03-12   3.80     8.02     14.75    10.14   
2    601016   节能风电       2026-03-17   4.55     8.00     18.65    9.90    
3    000537   绿发电力       2026-03-17   11.68    7.96     10.58    4.01

原文

出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值