Initial commit

This commit is contained in:
freedakgmail
2026-07-17 18:49:07 +08:00
commit 9c7d7abdd4
100 changed files with 41337 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
# 🔍 系统性算法搜索结果 (v5.3 内存回测引擎)
> 生成时间: 2026-02-26 08:19
## 搜索配置
| 项目 | 值 |
|------|----|
| 本金 | ¥200,000 |
| Phase 1 筛选期 | 2025-07-01 ~ 2025-09-30 |
| Phase 2 验证期 | 2025-01-02 ~ 2026-02-25 |
| 组合总数 | 70,400 → 剪枝后 21,120 |
| Phase 1 耗时 | 913s (23.1次/秒) |
| Phase 2 耗时 | 8s |
| 总耗时 | 922s (15.4分钟) |
## 🏆 全期间 Top 30
| 排名 | 全期盈利 | Q3盈利 | 真实收益 | 年化 | 胜率 | 盈亏比 | 回撤 | 交易 | 持仓天 | 策略 |
|------|---------|-------|---------|------|------|--------|------|------|--------|------|
| 🏆 | ¥+68,330 | ¥+43,258 | +25.6% | +22.0% | 44.6% | 1.80 | 8.6% | 488 | 16d | `TP12|SL6|delay3|h≤30|10%|SW` |
| 🥈 | ¥+68,330 | ¥+43,258 | +25.6% | +22.0% | 44.6% | 1.80 | 8.6% | 488 | 16d | `TP12|SL6|trig≥1|delay3|h≤30|10%|SW` |
| 🥉 | ¥+57,452 | ¥+42,404 | +22.0% | +18.9% | 46.3% | 1.62 | 11.2% | 414 | 16d | `TP12|SL6|delay3|h≤30|15%|SW` |
| #4 | ¥+57,452 | ¥+42,404 | +22.0% | +18.9% | 46.3% | 1.62 | 11.2% | 414 | 16d | `TP12|SL6|trig≥1|delay3|h≤30|15%|SW` |
| #5 | ¥+48,554 | ¥+44,714 | +19.4% | +16.7% | 54.7% | 1.60 | 14.6% | 324 | 32d | `TP10|SL8|ign|15%|SW` |
| #6 | ¥+48,554 | ¥+44,714 | +19.4% | +16.7% | 54.7% | 1.60 | 14.6% | 324 | 32d | `TP10|SL8|trig≥1|ign|15%|SW` |
| #7 | ¥+36,958 | ¥+44,291 | +14.0% | +12.1% | 39.4% | 1.88 | 15.4% | 421 | 16d | `TP12|SL6|h≤60|15%|SW` |
| #8 | ¥+36,958 | ¥+44,291 | +14.0% | +12.1% | 39.4% | 1.88 | 15.4% | 421 | 16d | `TP12|SL6|delay1|h≤60|15%|SW` |
| #9 | ¥+36,958 | ¥+44,291 | +14.0% | +12.1% | 39.4% | 1.88 | 15.4% | 421 | 16d | `TP12|SL6|trig≥1|h≤60|15%|SW` |
| #10 | ¥+36,958 | ¥+44,291 | +14.0% | +12.1% | 39.4% | 1.88 | 15.4% | 421 | 16d | `TP12|SL6|trig≥1|delay1|h≤60|15%|SW` |
| #11 | ¥+34,113 | ¥+42,664 | +14.1% | +12.2% | 45.9% | 1.47 | 9.5% | 470 | 17d | `TP12|SL8|delay3|h≤30|10%|SW` |
| #12 | ¥+34,113 | ¥+42,664 | +14.1% | +12.2% | 45.9% | 1.47 | 9.5% | 470 | 17d | `TP12|SL8|trig≥1|delay3|h≤30|10%|SW` |
| #13 | ¥+24,766 | ¥+44,310 | +9.8% | +8.5% | 40.1% | 1.64 | 16.1% | 419 | 15d | `TP12|SL8|h≤60|15%|SW` |
| #14 | ¥+24,766 | ¥+44,310 | +9.8% | +8.5% | 40.1% | 1.64 | 16.1% | 419 | 15d | `TP12|SL8|delay1|h≤60|15%|SW` |
| #15 | ¥+24,766 | ¥+44,310 | +9.8% | +8.5% | 40.1% | 1.64 | 16.1% | 419 | 15d | `TP12|SL8|trig≥1|h≤60|15%|SW` |
| #16 | ¥+24,766 | ¥+44,310 | +9.8% | +8.5% | 40.1% | 1.64 | 16.1% | 419 | 15d | `TP12|SL8|trig≥1|delay1|h≤60|15%|SW` |
| #17 | ¥+24,481 | ¥+44,291 | +9.7% | +8.4% | 41.5% | 1.71 | 19.0% | 414 | 15d | `TP12|SL6|15%|SW` |
| #18 | ¥+24,481 | ¥+44,291 | +9.7% | +8.4% | 41.5% | 1.71 | 19.0% | 414 | 15d | `TP12|SL6|delay1|15%|SW` |
| #19 | ¥+24,481 | ¥+44,291 | +9.7% | +8.4% | 41.5% | 1.71 | 19.0% | 414 | 15d | `TP12|SL6|trig≥1|15%|SW` |
| #20 | ¥+24,481 | ¥+44,291 | +9.7% | +8.4% | 41.5% | 1.71 | 19.0% | 414 | 15d | `TP12|SL6|trig≥1|delay1|15%|SW` |
| #21 | ¥+24,300 | ¥+43,692 | +10.7% | +9.2% | 45.5% | 1.31 | 16.3% | 322 | 26d | `TP12|SL6|ign|h≤60|15%|SW` |
| #22 | ¥+24,300 | ¥+43,692 | +10.7% | +9.2% | 45.5% | 1.31 | 16.3% | 322 | 26d | `TP12|SL6|trig≥1|ign|h≤60|15%|SW` |
| #23 | ¥+23,782 | ¥+46,040 | +10.4% | +9.1% | 61.5% | 1.41 | 11.3% | 381 | 31d | `T8/3|SL12|ign|h≤60|8%|SW` |
| #24 | ¥+23,782 | ¥+46,040 | +10.4% | +9.1% | 61.5% | 1.41 | 11.3% | 381 | 31d | `T8/3|SL12|trig≥1|ign|h≤60|8%|SW` |
| #25 | ¥+22,348 | ¥+43,048 | +9.9% | +8.6% | 45.8% | 1.31 | 13.2% | 271 | 32d | `TP12|SL6|ign|15%|SW` |
| #26 | ¥+22,348 | ¥+43,048 | +9.9% | +8.6% | 45.8% | 1.31 | 13.2% | 271 | 32d | `TP12|SL6|trig≥1|ign|15%|SW` |
| #27 | ¥+17,570 | ¥+44,310 | +7.2% | +6.2% | 42.1% | 1.55 | 19.6% | 437 | 15d | `TP12|SL8|15%|SW` |
| #28 | ¥+17,570 | ¥+44,310 | +7.2% | +6.2% | 42.1% | 1.55 | 19.6% | 437 | 15d | `TP12|SL8|delay1|15%|SW` |
| #29 | ¥+17,570 | ¥+44,310 | +7.2% | +6.2% | 42.1% | 1.55 | 19.6% | 437 | 15d | `TP12|SL8|trig≥1|15%|SW` |
| #30 | ¥+17,570 | ¥+44,310 | +7.2% | +6.2% | 42.1% | 1.55 | 19.6% | 437 | 15d | `TP12|SL8|trig≥1|delay1|15%|SW` |
## 新冠军 vs 之前冠军
| 指标 | 之前冠军 | 新冠军 |
|------|---------|-------|
| 策略 | `v5.2|忽略卖出+TP10+SL8+信号加权` | `TP12|SL6|delay3|h≤30|10%|SW` |
| 全期盈利 | ¥+56,375 | ¥+68,330.5 |
| 真实收益 | +21.5% | +25.6% |
| 年化 | +18.5% | +22.0% |
| 胜率 | 61.2% | 44.6% |
| 盈亏比 | 2.30 | 1.80 |
| 回撤 | - | 8.6% |
🎉 **新纪录!**
## 维度影响分析
### 仓位比例
| 仓位 | 数量 | 平均盈利 | 最优盈利 |
|------|------|---------|--------|
| 8% | 12 | ¥+15,474 | ¥+23,782 |
| 10% | 10 | ¥+24,178 | ¥+68,330 |
| 15% | 38 | ¥+22,253 | ¥+57,452 |
### 信号加权
| 模式 | 数量 | 平均盈利 | 最优盈利 |
|------|------|---------|--------|
| 等权 | 12 | ¥+9,208 | ¥+12,809 |
| 加权 | 48 | ¥+24,220 | ¥+68,330 |
### 止损线
| 止损 | 数量 | 平均盈利 | 最优盈利 |
|------|------|---------|--------|
| 6% | 16 | ¥+36,914 | ¥+68,330 |
| 8% | 14 | ¥+24,955 | ¥+48,554 |
| 10% | 18 | ¥+11,668 | ¥+17,066 |
| 12% | 12 | ¥+10,254 | ¥+23,782 |
@@ -0,0 +1,187 @@
# 2025年 vs 2026年 行情对比分析
> 生成时间: 2026-02-25
> 回测算法: Top 3 最挣钱算法 × 日线/5分钟定价
---
## 一、各季度利润分布(最优算法 v4|触发≥2+止盈10+损8)
| 季度 | 盈亏(元) | 真实收益 | 胜率 | 交易数 | 盈亏比 | 回撤% |
|------|---------|---------|------|-------|--------|-------|
| 2025-Q1 | +195 | +4.8% | 33.3% | 6 | 1.83 | 5.7% |
| 2025-Q2 | 0 | 0% | - | 0 | - | - |
| 2025-Q3 | +5,415 | +4.2% | 39.5% | 76 | 1.46 | 4.4% |
| 2025-Q4 | +6,450 | +4.0% | 47.5% | 80 | 1.41 | 5.1% |
| **2026-Q1(32天)** | **+20,720** | **+15.5%** | **57.7%** | **52** | **4.02** | **2.8%** |
> **亮点**: 2026年32天盈利(+20,720) > 2025年全年243天盈利(+20,600)
---
## 二、2025全年 vs 2026开年 关键指标对比
| 指标 | 2025全年(243个交易日) | 2026开年(32个交易日) | 差异 |
|------|---------------------|---------------------|------|
| 总盈利 | +¥20,600 | **+¥20,720** | 32天 > 243天 ✨ |
| 真实收益率 | 13.4% | **15.5%** | +2.1% |
| 年化收益(CAGR) | 13.5% | **111.2%**(简单) | 效率差8倍 |
| 胜率 | 44.9% | **57.7%** | +12.8% |
| 盈亏比 | 1.73 | **4.02** | 2.3倍 |
| 最大回撤 | 4.3% | **2.8%** | 更安全 |
| 日均盈利 | ¥85/天 | **¥648/天** | **7.6倍** |
| 交易次数 | 156笔 | 52笔 | - |
---
## 三、Top 3 算法全部数据
### 3.1 完整期间(2025-01-02 ~ 2026-02-25, 420天)
| 算法 | 定价 | 盈亏(元) | 占用资金 | 真实收益 | 年化(CAGR) | 胜率 | 回撤% | 盈亏比 | 交易 |
|------|------|---------|---------|---------|-----------|------|-------|--------|------|
| 🏆 v4\|触发≥2+止盈10+损8 | 日线 | +34,285 | ¥153,490 | +22.3% | **+19.2%** | 46.5% | 4.3% | 1.98 | 202 |
| 🏆 v4\|触发≥2+止盈10+损8 | 5分钟 | +22,860 | ¥160,740 | +14.2% | **+12.3%** | 42.5% | 4.2% | 1.70 | 188 |
| 🥈 v3\|止盈10+损8 | 日线 | +18,575 | ¥158,655 | +11.7% | +10.1% | 40.0% | 5.0% | 1.60 | 210 |
| 🥈 v3\|止盈10+损8 | 5分钟 | +13,555 | ¥160,740 | +8.4% | +7.3% | 39.0% | 6.3% | 1.50 | 190 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 日线 | +24,700 | ¥158,655 | +15.6% | +13.4% | 43.1% | 6.9% | 1.71 | 204 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 5分钟 | +13,015 | ¥161,995 | +8.0% | +7.0% | 44.1% | 5.7% | 1.46 | 186 |
### 3.2 仅2025年(2025-01-02 ~ 2025-12-31, 243个交易日)
| 算法 | 定价 | 盈亏(元) | 占用资金 | 真实收益 | 年化(CAGR) | 胜率 | 回撤% | 盈亏比 | 交易 |
|------|------|---------|---------|---------|-----------|------|-------|--------|------|
| 🏆 v4\|触发≥2+止盈10+损8 | 日线 | +20,600 | ¥153,490 | +13.4% | +13.5% | 44.9% | 4.3% | 1.73 | 156 |
| 🏆 v4\|触发≥2+止盈10+损8 | 5分钟 | +9,765 | ¥160,740 | +6.1% | +6.1% | 43.1% | 4.2% | 1.38 | 144 |
| 🥈 v3\|止盈10+损8 | 日线 | +6,380 | ¥158,655 | +4.0% | +4.0% | 36.2% | 5.0% | 1.23 | 160 |
| 🥈 v3\|止盈10+损8 | 5分钟 | +2,230 | ¥160,740 | +1.4% | +1.4% | 37.3% | 6.3% | 1.10 | 150 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 日线 | +7,280 | ¥158,655 | +4.6% | +4.6% | 38.5% | 6.9% | 1.23 | 156 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 5分钟 | +7,515 | ¥161,995 | +4.6% | +4.7% | 41.9% | 5.7% | 1.31 | 148 |
### 3.3 仅2026年(2026-01-05 ~ 2026-02-25, 32个交易日)
| 算法 | 定价 | 盈亏(元) | 占用资金 | 真实收益 | 年化(简单) | 胜率 | 回撤% | 盈亏比 | 交易 |
|------|------|---------|---------|---------|-----------|------|-------|--------|------|
| 🏆 v4\|触发≥2+止盈10+损8 | 日线 | +20,720 | ¥133,345 | +15.5% | +111.2% | 57.7% | 2.8% | 4.02 | 52 |
| 🏆 v4\|触发≥2+止盈10+损8 | 5分钟 | +14,230 | ¥131,700 | +10.8% | +77.3% | 48.0% | 3.0% | 3.00 | 50 |
| 🥈 v3\|止盈10+损8 | 日线 | +21,590 | ¥136,470 | +15.8% | +113.2% | 60.7% | 2.6% | 6.03 | 56 |
| 🥈 v3\|止盈10+损8 | 5分钟 | +13,290 | ¥139,570 | +9.5% | +68.2% | 56.0% | 3.2% | 4.02 | 50 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 日线 | **+23,340** | ¥136,470 | **+17.1%** | **+122.4%** | **65.4%** | 3.2% | **7.72** | 52 |
| 🥉 v4.2-K1\|延迟2天+止盈10+损8 | 5分钟 | **+16,835** | ¥136,500 | **+12.3%** | **+88.3%** | **65.2%** | 3.2% | **6.23** | 46 |
> **注意**: 2026年仅32个交易日(约51天),使用**简单年化**(收益率×365/天数),数值偏高仅供参考
---
## 四、月度市场表现(全市场平均日涨跌幅)
| 月份 | 平均日涨跌% | 趋势 | 平均收盘价 | 覆盖股票数 |
|------|-----------|------|-----------|-----------|
| 2025-01 | +0.30% | 🟢 | ¥3.97 | 26 |
| 2025-02 | +0.42% | 🟢 | ¥3.60 | 25 |
| 2025-03 | +0.40% | 🟢 | ¥3.21 | 28 |
| 2025-04 | +0.45% | 🟢 | ¥4.08 | 31 |
| 2025-05 | +0.13% | 🟢 | ¥19.98 | 5,142 |
| 2025-06 | +0.37% | 🟢 | ¥20.81 | 5,156 |
| 2025-07 | +0.24% | 🟢 | ¥22.19 | 5,425 |
| 2025-08 | +0.36% | 🟢 | ¥24.74 | 5,427 |
| 2025-09 | +0.04% | 🟢 | ¥26.02 | 5,438 |
| 2025-10 | +0.23% | 🟢 | ¥26.13 | 5,444 |
| 2025-11 | +0.02% | 🟢 | ¥26.03 | 5,454 |
| 2025-12 | +0.11% | 🟢 | ¥26.30 | 5,472 |
| **2026-01** | **+0.40%** | 🟢 | **¥29.38** | 5,478 |
| **2026-02** | **+0.15%** | 🟢 | **¥29.50** | 5,484 |
---
## 五、季度市场表现
| 季度 | 交易日 | 日均涨跌% | 趋势 | 波动率 |
|------|-------|----------|------|--------|
| 2025-Q1 | 57 | +0.370% | 🟢 强 | 4.066 |
| 2025-Q2 | 60 | +0.336% | 🟢 中 | 2.536 |
| 2025-Q3 | 66 | +0.212% | 🟢 弱 | 2.612 |
| 2025-Q4 | 60 | +0.115% | 🟢 最弱 | 2.671 |
| **2026-Q1(至今)** | **32** | **+0.304%** | **🟢 强** | **2.823** |
---
## 六、扫描信号分布对比
| 年份 | 总信号 | 买入信号 | 买入占比 | 强买(≥2触发) | 卖出信号 | 卖出占比 |
|------|-------|---------|---------|-------------|---------|---------|
| 2025 | 1,429,106 | 3,601 | 0.3% | 1,151 | 674,076 | **47.2%** |
| 2026 | 369,614 | 682 | 0.2% | 218 | 148,141 | **40.1%** |
> 2026年卖出信号占比下降7.1个百分点 → 市场做多环境改善
---
## 七、为什么2026年开年行情远好于2025年?
### 1. 🟢 市场整体回暖
2025年Q4是全年最弱季度(日均+0.115%),经过调整后,2026年1月日均涨幅反弹至 **+0.400%**,是Q4的 **3.5倍**。这是典型的**春季行情**特征:
- 年初资金回流
- 政策利好预期(两会前)
- 前期调整充分,估值修复
### 2. 📈 胜率暴增 12.8%
| 指标 | 2025全年 | 2026年 |
|------|---------|--------|
| 胜率 | 44.9% | **57.7%** |
当市场整体趋势向上时,买入信号本身的成功概率天然更高。这不是算法改变了,而是**市场环境配合了算法**。
### 3. 📊 盈亏比从 1.73 飙升到 4.02
- 赚钱时赚得更多(趋势延续性好,更容易触发止盈)
- 亏钱时亏得更少(回调幅度小,止损线更不容易被触及)
### 4. 🔻 卖出信号减少 → 做多空间更大
- 2025年:47.2% 信号是卖出 → 市场偏空
- 2026年:40.1% 信号是卖出 → 做多环境明显改善
### 5. 💡 延迟卖出策略在2026年最优
2026年 v4.2-K1(延迟2天卖出)成为最挣钱算法:
- +23,34017.1%vs 2025年仅 +7,2804.6%
- 说明2026年趋势更强,延迟卖出可以捕获更多上涨空间
---
## 八、结论与展望
### ✅ 核心结论
1. **2026年开年行情确实远好于2025年**32天盈利超过2025全年
2. 同一算法在不同市场环境下表现差异巨大:牛市年化100%+ vs 熊市年化4%
3. 算法的核心价值不在于"预测涨跌",而在于**在好行情中放大收益,在差行情中控制亏损**
### 📊 算法表现的市场敏感度
| 市场环境 | 代表期间 | 最优算法年化 | 胜率 |
|---------|---------|------------|------|
| 强趋势(日均>+0.3% | 2026-Q1 | **111%+** | 57%+ |
| 中等趋势(日均+0.2-0.3% | 2025-Q3 | ~10% | ~40% |
| 弱势/震荡(日均<+0.2% | 2025-Q4 | ~4% | ~47% |
### 🔮 2026全年展望
- 如果维持Q1水平 → 年化可达 **80-120%**
- 如果回落到2025平均水平 → 年化约 **15-20%**
- **保守预期**: 全年年化 **20-30%**(仍是银行存款2.5%的 8-12倍)
---
## 附录:年化计算方法说明
| 回测天数 | 年化方法 | 公式 |
|---------|---------|------|
| < 90天 | **简单年化** | `收益率 × 365 / 天数` |
| ≥ 90天 | **复利年化(CAGR)** | `(1 + 收益率)^(365/天数) - 1` |
> 短期(<90天)使用简单年化避免复利效应过度放大;长期(≥90天)使用CAGR更准确反映实际复利增长。
+42
View File
@@ -0,0 +1,42 @@
# 回测场景对比 v4.2(真实资金收益率版)
回测区间: 2025-01-02 ~ 2026-02-25
> ⚠️ **真实收益率** = 盈亏 / 最大同时占用资金(非总周转金额)
## 对比结果
| 场景 | 盈亏(元) | 占用资金 | 真实收益 | 真实年化 | 胜率 | 回撤% | 持仓天 | 盈亏比 | 交易 | 标注 |
|------|---------|---------|---------|---------|------|-------|--------|--------|------|------|
| v3|仅信号 | +6,310 | ¥155,430 | +4.1% | +3.5% | 40.5% | 6.4% | 20天 | 1.22 | 178 | |
| v3|止盈10+损8 | +49,500 | ¥174,120 | +28.4% | +24.4% | 47.8% | 3.3% | 14天 | 2.65 | 222 | 🛡️回撤最小 |
| v4|触发≥2+止盈10+损8 | +53,100 | ¥160,410 | +33.1% | +28.3% | 47.2% | 3.8% | 13天 | 2.42 | 212 | 🏆收益最高 |
| v4|触发≥2+跟踪6-3+损5 | +22,250 | ¥153,260 | +14.5% | +12.5% | 43.5% | 4.3% | 12天 | 1.65 | 216 | |
| v4.1|忽略卖出+止盈10+损8 | +23,670 | ¥130,180 | +18.2% | +15.7% | 57.9% | 6.0% | 31天 | 2.09 | 118 | 🎯胜率最高 |
| v4.1|忽略+跟踪8-3+损5+20天 | +33,170 | ¥152,540 | +21.8% | +18.7% | 49.6% | 4.8% | 13天 | 1.98 | 243 | |
| v4.2-K1|延迟2天+止盈10+损8 | +48,920 | ¥174,120 | +28.1% | +24.1% | 50.0% | 3.3% | 16天 | 2.78 | 208 | ⚖️盈亏比最佳 |
| v4.2-K2|延迟2天+触发≥2+止盈10+损8 | +35,260 | ¥160,950 | +21.9% | +18.8% | 47.5% | 4.0% | 14天 | 1.93 | 202 | |
| v4.2-K3|延迟2天+跟踪8-3+损5 | -550 | ¥158,690 | -0.3% | -0.3% | 41.1% | 10.9% | 14天 | 0.99 | 224 | |
| v4.2-K4|延迟2天+跟踪6-3+损5 | +10,660 | ¥158,690 | +6.7% | +5.8% | 49.1% | 6.8% | 14天 | 1.32 | 220 | |
| v4.2-K5|延迟2天+触发≥2+跟踪8-3+损5 | +21,420 | ¥153,260 | +14.0% | +12.1% | 42.9% | 4.6% | 13天 | 1.52 | 210 | |
| v4.2-K6|延迟2天+触发≥2+跟踪6-3+损8 | +22,470 | ¥155,140 | +14.5% | +12.5% | 52.0% | 5.5% | 14天 | 1.68 | 196 | |
| v4.2-L1|延迟3天+止盈10+损8 | +20,020 | ¥136,730 | +14.6% | +12.6% | 48.9% | 7.8% | 18天 | 1.66 | 180 | |
| v4.2-L2|延迟3天+触发≥2+止盈10+损8 | +36,940 | ¥160,950 | +22.9% | +19.7% | 49.5% | 4.2% | 16天 | 2.02 | 186 | |
| v4.2-L3|延迟3天+跟踪8-3+损5 | +1,680 | ¥136,840 | +1.2% | +1.1% | 44.4% | 14.4% | 17天 | 1.04 | 198 | |
| v4.2-L4|延迟3天+触发≥2+跟踪6-3+损5 | +30,540 | ¥153,260 | +19.9% | +17.1% | 50.0% | 7.3% | 13天 | 1.89 | 208 | |
| v4.2-M1|延迟2天+盈保5%+止盈10+损8 | +44,330 | ¥174,120 | +25.5% | +21.9% | 49.0% | 3.3% | 16天 | 2.55 | 208 | |
| v4.2-M2|延迟2天+盈保5%+触发≥2+止盈10+损8 | +24,860 | ¥160,950 | +15.4% | +13.3% | 46.5% | 4.0% | 14天 | 1.67 | 198 | |
| v4.2-M3|延迟3天+跟踪8-3+损5+30天 | +7,850 | ¥153,260 | +5.1% | +4.5% | 50.0% | 8.3% | 14天 | 1.20 | 228 | |
| v4.2-M4|延迟2天+触发≥2+跟踪8-3+损5+30天 | +25,020 | ¥153,260 | +16.3% | +14.1% | 45.8% | 4.5% | 12天 | 1.65 | 214 | |
## 指标说明
| 指标 | 说明 |
|------|------|
| 占用资金 | 回测期间最大同时持仓成本 |
| 真实收益 | 盈亏 / 最大占用资金 × 100% |
| 真实年化 | 按持续期折算年化(复利公式) |
| 回撤% | 最大回撤 / 最大占用资金 × 100% |
| 盈亏比 | 总盈利金额 / 总亏损金额 |
| 延迟N天 | 连续N天推荐卖出才执行卖出 |
+195
View File
@@ -0,0 +1,195 @@
# 💰 20万本金 × 按季度投资 × 多算法对比回测
> 生成时间: 2026-02-25 21:09
## 回测配置 (v5.2 动态仓位)
| 参数 | 值 |
|------|----|
| 本金 | ¥200,000 (唯一约束) |
| 单只上限 | 无(受总资金约束) |
| 最大持仓 | 无(受总资金约束) |
| 每笔仓位 | 动态: 总资金×5% = ¥10,000/笔 |
| 每笔股数 | 动态(根据股价自动计算,取整到100股) |
| 股价区间 | 无 |
| 每日最多买入 | 无 |
| 冷却期 | 3天 |
| 年化方法 | <90天用简单(S),≥90天用复利CAGR(C) |
## 算法说明
| # | 算法 | 参数说明 |
|---|------|--------|
| 1 | v3|基线(TP10+SL8) | take_profit_pct=10, stop_loss_pct=8 |
| 2 | v4|触发≥2+TP10+SL8 | min_buy_triggered=2, take_profit_pct=10, stop_loss_pct=8 |
| 3 | v4.2|延迟2天+TP10+SL8 | sell_confirm_days=2, take_profit_pct=10, stop_loss_pct=8 |
| 4 | v4|忽略卖出+TP10+SL8 | ignore_sell_signal=True, take_profit_pct=10, stop_loss_pct=8 |
| 5 | v4|触发≥2+TP15+SL8 | min_buy_triggered=2, take_profit_pct=15, stop_loss_pct=8 |
| 6 | v4|触发≥2+TP10+SL5 | min_buy_triggered=2, take_profit_pct=10, stop_loss_pct=5 |
| 7 | v4.2|延迟2天+触发≥2+TP10+SL8 | sell_confirm_days=2, min_buy_triggered=2, take_profit_pct=10, stop_loss_pct=8 |
| 8 | v4.1|跟踪止盈8/3+SL5 | ignore_sell_signal=True, trailing_start_pct=8, trailing_gap_pct=3, stop_loss_pct=5 |
| 9 | v4.1|跟踪止盈8/3+触发≥2+SL5 | ignore_sell_signal=True, trailing_start_pct=8, trailing_gap_pct=3, stop_loss_pct=5, min_buy_triggered=2 |
| 10 | v4|触发≥2+TP10+SL8+持仓≤30天 | min_buy_triggered=2, take_profit_pct=10, stop_loss_pct=8, max_hold_days=30 |
| 11 | v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | sell_confirm_days=2, min_buy_triggered=2, take_profit_pct=10, stop_loss_pct=8, signal_weight=True |
| 12 | v5.2|忽略卖出+TP10+SL8+信号加权 | ignore_sell_signal=True, take_profit_pct=10, stop_loss_pct=8, signal_weight=True |
| 13 | v5.2|跟踪止盈8/3+SL5+信号加权 | ignore_sell_signal=True, trailing_start_pct=8, trailing_gap_pct=3, stop_loss_pct=5, signal_weight=True |
## 一、盈亏对比(元)
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | -5,413 | +726 | +8,865 | -23,015 | +19,566 | +10,128 |
| v4|触发≥2+TP10+SL8 | +235 | +0 | +9,380 | +3,954 | +15,138 | +38,214 |
| v4.2|延迟2天+TP10+SL8 | -7,253 | +726 | +8,510 | -14,404 | +20,594 | +24,818 |
| v4|忽略卖出+TP10+SL8 | -7,469 | +726 | +18,660 | -12,454 | +21,573 | +46,303 |
| v4|触发≥2+TP15+SL8 | +235 | +0 | +7,064 | +95 | +13,126 | +31,840 |
| v4|触发≥2+TP10+SL5 | +235 | +0 | +4,319 | +3,500 | +9,442 | +28,637 |
| v4.2|延迟2天+触发≥2+TP10+SL8 | -1,605 | +0 | +12,402 | +8 | +13,774 | +34,754 |
| v4.1|跟踪止盈8/3+SL5 | -4,934 | +726 | +4,990 | -4,034 | +13,361 | -18,546 |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | -2,609 | +0 | +20,002 | +2,733 | +7,244 | +43,784 |
| v4|触发≥2+TP10+SL8+持仓≤30天 | +235 | +0 | +8,976 | +4,491 | +15,318 | +36,754 |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | -2,010 | +0 | +17,160 | -713 | +22,334 | +44,039 |
| v5.2|忽略卖出+TP10+SL8+信号加权 | -8,369 | +726 | +29,224 | -16,560 | +20,517 | +56,375 |
| v5.2|跟踪止盈8/3+SL5+信号加权 | -5,591 | +726 | +12,802 | -6,054 | +10,585 | -14,492 |
## 二、真实收益率(%)
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | -18.2% | +3.6% | +4.2% | -11.2% | +9.0% | +4.4% |
| v4|触发≥2+TP10+SL8 | +2.4% | +0.0% | +5.4% | +1.9% | +7.8% | +17.2% |
| v4.2|延迟2天+TP10+SL8 | -24.4% | +3.6% | +4.0% | -7.0% | +9.6% | +10.5% |
| v4|忽略卖出+TP10+SL8 | -25.1% | +3.6% | +8.2% | -5.9% | +9.7% | +18.5% |
| v4|触发≥2+TP15+SL8 | +2.4% | +0.0% | +3.9% | +0.1% | +6.3% | +14.8% |
| v4|触发≥2+TP10+SL5 | +2.4% | +0.0% | +2.8% | +1.7% | +5.2% | +13.2% |
| v4.2|延迟2天+触发≥2+TP10+SL8 | -16.1% | +0.0% | +6.8% | +0.0% | +6.5% | +15.4% |
| v4.1|跟踪止盈8/3+SL5 | -16.6% | +3.6% | +2.3% | -2.0% | +6.4% | -8.9% |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | -26.2% | +0.0% | +10.2% | +1.4% | +3.5% | +18.1% |
| v4|触发≥2+TP10+SL8+持仓≤30天 | +2.4% | +0.0% | +5.2% | +2.2% | +7.9% | +16.5% |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | -13.6% | +0.0% | +8.6% | -0.3% | +10.7% | +19.1% |
| v5.2|忽略卖出+TP10+SL8+信号加权 | -26.4% | +3.6% | +12.5% | -7.8% | +9.3% | +21.5% |
| v5.2|跟踪止盈8/3+SL5+信号加权 | -18.9% | +3.6% | +5.8% | -3.0% | +5.1% | -6.8% |
## 三、年化收益率(%)
> (S)=简单年化(<90天)(C)=复利CAGR(≥90天)
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | -75.6%(S) | +15.6%(C) | +17.9%(C) | -37.9%(C) | +64.5%(S) | +3.9%(C) |
| v4|触发≥2+TP10+SL8 | +9.8%(S) | +0.0%(C) | +23.6%(C) | +8.0%(C) | +56.1%(S) | +14.8%(C) |
| v4.2|延迟2天+TP10+SL8 | -101.3%(S) | +15.6%(C) | +17.1%(C) | -25.3%(C) | +68.7%(S) | +9.1%(C) |
| v4|忽略卖出+TP10+SL8 | -104.3%(S) | +15.6%(C) | +37.1%(C) | -21.7%(C) | +69.7%(S) | +15.9%(C) |
| v4|触发≥2+TP15+SL8 | +9.8%(S) | +0.0%(C) | +16.5%(C) | +0.2%(C) | +45.1%(S) | +12.8%(C) |
| v4|触发≥2+TP10+SL5 | +9.8%(S) | +0.0%(C) | +11.7%(C) | +7.1%(C) | +37.5%(S) | +11.4%(C) |
| v4.2|延迟2天+触发≥2+TP10+SL8 | -66.9%(S) | +0.0%(C) | +30.1%(C) | +0.0%(C) | +46.7%(S) | +13.3%(C) |
| v4.1|跟踪止盈8/3+SL5 | -69.0%(S) | +15.6%(C) | +9.6%(C) | -7.8%(C) | +45.6%(S) | -7.8%(C) |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | -108.8%(S) | +0.0%(C) | +47.6%(C) | +5.5%(C) | +25.3%(S) | +15.6%(C) |
| v4|触发≥2+TP10+SL8+持仓≤30天 | +9.8%(S) | +0.0%(C) | +22.6%(C) | +9.2%(C) | +56.8%(S) | +14.2%(C) |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | -56.4%(S) | +0.0%(C) | +39.1%(C) | -1.4%(C) | +76.2%(S) | +16.4%(C) |
| v5.2|忽略卖出+TP10+SL8+信号加权 | -109.6%(S) | +15.6%(C) | +60.4%(C) | -27.9%(C) | +66.4%(S) | +18.5%(C) |
| v5.2|跟踪止盈8/3+SL5+信号加权 | -78.2%(S) | +15.6%(C) | +25.3%(C) | -11.4%(C) | +36.2%(S) | -5.9%(C) |
## 四、胜率(%)
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | 11.1% | 100.0% | 42.4% | 41.9% | 53.1% | 45.0% |
| v4|触发≥2+TP10+SL8 | 25.0% | 0.0% | 42.6% | 44.8% | 49.3% | 44.9% |
| v4.2|延迟2天+TP10+SL8 | 11.1% | 100.0% | 45.5% | 40.8% | 56.7% | 47.8% |
| v4|忽略卖出+TP10+SL8 | 11.1% | 100.0% | 53.1% | 40.7% | 67.1% | 59.8% |
| v4|触发≥2+TP15+SL8 | 25.0% | 0.0% | 42.6% | 38.2% | 45.5% | 41.2% |
| v4|触发≥2+TP10+SL5 | 25.0% | 0.0% | 38.2% | 41.7% | 44.4% | 41.2% |
| v4.2|延迟2天+触发≥2+TP10+SL8 | 25.0% | 0.0% | 47.1% | 43.2% | 50.8% | 44.3% |
| v4.1|跟踪止盈8/3+SL5 | 30.0% | 100.0% | 46.8% | 39.8% | 61.2% | 43.3% |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | 25.0% | 0.0% | 54.7% | 45.1% | 48.4% | 48.5% |
| v4|触发≥2+TP10+SL8+持仓≤30天 | 25.0% | 0.0% | 42.6% | 44.6% | 49.3% | 46.1% |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | 25.0% | 0.0% | 47.0% | 43.3% | 52.5% | 44.8% |
| v5.2|忽略卖出+TP10+SL8+信号加权 | 11.1% | 100.0% | 57.5% | 42.9% | 66.1% | 61.2% |
| v5.2|跟踪止盈8/3+SL5+信号加权 | 30.0% | 100.0% | 45.6% | 39.6% | 56.2% | 44.2% |
## 五、盈亏比
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | 0.26 | 999.99 | 1.36 | 1.14 | 3.16 | 1.43 |
| v4|触发≥2+TP10+SL8 | 1.15 | 999.99 | 1.72 | 1.14 | 2.12 | 1.66 |
| v4.2|延迟2天+TP10+SL8 | 0.21 | 999.99 | 1.32 | 1.23 | 3.25 | 1.55 |
| v4|忽略卖出+TP10+SL8 | 0.20 | 999.99 | 2.22 | 1.27 | 4.53 | 2.16 |
| v4|触发≥2+TP15+SL8 | 1.15 | 999.99 | 1.54 | 1.00 | 2.02 | 1.58 |
| v4|触发≥2+TP10+SL5 | 1.15 | 999.99 | 1.30 | 1.12 | 1.64 | 1.48 |
| v4.2|延迟2天+触发≥2+TP10+SL8 | 0.54 | 999.99 | 1.93 | 1.00 | 1.91 | 1.56 |
| v4.1|跟踪止盈8/3+SL5 | 0.35 | 999.99 | 1.20 | 0.87 | 2.48 | 1.03 |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | 0.27 | 999.99 | 2.51 | 1.12 | 1.54 | 1.76 |
| v4|触发≥2+TP10+SL8+持仓≤30天 | 1.15 | 999.99 | 1.69 | 1.16 | 2.14 | 1.63 |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | 0.53 | 999.99 | 2.07 | 0.98 | 2.87 | 1.62 |
| v5.2|忽略卖出+TP10+SL8+信号加权 | 0.19 | 999.99 | 3.29 | 1.19 | 4.08 | 2.30 |
| v5.2|跟踪止盈8/3+SL5+信号加权 | 0.34 | 999.99 | 1.69 | 0.82 | 1.94 | 1.10 |
## 六、最大占用资金(元)
| 算法 | 2025-Q1 | 2025-Q2 | 2025-Q3 | 2025-Q4 | 2026-Q1 | 全期间 |
|------|--------|--------|--------|--------|--------|--------|
| v3|基线(TP10+SL8) | ¥29,692 | ¥19,956 | ¥210,978 | ¥205,770 | ¥217,079 | ¥228,420 |
| v4|触发≥2+TP10+SL8 | ¥9,950 | ¥0 | ¥172,570 | ¥203,834 | ¥193,078 | ¥222,459 |
| v4.2|延迟2天+TP10+SL8 | ¥29,692 | ¥19,956 | ¥211,691 | ¥205,436 | ¥214,508 | ¥235,524 |
| v4|忽略卖出+TP10+SL8 | ¥29,692 | ¥19,956 | ¥227,716 | ¥210,810 | ¥221,473 | ¥250,123 |
| v4|触发≥2+TP15+SL8 | ¥9,950 | ¥0 | ¥181,564 | ¥200,470 | ¥208,478 | ¥215,200 |
| v4|触发≥2+TP10+SL5 | ¥9,950 | ¥0 | ¥154,230 | ¥202,104 | ¥180,278 | ¥217,594 |
| v4.2|延迟2天+触发≥2+TP10+SL8 | ¥9,950 | ¥0 | ¥182,934 | ¥201,774 | ¥211,020 | ¥226,260 |
| v4.1|跟踪止盈8/3+SL5 | ¥29,668 | ¥19,956 | ¥215,702 | ¥202,549 | ¥209,646 | ¥208,376 |
| v4.1|跟踪止盈8/3+触发≥2+SL5 | ¥9,950 | ¥0 | ¥196,167 | ¥202,462 | ¥204,924 | ¥241,644 |
| v4|触发≥2+TP10+SL8+持仓≤30天 | ¥9,950 | ¥0 | ¥172,570 | ¥203,454 | ¥193,078 | ¥222,686 |
| v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | ¥14,778 | ¥0 | ¥200,032 | ¥204,190 | ¥209,762 | ¥230,860 |
| v5.2|忽略卖出+TP10+SL8+信号加权 | ¥31,682 | ¥19,956 | ¥233,843 | ¥211,248 | ¥221,145 | ¥262,252 |
| v5.2|跟踪止盈8/3+SL5+信号加权 | ¥29,668 | ¥19,956 | ¥221,058 | ¥203,087 | ¥209,122 | ¥214,326 |
## 七、🏆 各季度最优算法
| 季度 | 最优算法 | 盈利(元) | 真实收益 | 年化 | 胜率 | 盈亏比 |
|------|---------|---------|---------|------|------|--------|
| 2025-Q1 | **v4|触发≥2+TP10+SL8** | +235 | +2.4% | +9.8%(S) | 25.0% | 1.15 |
| 2025-Q2 | **v3|基线(TP10+SL8)** | +726 | +3.6% | +15.6%(C) | 100.0% | 999.99 |
| 2025-Q3 | **v5.2|忽略卖出+TP10+SL8+信号加权** | +29,224 | +12.5% | +60.4%(C) | 57.5% | 3.29 |
| 2025-Q4 | **v4|触发≥2+TP10+SL8+持仓≤30天** | +4,491 | +2.2% | +9.2%(C) | 44.6% | 1.16 |
| 2026-Q1 | **v5.2|延迟2天+触发≥2+TP10+SL8+信号加权** | +22,334 | +10.7% | +76.2%(S) | 52.5% | 2.87 |
| 全期间 | **v5.2|忽略卖出+TP10+SL8+信号加权** | +56,375 | +21.5% | +18.5%(C) | 61.2% | 2.30 |
## 八、算法全期间总收益排名
| 排名 | 算法 | 全期间盈利 | 真实收益 | 年化(CAGR) | 胜率 | 盈亏比 | 最大回撤 | 占用资金 |
|------|------|----------|---------|-----------|------|--------|---------|--------|
| 🏆 | v5.2|忽略卖出+TP10+SL8+信号加权 | +56,375 | +21.5% | +18.5% | 61.2% | 2.30 | 7.9% | ¥262,252 |
| 🥈 | v4|忽略卖出+TP10+SL8 | +46,303 | +18.5% | +15.9% | 59.8% | 2.16 | 7.7% | ¥250,123 |
| 🥉 | v5.2|延迟2天+触发≥2+TP10+SL8+信号加权 | +44,039 | +19.1% | +16.4% | 44.8% | 1.62 | 8.4% | ¥230,860 |
| #4 | v4.1|跟踪止盈8/3+触发≥2+SL5 | +43,784 | +18.1% | +15.6% | 48.5% | 1.76 | 5.0% | ¥241,644 |
| #5 | v4|触发≥2+TP10+SL8 | +38,214 | +17.2% | +14.8% | 44.9% | 1.66 | 4.9% | ¥222,459 |
| #6 | v4|触发≥2+TP10+SL8+持仓≤30天 | +36,754 | +16.5% | +14.2% | 46.1% | 1.63 | 4.5% | ¥222,686 |
| #7 | v4.2|延迟2天+触发≥2+TP10+SL8 | +34,754 | +15.4% | +13.3% | 44.3% | 1.56 | 7.0% | ¥226,260 |
| #8 | v4|触发≥2+TP15+SL8 | +31,840 | +14.8% | +12.8% | 41.2% | 1.58 | 4.9% | ¥215,200 |
| #9 | v4|触发≥2+TP10+SL5 | +28,637 | +13.2% | +11.4% | 41.2% | 1.48 | 5.0% | ¥217,594 |
| #10 | v4.2|延迟2天+TP10+SL8 | +24,818 | +10.5% | +9.1% | 47.8% | 1.55 | 10.5% | ¥235,524 |
| #11 | v3|基线(TP10+SL8) | +10,128 | +4.4% | +3.9% | 45.0% | 1.43 | 15.3% | ¥228,420 |
| #12 | v5.2|跟踪止盈8/3+SL5+信号加权 | -14,492 | -6.8% | -5.9% | 44.2% | 1.10 | 20.7% | ¥214,326 |
| #13 | v4.1|跟踪止盈8/3+SL5 | -18,546 | -8.9% | -7.8% | 43.3% | 1.03 | 21.9% | ¥208,376 |
## 九、分析结论
### 🏆 全期间最优算法: v5.2|忽略卖出+TP10+SL8+信号加权
- 总盈利: **¥+56,375**
- 真实收益率: **+21.5%**
- 年化收益率: **+18.5%**
- 胜率: **61.2%**
- 盈亏比: **2.30**
- 最大回撤: **7.9%**
- 最大占用资金: **¥262,252**131%本金利用率)
### 回报对比
| 投资方式 | 年化收益 | 20万本金一年收益 |
|---------|---------|----------------|
| 银行定存 | 2.5% | ¥5,000 |
| 余额宝 | 1.8% | ¥3,600 |
| **本算法** | **+18.5%** | **¥+56,375**(实际) |
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
# Top 3 算法 × 5分钟实时价格 回测对比
回测区间: 2025-01-02 ~ 2025-12-31
## 定价模式
| 模式 | 买入价 | 卖出价 | 说明 |
|------|--------|--------|------|
| 日线(原版) | 当日开盘价 | 当日收盘价 | 原始基准 |
| 5分钟实时 | 10:00 5min收盘 | 15:00 5min收盘 | 有5min数据用5min, 无则用mid=(开盘+收盘)/2 |
## 对比结果
| 算法 | 定价 | 盈亏(元) | 占用资金 | 真实收益 | 真实年化 | 胜率 | 回撤% | 盈亏比 | 交易 | 5min覆盖 |
|------|------|---------|---------|---------|---------|------|-------|--------|------|----------|
| 🏆 v4|触发≥2+止盈10+损8 | 日线(原版) | +20,600 | ¥153,490 | +13.4% | +13.5% | 44.9% | 4.3% | 1.73 | 156 | - |
| 🏆 v4|触发≥2+止盈10+损8 | 5分钟实时价 | +9,765 | ¥160,740 | +6.1% | +6.1% | 43.1% | 4.2% | 1.38 | 144 | 0% |
| 🥈 v3|止盈10+损8 | 日线(原版) | +6,380 | ¥158,655 | +4.0% | +4.0% | 36.2% | 5.0% | 1.23 | 160 | - |
| 🥈 v3|止盈10+损8 | 5分钟实时价 | +2,230 | ¥160,740 | +1.4% | +1.4% | 37.3% | 6.3% | 1.10 | 150 | 1% |
| 🥉 v4.2-K1|延迟2天+止盈10+损8 | 日线(原版) | +7,280 | ¥158,655 | +4.6% | +4.6% | 38.5% | 6.9% | 1.23 | 156 | - |
| 🥉 v4.2-K1|延迟2天+止盈10+损8 | 5分钟实时价 | +7,515 | ¥161,995 | +4.6% | +4.7% | 41.9% | 5.7% | 1.31 | 148 | 4% |
+176
View File
@@ -0,0 +1,176 @@
# ⏰ v7.0 交易时点网格搜索结果
> 生成时间: 2026-02-26 09:53
## 搜索配置
| 项目 | 值 |
|------|----|
| 本金 | ¥200,000 |
| 回测区间 | 2025-11-28 ~ 2026-02-26 |
| 5分钟数据 | 2025-11-28 ~ 2026-02-25 (56天) |
| 时间点 | 48 个 |
| 组合数 | 2,304 × 3 算法 = 6,912 |
| 耗时 | 797.8s (8.7次/s) |
| 有效结果 | 6,912 |
## 🏆 全局 Top 20
| 排名 | 算法 | 买入 | 卖出 | 盈亏 | 收益% | 年化% | 胜率 | 回撤% | 交易 | 5min% |
|------|------|------|------|------|-------|-------|------|-------|------|-------|
| 🏆 | 🥈TP12|SL6|d3|h30|15%SW | 09:35 | 13:40 | ¥+46,130 | +18.8% | +101.1% | 59.4% | 2.8% | 139 | 21% |
| 🥈 | 🥈TP12|SL6|d3|h30|15%SW | 09:35 | 13:35 | ¥+45,910 | +18.7% | +100.6% | 60.9% | 2.9% | 139 | 21% |
| 🥉 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 13:40 | ¥+45,850 | +18.7% | +100.6% | 57.4% | 2.7% | 137 | 21% |
| #4 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 14:15 | ¥+45,556 | +18.7% | +100.4% | 56.3% | 2.8% | 143 | 21% |
| #5 | 🥈TP12|SL6|d3|h30|15%SW | 09:40 | 14:15 | ¥+45,436 | +18.7% | +100.2% | 59.7% | 2.9% | 135 | 21% |
| #6 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 13:35 | ¥+45,425 | +18.6% | +99.5% | 56.1% | 2.9% | 133 | 21% |
| #7 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 13:45 | ¥+45,418 | +18.7% | +100.1% | 58.2% | 2.8% | 135 | 21% |
| #8 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 14:10 | ¥+45,328 | +18.6% | +99.8% | 58.0% | 2.9% | 139 | 21% |
| #9 | 🥈TP12|SL6|d3|h30|15%SW | 09:35 | 13:45 | ¥+45,255 | +18.5% | +99.1% | 60.0% | 2.8% | 141 | 21% |
| #10 | 🥈TP12|SL6|d3|h30|15%SW | 14:35 | 13:35 | ¥+45,204 | +18.5% | +98.9% | 57.5% | 2.9% | 147 | 21% |
| #11 | 🥈TP12|SL6|d3|h30|15%SW | 13:20 | 13:35 | ¥+45,202 | +18.5% | +98.8% | 57.8% | 2.9% | 143 | 21% |
| #12 | 🥈TP12|SL6|d3|h30|15%SW | 13:20 | 13:40 | ¥+45,160 | +18.4% | +98.7% | 58.0% | 2.7% | 139 | 21% |
| #13 | 🥈TP12|SL6|d3|h30|15%SW | 14:35 | 13:40 | ¥+45,142 | +18.5% | +98.8% | 55.6% | 2.7% | 145 | 21% |
| #14 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 14:25 | ¥+45,139 | +18.6% | +99.4% | 58.6% | 3.2% | 141 | 21% |
| #15 | 🥈TP12|SL6|d3|h30|15%SW | 14:30 | 13:40 | ¥+45,103 | +18.4% | +98.6% | 62.3% | 2.7% | 139 | 21% |
| #16 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 14:35 | ¥+45,088 | +18.5% | +99.1% | 58.2% | 3.1% | 135 | 21% |
| #17 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 13:55 | ¥+45,087 | +18.5% | +99.3% | 55.7% | 3.0% | 141 | 21% |
| #18 | 🥈TP12|SL6|d3|h30|15%SW | 09:40 | 13:40 | ¥+45,075 | +18.4% | +98.5% | 56.7% | 2.8% | 135 | 21% |
| #19 | 🥈TP12|SL6|d3|h30|15%SW | 09:45 | 14:20 | ¥+45,046 | +18.5% | +99.0% | 57.4% | 3.1% | 137 | 21% |
| #20 | 🥈TP12|SL6|d3|h30|15%SW | 09:40 | 13:35 | ¥+44,999 | +18.4% | +98.6% | 58.2% | 2.9% | 135 | 21% |
## 📊 每算法最优时间点
| 算法 | 最优买入 | 最优卖出 | 最优盈利 | 默认盈利(10:00/15:00) | 提升 |
|------|---------|---------|---------|---------------------|------|
| 🏆TP12|SL6|d3|h30|10%SW | 09:45 | 13:40 | ¥+30,258 | ¥+22,006 | ¥+8,252 |
| 🥈TP12|SL6|d3|h30|15%SW | 09:35 | 13:40 | ¥+46,130 | ¥+34,504 | ¥+11,625 |
| 🥉TP10|SL8|ign|15%SW | 14:35 | 10:05 | ¥+34,890 | ¥+19,705 | ¥+15,184 |
## 📈 买入时间排名 (卖出固定@15:00)
| 排名 | 买入时间 | 平均盈利 | 最高盈利 | 最低盈利 |
|------|---------|---------|---------|----------|
| 🏆 | 09:35 | ¥+28,213 | ¥+40,034 | ¥+19,618 |
| #2 | 09:45 | ¥+28,066 | ¥+39,810 | ¥+19,456 |
| #3 | 14:35 | ¥+27,881 | ¥+38,760 | ¥+20,066 |
| #4 | 09:40 | ¥+27,867 | ¥+39,487 | ¥+19,422 |
| #5 | 14:30 | ¥+27,806 | ¥+38,814 | ¥+20,090 |
| #6 | 10:35 | ¥+27,738 | ¥+38,905 | ¥+20,073 |
| #7 | 13:35 | ¥+27,713 | ¥+38,984 | ¥+19,888 |
| #8 | 13:30 | ¥+27,662 | ¥+38,724 | ¥+19,876 |
| #9 | 14:40 | ¥+27,624 | ¥+38,769 | ¥+20,104 |
| #10 | 13:40 | ¥+27,602 | ¥+38,372 | ¥+20,062 |
| #11 | 13:25 | ¥+27,602 | ¥+38,601 | ¥+19,903 |
| #12 | 13:20 | ¥+27,486 | ¥+38,613 | ¥+19,920 |
| #13 | 14:50 | ¥+27,461 | ¥+38,129 | ¥+20,044 |
| #14 | 13:45 | ¥+27,425 | ¥+38,350 | ¥+20,072 |
| #15 | 10:30 | ¥+27,402 | ¥+38,782 | ¥+19,882 |
| #16 | 09:50 | ¥+27,363 | ¥+38,290 | ¥+19,890 |
| #17 | 13:15 | ¥+27,316 | ¥+38,326 | ¥+19,880 |
| #18 | 14:15 | ¥+26,302 | ¥+35,799 | ¥+20,059 |
| #19 | 13:10 | ¥+26,246 | ¥+35,840 | ¥+20,035 |
| #20 | 14:10 | ¥+26,177 | ¥+35,631 | ¥+20,080 |
| #21 | 14:05 | ¥+26,102 | ¥+35,546 | ¥+20,068 |
| #22 | 14:20 | ¥+26,042 | ¥+35,728 | ¥+20,068 |
| #23 | 10:40 | ¥+26,036 | ¥+35,531 | ¥+19,918 |
| #24 | 13:55 | ¥+25,991 | ¥+35,035 | ¥+20,074 |
| #25 | 13:50 | ¥+25,985 | ¥+34,956 | ¥+20,096 |
| #26 | 10:45 | ¥+25,984 | ¥+35,174 | ¥+19,876 |
| #27 | 13:05 | ¥+25,965 | ¥+35,660 | ¥+19,916 |
| #28 | 10:25 | ¥+25,957 | ¥+35,309 | ¥+19,731 |
| #29 | 14:25 | ¥+25,949 | ¥+35,449 | ¥+20,098 |
| #30 | 14:00 | ¥+25,896 | ¥+35,378 | ¥+20,046 |
| #31 | 10:15 | ¥+25,838 | ¥+35,464 | ¥+19,651 |
| #32 | 15:00 | ¥+25,809 | ¥+35,078 | ¥+20,436 |
| #33 | 10:20 | ¥+25,785 | ¥+34,903 | ¥+19,729 |
| #34 | 11:05 | ¥+25,748 | ¥+34,926 | ¥+20,012 |
| #35 | 14:55 | ¥+25,703 | ¥+34,855 | ¥+20,064 |
| #36 | 10:10 | ¥+25,684 | ¥+35,283 | ¥+19,509 |
| #37 | 14:45 | ¥+25,592 | ¥+34,740 | ¥+20,057 |
| #38 | 10:05 | ¥+25,562 | ¥+34,987 | ¥+19,462 |
| #39 | 11:30 | ¥+25,510 | ¥+35,096 | ¥+19,857 |
| #40 | 11:25 | ¥+25,442 | ¥+34,946 | ¥+19,848 |
| #41 | 10:55 | ¥+25,434 | ¥+34,964 | ¥+19,826 |
| #42 | 10:00 | ¥+25,405 | ¥+34,504 | ¥+19,705 |
| #43 | 11:00 | ¥+25,396 | ¥+34,818 | ¥+19,999 |
| #44 | 10:50 | ¥+25,221 | ¥+34,489 | ¥+19,846 |
| #45 | 11:15 | ¥+25,037 | ¥+33,496 | ¥+20,027 |
| #46 | 11:10 | ¥+24,934 | ¥+33,214 | ¥+20,005 |
| #47 | 11:20 | ¥+24,921 | ¥+33,684 | ¥+20,043 |
| #48 | 09:55 | ¥+21,316 | ¥+27,112 | ¥+17,130 |
## 📉 卖出时间排名 (买入固定@10:00)
| 排名 | 卖出时间 | 平均盈利 | 最高盈利 | 最低盈利 |
|------|---------|---------|---------|----------|
| 🏆 | 13:30 | ¥+27,183 | ¥+34,910 | ¥+22,328 |
| #2 | 13:35 | ¥+27,122 | ¥+34,952 | ¥+22,090 |
| #3 | 13:25 | ¥+27,061 | ¥+34,880 | ¥+22,080 |
| #4 | 13:40 | ¥+27,058 | ¥+34,984 | ¥+22,296 |
| #5 | 13:20 | ¥+26,946 | ¥+34,682 | ¥+21,936 |
| #6 | 14:15 | ¥+26,912 | ¥+34,924 | ¥+22,553 |
| #7 | 13:45 | ¥+26,864 | ¥+34,479 | ¥+22,234 |
| #8 | 14:00 | ¥+26,784 | ¥+35,058 | ¥+22,394 |
| #9 | 13:55 | ¥+26,764 | ¥+34,634 | ¥+22,247 |
| #10 | 14:05 | ¥+26,720 | ¥+34,598 | ¥+22,480 |
| #11 | 13:50 | ¥+26,692 | ¥+34,131 | ¥+22,274 |
| #12 | 14:20 | ¥+26,683 | ¥+34,528 | ¥+22,264 |
| #13 | 14:30 | ¥+26,563 | ¥+34,292 | ¥+22,156 |
| #14 | 14:25 | ¥+26,555 | ¥+34,281 | ¥+22,106 |
| #15 | 10:05 | ¥+26,464 | ¥+29,920 | ¥+19,744 |
| #16 | 14:50 | ¥+26,399 | ¥+33,882 | ¥+21,874 |
| #17 | 14:40 | ¥+26,273 | ¥+33,675 | ¥+21,886 |
| #18 | 14:45 | ¥+26,263 | ¥+33,710 | ¥+21,788 |
| #19 | 10:15 | ¥+26,212 | ¥+30,418 | ¥+19,129 |
| #20 | 09:50 | ¥+26,188 | ¥+29,928 | ¥+19,044 |
| #21 | 13:05 | ¥+26,184 | ¥+33,670 | ¥+20,984 |
| #22 | 14:55 | ¥+26,174 | ¥+33,702 | ¥+21,540 |
| #23 | 09:40 | ¥+25,956 | ¥+29,410 | ¥+19,280 |
| #24 | 14:10 | ¥+25,426 | ¥+35,278 | ¥+18,697 |
| #25 | 15:00 | ¥+25,405 | ¥+34,504 | ¥+19,705 |
| #26 | 09:35 | ¥+25,268 | ¥+29,105 | ¥+18,964 |
| #27 | 14:35 | ¥+25,067 | ¥+34,774 | ¥+18,658 |
| #28 | 10:00 | ¥+24,864 | ¥+29,896 | ¥+19,030 |
| #29 | 09:55 | ¥+24,688 | ¥+29,404 | ¥+18,889 |
| #30 | 13:10 | ¥+23,100 | ¥+34,476 | ¥+12,914 |
| #31 | 13:15 | ¥+22,580 | ¥+33,689 | ¥+12,689 |
| #32 | 10:35 | ¥+22,309 | ¥+32,507 | ¥+13,788 |
| #33 | 10:55 | ¥+22,217 | ¥+33,049 | ¥+12,914 |
| #34 | 10:40 | ¥+22,216 | ¥+32,393 | ¥+13,516 |
| #35 | 10:50 | ¥+22,140 | ¥+32,744 | ¥+13,336 |
| #36 | 10:45 | ¥+22,136 | ¥+32,626 | ¥+13,316 |
| #37 | 10:30 | ¥+22,115 | ¥+32,128 | ¥+13,716 |
| #38 | 11:00 | ¥+22,032 | ¥+32,746 | ¥+13,318 |
| #39 | 11:10 | ¥+21,993 | ¥+32,580 | ¥+12,784 |
| #40 | 11:05 | ¥+21,958 | ¥+32,818 | ¥+13,135 |
| #41 | 11:20 | ¥+21,856 | ¥+32,472 | ¥+12,688 |
| #42 | 11:25 | ¥+21,856 | ¥+32,743 | ¥+12,422 |
| #43 | 11:30 | ¥+21,796 | ¥+32,470 | ¥+12,558 |
| #44 | 09:45 | ¥+21,518 | ¥+26,647 | ¥+15,167 |
| #45 | 11:15 | ¥+21,290 | ¥+30,784 | ¥+12,688 |
| #46 | 10:10 | ¥+21,228 | ¥+29,897 | ¥+14,395 |
| #47 | 10:25 | ¥+16,713 | ¥+22,278 | ¥+13,735 |
| #48 | 10:20 | ¥+16,172 | ¥+21,536 | ¥+13,410 |
## 🔥 最优买卖时间组合 Top 10
| 排名 | 买入 | 卖出 | 平均盈利 |
|------|------|------|----------|
| 🏆 | 14:35 | 13:40 | ¥+33,906 |
| #2 | 14:30 | 13:40 | ¥+33,799 |
| #3 | 15:00 | 13:40 | ¥+33,798 |
| #4 | 13:35 | 13:40 | ¥+33,713 |
| #5 | 13:20 | 13:35 | ¥+33,707 |
| #6 | 09:35 | 13:45 | ¥+33,658 |
| #7 | 14:20 | 13:40 | ¥+33,645 |
| #8 | 14:40 | 13:40 | ¥+33,633 |
| #9 | 14:35 | 13:35 | ¥+33,618 |
| #10 | 14:15 | 13:40 | ¥+33,612 |
## 💡 结论
1. **全局最优**: 🥈TP12|SL6|d3|h30|15%SW 买@09:35@13:40 → ¥+46,130
2. **默认(10:00/15:00)平均盈利**: ¥+25,405
3. **最优时间组合(跨算法平均)**: 买@14:35@13:40 → 平均¥+33,906
4. **时点优化潜在提升**: ¥+8,501
+58
View File
@@ -0,0 +1,58 @@
# 提醒和交易中的刷新 — 如何获取股票现价
## 一、提醒(自动提醒)刷新
### 哪些股票会参与
- **关注列表**`searchHistory`(用户添加的关注股票)
- **持有股票**`holdingStocks`(从交易记录里计算出的当前持仓代码)
- 两者合并去重后得到 `allStocks`,只对这些股票请求信号与价格。
### 价格从哪里来
1. **主流程**`POST /api/signal_alerts`
- 后端从 **`stock_signal_scan`** 取当日扫描结果(信号、推荐等)。
-**`stock_realtime_price`** 表按 `code IN (请求的股票)``price``change_pct` 作为初值。
- 接口返回后,前端会**再跑一遍实时价**:调用 **`refreshAlertPricesFromRealtime()`**,对每条提醒分批请求 `GET /api/realtime_price/{code}`,用实时接口返回的价格覆盖显示。
- 因此**最终展示的现价为实时价**(麦蕊等),不是表里旧数据。
2. **回退流程**(批量失败、逐个分析且 `forceRefresh`
- 前端对每只股票再请求 `GET /api/realtime_price/{code}` 更新价格,同样是实时接口。
### 小结
- 刷新提醒:**股票范围** = 关注 + 持仓;**现价** = 先来自表,随后由 **实时 API** 后台更新为最新价。
---
## 二、交易中的刷新
### 哪些股票会参与
-**当前持仓**`holdingPositions``quantity > 0` 的股票(即 `holdingStocks` 对应的持仓)。
### 价格从哪里来
1. **先从不发请求的缓存更新**
- `updateHoldingPricesFromAlerts()`:用 **`stockAlerts`** 里对应 `code``alert.price` 更新持仓的 `currentPrice`
- 即:若之前加载过提醒,交易里会先用提醒结果里的价格(该价格本身来自 `stock_realtime_price` 或单只实时 API)。
2. **用户点击「刷新」**`refreshHoldingPrices()`
- 对每个持仓 `code` 调用 `GET /api/realtime_price/{code}`
- 后端 `realtime_price` 使用 **实时 API**(如 `get_realtime_price` → 麦蕊智数等),**不读** `stock_realtime_price` 表。
- 拿到的价格会写回:
- `holdingPositions[code].currentPrice`
- 以及 `stockAlerts` 里该 code 的 `price`(并可能触发保存提醒缓存)。
### 小结
- 交易中的「现价」:
- 未点刷新时:来自 **提醒缓存**(提醒的数据又来自 `stock_realtime_price` 或单只实时 API)。
- 点击刷新后:来自 **实时 API**`/api/realtime_price/:code`),与数据库表无关。
---
## 三、实施价格(现价)来源汇总
| 场景 | 股票范围 | 现价/实施价格来源 |
|----------------|--------------|-------------------|
| 提醒主流程 | 关注 + 持仓 | 先表后 **实时 API** 覆盖(`refreshAlertPricesFromRealtime` |
| 提醒回退+强制刷新 | 同上,逐只 | `GET /api/realtime_price/:code` |
| 交易-不点刷新 | 持仓 | 提醒缓存 `stockAlerts[].price`(已含实时价) |
| 交易-点刷新 | 持仓 | `GET /api/realtime_price/:code`**与提醒刷新为同一接口** |
**说明**:提醒里更新现价与交易里「刷新价格」都调用 **同一个接口** `GET /api/realtime_price/:code`,后端均为 `get_realtime_price(stock_code)`(如麦蕊智数等)。
+202
View File
@@ -0,0 +1,202 @@
# 全景扫描算法梳理
## 一、整体流程
全景扫描是对**全市场股票**做一次**技术信号全量检测**,结果写入 `stock_signal_scan` 表,供前端「全景扫描」页、策略建议、提醒、模拟交易等使用。
### 1.1 触发方式
| 方式 | 说明 |
|------|------|
| 用户点击 | 前端「全景扫描」按钮 → 后台执行 `full_signal_scan.py`(可选) |
| 定时任务 | crontab 配置,如 11:50、16:30 或凌晨 01:00`0 1 * * 1-5` |
| 管理员 | 管理后台「启动全景扫描」触发 |
### 1.2 入口与脚本
- **脚本**`full_signal_scan.py`
- **扫描日期**`scan_date = date.today()`,支持按日断点续扫
- **环境变量**`FORCE_RESCAN=1` 时先清空当日 `stock_signal_scan` 再扫
### 1.3 数据源
| 数据类型 | 来源 | 说明 |
|----------|------|------|
| 股票列表 | 表 `stock_realtime_price` | `SELECT code, name ORDER BY code`,全市场 |
| K 线 | 多级回退 | 见下文「K 线获取顺序」 |
| 结果存储 | 表 `stock_signal_scan` | 不写价格;现价由 `stock_realtime_price` 等更新 |
**K 线获取顺序**`get_kline_data()`):
1. **本地 DB**`get_kline_from_local_db_threaded(code, days)``stock_kline_daily`
2. **阿里云 K 线 API**:北交所跳过
3. **腾讯 K 线 API**:全市场(含北交所)
4. **麦蕊智数**`get_kline(period='d', days=120)`
5. **AKShare**`stock_zh_a_hist` 日 K
取数长度:**K_DAYS = 120** 日。
---
## 二、单只股票扫描流程
对每只待扫描股票(`pending = 全市场 - 当日已扫`):
```
1. get_kline_data(code, days=120) → DataFrame (date, open, high, low, close, volume)
2. 若 df 为空或 len(df) < 30 → 跳过,记失败
3. detect_all_signals(df, lookback=LOOKBACK) → 7 个信号 + 指标 + signal_status
4. 汇总 triggered_count、signal_status、indicators、latest_signals
5. 写入内存缓冲;满 BATCH_SAVE_SIZE 条后批量 INSERT/UPDATE stock_signal_scan
```
**并发与批参数**`full_signal_scan.py`):
- `WORKERS = 8`
- `BATCH_SIZE = 80`(任务批)
- `BATCH_SAVE_SIZE = 40`(每 40 条写一次库)
- `LOOKBACK = 5`(检测最近 5 天内的信号)
---
## 三、核心算法:detect_all_signals
位置:`services/signal_detector.py``detect_all_signals(df, lookback=5)`
### 3.1 输入输出
- **输入**`df` 需含列 `date, open, high, low, close, volume``lookback` 默认 5。
- **输出**
`signals``latest_signals``signal_summary``indicators`、**`signal_status`**(用于推荐与展示)。
### 3.2 内部步骤
1. **列类型**:必要列缺失则返回错误;对 `open/high/low/close/volume` 若非 float 则转成 float64。
2. **指标计算**`calc_all_indicators(df)`,得到 MACD、SKDJ、KDJ、EMA、MA 等。
3. **7 个信号检测**(均在 `lookback` 窗口内):
- `detect_main_rising_wave(df, lookback)`
- `detect_daily_bottom_divergence(df, lookback)`
- `detect_dragon_head(df, lookback)`
- `detect_true_dragon(df, lookback)`
- `detect_short_bottom_divergence(df, lookback)`
- `detect_rat_trading(df, lookback)`
- `detect_rebound(df, lookback)`
4. **汇总**
- 所有信号按 `(strength 降序, date)` 排序;
-`latest_date` 当天的信号为 `latest_signals`
- 统计 `signal_summary`
- 取最后一根 K 的指标 → `indicators`macd/skdj/kdj/ema/ma);
- **`_check_all_signal_status(df)`** → `signal_status`(每条为 7 个信号的 `triggered/description/readiness` 等)。
全景扫描**写库**用的是 `signal_status``triggered_count``signal_status``triggered==True` 的个数),推荐与策略建议也用同一套 `signal_status` + `compute_recommend`
---
## 四、七个信号的判定条件(与 _check_all_signal_status 一致)
| 序号 | 信号名 | 强度 | 判定逻辑概要(当前 K / 最近窗口) |
|------|--------|------|----------------------------------|
| 1 | **主升浪** | 85% | DIF>0 且 DEA>0,且前一根 DIF≤DEA、当前 DIF>DEA(零上金叉) |
| 2 | **日线底背离** | 80% | 20 日内:收盘价在窗口新低附近(≤1.01×min);当前是窗口最低点;DIF 高于前低且 DIF<0 |
| 3 | **龙抬头** | 75% | SKDJ 曾超跌(K<20 或 K<30)K 上穿 D;最近 3 根 K 的 K 值标准差<15(稳定) |
| 4 | **真龙** | 70% | 4 条件中≥3 且必须含「价格>MA20」:价格>MA20、MA5>MA20、MACD 翻红(柱>0)、放量(>10 日均量 1.2 倍) |
| 5 | **短底背离** | 65% | 10 日内:收盘在窗口新低附近;当前是窗口最低点;DIF 高于 10 日内 DIF 前低 |
| 6 | **老鼠仓** | 60% | 盘中跌幅 (low-open)/open < -3%;回收率 (close-low)/(high-low) > 60%;收盘较开盘跌幅 > -1%;成交量 > 10 日均量 1.3 倍 |
| 7 | **反弹** | 55% | EMA3 前根 ≤ EMA21,当前 EMA3 > EMA21(金叉) |
- **detect_*** 系列:在 `lookback` 天内逐日检测,若有满足条件的 K 线则生成一条信号(含 date/type/strength/description 等)。
- **\_check_all_signal_status**:只对**最后一根 K 线**判断 7 个信号是否「当前触发」,并给出描述与就绪度;全景扫描的「是否触发」以 `signal_status[].triggered` 为准。
---
## 五、结果落库与表结构
- **表名**`stock_signal_scan`
- **写入字段**`code, name, scan_date, triggered_count, signal_status, indicators, latest_signals`
- **唯一约束**`(code, scan_date)`,重复写入时 `ON CONFLICT DO UPDATE`
- **说明**:脚本不写 `stock_realtime_price`;列表页现价、涨跌幅等来自该表或实时接口。
---
## 六、与推荐算法的一致性
- **统一推荐函数**`services/stock_algorithms.compute_recommend(signal_status, indicators, triggered_count, is_holding)`
- 被「全景扫描结果列表」「策略建议」「提醒」「模拟交易自动买卖」共用。
- **体系最强战法**(suanfa.md)在推荐中的体现:
- 日线底背离 → 纳入关注
- 龙抬头 → 买入(核心买点)
- 真龙/主升浪 → 持有/加仓
- 不见主升浪 → 可出场(如 MACD 死叉且无主升浪 → 卖出)
即:**全景扫描只负责「全量信号检测 + 落库」;「买/卖/加仓/持有/关注/观望」由同一套 `compute_recommend` 基于 `signal_status` 计算,保证与策略建议、提醒、模拟交易一致。**
---
## 七、小结
| 项目 | 内容 |
|------|------|
| 入口 | `full_signal_scan.py`,按日断点续扫 |
| 股票池 | `stock_realtime_price` 全表 code+name |
| K 线 | 120 日,本地 DB → 阿里 → 腾讯 → 麦蕊 → AKShare |
| 核心函数 | `detect_all_signals(df, lookback=5)` → 7 信号 + `signal_status` |
| 7 信号 | 主升浪(85%)、日线底背离(80%)、龙抬头(75%)、真龙(70%)、短底背离(65%)、老鼠仓(60%)、反弹(55%) |
| 落库 | `stock_signal_scan`,不写价格 |
| 推荐 | 与策略/提醒/模拟交易共用 `compute_recommend(signal_status, ...)` |
如需调整「哪些算触发」,只需改 `signal_detector.py` 中对应 `detect_*``_check_all_signal_status`;如需调整买卖建议,只需改 `stock_algorithms.compute_recommend`
---
## 八、全景扫描结果的「每日推荐买入」是如何获取的?
### 8.1 数据来源
- **每日推荐**依赖的是**当日(或最近一次)全景扫描**的结果表 **`stock_signal_scan`**。
- 若当天没有跑全量扫描,接口会**自动回退**到「最近一次有数据的 `scan_date`」(见 8.2)。
### 8.2 接口与参数
- **接口**`GET /api/scan_results``routes/analysis.py``get_scan_results()`)。
- **关键参数**
- `date`:扫描日期,默认当天;若该日无数据且未显式传 `date`,则用 `MAX(scan_date)` 回退。
- `recommend_text`:推荐文案筛选,例如 **`买入`**、`加仓``持有``关注``观察``观望``卖出`
- `holding_codes`:当前用户持仓 code 列表(逗号分隔),用于区分「持仓 / 非持仓」下的推荐。
### 8.3 「推荐买入」的获取流程(recommend_text=买入)
1. **按日期取扫描数据**
`stock_signal_scan` 中取出 `scan_date` 当天的**全部**记录:
`code, signal_status, indicators, triggered_count`
2. **逐条计算推荐**
对每条记录调用统一推荐函数(`_compute_recommend``stock_algorithms.compute_recommend`):
```text
_compute_recommend(signal_status, indicators, triggered_count, is_holding)
```
- `is_holding = (code in holding_codes)`
返回 `(signal_type, display_text, reason, recommend_rate)`,其中 **display_text** 即「买入 / 加仓 / 持有 / 关注 / 观察 / 观望 / 卖出」。
3. **筛选「买入」**
只保留 **`display_text == recommend_text`**(例如 `display_text == '买入'`)的股票,得到「每日推荐买入」列表。
4. **排序与分页**
按 `triggered_count` 降序、其次 `code` 升序排序;再按 `page`、`per_page` 分页,取当前页的 code 列表。
5. **补全当前页展示数据**
用当前页的 code 再查 `stock_signal_scan` + `stock_realtime_price`,对每条再次调用 `_compute_recommend`,得到 `recommend_text`、`recommend_reason`、现价等,返回前端。
### 8.4 何时会得到「买入」?
由 **`compute_recommend`**(体系最强战法)决定,**非持仓**时出现「买入」的条件包括:
- **最佳买入**:日线底背离 + 龙抬头,且 MACD 未死叉 → `display_text = '买入'`(评分 95)。
- **龙抬头买入**:有龙抬头且 MACD 金叉或暂无数据 → `display_text = '买入'`(评分 80);若同时有主升浪且 MACD 正常 → 也是「买入」(评分 90)。
- 若 MACD 死叉则会被降级为「关注」等,不会出现在「推荐买入」筛选中。
因此:**「每日推荐买入」= 当日(或回退日)`stock_signal_scan` 中,在给定 `holding_codes` 下经 `compute_recommend` 计算得到 `display_text == '买入'` 的股票列表,经排序分页后返回。**
### 8.5 与策略建议的关系
- **策略建议**`GET /api/scan_strategy`)同样读 `stock_signal_scan` 当日数据,对每条记录调用同一个 `_compute_recommend`,再按 `display_text` 分成 4 档(立即买入、持仓加仓、关注、纳入关注)。
- 「立即买入」档即 **`display_text == '买入'`**,与全景扫描里筛选 `recommend_text=买入` 的列表**算法一致**,只是接口与展示形式不同(一为分档统计,一为分页列表)。
+207
View File
@@ -0,0 +1,207 @@
# 本应用全部算法总结
## 一、全景扫描与策略建议
### 1.1 全景扫描(全量信号扫描)
**触发**:用户点击「全景扫描」或定时任务(如凌晨 01:00,crontab `0 1 * * 1-5`)。
**数据源**
- 股票列表:从表 **`stock_realtime_price`** 读取全部 `code, name`(即全市场股票)。
- K 线:优先 **麦蕊智数** `get_kline(period='d', days=120)`,备用 **AKShare** 日 K。
**算法流程**
1. 脚本 `full_signal_scan.py` 按日 `scan_date` 运行,支持断点续扫(已扫过的 code 跳过)。
2. 每只股票:取约 120 日 K 线 → 调用 **`detect_all_signals(df, lookback=5)`**`services/signal_detector.py`)检测 7 个信号。
3. 7 个信号:主升浪(85%)、日线底背离(80%)、龙抬头(75%)、真龙(70%)、短底背离(65%)、老鼠仓(60%)、反弹(55%)。每个信号得到是否触发、描述等。
4. 结果写入表 **`stock_signal_scan`**`code, name, scan_date, triggered_count, signal_status, indicators, latest_signals`
(**注意**:本脚本不写入价格;表 `stock_realtime_price` 由其他定时任务或接口更新。)
**并发**`WORKERS=3``BATCH_SIZE=30`,多线程按批处理。
---
### 1.2 策略建议(分档买卖建议)
**触发**:用户点击「策略建议」。
**接口**`GET /api/scan_strategy`,可选 `date``holding_codes`(逗号分隔)。
**算法**
1.**`stock_signal_scan`** 读取当日 `scan_date` 全部记录(`signal_status, indicators, triggered_count`)。
2. 对每条记录调用 **统一推荐函数 `_compute_recommend(signal_status, indicators, triggered_count, is_holding)`**(与扫描结果、提醒共用):
- **持仓**:MACD 死叉且无主升浪 → 卖出;有主升浪 → 加仓;有真龙 → 持有;否则 → 观望。
- **非持仓**:底背离+龙抬头 → 买入;主升浪 → 加仓;真龙 → 关注;MACD 死叉 → 卖出;仅底背离 → 关注;仅龙抬头 → 关注;其他触发 → 观察;无 → 观望。
3. 按推荐文案分档:
- **档1 立即买入**`disp == '买入'`(底背离+龙抬头)。
- **档2 持仓加仓**`disp in ('加仓','持有')`
- **档3 关注**`disp == '关注'` 且龙抬头触发、无底背离。
- **档4 纳入关注**`disp == '关注'` 且其余(如仅底背离)。
4. 返回 4 档的 `action/condition/desc/count/stocks`,前端展示。
**与全景扫描结果**:使用同一套 `_compute_recommend`,算法一致。
---
### 1.3 扫描结果列表(GET /api/scan_results
**触发**:全景扫描完成后前端拉取或切换筛选/分页。
**接口**`GET /api/scan_results`,参数:`date, min_triggered, signal_type, holding_codes, recommend_text, page, per_page, sort`
**算法**
1.**`stock_signal_scan`** 按 `scan_date` 筛选,可选按 `triggered_count`、信号类型过滤。
2. 若有 **`recommend_text`**(如「买入」「关注」):全量读出当日扫描,逐条 `_compute_recommend`,统计各推荐数量,筛出 `disp == recommend_text` 的 code,再分页。
3. 否则:按 `triggered_count` 等排序分页,LEFT JOIN **`stock_realtime_price`** 取 `price, change_pct`
4. 对当前页每条记录再算一次 **`_compute_recommend`**(带入 `holding_codes`),得到 `recommend_type/recommend_text` 等返回前端。
5. 列表中的**现价**来自表 **`stock_realtime_price`**(与全量扫描脚本无直接关系,需另有时效性更新)。
---
## 二、检查信号与批量扫描关注
### 2.1 单只检查信号(技术信号详情)
**触发**:在「技术信号」里输入/选择股票并查询,或从扫描列表点击某只股票。
**接口**`GET /api/technical_signals/<stock_code>?lookback=5&days=120`
**算法**
1.**`_get_kline_data(stock_code, days)`** 取 K 线(优先麦蕊智数,备用 AKShare)。
2. 调用 **`detect_all_signals(kline_df, lookback=5)`**,得到 7 个信号的触发情况、指标、说明。
3. 返回 `signals, latest_signals, signal_summary, indicators, signal_status`
**不读** `stock_signal_scan`**不读** `stock_realtime_price`,纯实时 K 线+本地计算。
---
### 2.2 批量扫描关注
**触发**:用户点击「批量扫描关注」。
**接口**`POST /api/batch_technical_signals`body`{ codes: [关注列表的 code], lookback: 3, days: 120 }`
**算法**
1.`codes` 中每只(最多 20 只):取 K 线 → **`detect_all_signals`** → 得到 `signal_status, triggered_count, latest_signals, indicators`
2. 结果仅用于当前页展示,**不写入** `stock_signal_scan`**不写入** `stock_realtime_price`
3. 即:批量扫描关注 = 多只股票各自走一遍「单只检查信号」逻辑,无持久化。
---
## 三、模拟交易及查看时的现价
### 3.1 模拟持仓与统计中的现价
**数据来源**
-**`sim_positions`** 存有每只持仓的 **`current_price`**(上次更新时的现价)。
- 列表/统计接口(如 `GET /api/sim/positions``GET /api/sim/stats`)直接读该字段,**不在此处调实时接口**。
**现价何时更新**
- **手动刷新**:在「分析 → 模拟交易」页的 **当前持仓** 区块,点击 **「刷新现价」** 按钮时,会调用 **`updateSimPrices()`**
- 对每条持仓并行请求 **`GET /api/realtime_price/<stock_code>`**12s 超时);
- 拿到价格后写回前端展示,并 **`POST /api/sim/update_prices`**,将 `{ stock_code: price }` 写入 **`sim_positions.current_price`**,并刷新统计。
- 进入模拟交易子页(`loadSimData()`)时**不会**自动拉实时价,只读库中的 `current_price`
- 后端定时任务(如 scheduler)也可按配置更新 `sim_positions.current_price`(若已实现)。
**结论**:模拟交易「查看」时的现价 = 库中 **`sim_positions.current_price`**;**只有用户点击「刷新现价」**(或定时任务)时,才通过 **实时 API****`/api/realtime_price`** 再经 **`/api/sim/update_prices`** 写入。
---
## 四、提醒 tab 下的刷新
**触发**:进入提醒 tab 或用户点击刷新(含强制刷新)。
**涉及股票****关注列表**searchHistory+ **当前持仓**holdingStocks),合并去重得到 `allStocks`
**算法流程**
1. **优先读缓存**(未强制刷新时):`GET /api/alerts_cache`,若缓存存在且为当日且版本匹配,则用缓存填充 `stockAlerts`,并 `updateHoldingPricesFromAlerts()`,对新加入的股票做增量分析;然后**直接结束**,不再请求信号接口。
2. **主流程**
**`POST /api/signal_alerts`**body`{ stocks: allStocks, holding_codes: this.holdingStocks }`
- 后端从 **`stock_signal_scan`** 取当日扫描结果(`signal_status, indicators, triggered_count`),从 **`stock_realtime_price`** 取 `price, change_pct`
- 对每只股票调用 **`_compute_recommend(..., is_holding)`**,得到推荐类型、理由、推荐率等,并与价格一起返回。
- 前端用返回结果覆盖 `stockAlerts`,保存缓存,并 **`updateHoldingPricesFromAlerts()`**(用提醒里的 price 回填持仓的 currentPrice)。
3. **后台补齐实时价**
调用 **`refreshAlertPricesFromRealtime()`**(不传参 = 刷新全部 `stockAlerts`):
- 每批 5 只,**`GET /api/realtime_price/<code>`**(超时 12s),用返回价格覆盖对应 alert 的 `price``latest_data['收盘价']`
- 更新后 **`saveAlertsCache`**、**`updateHoldingPricesFromAlerts()`**。
即:提醒列表的**最终展示价**来自**实时接口**,不是表里旧值。
**小结**
- 信号与推荐:**`stock_signal_scan`** + **`_compute_recommend`**,价格初值来自 **`stock_realtime_price`**。
- 最终现价:**实时 API**`/api/realtime_price` → 麦蕊智数等)通过 **`refreshAlertPricesFromRealtime()`** 覆盖。
---
## 五、交易 tab 下的刷新价格
**触发**:用户在交易 tab 点击「刷新价格」。
**涉及股票**:仅 **当前持仓**`holdingPositions``quantity > 0` 的 code)。
**算法**(与提醒共用一套逻辑):
1. 取持仓 code 列表 **`holdingCodes`**。
2. 设置 **`priceRefreshing = true`**,调用 **`refreshAlertPricesFromRealtime(holdingCodes, 12000)`**
- 若持仓在 **`stockAlerts`** 中存在:按与提醒相同的逻辑,每批 5 只请求 **`GET /api/realtime_price/<code>`**,更新 alert 的 `price`,并 **`updateHoldingPricesFromAlerts()`**,从而更新 **`holdingPositions[code].currentPrice`** 及统计。
- 若某持仓不在 `stockAlerts` 中:仍对该 code 单独请求 **`GET /api/realtime_price/<code>`**,直接写 **`holdingPositions[code].currentPrice`**,并触发 `calculateTradeStats()`
3. 结束后 **`checkStopLoss()`****`priceRefreshing = false`**。
**接口统一**
- 提醒与交易刷新现价均使用 **同一接口** **`GET /api/realtime_price/<stock_code>`**,后端为 **`get_realtime_price(stock_code)`**(优先麦蕊智数,备用 AKShare),**不读** `stock_realtime_price` 表。
---
## 附录:关键数据流一览
| 场景 | 股票范围 | 信号/推荐来源 | 现价来源(最终展示) |
|------|----------|----------------|----------------------|
| 全景扫描 | 全市场(stock_realtime_price 表) | detect_all_signals,写入 stock_signal_scan | 扫描不写价格;列表用 stock_realtime_price |
| 策略建议 | 当日 stock_signal_scan 全量 | _compute_recommend | 不展示单股现价 |
| 扫描结果列表 | 按筛选/分页 | stock_signal_scan + _compute_recommend | stock_realtime_price 表 |
| 单只/批量检查信号 | 用户选定/关注列表 | 实时 K 线 + detect_all_signals | 不涉及现价 |
| 模拟交易查看 | 模拟持仓 | sim_positions.current_price | 刷新时:/api/realtime_price → update_prices |
| 提醒刷新 | 关注+持仓 | stock_signal_scan + _compute_recommend;初价 stock_realtime_price | refreshAlertPricesFromRealtime → /api/realtime_price |
| 交易刷新价格 | 持仓 | 无信号重算 | refreshAlertPricesFromRealtime(holdingCodes) → /api/realtime_price |
**统一推荐逻辑****`_compute_recommend(signal_status, indicators, triggered_count, is_holding)`** 用于:策略建议、扫描结果列表的推荐列、提醒的推荐与理由。信号类型键与 `signal_detector` 一致(如真龙为 **`true_dragon`**)。
---
## 算法与逻辑是否一致?
### 一致的部分
1. **信号检测**
- 全景扫描(full_signal_scan)、单只检查信号、批量扫描关注,均使用 **同一套** **`detect_all_signals`**`services/signal_detector.py`),7 个信号定义与判定一致。
- 唯一区别:全景扫描写库(`stock_signal_scan`),单只/批量不写库。
2. **推荐逻辑**
- 策略建议、扫描结果列表的推荐列、提醒的买卖/观望结论,均使用 **同一函数** **`_compute_recommend`**`routes/analysis.py`),同一只股票在相同持仓状态下会得到相同推荐(买入/加仓/持有/关注/观察/观望/卖出)。
- 策略建议的 4 档(立即买入、持仓加仓、关注、纳入关注)即按该推荐结果分组,无第二套规则。
3. **现价刷新(提醒与交易)**
- 提醒 tab 的「用实时价覆盖」与交易 tab 的「刷新价格」共用 **同一方法** **`refreshAlertPricesFromRealtime(codesOnly?, timeoutMs)`**,同一接口 **`GET /api/realtime_price/<code>`**,同一后端 **`get_realtime_price`**(麦蕊智数优先,AKShare 备用)。
- 逻辑一致:按 code 列表分批请求、写回 alert/持仓、更新缓存与统计。
4. **持仓状态**
- 提醒、策略建议、扫描结果列表都使用同一套 **`holding_codes`**(前端传 `holdingStocks`),**`_compute_recommend`** 的 `is_holding` 与真实持仓一致,故「持有/加仓/卖出」等与是否持仓一致。
### 需注意的差异(非矛盾)
1. **数据来源与时效**
- **全景扫描 / 策略建议 / 扫描结果 / 提醒(初值)**:依赖 **当日** `stock_signal_scan`(及 `stock_realtime_price`)。若今日未跑全量扫描,则无当日信号,提醒会显示「今日尚未扫描此股」等。
- **单只/批量检查信号**:不读库,用**当前 K 线**实时算,与库内扫描结果可能不同(日期或数据源不同)。
- 设计如此:全量扫描是「当日快照」,单只/批量是「实时计算」,二者用途不同,不要求数值完全一致。
2. **现价来源**
- **列表/表内展示**(扫描结果、提醒初值):来自 **`stock_realtime_price`** 表(由定时或其它任务更新)。
- **用户主动刷新后**(提醒、交易、模拟持仓):来自 **实时 API**`/api/realtime_price`)。
- 即:先表后实时,两段一致(同一实时接口),只是数据源阶段不同。
3. **模拟交易现价**
- 模拟持仓的 **`current_price`** 仅在使用「刷新」或定时更新时从实时接口写入;查看时只读库,不自动调实时接口。与「真实交易 tab」的持仓现价逻辑相同(都是刷新时才拉实时价)。
### 结论
- **信号检测**:全应用共用 **`detect_all_signals`**,一致。
- **推荐与分档**:策略/扫描结果/提醒共用 **`_compute_recommend`**,一致。
- **现价刷新**:提醒与交易共用 **`refreshAlertPricesFromRealtime`** 与 **`/api/realtime_price`**,一致。
- **差异**仅在于:谁写库、谁读库、何时用表价/何时用实时价,属设计上的分工,不是算法或逻辑不一致。
@@ -0,0 +1,131 @@
# 推荐算法回测方案 — 约定与设计
## 一、回测规则约定(已确认)
| 项目 | 约定 | 说明 |
|------|------|------|
| **10:00 买入依据** | 用**前一交易日收盘后**的全景扫描推荐 | 与当前应用一致,无未来数据 |
| **15:00 加仓/清仓依据** | 用**当天中午**的全景扫描数据 | 即当日 11:50 左右的扫描结果(与现有定时任务一致) |
| **成交价格** | 用**当时的实时价格** | 10:00 买入用 10:00 附近价,15:00 操作用 15:00 附近价;若无分钟数据则需约定近似方式 |
| **选股** | **每天最多买 2 只** | 全市场从「买入」中按推荐分取前 2 只,每只 1000 股(可配置 `MAX_BUYS_PER_DAY` |
## 二、时间线小结
- **T 日 10:00**:根据 **T-1 日收盘后** 的扫描结果,若出现「买入」则按约定选**最多 2 只**(推荐分从高到低),每只以 **10:00 实时价** 买入 1000 股。
- **T 日 15:00**:根据 **T 日中午**(约 11:50)的扫描结果,对当前持仓做 `compute_recommend(..., is_holding=True)`,若为「加仓」则以 **15:00 实时价** 加仓 1000 股,若为「卖出」则以 **15:00 实时价** 清仓。
- 价格:优先使用「当时实时价格」;回测若无分钟/实时数据,需在实现中明确近似规则(见下)。
## 三、实现要点与数据需求
### 3.1 10:00 推荐与价格
- **推荐**:对每个交易日 T,用 **T-1 收盘** 的日 K 跑 `detect_all_signals`,再 `compute_recommend(..., is_holding=False)`,筛出「买入」,按约定选单只(如推荐分最高或信号数最多)。
- **价格**:理想为 T 日 10:00 实时价;若无分钟数据,可用 **T 日开盘价** 作为近似,并在文档/结果中注明。
### 3.2 15:00 推荐与价格(当天中午扫描)
- **推荐**:使用 **T 日中午全景扫描** 结果。
- 若回测期内有**历史中午扫描落库**(如 `stock_signal_scan` 带 scan_time 或 scan_date=当日且标记为午扫),可直接用。
- 若没有,则需在回测中**模拟「当日中午」的扫描**:用 T 日 11:50 前可得的数据(例如 T-1 日 K + T 日 open,或若有分钟数据则用 T 日 11:30 前数据)跑一次 `detect_all_signals` + `compute_recommend`,作为当日 15:00 决策依据,且不引入 T 日 15:00 之后的数据。
- **价格**:理想为 T 日 15:00 实时价;若无分钟数据,可用 **T 日收盘价** 作为近似,并注明。
### 3.3 实时价格的回测实现
- **有实时/分钟数据**:按 10:00 / 15:00 时刻取价。
- **仅日 K**:在方案中明确写「回测采用:10:00 用当日 open15:00 用当日 close」,并视为对「当时实时价格」的近似,在结果与文档中统一说明。
## 四、选股规则(每天最多买 2 只)
- 在「买入」列表中按推荐分从高到低排序,**最多选 2 只**(`MAX_BUYS_PER_DAY=2`):
-`recommend_rate` 从高到低,同分再按 `triggered_count` 或信号强度排序;
- 每只买入 1000 股(开盘价)。
- 若当日无「买入」,则不新开仓;仅对已有持仓做 15:00 的加仓/清仓判断。
## 五、回测程序与运行
1. **脚本位置**`stock-html/backtest_recommend.py`
2. **依赖**:需存在表 **`stock_kline_daily`** 且含 2026 年及以后的日 K 数据(可先运行 `sync_kline.py` 等同步脚本)。
3. **运行**:在项目根目录下执行
```bash
cd stock-html && ./venv/bin/python backtest_recommend.py
```
4. **输出**:控制台打印交易记录 + 核心统计(胜率/回撤/持仓天数/盈亏比/个股明细);结果写入 `docs/backtest_result.json`。
5. **约定**10:00 用 T-1 扫描 + 开盘价,15:00 用当日中午扫描(T-1 + T 日 open 模拟)+ 收盘价,每天最多买 2 只(推荐分从高到低取前 2)。
### v2 优化(2026-02-25
| 优化项 | 说明 |
|--------|------|
| **股价区间过滤** | 仅扫描 2~100 元股票,避免仙股和高价股导致金额失衡 |
| **单只最大投入** | ¥30,000 上限(含加仓),防止单只占比过高 |
| **最大同时持仓** | 8 只,分散风险 |
| **卖出冷却期** | 卖出后 3 天内不再买入同只,防止反复买卖 |
| **批量 K 线加载** | 用窗口函数一次查全市场 K 线,减少 DB 往返约 10 倍 |
| **丰富统计指标** | 胜率、最大回撤、平均持仓天数、盈亏比、个股盈亏明细 |
| **对比表增强** | 15 场景对比增加胜率/回撤/盈亏比列,标注最优场景 |
### v3 优化(2026-02-25
| 优化项 | 说明 |
|--------|------|
| **基于预扫描表** | 直接从 `stock_scan_history` 读取扫描结果,无需现场计算,秒级完成回测 |
| **修复最大回撤计算** | 改为基于每日组合权益(持仓市值 + 累计现金流)的回撤,修复之前用现金流计算导致数值虚高的问题 |
| **新增回撤百分比** | 输出 `max_drawdown_pct`(最大回撤 / 总投入资金 × 100%) |
| **运算符优先级修复** | 修复 `action_taken` 判断条件的括号缺失问题 |
以上约定已写入本文档,作为实现推荐回测的统一依据。
---
## 六、清仓与止盈推荐(目的:挣钱而非单纯持有)
当前回测里**清仓**只做一件事:**推荐为「卖出」时按收盘价清仓**(即 MACD 死叉且无主升浪)。
目的是「按信号纪律出场」,但**没有**针对「高点落袋」的规则,可能拿很久才等到卖出信号,回吐利润。
### 6.1 建议增加的清仓/止盈方式
在保留「信号卖出」的前提下,可增加**以挣钱为导向**的止盈类规则,例如:
| 类型 | 说明 | 目的 |
|------|------|------|
| **固定止盈** | 持仓浮盈 ≥ X%(如 10%、15%)时,当日 15:00 清仓 | 到点落袋,不贪最后一笔 |
| **高点回撤止盈** | 从持仓期间最高价回撤 ≥ Y%(如 8%)时清仓 | 近似「高点跑」,锁定大部分利润 |
| **信号卖出(现有)** | 推荐为「卖出」时清仓 | 趋势走弱时离场 |
可只选一种,或**组合**:先看是否触发止盈,若未触发再看是否触发「卖出」;若都未触发则继续持有或按原规则加仓。
### 6.2 推荐用法(兼顾挣钱与纪律)
- **优先**:在回测中增加 **固定止盈**(如 10%):
- 每个交易日 15:00 前,若 **持仓收益率 ≥ 10%**,则当日 15:00 按收盘价清仓,视为「高点跑」一次。
- **可选**:再增加 **高点回撤止盈**(如 8%):
- 若持仓期间最高价到当前价的回撤 ≥ 8%,则当日 15:00 清仓。
- **保留**:若未触发上述止盈,仍按当前逻辑:推荐「卖出」则清仓,「加仓」则加仓,「持有」则不动。
这样既保留「按推荐买卖」的纪律,又明确加入「高点跑 / 落袋为安」的推荐,更贴近「目的是挣钱」。
---
## 七、如何提供/提升收益率
### 7.1 当前收益率指标
回测脚本已输出并写入 `backtest_result.json`
- **收益率** = (总收回 - 总投入) / 总投入 × 100%,即整段回测的累计收益。
- **年化收益率** = (1 + 收益率)^(365/回测天数) − 1,折算为「若按同样节奏跑满一年」的大致水平,便于和理财/指数对比。
v2 已内置更多指标:胜率、最大回撤、平均持仓天数、盈亏比、个股盈亏明细,均在控制台和 JSON 中输出。
### 7.2 可操作的提升方向
| 方向 | 做法 | 说明 |
|------|------|------|
| **止盈** | 使用 `--take-profit 10` 等 | 浮盈到点即走,减少回吐;可多试 8%、12% 等找合适区间。 |
| **止损** | 在回测中增加「浮亏达 X% 清仓」 | 控制单笔最大亏损,避免深套。 |
| **高点回撤止盈** | 从持仓最高价回撤 Y% 时清仓 | 贴近「高点跑」,锁住大部分利润。 |
| **选股过滤** | 在「买入」列表中提高门槛 | 如仅选 recommend_rate≥90 或 triggered_count≥2,减少弱信号。 |
| **仓位/频率** | 每日买一只 vs 仅无仓时买 | 当前为每日买一只;若改为仅无仓时买,收益曲线会不同,可对比。 |
| **参数扫描** | 对止盈比例、止损比例等做网格 | 批量回测不同参数,看哪组年化/回撤更优。 |
建议先固定一套规则(如 止盈 10% + 信号卖出),跑出基准年化与回撤,再逐项加「止损」「高点回撤止盈」或选股过滤,对比同一区间下收益率与回撤的变化,再决定是否采用。