作者: 王宁 原始语言: 简体中文 市场聚焦: A股(上海和深圳证券交易所) 交易风格: 在股票出现重大行情前,主动识别并提前布局尚未被发现的标的
在中国股市的词汇体系中,"黑马"是指没有人看好、却最终带来超额回报的股票。王宁的方法论是在大众发现之前,通过技术异常、成交量分析和机构行为检测相结合的方式,系统性地识别这些股票。
这一理念建立在信息不对称模型之上:
一个黑马候选股通常展现以下特征:
| 特征 | 范围 |
|---|---|
| 市值 | 中小盘(10-200亿人民币) |
| 日均成交量 | 低于板块平均水平(冷门股) |
| 价格位置 | 距历史最高价下跌30-60% |
| 分析师覆盖 | 低(0-3位分析师跟踪) |
| 近期媒体提及 | 极少 |
| 过去6个月涨跌幅 | 在-10%到+15%之间(横盘/无人关注) |
王宁采用阶段分析框架来识别从第一阶段(筑底)向第二阶段(上升)转换中的黑马:
# 黑马一级筛选
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 # 低波动率(压缩状态)
通过一级筛选后,应用以下条件:
成交量异常是机构兴趣的最早足迹。聪明资金无法在不留下成交量数据痕迹的情况下积累有意义的仓位。
如果OBV上升而价格持平:
-> 聪明资金正在吸筹(看涨)
如果OBV持平而价格持平:
-> 还没有人关注这只股票(中性——太早)
如果OBV下降而价格持平:
-> 正在发生派发(看跌——回避)
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: 派发——回避
A股公司每季度公布前10大股东数据。追踪:
交易所公布达到涨跌停板或出现异常活动的股票的机构买卖数据:
大宗交易在场外进行,盘后公布:
A股市场遵循可识别的轮动模式:
黑马最常出现在即将轮动成为热点的板块中。该股票因其板块不受青睐而被忽视,但聪明资金预见到了轮动。
A股市场受到政府政策的深刻影响:
黑马往往从新受政策青睐的板块中涌现。尽早识别政策主题,然后在该板块内筛选具有黑马特征的股票。
监控正在从相对弱势向相对强势转换的板块:
sector_rs = sector_return_20d / market_return_20d
if sector_rs was < 0.8 (落后) last month
and sector_rs is now > 0.95 (追赶中):
-> 该板块正在转换;在其中寻找黑马
虽然主要方法是技术面的,但基本面催化剂为更长的持有期提供信心。
当从底部出现第一次显著的成交量放大时入场:
当价格突破底部/整理区间的顶部时入场:
在突破前在底部区间内入场,基于吸筹证据:
| 证据级别 | 入场时机 | 仓位大小 | 止损宽度 |
|---|---|---|---|
| 成交量 + 机构 + 基本面 | 早期(在底部内) | 15-20% | 宽(低于底部) |
| 成交量 + 技术突破 | 突破时 | 20-25% | 适中(低于突破位) |
| 仅技术突破 | 突破 + 回踩 | 10-15% | 窄(低于阻力位) |
黑马仓位逐步建立,以管理早期识别阶段固有的不确定性:
对于早期吸筹入场:
| 入场类型 | 止损水平 | 最大损失 |
|---|---|---|
| 早期吸筹(底部内) | 底部低点下方3% | 10-12% |
| 突破入场 | 阻力位下方3% | 5-8% |
| 回踩入场 | 回踩低点下方 | 3-5% |
如果基本面论点被推翻(盈利不及预期、管理层变更、监管行动),无论价格水平如何,立即退出。
当你观察到以下情况时退出仓位:
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
理解黑马处于其生命周期的哪个阶段对于把握时机至关重要:
第一阶段:孕育期
├── 聪明资金开始悄悄吸筹
├── 成交量异常首次出现
├── 价格:持平,处于底部
├── 持续时间:2-6个月
└── 操作:识别并建立初始仓位
第二阶段:启动期
├── 从底部首次有意义的突破
├── 成交量放大确认机构买入
├── 价格:突破底部,上涨10-20%
├── 持续时间:2-4周
└── 操作:加仓,确认论点
第三阶段:成长期
├── 持续上升趋势伴随强劲成交量
├── 分析师开始覆盖
├── 价格:趋势上行,距底部20-50%
├── 持续时间:1-3个月
└── 操作:持有核心仓位,部分获利了结
第四阶段:成熟期
├── 所有人都知道这个故事
├── 天量放量和宽幅波动
├── 价格:距底部50-100%+
├── 持续时间:2-4周
└── 操作:系统性退出
第五阶段:衰退期
├── 聪明资金已经退出
├── 散户接盘
├── 价格:从高点下跌
└── 操作:完全离场,绝不回头
# ============================================================
# 黑马猎杀 — 完整系统
# ============================================================
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]
)
"黑马藏在市场的暗影中,被所有人忽视。你的优势是耐心——在别人不愿意去寻找的地方搜寻的耐心。"
"成交量在价格呐喊之前先低语。学会听到低语,你就能在呐喊之前就已就位。"
"股东人数下降是强手正在从弱手手中收集筹码的最清晰信号。这是猎人变成猎物的足迹。"
"不要把一家垂死的公司误认为黑马。黑马是蛰伏的,不是死的。始终验证图表下面的业务是活的且在改善。"
"最好的黑马出现在正从弱势转向强势的板块中。昨天的落后者是明天的领涨者。"
"耐心是黑马猎人最大的武器,也是最大的挑战。你可能持有数周却什么都没有发生。那份沉默就是布局的代价。"
"当黑马终于奔跑,所有人都在谈论它时,你的工作就完成了。把你的股票卖给那些刚刚发现你几个月前就找到的东西的后来者。"
"一只冷门股在三十天内出现三次成交量异常不是巧合。这是来自市场的信息:有人知道一些你还不知道的事情。"
"永远不要爱上一匹拒绝奔跑的黑马。如果九十天过去了仍然没有动静,解放你的资金去进行下一次猎杀。"
本规范综合了王宁《猎杀黑马》的核心方法论,结构化为一份可操作的实施指南,用于在A股市场中主动筛选和提前布局尚未被发现的赢家。