猎杀黑马 — 完整实施规范

作者: 王宁 原始语言: 简体中文 市场聚焦: A股(上海和深圳证券交易所) 交易风格: 在股票出现重大行情前,主动识别并提前布局尚未被发现的标的


目录

  1. 核心理念
  2. 定义黑马
  3. 技术筛选框架
  4. 成交量异常检测
  5. 机构资金足迹分析
  6. 板块轮动与主题猎杀
  7. 基本面催化剂
  8. 图表形态识别
  9. 入场时机技巧
  10. 建仓策略
  11. 风险管理框架
  12. 持仓期间管理
  13. 退出策略
  14. 黑马生命周期
  15. 伪代码:完整黑马猎杀系统
  16. 核心语录与原则

1. 核心理念

在中国股市的词汇体系中,"黑马"是指没有人看好、却最终带来超额回报的股票。王宁的方法论是在大众发现之前,通过技术异常、成交量分析和机构行为检测相结合的方式,系统性地识别这些股票。

这一理念建立在信息不对称模型之上:


2. 定义黑马

2.1 量化特征

一个黑马候选股通常展现以下特征:

特征 范围
市值 中小盘(10-200亿人民币)
日均成交量 低于板块平均水平(冷门股)
价格位置 距历史最高价下跌30-60%
分析师覆盖 低(0-3位分析师跟踪)
近期媒体提及 极少
过去6个月涨跌幅 在-10%到+15%之间(横盘/无人关注)

2.2 定性特征

2.3 黑马不是什么


3. 技术筛选框架

3.1 阶段分析基础

王宁采用阶段分析框架来识别从第一阶段(筑底)向第二阶段(上升)转换中的黑马:

3.2 一级筛选标准

# 黑马一级筛选
price > 5.0  # 排除超低价股
market_cap between 1_billion and 20_billion
avg_volume_20 > 500_000  # 最低流动性要求
price_change_120_days between -0.15 and 0.15  # 横盘底部
ma20_slope between -0.001 and 0.003  # 走平或略微上升
ma60 near ma120 (within 5%)  # 均线收敛
atr_20 / price < 0.03  # 低波动率(压缩状态)

3.3 二级过滤条件

通过一级筛选后,应用以下条件:


4. 成交量异常检测

成交量异常是机构兴趣的最早足迹。聪明资金无法在不留下成交量数据痕迹的情况下积累有意义的仓位。

4.1 成交量异常类型

温和放量模式

脉冲放量模式

量价背离

4.2 能量潮(OBV)分析

如果OBV上升而价格持平:
    -> 聪明资金正在吸筹(看涨)
如果OBV持平而价格持平:
    -> 还没有人关注这只股票(中性——太早)
如果OBV下降而价格持平:
    -> 正在发生派发(看跌——回避)

4.3 量比指标

volume_ratio = sum(volume on up days, 20 days) / sum(volume on down days, 20 days)

if volume_ratio > 1.5: 强吸筹信号
if volume_ratio between 1.0 and 1.5: 温和吸筹
if volume_ratio < 1.0: 派发——回避

5. 机构资金足迹分析

5.1 股东集中度

A股公司每季度公布前10大股东数据。追踪:

5.2 龙虎榜

交易所公布达到涨跌停板或出现异常活动的股票的机构买卖数据:

5.3 大宗交易分析

大宗交易在场外进行,盘后公布:

5.4 融资余额趋势


6. 板块轮动与主题猎杀

6.1 板块轮动模型

A股市场遵循可识别的轮动模式:

  1. 周期早期: 金融、基建、房地产领涨
  2. 周期中期: 制造业、消费、科技领涨
  3. 周期末期: 资源、材料、防御性板块领涨
  4. 风险规避期: 公用事业、必需消费品、黄金

黑马最常出现在即将轮动成为热点的板块中。该股票因其板块不受青睐而被忽视,但聪明资金预见到了轮动。

6.2 政策驱动主题

A股市场受到政府政策的深刻影响:

黑马往往从新受政策青睐的板块中涌现。尽早识别政策主题,然后在该板块内筛选具有黑马特征的股票。

6.3 板块相对强度转换

监控正在从相对弱势向相对强势转换的板块:

sector_rs = sector_return_20d / market_return_20d

if sector_rs was < 0.8 (落后) last month
   and sector_rs is now > 0.95 (追赶中):
   -> 该板块正在转换;在其中寻找黑马

7. 基本面催化剂

虽然主要方法是技术面的,但基本面催化剂为更长的持有期提供信心。

7.1 盈利拐点

7.2 资产重估

7.3 竞争地位改善

7.4 资本事件


8. 图表形态识别

8.1 长期底部

8.2 杯柄形态

8.3 上升三角形

8.4 波动率收缩


9. 入场时机技巧

9.1 成交量触发入场

当从底部出现第一次显著的成交量放大时入场:

9.2 突破入场

当价格突破底部/整理区间的顶部时入场:

9.3 早期吸筹入场(最高风险,最高回报)

在突破前在底部区间内入场,基于吸筹证据:

9.4 入场优先级矩阵

证据级别 入场时机 仓位大小 止损宽度
成交量 + 机构 + 基本面 早期(在底部内) 15-20% 宽(低于底部)
成交量 + 技术突破 突破时 20-25% 适中(低于突破位)
仅技术突破 突破 + 回踩 10-15% 窄(低于阻力位)

10. 建仓策略

10.1 金字塔加仓模型

黑马仓位逐步建立,以管理早期识别阶段固有的不确定性:

10.2 底部区间内的均价策略

对于早期吸筹入场:

10.3 最大仓位限制


11. 风险管理框架

11.1 止损水平

入场类型 止损水平 最大损失
早期吸筹(底部内) 底部低点下方3% 10-12%
突破入场 阻力位下方3% 5-8%
回踩入场 回踩低点下方 3-5%

11.2 组合风险规则

11.3 基本面止损

如果基本面论点被推翻(盈利不及预期、管理层变更、监管行动),无论价格水平如何,立即退出。

11.4 基于时间的风险管理


12. 持仓期间管理

12.1 耐心阶段(第1-4周)

12.2 苏醒阶段(第4-8周)

12.3 奔跑阶段(第8-20周)

12.4 成熟阶段(第20周以后)


13. 退出策略

13.1 利润目标

13.2 派发信号(退出触发条件)

当你观察到以下情况时退出仓位:

13.3 追踪止损系统

function trail_stop(position, current_price, ma10, ma20):
    gain = (current_price - position.avg_cost) / position.avg_cost

    if gain >= 0.50:
        return max(position.stop, ma10)
    elif gain >= 0.30:
        return max(position.stop, ma20)
    elif gain >= 0.15:
        return max(position.stop, position.avg_cost * 1.05)
    elif gain >= 0.05:
        return max(position.stop, position.avg_cost)
    else:
        return position.stop

14. 黑马生命周期

理解黑马处于其生命周期的哪个阶段对于把握时机至关重要:

第一阶段:孕育期
├── 聪明资金开始悄悄吸筹
├── 成交量异常首次出现
├── 价格:持平,处于底部
├── 持续时间:2-6个月
└── 操作:识别并建立初始仓位

第二阶段:启动期
├── 从底部首次有意义的突破
├── 成交量放大确认机构买入
├── 价格:突破底部,上涨10-20%
├── 持续时间:2-4周
└── 操作:加仓,确认论点

第三阶段:成长期
├── 持续上升趋势伴随强劲成交量
├── 分析师开始覆盖
├── 价格:趋势上行,距底部20-50%
├── 持续时间:1-3个月
└── 操作:持有核心仓位,部分获利了结

第四阶段:成熟期
├── 所有人都知道这个故事
├── 天量放量和宽幅波动
├── 价格:距底部50-100%+
├── 持续时间:2-4周
└── 操作:系统性退出

第五阶段:衰退期
├── 聪明资金已经退出
├── 散户接盘
├── 价格:从高点下跌
└── 操作:完全离场,绝不回头

15. 伪代码:完整黑马猎杀系统

# ============================================================
# 黑马猎杀 — 完整系统
# ============================================================

def daily_dark_horse_scan(universe, date, market_index):
    """每日黑马候选股筛选。"""

    # 市场环境检查
    if market_index.close < market_index.ma60:
        return []  # 熊市——不进行猎杀

    candidates = []

    for stock in universe:
        hist = stock.get_history(date, lookback=250)
        if len(hist) < 120:
            continue

        # --- 一级筛选 ---
        if stock.market_cap < 1e9 or stock.market_cap > 20e9:
            continue
        if hist.avg_volume[-20:] < 500_000:
            continue

        # 横盘底部检查
        price_change_120d = (hist.close[-1] - hist.close[-120]) / hist.close[-120]
        if abs(price_change_120d) > 0.15:
            continue

        # 均线收敛
        ma20 = mean(hist.close[-20:])
        ma60 = mean(hist.close[-60:])
        ma120 = mean(hist.close[-120:])
        if abs(ma60 - ma120) / ma120 > 0.05:
            continue

        # 波动率压缩
        bb_width = bollinger_bandwidth(hist.close[-20:])
        bb_width_120 = min(bollinger_bandwidth(hist.close[i:i+20])
                          for i in range(-120, -20))
        if bb_width > bb_width_120 * 1.5:
            continue  # 压缩不够

        # --- 成交量异常检测 ---
        vol_score = 0

        # 检查温和吸筹
        vol_ratio = (sum(v for v, c in zip(hist.volume[-20:], hist.close_change[-20:]) if c > 0) /
                     max(sum(v for v, c in zip(hist.volume[-20:], hist.close_change[-20:]) if c < 0), 1))
        if vol_ratio > 1.5:
            vol_score += 2
        elif vol_ratio > 1.2:
            vol_score += 1

        # 检查成交量脉冲
        avg_vol = mean(hist.volume[-60:])
        spikes = sum(1 for v in hist.volume[-30:] if v > 3 * avg_vol)
        if spikes >= 2:
            vol_score += 2
        elif spikes >= 1:
            vol_score += 1

        # OBV趋势
        obv_slope = linear_regression_slope(compute_obv(hist)[-60:])
        if obv_slope > 0:
            vol_score += 1

        if vol_score < 2:
            continue  # 成交量证据不足

        # --- 机构足迹 ---
        inst_score = 0

        shareholders = stock.get_shareholder_data()
        if shareholders.count_declining_2_quarters:
            inst_score += 2

        if stock.has_block_trades(days=30):
            inst_score += 1

        if stock.margin_balance_increasing(days=30):
            inst_score += 1

        # --- 板块检查 ---
        sector_rs = stock.sector.return_20d / market_index.return_20d
        sector_transitioning = (stock.sector.return_60d < market_index.return_60d and
                               stock.sector.return_20d > market_index.return_20d * 0.9)

        sector_score = 0
        if sector_transitioning:
            sector_score += 2
        if sector_rs > 1.0:
            sector_score += 1

        # --- 总分 ---
        total_score = vol_score + inst_score + sector_score

        candidates.append({
            'stock': stock,
            'total_score': total_score,
            'vol_score': vol_score,
            'inst_score': inst_score,
            'sector_score': sector_score,
            'base_duration': compute_base_duration(hist),
            'current_phase': determine_lifecycle_phase(hist, stock)
        })

    candidates.sort(key=lambda x: x['total_score'], reverse=True)
    return candidates[:20]


def execute_dark_horse_entry(candidate, portfolio, daily_data):
    """黑马候选股的入场执行。"""
    stock = candidate['stock']
    phase = candidate['current_phase']
    score = candidate['total_score']

    # 组合检查
    dark_horse_positions = portfolio.count_positions(strategy='dark_horse')
    if dark_horse_positions >= 3:
        return None

    # 基于阶段和得分的仓位大小
    if phase == 'GESTATION' and score >= 6:
        full_size = 0.15  # 更小、更早、更宽的止损
        initial_pct = 0.30
        stop_type = 'BASE_LOW'
    elif phase == 'BIRTH' and score >= 5:
        full_size = 0.20
        initial_pct = 0.40
        stop_type = 'BREAKOUT'
    else:
        full_size = 0.10
        initial_pct = 0.50
        stop_type = 'TIGHT'

    entry_size = full_size * initial_pct
    entry_price = daily_data.close[-1]

    # 止损计算
    if stop_type == 'BASE_LOW':
        stop = candidate['base_low'] * 0.97
    elif stop_type == 'BREAKOUT':
        stop = candidate['resistance'] * 0.97
    else:
        stop = entry_price * 0.95

    # 风险检查
    risk_pct = (entry_price - stop) / entry_price
    portfolio_risk = entry_size * risk_pct
    if portfolio_risk > 0.03:  # 每个仓位最大3%组合风险
        entry_size = 0.03 / risk_pct

    shares = int((portfolio.capital * entry_size) / entry_price)

    return DarkHorsePosition(
        stock=stock,
        entry_price=entry_price,
        shares=shares,
        stop=stop,
        planned_full_size=full_size,
        current_size=entry_size,
        add_levels=[entry_price * 1.05, 'PULLBACK_HOLD'],
        phase=phase,
        entry_date=daily_data.dates[-1]
    )

16. 核心语录与原则

"黑马藏在市场的暗影中,被所有人忽视。你的优势是耐心——在别人不愿意去寻找的地方搜寻的耐心。"

"成交量在价格呐喊之前先低语。学会听到低语,你就能在呐喊之前就已就位。"

"股东人数下降是强手正在从弱手手中收集筹码的最清晰信号。这是猎人变成猎物的足迹。"

"不要把一家垂死的公司误认为黑马。黑马是蛰伏的,不是死的。始终验证图表下面的业务是活的且在改善。"

"最好的黑马出现在正从弱势转向强势的板块中。昨天的落后者是明天的领涨者。"

"耐心是黑马猎人最大的武器,也是最大的挑战。你可能持有数周却什么都没有发生。那份沉默就是布局的代价。"

"当黑马终于奔跑,所有人都在谈论它时,你的工作就完成了。把你的股票卖给那些刚刚发现你几个月前就找到的东西的后来者。"

"一只冷门股在三十天内出现三次成交量异常不是巧合。这是来自市场的信息:有人知道一些你还不知道的事情。"

"永远不要爱上一匹拒绝奔跑的黑马。如果九十天过去了仍然没有动静,解放你的资金去进行下一次猎杀。"


本规范综合了王宁《猎杀黑马》的核心方法论,结构化为一份可操作的实施指南,用于在A股市场中主动筛选和提前布局尚未被发现的赢家。