# 市场扫描优化分析

## 🔍 当前情况

### 扫描流程

1. **获取所有USDT永续合约交易对**：544个
2. **限制扫描数量**：150个（`MAX_SCAN_SYMBOLS=150`）
3. **初步筛选**：28个（通过最小涨跌幅和成交量过滤）
4. **最终选择**：5个（`TOP_N_SYMBOLS=5`）

### 问题分析

#### 问题1：扫描150个，只取5个，是否合理？

**当前逻辑**：
- 扫描前150个交易对（按币安返回顺序，可能不是按市值排序）
- 初步筛选后，28个需要详细分析
- 最终只选择5个（按信号得分和涨跌幅排序）

**问题**：
1. **可能错过好机会**：
   - 如果前150个中没有包含某些优质山寨币，会错过
   - 如果信号得分排序不准确，可能错过更好的机会

2. **TOP_N_SYMBOLS=5 可能太少**：
   - 山寨币策略配置：`MAX_OPEN_POSITIONS=4`（最多4个持仓）
   - 如果只选择5个，可能不够
   - 建议：`TOP_N_SYMBOLS` 应该 >= `MAX_OPEN_POSITIONS * 1.5`（至少6-8个）

#### 问题2：是否需要跳过主流币？

**当前逻辑**：
- 没有过滤主流币（BTC、ETH、BNB等）
- 如果主流币出现在前150个中，会被扫描和分析

**问题**：
1. **山寨币策略不应该交易主流币**：
   - 主流币波动小，不符合山寨币高盈亏比策略
   - 主流币流动性太好，价格冲击小，但也不容易有大波动

2. **主流币可能占用扫描名额**：
   - 如果BTC、ETH出现在前150个中，会占用扫描和分析资源
   - 但最终可能因为信号强度不足而不交易

---

## ✅ 优化方案

### 方案1：过滤主流币（推荐）

**实现**：在扫描前过滤掉主流币

**主流币列表**：
```python
MAJOR_COINS = {'BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT', 'AVAXUSDT', 'MATICUSDT'}
```

**优点**：
- 专注于山寨币，符合策略定位
- 节省扫描和分析资源
- 避免主流币占用名额

**缺点**：
- 如果主流币出现异常波动，会错过（但这不是山寨币策略的目标）

### 方案2：增加 TOP_N_SYMBOLS

**当前**：`TOP_N_SYMBOLS=5`

**建议**：增加到 `8-10`

**理由**：
- `MAX_OPEN_POSITIONS=4`，需要更多候选
- 增加选择余地，避免错过好机会
- 即使选择8-10个，最终也可能只交易4个（受持仓限制）

### 方案3：优化排序逻辑

**当前排序**：
```python
sorted_results = sorted(
    filtered_results,
    key=lambda x: (
        x.get('signalScore', 0) * 10,  # 信号得分权重更高
        abs(x['changePercent'])  # 其次考虑涨跌幅
    ),
    reverse=True
)
```

**优化建议**：
1. **增加成交量权重**：成交量越大，流动性越好
2. **增加波动率权重**：波动率越大，机会越大
3. **排除主流币**：在排序前排除主流币

---

## 🎯 推荐配置

### 优化后的配置

```python
MAX_SCAN_SYMBOLS = 150        # 保持150个（覆盖主流山寨）
TOP_N_SYMBOLS = 8             # 增加到8个（给更多选择余地）
EXCLUDE_MAJOR_COINS = True    # 排除主流币（新增配置）
MAJOR_COINS = ['BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'XRPUSDT', 'ADAUSDT', 'DOGEUSDT', 'DOTUSDT', 'AVAXUSDT', 'MATICUSDT']
```

**理由**：
1. **保持扫描150个**：覆盖主流山寨币
2. **增加到8个候选**：给更多选择余地，避免错过好机会
3. **排除主流币**：专注于山寨币，符合策略定位

---

## 🔧 实现方案

### 1. 添加主流币过滤

在 `market_scanner.py` 中添加主流币过滤逻辑：

```python
# 主流币列表（山寨币策略应该排除）
MAJOR_COINS = {'BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'XRPUSDT', 
               'ADAUSDT', 'DOGEUSDT', 'DOTUSDT', 'AVAXUSDT', 'MATICUSDT',
               'LINKUSDT', 'UNIUSDT', 'ATOMUSDT', 'ETCUSDT', 'LTCUSDT'}

# 在扫描前过滤主流币
if cfg.get('EXCLUDE_MAJOR_COINS', True):
    symbols = [s for s in symbols if s not in MAJOR_COINS]
    logger.info(f"排除主流币后，剩余 {len(symbols)} 个交易对")
```

### 2. 增加 TOP_N_SYMBOLS

在配置中增加 `TOP_N_SYMBOLS` 到 8：

```python
TOP_N_SYMBOLS = 8  # 从5增加到8，给更多选择余地
```

### 3. 优化排序逻辑

增加成交量和波动率权重：

```python
sorted_results = sorted(
    filtered_results,
    key=lambda x: (
        x.get('signalScore', 0) * 10,  # 信号得分权重最高
        abs(x['changePercent']) * 2,   # 涨跌幅权重
        x.get('volume24h', 0) / 1000000,  # 成交量权重（百万美元）
        x.get('volatility', 0) * 100   # 波动率权重
    ),
    reverse=True
)
```

---

## 📊 预期效果

### 优化前

- 扫描150个，可能包含主流币
- 最终选择5个
- 可能错过好机会

### 优化后

- 扫描150个，排除主流币，专注于山寨币
- 最终选择8个，给更多选择余地
- 减少错过好机会的概率

---

## ✅ 完成时间

2026-01-25
