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