176 lines
5.4 KiB
Markdown
176 lines
5.4 KiB
Markdown
# 交易对筛选优化方案(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` 排序(立即实施)
|
||
- **中**:在扫描阶段过滤低质量信号(可选)
|