龙头战法作为短线交易中的经典策略,其核心在于识别市场中最具带动效应的个股。传统的人工盯盘方式存在主观性强、效率低下等问题,而量化方法则通过将市场情绪和板块效应转化为可计算的指标,实现了策略的标准化和自动化。
这个量化模型的设计思路源自对游资操盘逻辑的拆解。在实际操作中,游资往往会关注以下几个关键特征:
提示:量化模型的价值不在于完全复制人工判断,而是通过标准化规则过滤掉大部分噪音,提高决策效率。
涨停强度是判断个股资金认可度的重要指标。我们采用复合计算方式:
python复制strength_score = (封单金额 / 成交额) * (1 / 封板时间)
其中:
这个公式的设计逻辑是:
注意:对于早盘快速涨停(如30分钟内)且封单金额超过日均成交额20%的个股,通常意味着较强的资金共识。
真正的龙头必须能够带动板块整体表现。我们通过以下公式量化:
python复制resonance_score = 板块内涨停家数 / 板块总家数
实际操作中需要注意:
龙头股的次日表现是验证其地位的关键:
python复制premium_score = 今日开盘涨幅 / 昨日涨停状态
其中:
衡量个股相对于大盘的独立走势:
python复制resilience_score = (个股涨幅 - 大盘涨幅) 的20日标准差
这个指标可以帮助识别:
完整的实现需要以下基础数据:
| 数据类型 | 字段说明 | 数据来源 |
|---|---|---|
| 行情数据 | 开盘价、最高价、最低价、收盘价、成交量、成交额 | 券商API、Tushare |
| 板块数据 | 个股所属行业、概念板块 | 同花顺、东方财富 |
| 涨停数据 | 涨停时间、封单金额、连板天数 | 自定义爬虫 |
数据清洗的关键步骤:
基于Pandas的完整实现示例:
python复制import pandas as pd
import numpy as np
def calculate_strength(row):
"""计算涨停强度得分"""
if row['is_limit_up']:
order_ratio = row['order_amount'] / row['amount']
time_factor = 1 / (row['limit_up_time'] + 1) # 避免除零
return order_ratio * time_factor
return 0
def find_dragon_stocks(daily_data):
"""
核心筛选函数
:param daily_data: 当日全市场数据
:return: 龙头股候选列表
"""
# 基础筛选:涨停、非ST、市值<500亿
base_mask = (
(daily_data['pct_chg'] >= 9.8) &
(~daily_data['name'].str.contains('ST')) &
(daily_data['total_mv'] < 5e5) # 单位:万元
)
candidates = daily_data[base_mask].copy()
# 计算各因子得分
candidates['strength'] = candidates.apply(calculate_strength, axis=1)
candidates['resonance'] = candidates.groupby('industry')['code'].transform('count') / \
daily_data.groupby('industry')['code'].count().max()
# 标记板块内首个涨停
first_limit = candidates.groupby('industry')['time'].transform('min')
candidates['is_first'] = (candidates['time'] == first_limit).astype(int)
# 综合筛选
final_mask = (
(candidates['is_first'] == 1) &
(candidates['strength'] > candidates['strength'].quantile(0.7)) &
(candidates['resonance'] > 0.3) &
(candidates['turnover'].between(0.1, 0.25))
)
return candidates[final_mask].sort_values('strength', ascending=False)
python复制# 根据市场环境调整因子权重
def dynamic_weight(volatility):
"""根据市场波动率调整因子权重"""
if volatility > 0.015: # 高波动市场
return {'strength':0.4, 'resonance':0.3, 'premium':0.2, 'resilience':0.1}
else: # 低波动市场
return {'strength':0.3, 'resonance':0.4, 'premium':0.2, 'resilience':0.1}
python复制# 连板天数衰减因子
def board_count_decay(board_count):
"""连板天数越多,筛选条件越严格"""
return np.where(
board_count == 2, 1.0,
np.where(board_count == 3, 0.9,
np.where(board_count == 4, 0.7, 0.5))
)
基于量化信号的买入决策流程:
盘前筛选:
盘中确认:
仓位管理:
python复制# 动态仓位计算
def position_size(score, volatility):
"""根据评分和市场波动计算仓位"""
base = 0.2 # 基础仓位
adj = min(score * 0.1, 0.3) # 评分调整
risk_adj = 1 - (volatility / 0.02) # 波动率调整
return base + adj * risk_adj
必须明确的退出机制:
| 信号类型 | 触发条件 | 操作建议 |
|---|---|---|
| 止盈信号 | 当日涨幅>7%且出现长上影线 | 减仓50% |
| 止损信号 | 跌破昨日收盘价且成交量放大 | 立即清仓 |
| 强制退出 | 封单金额快速减少50%以上 | 排队卖出 |
建立多维度风控体系:
python复制def risk_control(stock, market):
"""综合风险评估"""
risk_score = 0
# 流动性风险
if stock['amount'] < 1e5: # 成交额不足1亿
risk_score += 0.3
# 板块风险
if market['sector_down'] > 0.03: # 板块跌幅>3%
risk_score += 0.2
# 连板风险
if stock['board_count'] > 5: # 五板以上
risk_score += 0.4
return risk_score > 0.6 # 是否触发风控
建议使用以下工具组合:
数据获取:
回测引擎:
绩效分析:
通过网格搜索确定最优参数组合:
python复制from sklearn.model_selection import ParameterGrid
param_grid = {
'strength_thresh': [0.6, 0.7, 0.8],
'resonance_thresh': [0.2, 0.3, 0.4],
'board_count': [(2,3), (2,4), (2,5)]
}
best_params = None
best_sharpe = -np.inf
for params in ParameterGrid(param_grid):
results = backtest_strategy(params)
if results['sharpe'] > best_sharpe:
best_sharpe = results['sharpe']
best_params = params
样本外测试:
参数稳定性检验:
蒙特卡洛检验:
完整的量化交易系统应包含:
code复制数据层 → 策略层 → 风控层 → 执行层 → 监控层
关键组件实现:
python复制class DragonTradingSystem:
def __init__(self):
self.datafeed = DataFeed()
self.strategy = DragonStrategy()
self.risk = RiskManager()
self.executor = TradeExecutor()
def run(self):
while market_open:
data = self.datafeed.get_realtime()
signals = self.strategy.generate(data)
approved = self.risk.check(signals)
self.executor.execute(approved)
time.sleep(60) # 每分钟轮询
实盘中可能遇到的问题及解决方案:
信号闪烁问题:
成交滑点问题:
数据延迟问题:
定期进行策略诊断:
python复制def performance_attribution(trades):
"""分析收益来源"""
sector_effect = trades.groupby('sector')['pnl'].sum()
market_effect = (trades['mkt_pct'] * trades['position']).sum()
alpha = trades['pnl'].sum() - market_effect
return {
'total': trades['pnl'].sum(),
'by_sector': sector_effect,
'market': market_effect,
'alpha': alpha
}
在实际应用中,这个龙头战法量化模型需要持续跟踪市场变化并动态调整。我个人的经验是,每季度至少需要重新评估一次因子有效性,特别是在市场风格发生明显切换时。同时,建议准备2-3套参数配置,以应对不同的市场环境。