---
comet_change: trade-reflection-system
role: technical-design
canonical_spec: openspec
---

# 交易反思系统 (Trade Reflection System) - Design Doc

## 1. 概述

在现有交易复盘模块基础上，构建「人工反思 → AI 提炼 → 经验沉淀」的学习闭环。核心能力包括：按天组织交易视图、跨日交易自动配对、结构化反思、标签系统、AI 重新分析、历史经验库。

## 2. 架构设计

### 2.1 整体架构

```
┌─────────────────────────────────────────────────────────────┐
│                        前 端 层                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐  │
│  │ 按天交易视图  │  │ 反思编辑面板  │  │   经验库页面      │  │
│  └──────┬───────┘  └──────┬───────┘  └────────┬─────────┘  │
│         └─────────────────┴────────────────────┘            │
│                        现有交易复盘页面 (改造)                │
└─────────────────────────┬───────────────────────────────────┘
                          │ REST API
┌─────────────────────────┴───────────────────────────────────┐
│                        后 端 层                              │
│  ┌──────────────────────────────────────────────────────┐  │
│  │         trade_review.py (现有 + 8个新端点)            │  │
│  └──────────────────────────────────────────────────────┘  │
│  ┌──────────────┐  ┌──────────────────────────────┐        │
│  │trade_parser  │  │  ai_analysis.py (扩展)        │        │
│  │(不变)        │  │  └── 反思增强分析 + 版本存储   │        │
│  └──────────────┘  └──────────────────────────────┘        │
└─────────────────────────┬───────────────────────────────────┘
                          │ SQLAlchemy ORM
┌─────────────────────────┴───────────────────────────────────┐
│                        数 据 层                              │
│  TradeRecord(扩展) + 6新表 + SQLite/MySQL                   │
└─────────────────────────────────────────────────────────────┘
```

### 2.2 模块职责

| 模块 | 职责 | 变更类型 |
|------|------|---------|
| `trade_review.py` | 新增 8 个 API 端点 | 扩展 |
| `analysis_models.py` | 扩展 TradeRecord + 新增 6 个模型 | 扩展 |
| `ai_analysis.py` | 新增反思增强分析提示词 + 版本化存储 | 扩展 |
| `trade_parser.py` | 不变 | 无变更 |
| `futures_analysis.js` | 新增前端视图和交互逻辑 | 扩展 |

## 3. 数据模型详细设计

### 3.1 TradeRecord (扩展)

在现有表上新增字段：

```python
# 新增字段
reflection_status = Column(String(16), default='none')  # none/pending/done
```

- `none`: 未写反思
- `pending`: 已写反思，待 AI 分析
- `done`: 已完成 AI 分析

### 3.2 TradePair (新表)

存储跨日交易配对关系：

```python
class TradePair(AnalysisBase):
    __tablename__ = "trade_pairs"

    id = Column(Integer, primary_key=True, autoincrement=True)
    pair_type = Column(String(16), nullable=False)  # auto/manual
    symbol = Column(String(32), nullable=False, index=True)
    variety = Column(String(16), nullable=False, index=True)
    direction = Column(String(8), nullable=False)  # long/short

    open_trade_id = Column(Integer, nullable=False, index=True)
    open_date = Column(String(16), nullable=False)
    open_time = Column(String(32), nullable=False)
    open_price = Column(Float, nullable=True)

    close_trade_ids = Column(JSON, nullable=True)  # [id1, id2, ...]
    close_date = Column(String(16), nullable=True)
    close_time = Column(String(32), nullable=True)
    close_price = Column(Float, nullable=True)

    status = Column(String(16), nullable=False, default='open')  # open/closed
    pnl = Column(Float, nullable=True)  # 配对盈亏
    commission_total = Column(Float, nullable=True)  # 总手续费

    created_at = Column(DateTime, nullable=False, default=datetime.now)
    updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
```

### 3.3 TradeReflection (新表)

每笔交易的结构化反思：

```python
class TradeReflection(AnalysisBase):
    __tablename__ = "trade_reflections"

    id = Column(Integer, primary_key=True, autoincrement=True)
    trade_id = Column(Integer, nullable=False, index=True)
    trade_pair_id = Column(Integer, nullable=True, index=True)

    # 模板字段
    entry_reason = Column(Text, nullable=True)  # 入场理由
    entry_timing = Column(String(16), nullable=True)  # good/fair/poor
    position_management = Column(Text, nullable=True)  # 仓位管理反思
    exit_reason = Column(Text, nullable=True)  # 出场理由
    exit_timing = Column(String(16), nullable=True)  # good/fair/poor
    discipline_score = Column(Integer, nullable=True)  # 1-5

    # 自由文本
    free_reflection = Column(Text, nullable=True)

    # AI 分析状态
    ai_analysis_status = Column(String(16), default='none')  # none/pending/done
    ai_analysis_version = Column(Integer, default=0)

    created_at = Column(DateTime, nullable=False, default=datetime.now)
    updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
```

### 3.4 DailyReflection (新表)

当日整体反思：

```python
class DailyReflection(AnalysisBase):
    __tablename__ = "daily_reflections"

    id = Column(Integer, primary_key=True, autoincrement=True)
    trade_date = Column(String(16), nullable=False, unique=True, index=True)

    emotion_state = Column(String(32), nullable=True)  # 情绪状态
    market_judgment = Column(Text, nullable=True)  # 市场判断
    execution_discipline = Column(Integer, nullable=True)  # 1-5
    overall_rating = Column(Integer, nullable=True)  # 1-5
    summary = Column(Text, nullable=True)  # 总结
    improvements = Column(Text, nullable=True)  # 改进方向

    created_at = Column(DateTime, nullable=False, default=datetime.now)
    updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
```

### 3.5 TradeTag (新表)

标签定义：

```python
class TradeTag(AnalysisBase):
    __tablename__ = "trade_tags"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False, unique=True)
    category = Column(String(32), nullable=True)  # operation/mindset/discipline/technical/custom
    description = Column(Text, nullable=True)
    is_preset = Column(Boolean, nullable=False, default=False)
    usage_count = Column(Integer, nullable=False, default=0)
    created_at = Column(DateTime, nullable=False, default=datetime.now)
```

预设标签清单：
- 操作类: 追涨杀跌, 逆市操作, 提前入场, 延迟出场, 加仓过早
- 心态类: 情绪化交易, 恐惧平仓, 贪婪持仓, 报复性交易
- 纪律类: 严格执行计划, 违反止损, 超仓交易, 频繁交易
- 技术类: 突破交易, 回调交易, 趋势跟踪, 震荡交易

### 3.6 TradeRecordTag (关联表)

```python
class TradeRecordTag(AnalysisBase):
    __tablename__ = "trade_record_tags"

    id = Column(Integer, primary_key=True, autoincrement=True)
    trade_id = Column(Integer, nullable=False, index=True)
    tag_id = Column(Integer, nullable=False, index=True)

    __table_args__ = (
        Index('ix_trade_tag_unique', 'trade_id', 'tag_id', unique=True),
    )
```

### 3.7 TradeExperience (新表)

经验教训：

```python
class TradeExperience(AnalysisBase):
    __tablename__ = "trade_experiences"

    id = Column(Integer, primary_key=True, autoincrement=True)
    trade_id = Column(Integer, nullable=False, index=True)
    trade_pair_id = Column(Integer, nullable=True, index=True)
    reflection_id = Column(Integer, nullable=True, index=True)

    title = Column(String(128), nullable=False)  # 经验标题
    content = Column(Text, nullable=False)  # 经验内容
    lesson_type = Column(String(16), nullable=False)  # lesson/tip/warning
    tags = Column(JSON, nullable=True)  # [tag_name, ...]

    ai_version = Column(Integer, nullable=True)  # AI分析版本号
    created_from = Column(String(16), nullable=False)  # ai/manual

    created_at = Column(DateTime, nullable=False, default=datetime.now)
    updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
```

## 4. API 详细设计

### 4.1 按天获取交易+配对

```
GET /api/v1/trade-review/daily-trades/{date}

Response:
{
  "success": true,
  "data": {
    "trade_date": "2026-07-05",
    "trades": [...],  // 原始交易记录
    "pairs": [...],   // 配对结果
    "daily_reflection": {...},  // 当日反思 (如有)
    "statistics": {...}  // 当天统计
  }
}
```

### 4.2 配对 CRUD

```
POST /api/v1/trade-review/trade-pairs
{
  "pair_type": "manual",
  "symbol": "AG2608",
  "open_trade_id": 123,
  "close_trade_ids": [456, 789]
}

PUT /api/v1/trade-review/trade-pairs/{id}
DELETE /api/v1/trade-review/trade-pairs/{id}
```

### 4.3 反思 CRUD

```
POST /api/v1/trade-review/reflections
{
  "trade_id": 123,
  "entry_reason": "...",
  "entry_timing": "good",
  "position_management": "...",
  "exit_reason": "...",
  "exit_timing": "fair",
  "discipline_score": 4,
  "free_reflection": "..."
}

PUT /api/v1/trade-review/reflections/{id}
GET /api/v1/trade-review/reflections?trade_id=123
```

### 4.4 当日反思 CRUD

```
POST /api/v1/trade-review/daily-reflections
{
  "trade_date": "2026-07-05",
  "emotion_state": "平静",
  "market_judgment": "...",
  "execution_discipline": 4,
  "overall_rating": 4,
  "summary": "...",
  "improvements": "..."
}

PUT /api/v1/trade-review/daily-reflections/{id}
GET /api/v1/trade-review/daily-reflections/{date}
```

### 4.5 标签管理

```
GET /api/v1/trade-review/tags  # 获取所有标签
POST /api/v1/trade-review/tags  # 创建自定义标签
{
  "name": "我的标签",
  "category": "custom"
}

POST /api/v1/trade-review/records/{trade_id}/tags
{
  "tag_ids": [1, 2, 3]
}

DELETE /api/v1/trade-review/records/{trade_id}/tags/{tag_id}
```

### 4.6 AI 重新分析

```
POST /api/v1/trade-review/reanalyze
{
  "trade_id": 123,  # 或 trade_pair_id
  "reflection_id": 456
}

Response:
{
  "success": true,
  "data": {
    "analysis_id": 789,
    "version": 2,
    "analysis": "...",
    "experience_suggestions": [...]  # 经验提炼建议
  }
}
```

### 4.7 经验库 CRUD

```
GET /api/v1/trade-review/experiences
  ?tag=追涨杀跌
  &lesson_type=warning
  &keyword=止损
  &page=1&page_size=20

POST /api/v1/trade-review/experiences
{
  "trade_id": 123,
  "title": "...",
  "content": "...",
  "lesson_type": "lesson",
  "tags": ["追涨杀跌", "违反止损"]
}

PUT /api/v1/trade-review/experiences/{id}
DELETE /api/v1/trade-review/experiences/{id}
```

## 5. 核心业务流程

### 5.1 交易配对流程

```
1. 用户导入结算单 → TradeRecord 表
2. 用户选择日期 → 触发配对逻辑
3. 配对引擎:
   a. 按 variety + trade_date 筛选
   b. 按品种分组
   c. 对每个品种:
      - 找出所有开仓记录 (offset='开')
      - 找出所有平仓记录 (offset='平')
      - 按时间顺序配对 (FIFO)
      - 同一方向连续开仓合并为一个头寸
   d. 生成 TradePair 记录 (pair_type='auto')
4. 前端展示配对结果
5. 用户可手动修正 (创建 pair_type='manual' 记录)
```

### 5.2 反思 → AI 分析 → 经验提炼流程

```
1. 用户给某笔交易写反思 → POST /reflections
2. 系统更新 TradeRecord.reflection_status = 'pending'
3. 用户点击「重新 AI 分析」→ POST /reanalyze
4. 后端:
   a. 获取交易详情 + 多周期 K 线
   b. 获取反思内容
   c. 构建增强提示词 (交易信息 + K 线 + 反思)
   d. 调用 AI 模型
   e. 解析响应，保存为 TradeExperience (ai_version=N)
   f. 更新 TradeReflection.ai_analysis_status = 'done'
   g. 更新 TradeReflection.ai_analysis_version = N
   h. 更新 TradeRecord.reflection_status = 'done'
5. 前端展示 AI 分析结果和经验建议
6. 用户可编辑经验建议后保存
```

### 5.3 AI 提示词设计

```python
prompt = f"""
你是一个有20年经验的期货交易教练。请分析以下交易及其反思，提炼经验教训。

【交易信息】
品种: {symbol}
方向: {direction}
开仓: {open_date} {open_time} @ {open_price}
平仓: {close_date} {close_time} @ {close_price}
盈亏: {pnl}
手续费: {commission}

【多周期 K 线 context】
{kline_context}

【交易者反思】
入场理由: {entry_reason}
入场时机评价: {entry_timing}
仓位管理反思: {position_management}
出场理由: {exit_reason}
出场时机评价: {exit_timing}
纪律评分: {discipline_score}/5
自由反思: {free_reflection}

请从以下维度分析并输出 JSON:
{{
  "trade_analysis": "对这笔交易的综合评价",
  "strengths": ["优点1", "优点2"],
  "weaknesses": ["不足1", "不足2"],
  "experience_lessons": [
    {{
      "title": "经验标题",
      "content": "经验内容",
      "lesson_type": "lesson/tip/warning",
      "tags": ["标签1", "标签2"]
    }}
  ]
}}
"""
```

## 6. 前端设计

### 6.1 按天交易视图

```
┌─────────────────────────────────────────────────────────────┐
│  日期选择器: [2026-07-05]  [<] [>]                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  当日反思 [编辑]                                     │   │
│  │  情绪: 平静 | 纪律: ★★★★ | 总体: ★★★★               │   │
│  │  总结: ...                                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  交易配对 #1 (AG2608 多头) 盈亏: +1200              │   │
│  │  ┌─────────┐  ┌─────────┐                          │   │
│  │  │ 开 09:30│→ │ 平 14:20│  [反思] [标签] [AI分析]   │   │
│  │  └─────────┘  └─────────┘                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  交易配对 #2 (RB2610 空头) 盈亏: -800               │   │
│  │  ┌─────────┐  ┌─────────┐                          │   │
│  │  │ 开 10:15│→ │ 平 11:30│  [反思✓] [标签] [AI分析✓] │   │
│  │  └─────────┘  └─────────┘                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  未配对交易: CU2609 买开 09:45 @ 78500              │   │
│  │                         [手动配对] [反思] [标签]     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

### 6.2 反思编辑面板 (Modal)

```
┌─────────────────────────────────────────────────────────────┐
│  反思编辑 - AG2608 多头 09:30→14:20                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  入场理由: [文本框]                                          │
│  入场时机: ○ 良好 ○ 一般 ○ 较差                              │
│                                                             │
│  仓位管理反思: [文本框]                                      │
│                                                             │
│  出场理由: [文本框]                                          │
│  出场时机: ○ 良好 ○ 一般 ○ 较差                              │
│                                                             │
│  纪律评分: ☆☆☆☆☆                                           │
│                                                             │
│  ─── 自由反思 ───                                          │
│  [多行文本框]                                                │
│                                                             │
│  ─── 标签 ───                                              │
│  [预设标签选择] + [自定义标签输入]                            │
│                                                             │
│  [保存] [保存并AI分析] [取消]                                 │
└─────────────────────────────────────────────────────────────┘
```

### 6.3 经验库页面

```
┌─────────────────────────────────────────────────────────────┐
│  历史经验库                                                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  [搜索框]  [标签筛选: 全部▼]  [类型: 全部▼]  [视图: 列表▼]    │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 2026-07-05 | ⚠️ 警告                                 │   │
│  │ 追涨杀跌导致亏损 - AG2608                            │   │
│  │ 在突破不明显的情况下追多，未设止损...                  │   │
│  │ 标签: 追涨杀跌 | 违反止损                            │   │
│  │ [查看原交易] [编辑]                                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 2026-07-04 | 💡 经验                                 │   │
│  │ 严格执行计划带来稳定收益 - RB2610                    │   │
│  │ 按计划入场，按止损出场，避免情绪干扰...                 │   │
│  │ 标签: 严格执行计划 | 趋势跟踪                        │   │
│  │ [查看原交易] [编辑]                                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  [时间线视图] [分类视图]                                    │
└─────────────────────────────────────────────────────────────┘
```

## 7. 错误处理

| 场景 | 处理策略 |
|------|---------|
| 配对逻辑无法匹配 | 标记为「未配对交易」，用户手动配对 |
| AI 模型调用失败 | 返回错误提示，保留 pending 状态，可重试 |
| 反思为空时触发 AI 分析 | 允许，但提示用户「补充反思可获得更精准的分析」 |
| 标签重复创建 | 自动去重，返回已存在标签 |
| 经验保存时交易已删除 | 软删除标记，经验保留但标记「来源已删除」 |

## 8. Demo 确认环节

在设计完成后、执行代码前，需要创建一个交互式 Demo 展示以下关键交互流程：
1. 按天查看交易 + 配对展示
2. 编辑反思 + 打标签
3. 触发 AI 重新分析
4. 经验提炼和保存
5. 经验库浏览和筛选

Demo 使用静态数据模拟，确认交互后再进入实际开发。

## 9. 测试策略

### 9.1 单元测试
- `test_trade_pairing.py`: 配对逻辑测试 (FIFO、跨日、多次开仓)
- `test_ai_prompt_builder.py`: AI 提示词构建测试
- `test_experience_extractor.py`: 经验提炼逻辑测试

### 9.2 API 测试
- `test_reflection_api.py`: 反思 CRUD
- `test_tag_api.py`: 标签管理
- `test_experience_api.py`: 经验库 CRUD
- `test_reanalyze_api.py`: AI 重新分析

### 9.3 集成测试
- `test_reflection_to_experience_flow.py`: 完整流程测试

### 9.4 边界测试
- 空反思 AI 分析
- 跨日配对边界 (周末/节假日)
- 标签去重
- 经验库分页/搜索/筛选

## 10. 非目标确认

- 不改变现有结算单导入逻辑
- 不改变 K 线数据获取和展示
- 不改变复盘计划 V2 生成逻辑
- 不改变品种分析主页
- 不重构现有交易复盘统计功能
