You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
24 KiB
24 KiB
| comet_change | role | canonical_spec | archived-with |
|---|---|---|---|
| trade-reflection-system | technical-design | openspec | trade-reflection-system |
交易反思系统 (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 (扩展)
在现有表上新增字段:
# 新增字段
reflection_status = Column(String(16), default='none') # none/pending/done
none: 未写反思pending: 已写反思,待 AI 分析done: 已完成 AI 分析
3.2 TradePair (新表)
存储跨日交易配对关系:
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 (新表)
每笔交易的结构化反思:
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 (新表)
当日整体反思:
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 (新表)
标签定义:
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 (关联表)
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 (新表)
经验教训:
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 提示词设计
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 展示以下关键交互流程:
- 按天查看交易 + 配对展示
- 编辑反思 + 打标签
- 触发 AI 重新分析
- 经验提炼和保存
- 经验库浏览和筛选
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: 反思 CRUDtest_tag_api.py: 标签管理test_experience_api.py: 经验库 CRUDtest_reanalyze_api.py: AI 重新分析
9.3 集成测试
test_reflection_to_experience_flow.py: 完整流程测试
9.4 边界测试
- 空反思 AI 分析
- 跨日配对边界 (周末/节假日)
- 标签去重
- 经验库分页/搜索/筛选
10. 非目标确认
- 不改变现有结算单导入逻辑
- 不改变 K 线数据获取和展示
- 不改变复盘计划 V2 生成逻辑
- 不改变品种分析主页
- 不重构现有交易复盘统计功能