Files
Grid_Trading/docs/superpowers/specs/2026-07-08-grid-trading-gui-design.md
2026-07-09 10:45:27 +08:00

185 lines
8.3 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.

# A股/ETF 网格交易管理 GUI 设计
日期2026-07-08
## 目标
构建一个本地运行的 Python GUI 个人交易管理软件,用于管理 A股/ETF 的网格交易账户。软件不连接券商、不自动下单,核心价值是把成交记录、持仓成本、网格收益、回本价和每日操作建议统一管理,减少手工表格计算。
第一阶段先实现“每天能用”的本地账本:账户、标的、策略配置、成交录入、持仓表、成本/利润/回本价计算、SQLite 持久化。行情刷新、盘中提醒、图表分析放在后续阶段。
## 已确认决策
- 应用形态Python 桌面 GUI。
- 技术路线PySide6 + SQLite + 分层业务计算模块。
- 交易市场A股股票和 ETF。
- 数据来源:成交手动录入;现价通过腾讯接口手动刷新。
- 首屏布局:持仓表优先,左侧导航,顶部账户摘要,中间持仓表,下方选中标的详情。
- 网格策略:默认模板 + 单标的覆盖。
- 回本价:同时显示持仓回本价和账户回本价。
- 使用场景:盘中辅助 + 盘后复盘;第一阶段先做盘后复盘和账本计算。
## 第一阶段范围
第一阶段交付一个可运行的本地桌面应用,包含以下能力:
1. 账户管理
- 创建和编辑一个本地账户。
- 维护现金余额、初始资金、账户备注。
- 账户摘要显示总资产、现金、持仓市值、浮动盈亏、资金使用率。
2. 标的管理
- 添加 A股/ETF 标的,字段包括代码、名称、市场、交易单位。
- 交易单位默认按 A股一手 100 股处理,可在标的层覆盖。
- 为标的绑定默认网格模板,也允许设置单标的覆盖参数。
3. 网格策略配置
- 默认模板字段:网格间距、每格金额、底仓目标金额、最大投入金额、最小交易单位。
- 单标的覆盖字段:可覆盖模板中的任意策略参数。
- 第一阶段仅保存和展示策略参数,不自动生成委托清单。
4. 成交记录
- 手动录入买入、卖出成交。
- 成交字段包括日期、代码、方向、成交价、数量、手续费、印花税、过户费、交易分组、备注。
- 交易分组包括底仓、网格、其他,用于区分底仓和网格仓。
- 手续费支持自动估算和手动覆盖,费率在设置中可配置。
- 支持修改和删除成交,保存后自动重算相关持仓。
5. 持仓表
- 每个标的一行,展示代码、名称、当前价格、总持仓、可用数量、底仓数量、网格仓数量、持仓成本、持仓回本价、账户回本价、已实现盈亏、累计网格利润、浮动盈亏。
- 当前价格只来自腾讯行情刷新;没有行情快照时显示空值,不用成交价或标的字段兜底估值。
- A股 T+1 可用数量按交易日期计算:当日买入数量不可卖出,当日卖出会减少可用数量。
6. 数据持久化
- 使用本地 SQLite 数据库保存账户、标的、策略、成交、现金流水和应用设置。
- 数据库存放在 `data/grid_trading.db`
- 每次启动从数据库恢复状态。
## 非目标
第一阶段不做以下内容:
- 不自动登录券商。
- 不自动下单。
- 不自动定时刷新行情。
- 不生成盘中弹窗提醒。
- 不做复杂图表。
- 不做多账户同步或云端备份。
- 不提供投资建议,只做用户规则下的数据计算和提醒基础。
## 架构
采用分层结构,避免 GUI 代码和交易计算混在一起:
- `app`:应用入口、窗口初始化、主题和全局状态。
- `ui`PySide6 界面,包括主窗口、持仓表、成交录入弹窗、标的管理、策略设置。
- `services`:业务服务,包括成交保存、持仓重算、账户摘要、费用估算。
- `domain`:核心交易模型和计算逻辑,尽量不依赖 PySide6便于单元测试。
- `repositories`SQLite 读写封装。
- `config`:默认费率、数据库路径和应用设置。
GUI 只负责展示和收集输入;所有计算通过 service 调用 domain 模块完成。这样后续添加行情、图表和导入导出时,不需要重写持仓计算。
## 数据模型
核心表:
- `accounts`:账户基础信息、初始现金、当前现金。
- `instruments`:标的信息,包括代码、名称、市场、交易单位。
- `strategy_templates`:默认网格模板。
- `instrument_strategy_overrides`:单标的策略覆盖。
- `trades`:成交记录。
- `cash_ledger`:现金流水,包括初始入金、成交资金变化、手工调整、分红。
- `app_settings`:手续费规则和界面设置。
持仓表不作为主数据源保存,而是由成交和现金流水派生计算。必要时可以做只读缓存,但重算结果必须能从原始记录恢复。
## 计算口径
费用:
- 买入成交成本 = 成交金额 + 买入费用。
- 卖出净收入 = 成交金额 - 卖出费用。
- 费率可配置;录入成交时允许用户覆盖实际费用。
持仓成本:
- 底仓、网格、其他三个交易分组分别维护移动平均成本。
- 总持仓 = 三个分组的剩余数量合计。
- 总持仓成本 = 三个分组的剩余成本合计。
- 持仓成本价 = 总持仓成本 / 总持仓数量。
已实现盈亏:
- 卖出时按对应交易分组的移动平均成本结转成本。
- 已实现盈亏 = 卖出净收入 - 卖出结转成本。
- 累计网格利润只统计交易分组为网格的已实现盈亏。
回本价:
- 持仓回本价 = (当前剩余持仓成本 - 累计网格利润) / 当前总持仓数量。
- 账户回本价 = 该标的累计净投入 / 当前总持仓数量。
- 累计净投入 = 历史买入总支出 + 相关费用 - 历史卖出净收入 - 分红及其他现金流入。
- 当前总持仓数量为 0 时,回本价显示为空,并展示历史已实现盈亏。
估值:
- 持仓市值 = 当前价格 * 当前总持仓数量。
- 当前价格只使用腾讯接口返回的行情快照;没有行情快照时显示为空,持仓市值和浮动盈亏也显示为空。
- 浮动盈亏 = 持仓市值 - 当前剩余持仓成本。
## 主界面
主窗口采用持仓表优先布局:
- 左侧导航:账户总览、持仓管理、成交记录、网格策略、设置。
- 顶部摘要:总资产、现金、持仓市值、浮动盈亏、资金使用率。
- 操作栏:刷新、录入成交、添加标的、策略设置、搜索。
- 中央持仓表:展示所有标的的核心指标。
- 底部详情区:展示选中标的的最近成交、分组持仓、策略参数和计算说明。
“刷新行情”从腾讯接口拉取当前价格并重算持仓表和账户摘要。
## 错误处理
- 成交数量必须是交易单位的整数倍,除非标的显式允许非整手。
- 卖出数量不能超过该标的可卖数量。
- 价格和费用不能为负数。
- 删除或修改历史成交后,系统按时间顺序重算该标的全部持仓。
- 数据库写入失败时显示错误弹窗,并保留用户当前输入。
- 计算出现除零或无持仓时,界面显示空值而不是异常。
## 测试策略
第一阶段重点测试核心计算,而不是 GUI 细节:
- 单元测试覆盖买入、卖出、费用、移动平均成本、已实现盈亏、累计网格利润。
- 单元测试覆盖持仓回本价和账户回本价。
- 单元测试覆盖 T+1 可用数量。
- 仓储测试覆盖 SQLite 初始化、插入、更新、删除和重启恢复。
- 一个轻量 GUI 冒烟测试验证主窗口可启动。
## 验收标准
第一阶段完成时,应满足:
- 可以启动桌面应用。
- 可以创建账户、添加标的、配置默认网格模板和单标的覆盖。
- 可以手动录入、修改、删除买卖成交。
- 持仓表能正确展示数量、成本、盈亏、网格利润和两种回本价。
- 关闭并重新打开应用后,数据仍然存在。
- 核心计算测试通过。
## 后续阶段
第二阶段:支持定时刷新行情,生成买卖档位和今日委托建议。
第三阶段:加入图表,包括成本变化曲线、累计网格收益、账户盈亏和资金使用率。
第四阶段:加入导入导出、备份恢复、券商导出文件解析和更完整的复盘报表。
## 参考
- Qt for Python / PySide6 官方文档https://doc.qt.io/qtforpython-6/
- AKShare 股票数据文档https://akshare.akfamily.xyz/data/stock/stock.html