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

8.3 KiB
Raw Permalink Blame History

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:应用入口、窗口初始化、主题和全局状态。
  • uiPySide6 界面,包括主窗口、持仓表、成交录入弹窗、标的管理、策略设置。
  • services:业务服务,包括成交保存、持仓重算、账户摘要、费用估算。
  • domain:核心交易模型和计算逻辑,尽量不依赖 PySide6便于单元测试。
  • repositoriesSQLite 读写封装。
  • config:默认费率、数据库路径和应用设置。

GUI 只负责展示和收集输入;所有计算通过 service 调用 domain 模块完成。这样后续添加行情、图表和导入导出时,不需要重写持仓计算。

数据模型

核心表:

  • accounts:账户基础信息、初始现金、当前现金。
  • instruments:标的信息,包括代码、名称、市场、交易单位。
  • strategy_templates:默认网格模板。
  • instrument_strategy_overrides:单标的策略覆盖。
  • trades:成交记录。
  • cash_ledger:现金流水,包括初始入金、成交资金变化、手工调整、分红。
  • app_settings:手续费规则和界面设置。

持仓表不作为主数据源保存,而是由成交和现金流水派生计算。必要时可以做只读缓存,但重算结果必须能从原始记录恢复。

计算口径

费用:

  • 买入成交成本 = 成交金额 + 买入费用。
  • 卖出净收入 = 成交金额 - 卖出费用。
  • 费率可配置;录入成交时允许用户覆盖实际费用。

持仓成本:

  • 底仓、网格、其他三个交易分组分别维护移动平均成本。
  • 总持仓 = 三个分组的剩余数量合计。
  • 总持仓成本 = 三个分组的剩余成本合计。
  • 持仓成本价 = 总持仓成本 / 总持仓数量。

已实现盈亏:

  • 卖出时按对应交易分组的移动平均成本结转成本。
  • 已实现盈亏 = 卖出净收入 - 卖出结转成本。
  • 累计网格利润只统计交易分组为网格的已实现盈亏。

回本价:

  • 持仓回本价 = (当前剩余持仓成本 - 累计网格利润) / 当前总持仓数量。
  • 账户回本价 = 该标的累计净投入 / 当前总持仓数量。
  • 累计净投入 = 历史买入总支出 + 相关费用 - 历史卖出净收入 - 分红及其他现金流入。
  • 当前总持仓数量为 0 时,回本价显示为空,并展示历史已实现盈亏。

估值:

  • 持仓市值 = 当前价格 * 当前总持仓数量。
  • 当前价格只使用腾讯接口返回的行情快照;没有行情快照时显示为空,持仓市值和浮动盈亏也显示为空。
  • 浮动盈亏 = 持仓市值 - 当前剩余持仓成本。

主界面

主窗口采用持仓表优先布局:

  • 左侧导航:账户总览、持仓管理、成交记录、网格策略、设置。
  • 顶部摘要:总资产、现金、持仓市值、浮动盈亏、资金使用率。
  • 操作栏:刷新、录入成交、添加标的、策略设置、搜索。
  • 中央持仓表:展示所有标的的核心指标。
  • 底部详情区:展示选中标的的最近成交、分组持仓、策略参数和计算说明。

“刷新行情”从腾讯接口拉取当前价格并重算持仓表和账户摘要。

错误处理

  • 成交数量必须是交易单位的整数倍,除非标的显式允许非整手。
  • 卖出数量不能超过该标的可卖数量。
  • 价格和费用不能为负数。
  • 删除或修改历史成交后,系统按时间顺序重算该标的全部持仓。
  • 数据库写入失败时显示错误弹窗,并保留用户当前输入。
  • 计算出现除零或无持仓时,界面显示空值而不是异常。

测试策略

第一阶段重点测试核心计算,而不是 GUI 细节:

  • 单元测试覆盖买入、卖出、费用、移动平均成本、已实现盈亏、累计网格利润。
  • 单元测试覆盖持仓回本价和账户回本价。
  • 单元测试覆盖 T+1 可用数量。
  • 仓储测试覆盖 SQLite 初始化、插入、更新、删除和重启恢复。
  • 一个轻量 GUI 冒烟测试验证主窗口可启动。

验收标准

第一阶段完成时,应满足:

  • 可以启动桌面应用。
  • 可以创建账户、添加标的、配置默认网格模板和单标的覆盖。
  • 可以手动录入、修改、删除买卖成交。
  • 持仓表能正确展示数量、成本、盈亏、网格利润和两种回本价。
  • 关闭并重新打开应用后,数据仍然存在。
  • 核心计算测试通过。

后续阶段

第二阶段:支持定时刷新行情,生成买卖档位和今日委托建议。

第三阶段:加入图表,包括成本变化曲线、累计网格收益、账户盈亏和资金使用率。

第四阶段:加入导入导出、备份恢复、券商导出文件解析和更完整的复盘报表。

参考