181 lines
4.8 KiB
Markdown
181 lines
4.8 KiB
Markdown
# 市场扫描优化分析
|
||
|
||
## 🔍 当前情况
|
||
|
||
### 扫描流程
|
||
|
||
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
|