投资组合策略类型详细MD文档

完整的投资组合策略类型详细文档

# 投资组合策略类型详细文档

## 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. 结论

本系统提供了多种策略类型,每种策略都有其独特的算法实现和选股逻辑,适合不同的市场环境和投资目标。投资者可以根据自身的风险偏好、投资目标和市场环境选择合适的策略,也可以结合多种策略进行分散投资,以获得更好的风险调整后收益。

系统支持自动生成投资组合,也支持手动调整,投资者可以根据自己的需求灵活使用。同时,系统还提供了节奏控制功能,可以帮助投资者控制交易节奏,降低交易频率,提高交易效率。

通过合理选择和优化策略,投资者可以在不同的市场环境中获得稳定的收益,实现长期的投资目标。