完整的投资组合策略类型详细文档
# 投资组合策略类型详细文档
## 1. high_accuracy_v2 策略
**实现文件**:`/Users/apple/quant/src/core/high_accuracy_stock_recommender.py`
**核心算法**:
- **多维度加权评分机制**:技术面、资金面、板块面、动量四维综合评分
- **专家知识对齐算法**:基于RAG检索专家成功案例,动态调整评分
- **置信度计算模型**:基于评分标准差的一致性评估
- **三种风险模式**:保守、标准、激进,可根据风险偏好动态调整参数
**选股逻辑**:
1. **基础筛选**:
- 涨幅控制:-2.0% 至 5.0%(避免追高)
- 成交额要求:≥1亿元(保证流动性)
- 价格区间:10-25元(聚焦中低价位股票)
- 排除ST股和指数(000001.SH、399001.SZ等)
2. **板块筛选**:
- 必须属于强势板块(综合评分≥0.6)
- 从sector_analysis_history获取板块评分数据
- 板块评分公式:板块涨幅×0.3 + 资金流入×0.3 + 活跃度×0.2 + 趋势强度×0.2
3. **资金筛选**:
- 必须有资金流入(≥1000万)
- 从review_results获取资金流向数据
- 资金流入验证:大单净流入≥500万且散户资金占比<40%
4. **技术筛选**:
- 均线多头排列(MA5>MA10>MA20)
- MACD金叉或即将金叉
- 成交量放大(5日均量>20日均量)
5. **综合评分**:
- 计算公式:技术面×0.35 + 资金面×0.25 + 板块面×0.25 + 动量×0.15
- 置信度计算:`confidence = 1.0 - (score_std / 50.0)`,其中score_std为四维评分标准差
- 专家知识对齐:检索同类市场环境下专家成功案例,匹配成功则评分×1.1
**详细参数配置**:
| 参数 | 保守型 | 标准型 | 激进型 | 说明 |
|------|--------|--------|--------|------|
| pct_chg_min | -2.0% | -2.0% | -2.0% | 最小涨幅 |
| pct_chg_max | 3.0% | 5.0% | 7.0% | 最大涨幅(避免追高) |
| pct_chg_optimal | (0, 2) | (0, 3) | (0, 4) | 最优涨幅区间 |
| amount_min | 1.5亿 | 1.0亿 | 0.8亿 | 最小成交额(流动性) |
| amount_optimal | 15亿 | 10亿 | 8亿 | 最优成交额 |
| price_min | 12.0元 | 10.0元 | 8.0元 | 最低价格 |
| price_max | 22.0元 | 25.0元 | 30.0元 | 最高价格 |
| price_optimal | (12, 20) | (10, 21) | (8, 25) | 最优价格区间 |
| sector_min_score | 0.7 | 0.6 | 0.5 | 板块最低评分 |
| inflow_min | 2000万 | 1000万 | 500万 | 最小资金流入 |
| technical_weight | 40% | 35% | 30% | 技术面权重 |
| fund_flow_weight | 30% | 25% | 20% | 资金面权重 |
| sector_weight | 20% | 25% | 30% | 板块面权重 |
| momentum_weight | 10% | 15% | 20% | 动量权重 |
| require_breakthrough | True | True | False | 是否要求突破形态 |
| require_ma_alignment | True | True | False | 是否要求均线多头 |
**专家知识对齐算法**:
1. **市场环境检测**:使用MarketRegimeAnalyzer检测当前市场状态
2. **专家案例检索**:从专家知识库中检索同类市场环境下的成功案例
3. **案例匹配**:计算当前推荐股票与专家案例的相似度
4. **评分调整**:如果匹配成功,将推荐股票评分提升10%
5. **置信度优化**:同步提升置信度至不超过1.0
**适用场景**:
- 适合震荡市或趋势初期
- 风险偏好适中的投资者
- 希望获得稳定收益的用户
## 2. v3_fusion 策略
**实现文件**:`/Users/apple/quant/src/core/v3_realtime_signal_engine.py`
**核心算法**:
- **五信号融合引擎**:TFT+GNN+V3+XGBoost+DQN多模型融合
- **风险调整置信度机制**:基于VaR改良版的市场风险评估
- **实时信号生成**:1分钟更新频率,支持高频策略
- **机构博弈检测**:识别主力资金操纵行为
**选股逻辑**:
1. **股票池选择**:
- 从realtime_daily_data获取约350只活跃股票
- 价格过滤:5-500元
- 成交额过滤:≥5000万元
- 排除ST股和停牌股
2. **多模型预测**:
- **TFT预测**:Transformer-based时间序列模型,预测未来3天价格走势
- **GNN预测**:图神经网络,基于股票关系网络分析
- **XGBoost预测**:增强梯度提升树,基于40+技术和基本面特征
- **DQN预测**:深度Q网络,长期策略优化
- **V3引擎**:核心AI决策引擎,综合宏观、行业、个股数据
3. **信号融合**:
- 加权融合公式:`final_score = TFT×0.3 + GNN×0.25 + V3×0.2 + XGBoost×0.15 + DQN×0.1`
- 一致性校验:要求至少3个模型预测方向一致
- 置信度归一化:将各模型置信度映射到0-1区间
4. **风险评估与调整**:
- 市场风险评估:使用MarketRegimeAnalyzer检测市场状态
- 风险调整置信度:`adjusted_confidence = confidence × (1 - market_risk_score×0.5)`
- 资金流向分析:大单净流入≥1000万且机构资金占比≥60%
- 机构博弈检测:识别拉高出货、尾盘突袭等操纵行为
5. **最终筛选**:
- 置信度阈值≥0.6
- 风险等级≤中
- 技术形态确认:均线多头或即将突破
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 股票池大小 | 350 | 初始股票池数量 |
| 价格_min | 5.0元 | 最低价格限制 |
| 价格_max | 500.0元 | 最高价格限制 |
| 成交额_min | 5000万 | 最小成交额 |
| 模型权重_TFT | 0.3 | TFT模型权重 |
| 模型权重_GNN | 0.25 | GNN模型权重 |
| 模型权重_V3 | 0.2 | V3引擎权重 |
| 模型权重_XGBoost | 0.15 | XGBoost模型权重 |
| 模型权重_DQN | 0.1 | DQN模型权重 |
| 置信度阈值 | 0.6 | 生成信号的最低置信度 |
| 模型一致性要求 | ≥3 | 要求一致预测的模型数量 |
| 风险等级_max | 中 | 允许的最大风险等级 |
| 资金流入_min | 1000万 | 最小资金流入 |
| 机构资金占比_min | 60% | 机构资金最低占比 |
| 信号更新频率 | 1分钟 | 实时信号更新频率 |
| 最大持仓数 | 20 | 单个组合最大股票数量 |
**五信号融合算法**:
```python
def fuse_signals(signals):
# 信号权重配置
weights = {
'tft': 0.3,
'gnn': 0.25,
'v3': 0.2,
'xgboost': 0.15,
'dqn': 0.1
}
# 计算加权平均分数
final_score = 0
buy_count = 0
for model, signal in signals.items():
if signal['action'] == 'buy':
buy_count += 1
final_score += signal['confidence'] * weights[model]
# 一致性校验
if buy_count < 3:
return None
return {
'final_score': final_score,
'confidence': final_score,
'action': 'buy'
}
```
**风险调整机制**:
1. **市场风险评估**:使用VaR改良版计算市场风险分数(0-1)
2. **个股风险评估**:结合波动率、流动性、估值等指标
3. **风险调整公式**:`adjusted_confidence = confidence × (1 - market_risk×0.3 - stock_risk×0.2)`
4. **止损设置**:动态止损 = 买入价 × (1 - 风险等级系数×0.05)
**适用场景**:
- 适合趋势明确的市场
- 风险偏好较高的投资者
- 希望获取超额收益的用户
- 适合高频交易策略
## 3. concept_theme 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **概念热度评估模型**:基于搜索量、媒体曝光度、资金流入等多维度
- **追涨风险评估系统**:ChaseRiskEvaluator,评估买入时机风险
- **龙头股识别算法**:基于涨幅、成交量、资金流入、市值等指标
**选股逻辑**:
1. **概念筛选**:
- 从concept_sectors_config.py获取热门概念列表
- 概念热度评分:搜索指数×0.3 + 媒体提及×0.2 + 资金流入×0.3 + 涨幅×0.2
- 选择热度评分≥0.7的概念板块
2. **基础筛选**:
- 涨幅:0-6%(温和上涨,避免追高)
- 成交额:>6000万元(保证流动性)
- 换手率:1-15%(避免过度炒作)
- 排除ST股和指数
3. **龙头股识别**:
- 龙头股评分公式:涨幅×0.3 + 成交额×0.2 + 大单净流入×0.25 + 市值×0.15 + 板块权重×0.1
- 要求龙头股评分≥0.8
- 区分:龙头股(评分前20%)、潜力股(评分20-50%)、跟风股(评分50%以下)
4. **追涨风险评估**:
- 追涨风险评分:当前涨幅/历史最大涨幅×0.4 + 估值偏离度×0.3 + 短期换手率×0.3
- 风险等级:低(0-0.3)、中(0.3-0.7)、高(>0.7)
- 仅保留风险等级≤中的股票
5. **最终筛选**:
- 按龙头股评分×(1-风险评分)排序
- 每个概念板块最多保留2只股票
- 总推荐数量≤8只
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 概念热度阈值 | 0.7 | 概念板块热度最低要求 |
| 涨幅_min | 0% | 最小涨幅 |
| 涨幅_max | 6% | 最大涨幅(避免追高) |
| 成交额_min | 6000万 | 最小成交额 |
| 换手率_min | 1% | 最小换手率 |
| 换手率_max | 15% | 最大换手率(避免过度炒作) |
| 龙头股评分阈值 | 0.8 | 龙头股最低评分 |
| 追涨风险阈值 | 0.7 | 最大追涨风险 |
| 单概念股票数_max | 2 | 单个概念最多推荐股票数 |
| 最大推荐数量 | 8 | 单个组合最大股票数量 |
| 概念更新频率 | 每天 | 概念热度更新频率 |
**概念热度计算**:
```python
def calculate_concept_heat(concept_data):
"""
计算概念热度评分
Args:
concept_data: 包含搜索指数、媒体提及、资金流入、涨幅等数据的字典
Returns:
热度评分 (0-1)
"""
search_score = concept_data.get('search_index', 0) / 10000 # 归一化到0-1
media_score = concept_data.get('media_mentions', 0) / 100 # 归一化到0-1
fund_score = concept_data.get('fund_inflow', 0) / 100000000 # 归一化到0-1
pct_score = concept_data.get('pct_chg', 0) / 20 # 归一化到0-1
# 加权求和
heat_score = (search_score * 0.3 +
media_score * 0.2 +
fund_score * 0.3 +
pct_score * 0.2)
# 限制在0-1区间
return max(0, min(1, heat_score))
```
**龙头股识别算法**:
```python
def identify_leader_stocks(concept_stocks):
"""
识别概念板块龙头股
Args:
concept_stocks: 概念板块内股票列表
Returns:
带龙头股标记和评分的股票列表
"""
for stock in concept_stocks:
# 计算龙头股评分
pct_score = min(1, stock['pct_chg'] / 10) # 涨幅评分
vol_score = min(1, stock['amount'] / 100000000) # 成交额评分
fund_score = min(1, stock['fund_inflow'] / 10000000) # 资金流入评分
market_cap_score = min(1, stock['market_cap'] / 10000000000) # 市值评分
weight_score = stock['sector_weight'] # 板块权重评分
# 综合评分
leader_score = (pct_score * 0.3 +
vol_score * 0.2 +
fund_score * 0.25 +
market_cap_score * 0.15 +
weight_score * 0.1)
# 标记龙头股类型
if leader_score >= 0.8:
stock['leader_type'] = '龙头股'
elif leader_score >= 0.5:
stock['leader_type'] = '潜力股'
else:
stock['leader_type'] = '跟风股'
stock['leader_score'] = leader_score
return concept_stocks
```
**追涨风险评估**:
```python
def evaluate_chase_risk(stock_data):
"""
评估追涨风险
Args:
stock_data: 股票数据字典
Returns:
风险评分 (0-1) 和风险等级
"""
# 当前涨幅与历史最大涨幅的比例
pct_ratio = stock_data['current_pct'] / stock_data.get('max_historical_pct', 10)
# 估值偏离度(当前PE/历史平均PE)
pe_ratio = stock_data['current_pe'] / stock_data.get('avg_historical_pe', 20)
# 短期换手率(5日平均)
short_turnover = stock_data['5d_avg_turnover'] / 20
# 计算风险评分
risk_score = (pct_ratio * 0.4 +
min(2, pe_ratio - 1) * 0.3 +
short_turnover * 0.3)
# 限制在0-1区间
risk_score = max(0, min(1, risk_score))
# 确定风险等级
if risk_score <= 0.3:
risk_level = '低'
elif risk_score <= 0.7:
risk_level = '中'
else:
risk_level = '高'
return risk_score, risk_level
```
**适用场景**:
- 适合概念题材活跃的市场
- 风险偏好适中的投资者
- 希望把握短期热点的用户
- 适合事件驱动型投资策略
## 4. sector_rotation 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **板块动量跟踪模型**:基于相对强弱指标(RSI)、移动平均收敛发散(MACD)、累积收益
- **板块轮动预测**:使用马尔可夫链模型预测板块切换概率
- **龙头股选择算法**:基于板块内影响力和资金流向
**选股逻辑**:
1. **板块动量分析**:
- 计算板块动量得分:`动量得分 = (5日收益×0.4 + 20日收益×0.3 + 60日收益×0.2 + 120日收益×0.1)`
- 计算板块相对强弱:`板块RSI = 100 - (100 / (1 + 板块涨幅/大盘涨幅))`
- 选择动量得分≥0.6且RSI≥50的板块
2. **板块筛选与排序**:
- 选择动量最强的前3-5个板块
- 考虑板块估值:PE≤板块平均PE×1.2
- 考虑资金流向:板块资金净流入≥5000万
- 板块轮动概率:使用马尔可夫链模型预测下一期强势板块
3. **板块内选股**:
- 选股公式:涨幅×0.3 + 成交量×0.2 + 资金流入×0.25 + 市值×0.15 + 板块权重×0.1
- 每个板块选择前2-3只股票
- 要求股票在板块中的权重≥2%
4. **组合构建**:
- 每个板块分配20-30%的仓位
- 单个股票不超过总仓位的10%
- 定期调仓(默认每周一次)
- 调仓触发条件:板块动量得分变化≥0.2或个股偏离目标仓位≥5%
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 板块数量 | 3-5 | 选择的强势板块数量 |
| 动量得分阈值 | 0.6 | 板块动量最低得分 |
| RSI阈值 | 50 | 板块相对强弱最低要求 |
| 资金流入_min | 5000万 | 板块最低资金流入 |
| 板块PE_ratio | 1.2 | 板块PE相对于平均PE的最大倍数 |
| 单板块股票数 | 2-3 | 每个板块选择的股票数量 |
| 单板块最大权重 | 30% | 单个板块最大仓位 |
| 单股最大权重 | 10% | 单个股票最大仓位 |
| 调仓周期 | 7天 | 定期调仓频率 |
| 调仓阈值 | 0.2 | 板块动量变化触发调仓阈值 |
| 仓位偏离阈值 | 5% | 个股仓位偏离触发调仓阈值 |
**板块动量计算**:
```python
def calculate_sector_momentum(sector_data):
"""
计算板块动量得分
Args:
sector_data: 包含不同周期收益的板块数据
Returns:
动量得分 (0-1)
"""
# 计算不同周期的收益
returns = {
'5d': sector_data.get('5d_return', 0),
'20d': sector_data.get('20d_return', 0),
'60d': sector_data.get('60d_return', 0),
'120d': sector_data.get('120d_return', 0)
}
# 加权计算动量得分
momentum_score = (returns['5d'] * 0.4 +
returns['20d'] * 0.3 +
returns['60d'] * 0.2 +
returns['120d'] * 0.1)
# 归一化到0-1区间
normalized_score = min(1, max(0, (momentum_score + 0.5) / 1.5))
return normalized_score
```
**马尔可夫链板块轮动预测**:
```python
def predict_sector_rotation(current_sector, transition_matrix):
"""
使用马尔可夫链预测下一期强势板块
Args:
current_sector: 当前强势板块
transition_matrix: 板块轮动转移矩阵
Returns:
下一期强势板块预测概率
"""
# 获取当前板块的转移概率向量
if current_sector in transition_matrix:
next_sector_probs = transition_matrix[current_sector]
# 选择概率最高的前3个板块
predicted_sectors = sorted(next_sector_probs.items(),
key=lambda x: x[1],
reverse=True)[:3]
return predicted_sectors
return []
```
**适用场景**:
- 适合板块轮动明显的市场
- 风险偏好适中的投资者
- 希望把握板块热点切换的用户
- 适合中期投资策略
## 5. combined 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **多策略融合框架**:技术分析 + 概念题材 + 资金流向
- **追涨风险控制系统**:ChaseRiskEvaluator,动态调整买入时机
- **龙头股识别算法**:基于多维度综合评分
**选股逻辑**:
1. **多策略基础筛选**:
- 调用RealtimeStockAnalyzer分析器获取技术面推荐
- 从concept_sectors_config获取概念题材推荐
- 从moneyflow_analyzer获取资金流向推荐
- 合并推荐结果,去除重复股票
2. **统一评分机制**:
- 评分公式:技术面×0.4 + 概念题材×0.3 + 资金流向×0.3
- 技术面评分:均线排列×0.3 + 形态突破×0.2 + MACD信号×0.2 + RSI指标×0.3
- 概念题材评分:概念热度×0.5 + 板块强度×0.3 + 个股相关性×0.2
- 资金流向评分:大单净流入×0.4 + 机构资金占比×0.3 + 资金持续性×0.3
3. **追涨风险评估**:
- 使用ChaseRiskEvaluator进行风险评估
- 风险评分:当前涨幅/历史最大涨幅×0.4 + 估值偏离度×0.3 + 短期换手率×0.3
- 仅保留风险等级≤中的股票
4. **龙头股识别**:
- 龙头股评分:涨幅×0.3 + 成交额×0.2 + 资金流入×0.25 + 市值×0.15 + 板块权重×0.1
- 标记龙头股类型:龙头股(评分≥0.8)、潜力股(0.5-0.8)、跟风股(<0.5)
5. **最终筛选**:
- 按综合评分×(1-风险评分)排序
- 保留前8只股票
- 确保行业分散度(单个行业股票数≤3)
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 技术面权重 | 0.4 | 技术面在综合评分中的权重 |
| 概念题材权重 | 0.3 | 概念题材在综合评分中的权重 |
| 资金流向权重 | 0.3 | 资金流向在综合评分中的权重 |
| 最大推荐数量 | 8 | 单个组合最大股票数量 |
| 置信度阈值 | 0.6 | 生成信号的最低置信度 |
| 追涨风险阈值 | 0.7 | 最大追涨风险 |
| 单行业股票数_max | 3 | 单个行业最大股票数量 |
| 龙头股评分阈值 | 0.8 | 龙头股最低评分 |
**多策略融合算法**:
```python
def combine_strategies(technical_recommendations, concept_recommendations, fundflow_recommendations):
"""
融合多个策略的推荐结果
Args:
technical_recommendations: 技术面推荐
concept_recommendations: 概念题材推荐
fundflow_recommendations: 资金流向推荐
Returns:
融合后的推荐列表
"""
# 创建股票字典,合并各策略评分
stock_dict = {}
# 技术面评分
for stock in technical_recommendations:
stock_dict[stock['ts_code']] = {
'technical_score': stock['confidence'],
'concept_score': 0,
'fundflow_score': 0,
'name': stock['name']
}
# 概念题材评分
for stock in concept_recommendations:
if stock['ts_code'] in stock_dict:
stock_dict[stock['ts_code']]['concept_score'] = stock['confidence']
else:
stock_dict[stock['ts_code']] = {
'technical_score': 0,
'concept_score': stock['confidence'],
'fundflow_score': 0,
'name': stock['name']
}
# 资金流向评分
for stock in fundflow_recommendations:
if stock['ts_code'] in stock_dict:
stock_dict[stock['ts_code']]['fundflow_score'] = stock['confidence']
else:
stock_dict[stock['ts_code']] = {
'technical_score': 0,
'concept_score': 0,
'fundflow_score': stock['confidence'],
'name': stock['name']
}
# 计算综合评分
combined_recommendations = []
for ts_code, scores in stock_dict.items():
# 加权融合
total_score = (scores['technical_score'] * 0.4 +
scores['concept_score'] * 0.3 +
scores['fundflow_score'] * 0.3)
combined_recommendations.append({
'ts_code': ts_code,
'name': scores['name'],
'confidence': total_score,
'technical_score': scores['technical_score'],
'concept_score': scores['concept_score'],
'fundflow_score': scores['fundflow_score']
})
# 按综合评分排序
combined_recommendations.sort(key=lambda x: x['confidence'], reverse=True)
return combined_recommendations
```
**追涨风险控制逻辑**:
```python
def apply_chase_risk_control(recommendations):
"""
应用追涨风险控制
Args:
recommendations: 推荐股票列表
Returns:
带风险控制的推荐列表
"""
from .chase_risk_evaluator import ChaseRiskEvaluator
evaluator = ChaseRiskEvaluator()
controlled_recommendations = []
for rec in recommendations:
# 评估追涨风险
risk_score, risk_level = evaluator.evaluate(rec)
# 调整置信度
adjusted_confidence = rec['confidence'] * (1 - risk_score * 0.5)
# 仅保留风险等级≤中的股票
if risk_level <= '中':
controlled_recommendations.append({
**rec,
'adjusted_confidence': adjusted_confidence,
'risk_score': risk_score,
'risk_level': risk_level
})
# 按调整后的置信度排序
controlled_recommendations.sort(key=lambda x: x['adjusted_confidence'], reverse=True)
return controlled_recommendations
```
**适用场景**:
- 适合技术面和概念题材结合的市场
- 风险偏好适中的投资者
- 希望获得综合收益的用户
- 适合震荡市和趋势初期
## 6. gnn_analysis 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **图神经网络(GNN)预测**:使用GAT(Graph Attention Network)模型分析股票关系
- **实时图构建系统**:动态构建股票关系图,包含相关性、资金流动等关系
- **多维度特征提取**:技术面、基本面、资金面、概念题材特征
**选股逻辑**:
1. **股票池选择**:
- 从stocks_data获取最近交易日的股票数据
- 按成交额排序,选择前300只活跃股票
- 过滤条件:成交额>1万元,收盘价>0
2. **图构建**:
- 尝试使用准实时数据构建图(scripts.gnn_intraday_tomorrow.build_graph_from_realtime)
- 失败则使用历史数据构建
- 图节点特征:40+技术指标、基本面数据、资金流向
- 图边构建:基于股票相关性、行业归属、资金流动关系
- 边权重:相关性系数、资金流动强度
3. **GNN预测**:
- 加载预训练GAT模型:./models/gnn_ranking/best_ranking_model_epoch3.pth
- 模型架构:2层GAT,每层8个注意力头
- 输入:股票特征矩阵、关系图边索引
- 输出:股票未来3天收益率预测
4. **预测结果处理**:
- 筛选Top 30%的高得分股票
- 置信度计算:基于模型预测概率和一致性
- 要求置信度≥0.72
5. **风险评估与最终筛选**:
- 使用ChaseRiskEvaluator评估追涨风险
- 仅保留风险等级≤中的股票
- 按置信度排序,保留前6只股票
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 股票池大小 | 300 | 初始活跃股票数量 |
| 模型类型 | GAT | 图注意力网络模型 |
| 模型路径 | ./models/gnn_ranking/best_ranking_model_epoch3.pth | 预训练模型路径 |
| 注意力头数量 | 8 | 每层GAT的注意力头数量 |
| 模型层数 | 2 | GAT模型层数 |
| 特征维度 | 40+ | 每个股票节点的特征数量 |
| 预测周期 | 3天 | 预测未来3天收益率 |
| 置信度阈值 | 0.72 | 生成信号的最低置信度 |
| 风险等级_max | 中 | 允许的最大风险等级 |
| 最大推荐数量 | 6 | 单个组合最大股票数量 |
| 图构建频率 | 每日 | 每日更新股票关系图 |
**GNN模型架构**:
```python
# GAT模型架构
def build_gnn_model(feature_dim: int, hidden_dim: int = 64, num_heads: int = 8):
"""
构建图注意力网络模型
Args:
feature_dim: 输入特征维度
hidden_dim: 隐藏层维度
num_heads: 注意力头数量
Returns:
GAT模型实例
"""
from src.gnn.models import StockGAT
import torch
# 模型结构:输入层 → GAT层1 → GAT层2 → 输出层
model = StockGAT(
in_channels=feature_dim, # 输入特征维度
hidden_channels=hidden_dim, # 隐藏层维度
out_channels=1, # 输出维度(收益率预测)
num_heads=num_heads, # 注意力头数量
dropout=0.3, # dropout率
edge_dim=1 # 边特征维度
)
return model
```
**图构建算法**:
```python
def build_stock_graph(stock_data, correlation_threshold=0.7):
"""
构建股票关系图
Args:
stock_data: 股票数据字典,包含每只股票的特征
correlation_threshold: 相关性阈值,超过则建立边
Returns:
图节点特征矩阵、边索引、边权重
"""
import numpy as np
import torch
from scipy.spatial.distance import cosine
# 提取股票列表和特征
stock_codes = list(stock_data.keys())
features = [stock_data[code]['features'] for code in stock_codes]
features = torch.tensor(np.array(features), dtype=torch.float32)
# 计算股票间相关性,构建边
edge_index = []
edge_weights = []
for i in range(len(stock_codes)):
for j in range(i+1, len(stock_codes)):
# 计算特征相关性
correlation = 1 - cosine(features[i].numpy(), features[j].numpy())
# 如果相关性超过阈值,建立边
if correlation >= correlation_threshold:
# 双向边
edge_index.append([i, j])
edge_index.append([j, i])
# 边权重为相关性
edge_weights.append(correlation)
edge_weights.append(correlation)
# 转换为PyTorch张量
edge_index = torch.tensor(edge_index, dtype=torch.long).t().contiguous()
edge_weights = torch.tensor(edge_weights, dtype=torch.float32)
return features, edge_index, edge_weights
```
**适用场景**:
- 适合复杂关系网络的市场
- 风险偏好较高的投资者
- 希望利用AI技术的用户
- 适合捕捉跨股票联动效应
## 7. review_analysis 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **复盘热点识别模型**:基于历史涨停股、涨幅榜、资金流向
- **龙头股识别算法**:基于涨幅、成交量、封单量、开板次数
- **追涨风险评估系统**:ChaseRiskEvaluator,评估买入时机风险
**选股逻辑**:
1. **复盘数据获取**:
- 从review_results获取最近复盘数据
- 从sector_analysis_history获取板块分析数据
- 从stock_data获取个股详细数据
2. **基础筛选**:
- 涨幅:3-8%(避免追高,又保证强势)
- 成交额:>1亿元(保证流动性)
- 换手率:3-15%(避免过度炒作)
- 排除ST股和指数
- 按涨幅和成交额排序
3. **热点匹配**:
- 匹配复盘热点板块
- 热点相关性评分:板块匹配度×0.5 + 概念匹配度×0.3 + 资金流向匹配度×0.2
- 仅保留热点相关性≥0.6的股票
4. **龙头股识别**:
- 龙头股评分:涨幅×0.3 + 成交额×0.2 + 资金流入×0.25 + 市值×0.15 + 板块权重×0.1
- 标记龙头股类型:龙头股(评分≥0.8)、潜力股(0.5-0.8)、跟风股(<0.5)
5. **追涨风险评估**:
- 使用ChaseRiskEvaluator进行风险评估
- 风险评分:当前涨幅/历史最大涨幅×0.4 + 估值偏离度×0.3 + 短期换手率×0.3
- 仅保留风险等级≤中的股票
6. **最终筛选**:
- 按龙头股评分×(1-风险评分)排序
- 保留前6只股票
- 不足时放宽条件:涨幅范围扩大到2-10%,成交额降低到8000万
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 涨幅_min | 3% | 最小涨幅 |
| 涨幅_max | 8% | 最大涨幅 |
| 涨幅_min_relaxed | 2% | 放宽条件后的最小涨幅 |
| 涨幅_max_relaxed | 10% | 放宽条件后的最大涨幅 |
| 成交额_min | 1亿 | 最小成交额 |
| 成交额_min_relaxed | 8000万 | 放宽条件后的最小成交额 |
| 换手率_min | 3% | 最小换手率 |
| 换手率_max | 15% | 最大换手率 |
| 热点相关性阈值 | 0.6 | 热点匹配最低评分 |
| 龙头股评分阈值 | 0.8 | 龙头股最低评分 |
| 追涨风险阈值 | 0.7 | 最大追涨风险 |
| 最大推荐数量 | 6 | 单个组合最大股票数量 |
| 复盘数据来源 | review_results | 复盘数据获取表 |
**复盘热点识别算法**:
```python
def identify_review_hotspots(review_data):
"""
识别复盘热点
Args:
review_data: 复盘数据
Returns:
热点列表,包含热点名称、热度评分、相关股票
"""
hotspots = {}
# 分析涨停股和涨幅榜
for stock in review_data:
# 提取板块和概念
sectors = stock.get('sectors', [])
concepts = stock.get('concepts', [])
# 更新板块热度
for sector in sectors:
if sector not in hotspots:
hotspots[sector] = {
'type': 'sector',
'count': 0,
'total_pct_chg': 0,
'related_stocks': []
}
hotspots[sector]['count'] += 1
hotspots[sector]['total_pct_chg'] += stock.get('pct_chg', 0)
hotspots[sector]['related_stocks'].append(stock['ts_code'])
# 更新概念热度
for concept in concepts:
if concept not in hotspots:
hotspots[concept] = {
'type': 'concept',
'count': 0,
'total_pct_chg': 0,
'related_stocks': []
}
hotspots[concept]['count'] += 1
hotspots[concept]['total_pct_chg'] += stock.get('pct_chg', 0)
hotspots[concept]['related_stocks'].append(stock['ts_code'])
# 计算热度评分
for name, data in hotspots.items():
# 热度评分 = 股票数量×0.5 + 平均涨幅×0.5
avg_pct_chg = data['total_pct_chg'] / data['count'] if data['count'] > 0 else 0
data['hotness_score'] = (data['count'] * 0.5 + avg_pct_chg * 0.5)
# 按热度评分排序
sorted_hotspots = sorted(hotspots.items(), key=lambda x: x[1]['hotness_score'], reverse=True)
return sorted_hotspots
```
**龙头股识别逻辑**:
```python
def identify_review_leaders(hotspot_stocks, hotspot_type):
"""
识别复盘中的龙头股
Args:
hotspot_stocks: 热点相关股票列表
hotspot_type: 热点类型(sector/concept)
Returns:
带龙头股标记的股票列表
"""
for stock in hotspot_stocks:
# 计算龙头股评分
pct_score = min(1, stock['pct_chg'] / 10) # 涨幅评分
vol_score = min(1, stock['amount'] / 100000000) # 成交额评分
fund_score = min(1, stock['fund_inflow'] / 10000000) # 资金流入评分
# 如果是涨停股,加分
limit_up_bonus = 0.2 if stock['pct_chg'] >= 9.8 else 0
# 综合评分
leader_score = (pct_score * 0.3 +
vol_score * 0.2 +
fund_score * 0.25 +
limit_up_bonus +
(1 - stock['risk_score']) * 0.25) # 风险调整
# 标记龙头股类型
if leader_score >= 0.8:
stock['leader_type'] = '龙头股'
elif leader_score >= 0.5:
stock['leader_type'] = '潜力股'
else:
stock['leader_type'] = '跟风股'
stock['leader_score'] = leader_score
# 按龙头股评分排序
hotspot_stocks.sort(key=lambda x: x['leader_score'], reverse=True)
return hotspot_stocks
```
**适用场景**:
- 适合复盘热点明显的市场
- 风险偏好适中的投资者
- 希望把握复盘热点的用户
- 适合短线交易策略
## 8. ai_prediction 策略
**实现文件**:`/Users/apple/quant/src/core/simple_recommenders.py`
**核心算法**:
- **多模型AI预测系统**:整合TFT、GNN、XGBoost、DQN等模型预测
- **预测记录管理**:从prediction_records表获取历史预测结果
- **置信度校准机制**:基于模型历史准确率动态调整置信度
**选股逻辑**:
1. **AI预测数据获取**:
- 从prediction_records表获取最近3天的预测结果
- 筛选条件:推荐类型='buy',有效标记=1
- 要求DQN置信度>0.28
2. **实时数据验证**:
- 检查股票当前价格是否存在
- 排除指数和无效股票(ts_code包含399、000等)
- 验证股票是否在交易中(非停牌)
3. **预测质量评估**:
- 模型准确率检查:该模型最近7天准确率≥50%
- 预测一致性:至少2个模型推荐同一股票
- 预测时效性:预测时间距离当前≤3天
4. **追涨风险评估**:
- 使用ChaseRiskEvaluator进行风险评估
- 风险评分:当前涨幅/历史最大涨幅×0.4 + 估值偏离度×0.3 + 短期换手率×0.3
- 仅保留风险等级≤中的股票
5. **最终筛选**:
- 按置信度×模型准确率排序
- 保留前8只股票
- 确保行业分散度(单个行业股票数≤3)
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 预测时间范围 | 3天 | 最近3天的预测结果 |
| DQN置信度阈值 | 0.28 | DQN模型最低置信度 |
| 模型准确率阈值 | 50% | 模型最近7天最低准确率 |
| 预测一致性要求 | ≥2 | 推荐同一股票的模型数量 |
| 风险等级_max | 中 | 允许的最大风险等级 |
| 单行业股票数_max | 3 | 单个行业最大股票数量 |
| 最大推荐数量 | 8 | 单个组合最大股票数量 |
| 预测数据来源 | prediction_records | AI预测数据获取表 |
**AI预测整合算法**:
```python
def integrate_ai_predictions(prediction_records, db_manager):
"""
整合多个AI模型的预测结果
Args:
prediction_records: AI预测记录列表
db_manager: 数据库管理器
Returns:
整合后的推荐股票列表
"""
from collections import defaultdict
# 按股票代码分组
stock_predictions = defaultdict(list)
for record in prediction_records:
stock_predictions[record['ts_code']].append(record)
integrated_results = []
for ts_code, records in stock_predictions.items():
# 检查预测一致性
if len(records) < 2:
continue
# 获取模型准确率
model_names = list(set([r['model_name'] for r in records]))
avg_accuracy = 0
for model_name in model_names:
# 从模型历史记录获取准确率
accuracy_query = f"""
SELECT AVG(is_correct) as accuracy
FROM prediction_accuracy
WHERE model_name = '{model_name}'
AND predict_date >= CURRENT_DATE - INTERVAL '7 days'
"""
accuracy_result = db_manager.execute_query(accuracy_query)
model_accuracy = float(accuracy_result.iloc[0]['accuracy']) if not accuracy_result.empty else 0.5
avg_accuracy += model_accuracy
avg_accuracy /= len(model_names)
# 计算平均置信度
avg_confidence = sum([r['confidence'] for r in records]) / len(records)
# 计算DQN置信度
dqn_confidence = max([r['dqn_confidence'] for r in records if r.get('dqn_confidence') is not None], default=0)
# 仅保留符合条件的股票
if avg_accuracy >= 0.5 and dqn_confidence > 0.28:
integrated_results.append({
'ts_code': ts_code,
'name': records[0]['stock_name'],
'avg_confidence': avg_confidence,
'dqn_confidence': dqn_confidence,
'avg_accuracy': avg_accuracy,
'model_count': len(records),
'model_names': model_names
})
# 按综合评分排序
integrated_results.sort(key=lambda x: x['avg_confidence'] * x['avg_accuracy'], reverse=True)
return integrated_results
```
**置信度校准逻辑**:
```python
def calibrate_confidence(confidence, model_accuracy, market_risk_score):
"""
校准AI预测置信度
Args:
confidence: 原始置信度
model_accuracy: 模型历史准确率
market_risk_score: 市场风险评分(0-1)
Returns:
校准后的置信度
"""
# 基于模型准确率校准
accuracy_calibrated = confidence * (0.5 + model_accuracy * 0.5)
# 基于市场风险校准
risk_calibrated = accuracy_calibrated * (1 - market_risk_score * 0.3)
# 限制在0-1区间
return max(0, min(1, risk_calibrated))
```
**适用场景**:
- 适合AI预测有效的市场
- 风险偏好适中的投资者
- 希望利用AI预测的用户
- 适合趋势明确的市场环境
## 9. potential_leader 策略
**实现文件**:`/Users/apple/quant/src/core/potential_leader_recommender.py`
**核心算法**:
- **潜力龙头识别模型**:基于多维度特征的综合评分
- **假龙头检测算法**:识别短期炒作、波动性过大的股票
- **潜力评分系统**:涨幅、成交量、技术形态、资金流向等多维度评分
**选股逻辑**:
1. **股票池准备**:
- 从stocks_data获取最近3个交易日有交易的股票(排除停牌)
- 排除北交所股票(ts_code包含.BJ)
2. **潜力龙头初筛**:
- 涨幅适中:5日涨幅3-12%,10日涨幅5-20%
- 连续上涨:最近5天至少3天上涨
- 成交量放大:量比≥1.3倍
- 技术形态:均线多头排列(价格>MA5>MA20)
- RSI适中:50-75
- 回调幅度<2%
3. **潜力评分计算**:
- 评分公式:涨幅得分×0.3 + 连续上涨得分×0.2 + 成交量得分×0.2 + 技术形态得分×0.1 + RSI得分×0.1 + 10日动量得分×0.1
- 要求总分≥0.5
4. **假龙头检测**:
- 波动性检测:最近5天标准差>8%且单日跌幅>4%
- 成交量异常:单日成交量/10日平均>5倍且前4日平均成交量<单日成交量/4
- 上涨后立即回调:前3日平均涨幅>2%且后4日平均跌幅<-1.5%
5. **最终筛选**:
- 按潜力评分排序
- 保留前20只股票
- 置信度计算:`min(potential_score/0.6, 1.0)`
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 5日涨幅_min | 3% | 最小5日涨幅 |
| 5日涨幅_max | 12% | 最大5日涨幅 |
| 10日涨幅_min | 5% | 最小10日涨幅 |
| 10日涨幅_max | 20% | 最大10日涨幅 |
| 连续上涨_min | 3 | 最近5天最小上涨天数 |
| 量比_min | 1.3 | 最小成交量放大倍数 |
| RSI_min | 50 | 最小RSI值 |
| RSI_max | 75 | 最大RSI值 |
| 回调幅度_max | 2% | 最大回调幅度 |
| 波动率_max | 8.0 | 最大5日波动率 |
| 单日跌幅_max | -4.0% | 最大单日跌幅 |
| 潜力评分_min | 0.5 | 最小潜力评分 |
| 最大推荐数量 | 20 | 单个组合最大股票数量 |
| 置信度计算公式 | `min(potential_score/0.6, 1.0)` | 置信度归一化 |
| 均线多头要求 | True | 要求价格>MA5>MA20 |
**潜力评分算法**:
```python
def calculate_potential_score(stock_info):
"""
计算潜力龙头得分
Args:
stock_info: 股票信息字典
Returns:
潜力评分 (0-1)
"""
score = 0.0
# 1. 涨幅得分(5日涨幅3-12%)
change_5d = stock_info.get('change_5d')
if change_5d is not None:
if 0.05 <= change_5d <= 0.10: # 5日涨幅在5-10%之间得分最高
score += 0.3
elif 0.03 <= change_5d < 0.05 or 0.10 < change_5d <= 0.12:
score += 0.2
# 2. 连续上涨得分(最近5天至少3天上涨)
pct_chgs = stock_info.get('pct_chgs')
if pct_chgs is not None and len(pct_chgs) >= 5:
up_days = sum(1 for pct in pct_chgs[-5:] if pct > 0)
if up_days >= 4:
score += 0.2
elif up_days >= 3:
score += 0.15
# 3. 成交量得分(量比≥1.3倍)
volume_ratio = stock_info.get('volume_ratio')
if volume_ratio is not None:
if volume_ratio >= 2.0:
score += 0.2
elif volume_ratio >= 1.5:
score += 0.15
elif volume_ratio >= 1.3:
score += 0.1
# 4. 技术形态得分(均线多头排列)
if stock_info.get('ma_bullish', False):
score += 0.1
# 5. RSI得分(RSI在50-75之间)
rsi = stock_info.get('rsi')
if rsi is not None:
if 60 <= rsi <= 70: # RSI在60-70之间得分最高
score += 0.1
elif 50 <= rsi < 60 or 70 < rsi <= 75:
score += 0.05
# 6. 10日动量得分(10日涨幅5-20%)
change_10d = stock_info.get('change_10d')
if change_10d is not None:
if 0.10 <= change_10d <= 0.15: # 10日涨幅在10-15%之间得分最高
score += 0.1
elif 0.05 <= change_10d < 0.10 or 0.15 < change_10d <= 0.20:
score += 0.05
return score
```
**假龙头检测算法**:
```python
def is_fake_leader(stock_info):
"""
检测是否为假龙头
Args:
stock_info: 股票信息字典
Returns:
是否为假龙头
"""
pct_chgs = stock_info.get('pct_chgs')
volumes = stock_info.get('volumes')
closes = stock_info.get('closes')
# 1. 波动性检测
if pct_chgs is not None and len(pct_chgs) >= 5:
recent_5d_pct = pct_chgs[-5:]
volatility = np.std(recent_5d_pct)
if volatility > 6.0 and any(pct < -4.0 for pct in recent_5d_pct):
return True
# 2. 上涨后立即回调检测
if pct_chgs is not None and len(pct_chgs) >= 7:
recent_7d = pct_chgs[-7:]
first_3d_avg = np.mean(recent_7d[:3])
last_4d_avg = np.mean(recent_7d[3:])
if first_3d_avg > 2.0 and last_4d_avg < -1.5:
return True
# 3. 成交量异常检测
if volumes is not None and len(volumes) >= 10:
recent_1d_vol = volumes[-1]
avg_10d_vol = volumes[-10:].mean()
if recent_1d_vol / avg_10d_vol > 5.0:
prev_4d_avg_vol = volumes[-5:-1].mean() if len(volumes) >= 5 else avg_10d_vol
if recent_1d_vol / prev_4d_avg_vol > 4.0:
return True
return False
```
**适用场景**:
- 适合寻找潜力龙头的市场
- 风险偏好较高的投资者
- 希望提前布局的用户
- 适合趋势初期和板块轮动市场
## 10. leader_stock 策略
**实现文件**:`/Users/apple/quant/src/core/leader_stock_recommender.py`
**核心算法**:
- **龙头股识别模型**:基于多维度特征的综合评分系统
- **假龙头检测算法**:识别短期炒作、波动性过大的股票
- **市值相对位置分析**:行业内市值排名与分位数计算
- **严格龙头股标准**:持续上涨、小回调、稳定波动等特征
**选股逻辑**:
1. **股票池准备**:
- 从stocks_data获取最近3个交易日有交易的股票(排除停牌)
- 排除北交所股票(ts_code包含.BJ)
2. **初步龙头识别**:
- 使用rhythm_manager._is_leader_stock方法进行初步筛选
- 应用假龙头检测:排除波动剧烈、回调过大的股票
- 市值筛选:排除市值>500亿元的股票(盘子太大,拉不动)
3. **严格标准校验**:
- 5日涨幅≥8%,10日涨幅≥15%
- 回调幅度<1.5%
- 成交量放大≥1.5倍
- RSI在65-88之间
- 最近5天至少4天上涨
- 波动率<8%
- 成交量持续放大(最近5天平均成交量比前5天≥1.2倍)
4. **市值相对位置分析**:
- 计算股票在行业中的市值分位数、排名
- 标记市值类型:小市值(前30%)、中市值(30-70%)、大市值(后30%)
- 偏好行业中小市值股票(更容易连续上涨)
5. **龙头股评分计算**:
- 评分公式:5日涨幅×0.25 + 10日涨幅×0.15 + 成交量比×0.15 + RSI×0.1 + 连续上涨×0.15 + 市值相对位置×0.2 + 非主流板块加分×0.05
- 要求总分≥0.6
6. **最终筛选**:
- 按龙头股评分排序
- 保留前20只股票
- 置信度计算:`min(leader_score/0.6, 1.0)`
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 最小龙头得分 | 0.6 | 最小龙头股评分阈值 |
| 5日涨幅_min | 8% | 严格标准的最小5日涨幅 |
| 10日涨幅_min | 15% | 严格标准的最小10日涨幅 |
| 回调幅度_max | 1.5% | 最大回调幅度 |
| 量比_min | 1.5 | 最小成交量放大倍数 |
| RSI_min | 65 | 最小RSI值 |
| RSI_max | 88 | 最大RSI值 |
| 连续上涨_min | 4 | 最近5天最小上涨天数 |
| 波动率_max | 8.0 | 最大5日波动率 |
| 市值_max | 500亿 | 最大市值限制 |
| 小市值分位数 | 0.3 | 行业中小市值的分位数阈值 |
| 5日涨幅权重 | 0.25 | 5日涨幅在评分中的权重 |
| 10日涨幅权重 | 0.15 | 10日涨幅在评分中的权重 |
| 成交量比权重 | 0.15 | 成交量比在评分中的权重 |
| RSI权重 | 0.1 | RSI在评分中的权重 |
| 连续上涨权重 | 0.15 | 连续上涨天数在评分中的权重 |
| 市值位置权重 | 0.2 | 市值相对位置在评分中的权重 |
| 非主流板块加分 | 0.05 | 非主流板块的额外加分 |
| 最大推荐数量 | 20 | 单个组合最大股票数量 |
**龙头股评分算法**:
```python
def calculate_leader_score(stock_info):
"""
计算龙头股得分
Args:
stock_info: 股票信息字典
Returns:
龙头股评分 (0-1)
"""
score = 0.0
# 1. 5日涨幅得分(权重0.25)
if stock_info.get('change_5d') is not None:
change_5d = stock_info['change_5d']
if change_5d > 0.20: # 20%以上
score += 0.25
elif change_5d > 0.10: # 10-20%
score += 0.15
elif change_5d > 0.05: # 5-10%
score += 0.08
# 2. 10日涨幅得分(权重0.15)
if stock_info.get('change_10d') is not None:
change_10d = stock_info['change_10d']
if change_10d > 0.30: # 30%以上
score += 0.15
elif change_10d > 0.20: # 20-30%
score += 0.12
elif change_10d > 0.10: # 10-20%
score += 0.08
# 3. 成交量比得分(权重0.15)
if stock_info.get('volume_ratio') is not None:
volume_ratio = stock_info['volume_ratio']
if volume_ratio > 3.0:
score += 0.15
elif volume_ratio > 2.0:
score += 0.12
elif volume_ratio > 1.5:
score += 0.08
# 4. RSI得分(权重0.1)
if stock_info.get('rsi') is not None:
rsi = stock_info['rsi']
if 60 <= rsi <= 80: # 强势但不极端超买
score += 0.1
elif 50 <= rsi < 60 or 80 < rsi <= 90:
score += 0.05
# 5. 连续上涨得分(权重0.15)
if stock_info.get('pct_chgs') is not None:
pct_chgs = stock_info['pct_chgs']
if len(pct_chgs) >= 5:
recent_5d = pct_chgs[-5:]
up_days = sum(1 for pct in recent_5d if pct > 0)
if up_days >= 5: # 连续5天上涨
score += 0.15
elif up_days >= 4: # 4天上涨
score += 0.12
elif up_days >= 3: # 3天上涨
score += 0.08
# 6. 市值相对位置得分(权重0.2)
market_cap_position = stock_info.get('market_cap_position')
if market_cap_position:
percentile = market_cap_position.get('percentile', 0.5)
is_small_cap = market_cap_position.get('is_small_cap_in_sector', False)
if is_small_cap: # 前30%小市值
score += 0.2
elif percentile <= 0.5: # 前50%中小市值
score += 0.15
elif percentile <= 0.7: # 50%-70%中等市值
score += 0.08
else: # 后30%大市值
score += 0.03
# 7. 非主流板块加分(权重0.05)
industry = stock_info.get('industry')
if industry:
mainstream_sectors = ['银行', '房地产', '钢铁', '煤炭', '石油', '电力', '公用事业']
is_mainstream = any(mainstream in industry for mainstream in mainstream_sectors)
if not is_mainstream:
score += 0.05
return min(score, 1.0) # 限制在0-1之间
```
**假龙头检测算法**:
```python
def is_fake_leader(stock_info):
"""
检测是否为假龙头
Args:
stock_info: 股票信息字典
Returns:
是否为假龙头
"""
historical_data = stock_info.get('historical_data')
if historical_data is None or len(historical_data) < 10:
return False
closes = historical_data['close'].values
pct_chgs = historical_data['pct_chg'].values if 'pct_chg' in historical_data.columns else None
volumes = historical_data['volume'].values if 'volume' in historical_data.columns else None
current_price = stock_info['current_price']
change_5d = stock_info.get('change_5d')
rsi = stock_info.get('rsi')
# 1. 刚上涨就大幅回调且继续下跌
if len(closes) >= 10:
high_10d = closes[-10:].max()
max_pullback = (high_10d - current_price) / high_10d if high_10d > 0 else 0
if max_pullback > 0.03:
if len(closes) >= 3:
recent_3d = closes[-3:]
if recent_3d[-1] < recent_3d[0]:
return True
# 2. 波动剧烈且有单日大幅下跌
if pct_chgs is not None and len(pct_chgs) >= 5:
recent_5d_pct = pct_chgs[-5:]
volatility = np.std(recent_5d_pct)
if volatility > 6.0 and any(pct < -4.0 for pct in recent_5d_pct):
return True
# 3. 上涨后立即大幅回调
if pct_chgs is not None and len(pct_chgs) >= 7:
recent_7d = pct_chgs[-7:]
first_3d_avg = np.mean(recent_7d[:3])
last_4d_avg = np.mean(recent_7d[3:])
if first_3d_avg > 2.0 and last_4d_avg < -1.5:
return True
# 4. 成交量突然放大但不可持续
if volumes is not None and len(volumes) >= 10:
recent_1d_vol = volumes[-1]
avg_10d_vol = volumes[-10:].mean()
if recent_1d_vol / avg_10d_vol > 5.0:
prev_4d_avg_vol = volumes[-5:-1].mean() if len(volumes) >= 5 else avg_10d_vol
if recent_1d_vol / prev_4d_avg_vol > 4.0:
return True
# 5. RSI极端超买且开始回调
if rsi is not None and rsi > 95:
if len(closes) >= 3:
recent_3d = closes[-3:]
if recent_3d[-1] < recent_3d[0]:
return True
return False
```
**适用场景**:
- 适合龙头股明显的市场
- 风险偏好较高的投资者
- 希望跟随龙头股的用户
- 适合趋势明确的市场环境
## 11. combined_rhythm_controlled 策略
**实现文件**:`/Users/apple/quant/src/core/portfolio_saver.py`
**核心算法**:
- **节奏控制机制**:基于市场状态的动态调整
- **质量筛选系统**:PositionQualityFilter,提高持仓质量
- **专家知识对齐**:参考专家案例优化组合配置
- **去重机制**:防止当天重复生成相同策略的组合
**选股逻辑**:
1. **基础组合生成**:
- 使用combined策略生成原始组合
- 按置信度排序,保留前N只股票
- 应用去重检查,防止重复生成
2. **质量筛选**:
- 调用create_position_quality_filter创建质量筛选器
- 应用质量筛选规则:
- 技术形态健康度评分≥0.6
- 资金流向评分≥0.5
- 板块热度评分≥0.5
- 风险等级≤中
- 筛选后保留符合条件的股票
3. **专家知识对齐**:
- 检查FeatureFlags.ENABLE_EXPERT_KNOWLEDGE_ALIGNMENT开关
- 调用_apply_expert_knowledge方法调整组合配置
- 参考同类市场环境下专家成功案例
- 调整最终股票选择和权重分配
4. **节奏控制调整**:
- 计算回调要求:基于当前市场状态和股票技术形态
- 调整持仓结构:降低高频交易股票权重
- 优化仓位分配:根据市场风险调整单股仓位上限
- 生成节奏控制组合:适合中长期持有
5. **最终筛选**:
- 按调整后的评分排序
- 保留前max_stocks只股票
- 生成节奏控制版本组合
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 质量筛选 | 启用 | 提高持仓质量 |
| 专家知识对齐 | 启用 | 参考专家案例 |
| 节奏控制 | 启用 | 控制交易节奏 |
| 质量筛选阈值 | 0.6 | 技术形态健康度最低评分 |
| 资金流向阈值 | 0.5 | 资金流向最低评分 |
| 板块热度阈值 | 0.5 | 板块热度最低评分 |
| 风险等级_max | 中 | 允许的最大风险等级 |
| 去重检查 | 启用 | 防止重复生成组合 |
| 专家知识开关 | 可配置 | 通过FeatureFlags.ENABLE_EXPERT_KNOWLEDGE_ALIGNMENT控制 |
**节奏控制机制**:
```python
def apply_rhythm_control(stocks, strategy_type):
"""
应用节奏控制
Args:
stocks: 原始股票列表
strategy_type: 策略类型
Returns:
节奏控制后的股票列表
"""
# 1. 调整单股仓位上限
# 基于市场风险状态动态调整单股最大权重
market_risk = get_market_risk() # 获取市场风险评分(0-1)
max_position_weight = 0.15 - (market_risk * 0.05) # 风险越高,单股权重越低
# 2. 降低高频交易股票权重
for stock in stocks:
# 检查股票交易频率
trading_freq = get_stock_trading_frequency(stock['stock_code'])
if trading_freq > 0.8: # 高频交易股票
stock['confidence'] *= 0.8 # 降低置信度
# 3. 优化持仓结构
# 增加中长期表现稳定的股票权重
for stock in stocks:
stability_score = get_stock_stability_score(stock['stock_code'])
if stability_score > 0.7: # 稳定股票
stock['confidence'] *= 1.1 # 提高置信度
# 4. 按调整后的置信度排序
stocks.sort(key=lambda x: x['confidence'], reverse=True)
return stocks
```
**适用场景**:
- 适合需要控制交易节奏的市场
- 风险偏好适中的投资者
- 希望降低交易频率的用户
- 适合中长期投资策略
## 12. sector_rotation_rhythm_controlled 策略
**实现文件**:`/Users/apple/quant/src/core/portfolio_saver.py`
**核心算法**:
- **板块轮动节奏控制**:基于板块热度和动量的动态调整
- **质量筛选系统**:PositionQualityFilter,提高持仓质量
- **专家知识对齐**:参考专家案例优化组合配置
**选股逻辑**:
1. **基础组合生成**:
- 使用sector_rotation策略生成原始组合
- 按板块动量和置信度排序
- 应用去重检查,防止重复生成
2. **质量筛选**:
- 调用create_position_quality_filter创建质量筛选器
- 应用质量筛选规则:
- 技术形态健康度评分≥0.6
- 资金流向评分≥0.5
- 板块热度评分≥0.5
- 风险等级≤中
- 筛选后保留符合条件的板块和股票
3. **专家知识对齐**:
- 检查FeatureFlags.ENABLE_EXPERT_KNOWLEDGE_ALIGNMENT开关
- 调用_apply_expert_knowledge方法调整组合配置
- 参考同类市场环境下专家成功案例
- 调整板块权重分配和股票选择
4. **板块轮动节奏调整**:
- 评估板块热度:当前板块热度与历史平均比较
- 计算板块回调要求:基于板块技术形态
- 调整板块权重:降低过热板块权重,提高潜力板块权重
- 优化持仓结构:每个板块分配合理仓位
5. **最终筛选**:
- 按调整后的板块权重和股票评分排序
- 每个板块保留前2-3只股票
- 总股票数量≤max_stocks
- 生成节奏控制版本组合
**详细参数配置**:
| 参数 | 取值 | 说明 |
|------|------|------|
| 质量筛选 | 启用 | 提高持仓质量 |
| 专家知识对齐 | 启用 | 参考专家案例 |
| 节奏控制 | 启用 | 控制交易节奏 |
| 质量筛选阈值 | 0.6 | 技术形态健康度最低评分 |
| 资金流向阈值 | 0.5 | 资金流向最低评分 |
| 板块热度阈值 | 0.5 | 板块热度最低评分 |
| 风险等级_max | 中 | 允许的最大风险等级 |
| 单板块股票数 | 2-3 | 每个板块最多推荐股票数 |
| 单板块最大权重 | 30% | 单个板块最大仓位 |
| 专家知识开关 | 可配置 | 通过FeatureFlags.ENABLE_EXPERT_KNOWLEDGE_ALIGNMENT控制 |
**板块轮动节奏控制机制**:
```python
def apply_sector_rhythm_control(sector_stocks, strategy_type):
"""
应用板块轮动节奏控制
Args:
sector_stocks: 按板块分组的股票列表
strategy_type: 策略类型
Returns:
节奏控制后的股票列表
"""
# 1. 评估板块热度
sector_heat_scores = {}
for sector, stocks in sector_stocks.items():
# 计算板块热度评分
heat_score = calculate_sector_heat(sector)
sector_heat_scores[sector] = heat_score
# 2. 调整板块权重
adjusted_sector_weights = {}
for sector, heat_score in sector_heat_scores.items():
# 过热板块降低权重
if heat_score > 0.8: # 过热板块
adjusted_sector_weights[sector] = 0.2 # 降低权重
elif heat_score > 0.6: # 强势板块
adjusted_sector_weights[sector] = 0.3 # 保持权重
else: # 潜力板块
adjusted_sector_weights[sector] = 0.25 # 适度权重
# 3. 调整板块内股票选择
adjusted_stocks = []
for sector, stocks in sector_stocks.items():
# 按调整后的板块权重筛选股票数量
target_count = max(2, int(adjusted_sector_weights[sector] * 20)) # 20为总股票数
# 选择板块内优质股票
sector_stocks_sorted = sorted(stocks, key=lambda x: x['confidence'], reverse=True)
adjusted_stocks.extend(sector_stocks_sorted[:target_count])
# 4. 按置信度排序
adjusted_stocks.sort(key=lambda x: x['confidence'], reverse=True)
return adjusted_stocks
```
**适用场景**:
- 适合板块轮动需要控制节奏的市场
- 风险偏好适中的投资者
- 希望降低交易频率的用户
- 适合中长期板块轮动投资策略
## 13. 策略类型汇总表
| 策略类型 | 核心算法 | 选股逻辑 | 风险等级 | 推荐数量 | 适用市场环境 | 适合投资者类型 | 核心参数 |
|---------|---------|---------|---------|---------|-------------|--------------|----------|
| high_accuracy_v2 | 多维度综合评分 | 基础筛选→板块筛选→资金筛选→技术筛选→综合评分 | 适中 | 20 | 震荡市、趋势初期 | 风险偏好适中 | 三种模式(保守/标准/激进) |
| v3_fusion | 五信号融合引擎 | 股票池选择→AI快速评分→多模型融合→风险评估 | 较高 | 20 | 趋势明确的市场 | 风险偏好较高 | 5模型融合、1分钟更新 |
| concept_theme | 概念热度筛选 | 概念筛选→基础筛选→热点匹配→龙头股识别→追涨风险评估 | 适中 | 8 | 概念题材活跃的市场 | 风险偏好适中 | 概念热度评分≥0.7 |
| sector_rotation | 板块轮动分析 | 板块动量分析→板块筛选→板块内选股→组合构建 | 适中 | 3-5板块×2-3股/板块 | 板块轮动明显的市场 | 风险偏好适中 | 马尔可夫链轮动预测 |
| combined | 技术+概念融合 | 多策略基础筛选→统一评分→追涨风险评估→龙头股识别 | 适中 | 8 | 技术面和概念题材结合的市场 | 风险偏好适中 | 技术×0.4+概念×0.3+资金×0.3 |
| gnn_analysis | 图神经网络预测 | 股票池选择→图构建→GNN预测→预测结果处理→风险评估 | 较高 | 6 | 复杂关系网络的市场 | 风险偏好较高 | GAT模型、40+特征 |
| review_analysis | 复盘分析 | 复盘数据获取→基础筛选→热点匹配→龙头股识别→追涨风险评估 | 适中 | 6 | 复盘热点明显的市场 | 风险偏好适中 | 涨幅3-8%、成交额≥1亿 |
| ai_prediction | AI预测模型 | AI预测数据获取→实时数据验证→预测质量评估→追涨风险评估 | 适中 | 8 | AI预测有效的市场 | 风险偏好适中 | 多模型整合、置信度校准 |
| potential_leader | 潜力龙头识别 | 股票池准备→潜力龙头初筛→潜力评分→假龙头检测 | 较高 | 20 | 趋势初期、板块轮动市场 | 风险偏好较高 | 5日涨幅3-12%、10日涨幅5-20% |
| leader_stock | 龙头股识别 | 股票池准备→初步龙头识别→严格标准校验→市值相对位置分析→龙头股评分 | 较高 | 20 | 龙头股明显的市场 | 风险偏好较高 | 5日涨幅≥8%、回调<1.5% |
| combined_rhythm_controlled | 节奏控制 | 基础组合生成→质量筛选→专家知识对齐→节奏控制调整 | 适中 | 20 | 需要控制交易节奏的市场 | 风险偏好适中 | 质量筛选、专家知识对齐 |
| sector_rotation_rhythm_controlled | 板块轮动节奏控制 | 基础组合生成→质量筛选→专家知识对齐→板块轮动节奏调整 | 适中 | 20 | 板块轮动需要控制节奏的市场 | 风险偏好适中 | 板块权重动态调整 |
## 14. 策略选择建议
1. **根据市场环境选择**:
- 震荡市:选择high_accuracy_v2、combined、concept_theme
- 趋势市:选择v3_fusion、leader_stock、potential_leader
- 板块轮动明显:选择sector_rotation、sector_rotation_rhythm_controlled
- 概念题材活跃:选择concept_theme、review_analysis
2. **根据风险偏好选择**:
- 保守型:选择high_accuracy_v2(保守模式)、combined_rhythm_controlled
- 适中型:选择high_accuracy_v2(标准模式)、combined、sector_rotation
- 激进型:选择v3_fusion、gnn_analysis、leader_stock
3. **根据投资目标选择**:
- 短期收益:选择concept_theme、review_analysis
- 中期收益:选择sector_rotation、high_accuracy_v2
- 长期收益:选择v3_fusion、gnn_analysis
- 稳定收益:选择combined_rhythm_controlled、sector_rotation_rhythm_controlled
## 15. 策略优化建议
1. **定期评估策略绩效**:
- 每月评估一次策略表现
- 根据绩效调整策略参数
- 淘汰表现不佳的策略
2. **结合市场状态调整**:
- 根据市场状态调整策略权重
- 震荡市增加保守型策略权重
- 趋势市增加激进型策略权重
3. **优化风险控制**:
- 根据市场波动调整止损阈值
- 增加分散化投资
- 控制单股仓位
4. **持续更新策略**:
- 定期更新模型参数
- 引入新的数据源
- 优化选股逻辑
## 16. 结论
本系统提供了多种策略类型,每种策略都有其独特的算法实现和选股逻辑,适合不同的市场环境和投资目标。投资者可以根据自身的风险偏好、投资目标和市场环境选择合适的策略,也可以结合多种策略进行分散投资,以获得更好的风险调整后收益。
系统支持自动生成投资组合,也支持手动调整,投资者可以根据自己的需求灵活使用。同时,系统还提供了节奏控制功能,可以帮助投资者控制交易节奏,降低交易频率,提高交易效率。
通过合理选择和优化策略,投资者可以在不同的市场环境中获得稳定的收益,实现长期的投资目标。