暴力K线擒大牛 — 完整实施规范

作者: 王宁 原始语言: 中文(简体) 市场聚焦: A股(上海和深圳证券交易所) 交易风格: 基于K线形态识别的激进动量/波段交易


目录

  1. 核心理念
  2. 定义"暴力"K线
  3. 捕捉大牛的关键K线形态
  4. 成交量确认框架
  5. 均线环境要求
  6. 突破形态识别
  7. 入场技巧与时机
  8. 仓位管理与风险控制
  9. 退出策略与利润保护
  10. 板块与市场环境过滤器
  11. 实操筛选流程
  12. 常见陷阱与假信号
  13. 伪代码:完整筛选与执行流程
  14. 核心语录与原则

1. 核心理念

王宁的核心论点是:个股的重大牛市行情几乎总是由一根或多根"暴力"K线所预示——异常大实体的K线伴随着果断的成交量放大。这些K线代表着供需平衡的根本性转变,强势资金正在积极吸筹并压倒卖方。

该理念建立在三大支柱之上:

该方法刻意偏好高胜率、短持仓周期的交易机会(通常3-15个交易日),而非低频率、高确信度的持仓。目标是抓住行情的爆发阶段,而非持仓度过整理期。


2. 定义"暴力"K线

当一根K线同时满足以下几个量化标准时,即被视为"暴力"K线(暴力K线):

2.1 实体大小阈值

指标 最低阈值 强信号
日线实体大小(收盘价-开盘价范围) >= 5% >= 7%
实体占总振幅比 >= 60% >= 75%
相对实体大小 vs. 20日平均实体 >= 2.0倍 >= 3.0倍

暴力K线必须具有相对于影线的主导实体。较长的上影线或下影线会削弱信号,因为它们表示犹豫不决而非坚定信念。

2.2 影线约束

2.3 跳空要求(可选增强因子)

整个交易日维持的开盘跳空缺口会放大暴力K线信号。>= 2%且全天未被回补的跳空表明买方极度紧迫。


3. 捕捉大牛的关键K线形态

3.1 涨停板

在A股中,每日涨跌幅限制为+10%(创业板/科创板为+20%)。涨停板是终极暴力K线:

3.2 大阳线

单日涨幅 >= 5%,实体饱满且影线极小的K线:

3.3 吞没形态

看涨吞没形态中,当前K线的实体完全覆盖前一根K线的实体:

3.4 启明星组合

三根K线组合形态:

  1. 第一日:下跌K线(延续下跌趋势)
  2. 第二日:小实体K线(可接受向下跳空),显示犹豫不决
  3. 第三日:暴力阳线收复第一日大部分或全部跌幅

3.5 突破跳空

跳空高开引发暴力K线,且跳空缺口未被回补:


4. 成交量确认框架

成交量是暴力K线的"灵魂"——没有成交量确认,即使最令人印象深刻的K线也值得怀疑。

4.1 成交量阈值

最低确认:   成交量 >= 20日均量的1.5倍
标准确认:   成交量 >= 20日均量的2.0倍
强确认:     成交量 >= 20日均量的3.0倍
极端(需谨慎):成交量 >= 20日均量的5.0倍

4.2 成交量形态分析

4.3 相对于近期历史的成交量

成交量柱必须在图表上视觉突出。王宁强调,如果你需要仔细辨认成交量是否高于均值,那就不是暴力K线交易机会。

4.4 连续成交量模式

在初始暴力K线之后,理想的跟进显示:


5. 均线环境要求

在错误的均线环境中出现的暴力K线是陷阱,而非信号。

5.1 看涨均线排列

理想环境具备:

5.2 均线距离规则

暴力K线出现时,股价应在20日均线10%范围内。已经远离均线20-30%的股票产生的暴力K线更可能是见顶放量。

5.3 均线斜率要求


6. 突破形态识别

6.1 底部突破模型

最高概率的暴力K线出现在股票突破明确的整理底部时:

6.2 阻力位类型

阻力类型 描述 突破意义
水平整理顶部 被触及2次以上的平台价格上限
前期波段高点 前次反弹的高点
下降趋势线 下降通道的上边界
整数关口 心理价位(10元、20元、50元) 低-中
均线阻力 60日、120日或250日均线 中-高

6.3 假突破过滤


7. 入场技巧与时机

7.1 当日入场(激进型)

对于实时盯盘的交易者:

7.2 次日早盘入场(标准型)

7.3 回调入场(保守型)

7.4 入场决策伪代码

function decide_entry(candle, next_day_open, ma5):
    if candle.is_violent() and candle.volume_confirmed():
        if next_day_open >= candle.close * 0.97:
            if next_day_open <= candle.close * 1.03:
                return ENTER_AT_OPEN  // 开盘入场
            else:
                return WAIT_FOR_15MIN_PULLBACK  // 等待15分钟回调
        else:
            return SKIP_TRADE  // 放弃交易
    return NO_SIGNAL  // 无信号

8. 仓位管理与风险控制

8.1 仓位管理模型

王宁提倡基于信号强度的分级投入模型:

信号强度 仓位比例 满足条件
最大仓位 资金的30% 暴力K线 + 成交量 + 均线排列 + 底部突破 + 板块支撑
标准仓位 资金的20% 暴力K线 + 成交量 + 均线排列
最小仓位 资金的10% 仅暴力K线 + 成交量

8.2 最大同时持仓数

8.3 止损规则

function calculate_stop(candle, entry_price):
    hard_stop = candle.low
    soft_stop = (candle.open + candle.close) / 2
    max_loss_pct = (entry_price - hard_stop) / entry_price
    if max_loss_pct > 0.08:
        return SKIP_TRADE  // 风险太大
    return hard_stop, soft_stop

9. 退出策略与利润保护

9.1 利润目标位

9.2 移动止损方法

9.3 看跌退出信号

在以下情况立即退出全部仓位:


10. 板块与市场环境过滤器

10.1 市场指数过滤器

10.2 板块动量

10.3 政策与新闻意识

虽然该方法主要是技术性的,但王宁承认A股受政策影响很大。重大政府政策公告、监管变化或板块特定新闻可以覆盖技术信号。


11. 实操筛选流程

11.1 每日筛选流程

  1. 收盘后(下午3:00): 运行暴力K线量化筛选
  2. 成交量过滤: 移除成交量 < 20日均量1.5倍的结果
  3. 检查均线排列: 移除下跌趋势中的股票(价格低于20日和60日均线)
  4. 图表视觉审查: 手动检查剩余候选股的底部形态和阻力位
  5. 按确信度排序: 为每个候选股评分并选出前2-3只作为次日操作目标
  6. 次日盘前: 审查隔夜新闻中是否有任何影响交易的不利因素

11.2 筛选标准总结

筛选条件:
  body_pct >= 5%
  AND body_to_range_ratio >= 0.6
  AND volume >= 1.5 * sma(volume, 20)
  AND close > sma(close, 20)
  AND sma(close, 20) slope >= 0
  AND upper_shadow <= body * 0.33

12. 常见陷阱与假信号

12.1 衰竭K线

在长期上涨趋势末期出现的暴力K线(股票已从底部上涨50%以上),更可能是见顶放量而非延续信号。避免在已经大幅拉升后出现的暴力K线。

12.2 新闻驱动的脉冲

由一次性新闻事件(业绩惊喜、重组公告)引起的暴力K线,如果没有技术底部支撑,往往在5-10日内完全回调。

12.3 成交量不匹配

暴力K线上的极端成交量(>= 5倍均量)可能表示派发——主力资金在散户狂热中卖出。如果成交量极端且股票在第二日未能继续上涨,这很可能是一个陷阱。

12.4 跳空回补陷阱

如果跳空暴力K线在3日内回补其跳空缺口,则突破已经失败。立即退出。


13. 伪代码:完整筛选与执行流程

# ============================================================
# 暴力K线擒大牛 — 完整流程
# ============================================================

def screen_violent_candles(universe, date):
    """在A股全市场中筛选暴力K线信号。"""
    candidates = []

    for stock in universe:
        candle = stock.get_daily_candle(date)
        hist = stock.get_history(date, lookback=60)

        # --- 步骤1:K线实体资格认定 ---
        body = abs(candle.close - candle.open)
        total_range = candle.high - candle.low
        body_pct = body / candle.open

        if body_pct < 0.05:
            continue
        if total_range == 0 or body / total_range < 0.60:
            continue

        # --- 步骤2:影线约束 ---
        if candle.close > candle.open:  # 阳线
            upper_shadow = candle.high - candle.close
            if upper_shadow > body * 0.33:
                continue
        else:
            continue  # 非看涨暴力K线

        # --- 步骤3:成交量确认 ---
        avg_vol_20 = mean(hist.volume[-20:])
        if candle.volume < 1.5 * avg_vol_20:
            continue

        # --- 步骤4:均线环境 ---
        ma20 = mean(hist.close[-20:])
        ma60 = mean(hist.close[-60:])
        if candle.close < ma20:
            continue

        ma20_prev = mean(hist.close[-21:-1])
        if ma20 < ma20_prev:  # 20日均线下行
            continue

        # --- 步骤5:偏离度检查 ---
        if candle.close > ma20 * 1.20:
            continue  # 偏离过大,可能是见顶放量

        # --- 步骤6:信号评分 ---
        score = 0
        score += 1 if body_pct >= 0.07 else 0
        score += 1 if candle.volume >= 2.0 * avg_vol_20 else 0
        score += 1 if candle.close > ma60 else 0
        score += 1 if is_base_breakout(hist, candle) else 0
        score += 1 if sector_is_strong(stock.sector, date) else 0

        candidates.append({
            'stock': stock,
            'candle': candle,
            'score': score,
            'body_pct': body_pct,
            'volume_ratio': candle.volume / avg_vol_20
        })

    # 按评分降序排列
    candidates.sort(key=lambda x: x['score'], reverse=True)
    return candidates[:10]  # 前10名


def execute_trade(candidate, portfolio, next_day_data):
    """对合格候选股执行入场逻辑。"""
    candle = candidate['candle']
    score = candidate['score']
    stock = candidate['stock']

    # 确定仓位大小
    if score >= 4:
        size_pct = 0.30
    elif score >= 3:
        size_pct = 0.20
    else:
        size_pct = 0.10

    # 检查组合约束
    if portfolio.open_positions >= 3:
        return None
    if portfolio.invested_pct + size_pct > 0.80:
        size_pct = 0.80 - portfolio.invested_pct

    # 入场价格逻辑
    open_price = next_day_data.open
    gap_pct = (open_price - candle.close) / candle.close

    if gap_pct < -0.03:
        return None  # 跳空低开太多,放弃
    elif gap_pct > 0.03:
        entry_price = wait_for_pullback(next_day_data, minutes=15)
    else:
        entry_price = open_price

    if entry_price is None:
        return None

    # 计算止损
    hard_stop = candle.low
    max_risk = (entry_price - hard_stop) / entry_price
    if max_risk > 0.08:
        return None  # 风险超过8%,放弃

    # 下单交易
    shares = int((portfolio.capital * size_pct) / entry_price)
    return Trade(
        stock=stock,
        entry_price=entry_price,
        shares=shares,
        hard_stop=hard_stop,
        soft_stop=(candle.open + candle.close) / 2,
        time_stop_days=5,
        targets=[1.10, 1.20, None]  # 最后一部分使用移动止损
    )


def manage_open_position(trade, current_day):
    """持仓的每日管理。"""
    gain_pct = (current_day.close - trade.entry_price) / trade.entry_price

    # 时间止损
    if trade.days_held >= trade.time_stop_days:
        if current_day.high <= trade.entry_price * 1.02:
            return EXIT_FULL, "时间止损 — 无新高"

    # 暴力阴线退出
    body = abs(current_day.close - current_day.open)
    if current_day.close < current_day.open and body / current_day.open >= 0.05:
        if current_day.volume >= 1.5 * trade.stock.avg_volume_20:
            return EXIT_FULL, "暴力阴线"

    # 移动止损管理
    if gain_pct >= 0.30:
        trade.trailing_stop = max(trade.trailing_stop, current_day.ma10)
    elif gain_pct >= 0.20:
        trade.trailing_stop = max(trade.trailing_stop, current_day.ma5)
    elif gain_pct >= 0.10:
        trade.trailing_stop = max(trade.trailing_stop, trade.entry_price)

    if current_day.close < trade.trailing_stop:
        return EXIT_FULL, "移动止损触发"

    # 利润目标(分批退出)
    if gain_pct >= 0.15 and trade.partial_exits == 0:
        trade.partial_exits = 1
        return EXIT_THIRD, "达到第一目标"
    if gain_pct >= 0.25 and trade.partial_exits == 1:
        trade.partial_exits = 2
        return EXIT_THIRD, "达到第二目标"

    return HOLD, None

14. 核心语录与原则

"市场通过K线来说话。暴力K线不是低语——而是呐喊。你的工作是在市场呐喊时倾听。"

"成交量是K线的灵魂。没有成交量的大实体是谎言;有成交量的大实体是意图的告白。"

"不要追一只已经从底部涨了50%的股票。启动行情的暴力K线是机会;结束行情的暴力K线是陷阱。"

"三个条件必须对齐:K线必须暴力,成交量必须确认,趋势必须支持。三者满其二是不够的。"

"速度就是一切。暴力K线今天出现;到明天机会已经少了一半。到第三天,你就是最后一个买家。"

"最安全的暴力K线是从安静底部突破的那一根。寂静之后的暴力——这就是大牛股的模式。"

"单笔暴力K线交易的风险永远不要超过8%。这种模式有很高的胜率,但没有任何模式是万无一失的。生存是第一位的。"

"当市场指数生病时,即使最健康的股票也会感冒。总是先检查将军,然后再带你的士兵上战场。"


本规范综合了王宁《暴力K线擒大牛》的核心方法论,以可操作的实施指南形式构建,面向系统化交易者捕捉A股动量交易机会。