auto_trade_sys/docs/TRADING_LOSS_ANALYSIS_2026-02-04.md
薇薇安 6bee742413 1
2026-02-04 11:22:33 +08:00

90 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 交易异常与数据库优化分析报告 (2026-02-04)
## 1. 数据库连接异常分析
### 问题描述
用户反馈在 2026-02-04 02:28 左右出现 `(1040, 'Too many connections')` 错误。
### 原因分析
检查 `backend/database/connection.py` 代码发现,原有的数据库连接管理使用了 `pymysql.connect` 直接建立连接,虽然使用了 `contextmanager` 确保关闭,但在高并发或频繁请求下(如策略扫描、推荐系统同时运行),会频繁创建和销毁连接。
MySQL 建立连接开销较大,且如果不使用连接池,每一个 API 请求或后台任务都会占用一个物理连接。当并发量瞬间增加时,很容易达到 MySQL 的最大连接数限制(默认通常是 151
### 解决方案(已实施)
已修改 `backend/database/connection.py`,引入了 `SQLAlchemy` 的连接池 (`QueuePool`) 机制。
- **连接池配置**
- `pool_size=20`: 基础连接池大小保持 20 个活跃连接。
- `max_overflow=30`: 高峰期可临时增加 30 个连接(总计 50 个)。
- `pool_recycle=3600`: 连接存活 1 小时后回收,防止 MySQL 8小时超时断开问题。
- `pool_pre_ping=True`: 每次获取连接前自动检测有效性,防止获取到已断开的连接。
此优化将显著降低数据库连接开销,彻底解决 "Too many connections" 问题。
---
## 2. ZROUSDT 50% 亏损交易分析
### 交易详情
- **交易对**: ZROUSDT
- **方向**: 做多 (BUY)
- **开仓时间**: 2026-02-04 02:28 (大致)
- **入场价**: 1.7978
- **止损价**: 1.68307
- **止损触发价**: 1.6819 (实际平仓价)
- **杠杆倍数**: 8x
- **盈亏比例**: -51.57%
### 亏损原因深度拆解
1. **价格波动幅度**:
止损距离 = (1.7978 - 1.68307) / 1.7978 ≈ **6.38%**
实际平仓跌幅 = (1.7978 - 1.6819) / 1.7978 ≈ **6.45%**
2. **杠杆放大效应**:
盈亏比例 = 价格跌幅 × 杠杆倍数
盈亏比例 = 6.45% × 8 ≈ **51.6%**
**结论**: 此次 -51.57% 的亏损在数学上是完全符合预期的。
当策略允许 **6.4%** 的止损宽度,并且强制使用 **8倍** 杠杆时,一旦止损触发,本金(保证金)必然损失 **51%**
3. **资金风险 vs 本金风险**:
虽然单笔交易损失了 50% 的保证金,但系统是基于 `FIXED_RISK_PERCENT` (默认 2%) 来计算仓位的。
- 假设账户余额 100 U风险 2 U。
- 止损距离 6.4%,风险 2 U => 仓位价值 = 2 / 6.4% ≈ 31.25 U。
- 杠杆 8x => 占用保证金 = 31.25 / 8 ≈ 3.9 U。
- 亏损 2 U。
- 亏损占保证金比例 = 2 / 3.9 ≈ **51%**
**关键点**: 实际上账户总资产仅损失了预设的 **2%**符合风控但对于这笔具体的交易单其保证金损失过半视觉冲击力极强且接近强平线8倍杠杆强平线约在 -12.5% 跌幅6.4% 已经走了一半)。
### 优化建议
为了避免出现单笔交易亏损 > 30% 甚至接近强平的情况,建议引入 **动态杠杆 (Dynamic Leverage)** 机制。
#### 建议方案:基于止损宽度的动态杠杆
不应固定使用 8x 杠杆,而应根据止损距离自动调整杠杆。
**公式**: `建议杠杆 = 目标最大单单亏损率 / 止损宽度`
假设我们希望单笔交易止损时,保证金亏损不超过 **20%** (MAX_ROE_LOSS = 0.2)
- **当前案例 (ZRO)**: 止损宽度 6.4%。
- 建议杠杆 = 20% / 6.4% ≈ **3.1倍**
- 如果使用 3x 杠杆:
- 仓位价值不变(仍由 2% 总账户风险决定)。
- 保证金占用增加(从 3.9U 变为 10.4U)。
- 亏损仍为 2U。
- **保证金亏损率 = 2 / 10.4 ≈ 19.2%**。
**优点**:
1. 降低强平风险3x 杠杆强平线在 -33%,远低于 -6.4%)。
2. 心理体验更好(亏损比例控制在 20% 以内)。
3. 资金利用率更健康(高波动币种自动降低杠杆,低波动币种可维持高杠杆)。
#### 后续行动计划
1.`config.py` 中添加 `DYNAMIC_LEVERAGE_ENABLED = True``MAX_SINGLE_TRADE_LOSS_PERCENT = 20` (单单最大本金亏损率)。
2. 修改 `risk_manager.py`,在计算仓位前,先根据 `stop_loss_price` 计算最大允许杠杆,并取 `min(CONFIG_LEVERAGE, dynamic_leverage)`
---
**总结**:
- 数据库连接问题已通过引入连接池修复。
- ZROUSDT 交易逻辑正常,大比例亏损源于 **宽止损 + 高固定杠杆** 的组合。建议实施动态杠杆优化。