# 交易对筛选优化方案（2026-01-27）

## 🔍 当前问题分析

### 问题描述

用户发现扫描到的交易对信号强度都是5-7，质疑：
1. 是否按信号强度从高到低排序？
2. 信号强度5-7是否合理？

### 当前实现

**market_scanner.py**：
- 计算 `signalScore`（简单的技术指标得分：RSI、MACD、布林带等）
- 按 `signalScore` 排序，取前 `TOP_N_SYMBOLS` 个（当前是8个）
- **没有按 `signal_strength` 排序或过滤**

**strategy.py**：
- 对扫描到的交易对，调用 `_analyze_trade_signal` 计算 `signal_strength`
- 检查 `signal_strength >= MIN_SIGNAL_STRENGTH`（当前是5）
- 如果信号强度不足，只生成推荐，不自动交易

### 问题根源

1. **两个不同的概念**：
   - `signalScore`：简单的技术指标得分（用于排序）
   - `signal_strength`：复杂的信号强度计算（包括多周期共振、趋势确认等）

2. **排序依据错误**：
   - 当前按 `signalScore` 排序，但实际交易判断用的是 `signal_strength`
   - 导致 `signalScore` 高的交易对，`signal_strength` 可能只有5-7

3. **信号强度5-7是否合理**：
   - 当前 `MIN_SIGNAL_STRENGTH = 5`，所以信号强度5-7是正常的
   - 但问题是：应该优先选择信号强度更高的交易对（8-10分）

---

## ✅ 优化方案

### 方案1：在扫描阶段预先计算signal_strength（推荐）

**优点**：
- 按真实的信号强度排序，优先选择高质量信号
- 可以在扫描阶段就过滤掉低质量信号
- 减少后续策略阶段的无效处理

**缺点**：
- 需要调用 `_analyze_trade_signal`，增加计算量
- 但考虑到已经获取了所有技术指标，计算量增加有限

**实现**：
1. 在 `market_scanner.py` 的 `_get_symbol_change` 中，调用 `_analyze_trade_signal` 计算 `signal_strength`
2. 按 `signal_strength` 排序，而不是按 `signalScore` 排序
3. 可选：在扫描阶段就过滤掉 `signal_strength < MIN_SIGNAL_STRENGTH` 的交易对

---

### 方案2：保持现状，但优化signalScore计算（简单）

**优点**：
- 不需要修改太多代码
- 保持扫描阶段简单快速

**缺点**：
- `signalScore` 和 `signal_strength` 仍然不一致
- 可能仍然会出现信号强度5-7的情况

**实现**：
1. 优化 `signalScore` 的计算，使其更接近 `signal_strength`
2. 增加多周期共振的权重
3. 增加趋势确认的权重

---

## 🎯 推荐方案：方案1（按signal_strength排序）

### 实施步骤

1. **在market_scanner.py中集成signal_strength计算**
   - 需要访问 `TradingStrategy` 的 `_analyze_trade_signal` 方法
   - 或者，将 `_analyze_trade_signal` 提取为独立函数

2. **按signal_strength排序**
   - 替换当前的 `signalScore` 排序逻辑
   - 优先选择 `signal_strength` 高的交易对

3. **可选：在扫描阶段过滤**
   - 过滤掉 `signal_strength < MIN_SIGNAL_STRENGTH` 的交易对
   - 但考虑到可能没有足够的交易对，建议只排序，不严格过滤

---

## 📊 预期效果

### 优化前

- 按 `signalScore` 排序，取前8个
- 信号强度：5, 5, 5, 5, 6, 6, 7, 7（可能的情况）
- 问题：信号强度普遍偏低

### 优化后

- 按 `signal_strength` 排序，取前8个
- 信号强度：7, 7, 8, 8, 9, 9, 10, 10（理想情况）
- 效果：优先选择高质量信号，提升胜率

---

## ⚠️ 注意事项

1. **性能考虑**：
   - 计算 `signal_strength` 需要额外的计算量
   - 但考虑到已经获取了所有技术指标，计算量增加有限
   - 可以通过缓存优化

2. **交易对数量**：
   - 如果严格过滤，可能导致交易对数量不足
   - 建议：只排序，不严格过滤（保留所有符合条件的交易对）

3. **信号强度分布**：
   - 如果市场整体信号强度偏低，可能仍然会出现5-7的情况
   - 这是正常的，说明当前市场条件不够理想

---

## 🔧 实施建议

### 阶段1：按signal_strength排序（立即实施）

1. 在 `market_scanner.py` 中集成 `signal_strength` 计算
2. 按 `signal_strength` 排序，而不是按 `signalScore` 排序
3. 保持 `TOP_N_SYMBOLS = 8`，但优先选择信号强度高的

### 阶段2：可选优化（后续考虑）

1. 在扫描阶段过滤掉 `signal_strength < MIN_SIGNAL_STRENGTH` 的交易对
2. 如果过滤后交易对数量不足，降低 `MIN_SIGNAL_STRENGTH` 或增加 `TOP_N_SYMBOLS`

---

## 📝 代码修改点

### 1. market_scanner.py

**需要修改**：
- `_get_symbol_change` 方法：添加 `signal_strength` 计算
- `scan_market` 方法：按 `signal_strength` 排序

**需要访问**：
- `TradingStrategy._analyze_trade_signal` 方法
- 或者，将信号强度计算逻辑提取为独立函数

### 2. 可选：提取信号强度计算逻辑

**建议**：
- 将 `_analyze_trade_signal` 中的信号强度计算逻辑提取为独立函数
- 在 `market_scanner.py` 和 `strategy.py` 中复用

---

## ✅ 总结

**问题**：
- 当前按 `signalScore` 排序，但实际交易判断用的是 `signal_strength`
- 导致信号强度普遍偏低（5-7）

**解决方案**：
- 在扫描阶段预先计算 `signal_strength`
- 按 `signal_strength` 排序，优先选择高质量信号
- 预期信号强度分布：7-10分（而不是5-7分）

**实施优先级**：
- **高**：按 `signal_strength` 排序（立即实施）
- **中**：在扫描阶段过滤低质量信号（可选）
