Files
stock-analysis/doc/可转债轮动分析系统_软件设计说明书.md
WarrenZhou aca5515e15 docs: add soft copyright application documents and fix import indent
1. 新增软著申请所需的全套文档:README说明、操作说明书、软件设计说明书
2. 修复task.go文件中的import代码缩进格式
2026-08-19 23:05:42 +08:00

408 lines
16 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.

# 可转债轮动分析系统 V1.0
## 软件设计说明书
---
### 第一章 引言
#### 1.1 编写目的
本文档是「可转债轮动分析系统 V1.0」的软件设计说明书,旨在详细描述系统的总体架构设计、模块划分、数据结构、接口设计、关键算法及安全与性能设计,作为软件著作权登记的技术文档依据,同时为系统的后续维护与功能迭代提供设计参考。
#### 1.2 项目背景
可转债作为一种兼具债券属性与股票属性的金融工具,近年来市场规模不断扩大。投资者在进行可转债投资决策时,需要对全市场可转债的实时行情进行监控,并通过历史数据回测验证轮动策略的有效性。传统的人工分析与手工数据整理方式效率低下、时效性差。本系统旨在构建一个集行情浏览、策略回测、数据入库与任务管理于一体的可转债分析平台,提升可转债量化研究的效率与准确性。
#### 1.3 术语定义
| 术语 | 说明 |
|------|------|
| 可转债 | 可转换公司债券,可在特定条件下转换为公司股票 |
| 溢价率 | 转股溢价率,衡量可转债价格相对其转股价值的溢价程度 |
| 转股价值 | 可转债按当前转股价转换后对应的股票市值 |
| 轮动策略 | 定期按特定指标排序、调仓的投资策略 |
| 全量入库 | 拉取全部可转债的历史K线数据并写入数据库 |
| 增量同步 | 仅同步自上次入库日期之后新增的数据 |
| 熔断 | 数据源连续失败达到阈值后,短时间内直接切换备用源的机制 |
| 限速器 | 令牌桶算法实现的请求速率控制组件 |
---
### 第二章 总体设计
#### 2.1 设计目标
1. 提供可转债实时行情浏览与多维度排序、筛选能力。
2. 提供多策略历史回测能力,输出收益、回撤、夏普比率等关键指标。
3. 提供可转债历史数据的高效入库能力,支持全量与增量两种同步方式。
4. 提供异步任务管理能力,实现入库任务进度的实时展示。
5. 保证系统在数据源异常、缓存服务不可用等情况下的可用性。
#### 2.2 系统架构
系统采用 B/S 架构,总体分为三层:
1. **表示层(View)**:基于 HTML、JavaScript、CSS 开发的单页应用,包含登录页与主页(实时行情、策略回测、数据管理三个标签页)。
2. **控制层(Controller)**:基于 Go 语言 net/http 开发的路由与控制器,负责接收 HTTP 请求、权限校验、参数解析与响应封装。
3. **模型层(Model)**:包含数据模型定义、存储接口抽象、数据源访问与业务服务四部分。
系统整体遵循 MVC 设计模式,控制层与模型层通过接口解耦,便于替换数据源与存储实现。
#### 2.3 技术选型
| 技术 | 用途 | 选型理由 |
|------|------|----------|
| Go 1.25 | 后端开发语言 | 高并发、静态编译、部署简单 |
| net/http | HTTP 服务框架 | 标准库,无额外依赖 |
| SQLite 3 | 数据持久化 | 单文件、零配置、适合个人分析场景 |
| modernc.org/sqlite | SQLite 驱动 | 纯 Go 实现,无 CGO 依赖 |
| Redis | 任务状态缓存 | 高性能内存存储,支持实时状态查询 |
| go-redis/v9 | Redis 客户端 | 官方维护的 Go Redis 客户端 |
| Chart.js | 前端图表 | 开源图表库,用于回测净值曲线展示 |
| Docker | 容器化部署 | 便于 Redis 等中间件的一键启动 |
| golang.org/x/crypto | 密码加密 | 提供 bcrypt 密码哈希算法 |
---
### 第三章 模块设计
系统按功能划分为六大模块,各模块职责如下。
#### 3.1 用户认证模块
负责用户注册、登录、登出与权限校验。
**功能组成**:
1. 注册:用户名 + 邮箱 + 验证码 + 密码。
2. 登录:支持用户名密码登录与邮箱验证码登录两种方式。
3. 权限校验:通过 token 识别登录用户,未登录访问受保护资源时自动跳转或返回未授权。
4. 管理员账号:系统初始化时自动创建管理员账号。
**关键设计**:
- 密码使用 bcrypt 算法加盐哈希存储,不保存明文。
- 登录成功后生成随机 token,前端同时写入 localStorage 与 cookie,保证前后端鉴权一致。
- 验证码设置有效期与使用状态,验证后标记已使用。
#### 3.2 行情模块
负责可转债实时行情与历史K线数据的获取与展示。
**功能组成**:
1. 实时行情:获取全量可转债实时报价,过滤已退市转债。
2. 历史K线:获取指定转债的日K线数据。
3. 搜索与排序:支持按代码、名称、正股搜索,按多字段排序。
**关键设计**:
- 采用主备数据源机制,主数据源为东方财富接口,备用数据源为腾讯财经接口。
- 主数据源失败时自动切换备用数据源,保证数据可用性。
#### 3.3 策略回测模块
负责轮动策略的历史回测与结果展示。
**功能组成**:
1. 三种轮动策略:低价轮动、双低轮动、溢价率轮动。
2. 回测参数配置:起止日期、初始资金、持仓数量、调仓周期、价格区间等。
3. 基本面过滤:排除正股 ST、资产负债率过高或净利润为负的转债。
4. 结果展示:累计收益、年化收益、最大回撤、夏普比率、波动率、胜率等指标及净值曲线。
**关键设计**:
- 回测引擎以交易日为步长遍历历史数据,按调仓周期执行策略选股与调仓。
- 账户模型模拟现金与持仓,计算每日净值。
- 同时计算等权全转债基准,用于超额收益对比。
#### 3.4 数据入库模块
负责可转债历史数据的入库与同步。
**功能组成**:
1. 全量入库:拉取全部转债的历史K线。
2. 增量同步:仅同步已入库转债的新增数据。
3. 断点续跑:全量模式下跳过已入库转债,增量模式基于最后K线日期确定起点。
**关键设计**:
- 采用并发拉取 + 批量写入的架构,多 worker 并发获取数据,单 collector 串行批量写入数据库。
- SQLite 连接数限制为 1,避免写锁竞争。
- K线写入采用幂等 upsert 语义,重复写入自动跳过。
#### 3.5 异步任务模块
负责数据入库任务的异步执行与状态管理。
**功能组成**:
1. 任务创建:创建全量或增量入库任务。
2. 任务执行:异步并发执行入库任务。
3. 任务查询:查询任务列表与单个任务状态。
4. 任务取消:取消运行中的任务。
5. 实时进度:任务进度实时写入缓存,前端轮询展示。
**关键设计**:
- 任务管理器统一管理任务注册表与全局限速器,支持多任务并发。
- 任务状态同时写入 Redis(实时)与 SQLite(持久化),Redis 不可用时自动降级到 SQLite。
- 全局限速器采用令牌桶算法,控制数据源请求速率,避免高频请求被限流。
#### 3.6 数据源模块
负责外部行情数据的访问与容错。
**功能组成**:
1. 东财数据源:实时行情、历史K线、转债列表、基本面数据。
2. 腾讯数据源:历史K线备用源、实时报价。
3. 主备切换:主数据源失败时自动切换备用源。
4. 熔断机制:主源连续失败达到阈值后进入熔断窗口。
**关键设计**:
- 定义统一的数据源接口(MarketDataSource),屏蔽不同数据源的实现差异。
- 熔断窗口结束后自动放行一次探测请求,成功则解除熔断。
---
### 第四章 数据库设计
#### 4.1 数据库选型
系统采用 SQLite 3 作为持久化数据库。SQLite 为单文件嵌入式数据库,无需独立部署,适合个人分析场景;同时 SQL 语句遵循通用标准语法,便于后续迁移至 PostgreSQL 等数据库。
#### 4.2 核心数据表
**(1)可转债K线表(convertible_kline)**
存储每只可转债的日K线数据。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 转债代码 |
| date | TEXT | 交易日期 |
| open | REAL | 开盘价 |
| close | REAL | 收盘价 |
| high | REAL | 最高价 |
| low | REAL | 最低价 |
| volume | INTEGER | 成交量 |
| amount | REAL | 成交额 |
| convert_price | REAL | 转股价 |
| convert_value | REAL | 转股价值 |
| premium_rate | REAL | 溢价率 |
主键:code + date 联合主键。
**(2)转债基础信息表(convert_bond)**
存储转债的基本信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 转债代码(主键) |
| name | TEXT | 转债名称 |
| stock_code | TEXT | 正股代码 |
| initial_convert_price | REAL | 初始转股价 |
| list_date | TEXT | 上市日期 |
| delist_date | TEXT | 退市日期 |
**(3)用户表(user)**
存储注册用户信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 用户ID(自增主键) |
| username | TEXT | 用户名 |
| email | TEXT | 邮箱 |
| password_hash | TEXT | 密码哈希 |
| created_at | TEXT | 创建时间 |
| updated_at | TEXT | 更新时间 |
**(4)验证码表(verify_code)**
存储邮箱验证码信息。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER | 主键 |
| email | TEXT | 邮箱 |
| code | TEXT | 验证码 |
| purpose | TEXT | 用途(注册/登录) |
| expires_at | INTEGER | 过期时间 |
| used | INTEGER | 是否已使用 |
**(5)任务表(ingest_task)**
存储数据入库任务的持久化记录。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | TEXT | 任务ID(主键) |
| type | TEXT | 任务类型(full/incremental) |
| status | TEXT | 任务状态 |
| total | INTEGER | 总数量 |
| done | INTEGER | 已完成数量 |
| success | INTEGER | 成功数量 |
| failed | INTEGER | 失败数量 |
| failed_codes | TEXT | 失败转债代码 |
| params | TEXT | 任务参数 |
| error | TEXT | 错误信息 |
| started_at | TEXT | 开始时间 |
| finished_at | TEXT | 完成时间 |
**(6)正股基本面表(stock_fundamental)**
存储正股的基本面数据,用于回测基本面过滤。
| 字段 | 类型 | 说明 |
|------|------|------|
| code | TEXT | 正股代码(主键) |
| name | TEXT | 名称 |
| roe | REAL | 净资产收益率 |
| debt_ratio | REAL | 资产负债率 |
| net_profit | REAL | 净利润 |
| status | INTEGER | 状态 |
| total_asset | REAL | 总资产 |
| total_debt | REAL | 总负债 |
| update_date | TEXT | 更新日期 |
---
### 第五章 接口设计
系统采用 RESTful 风格的 HTTP 接口,接口响应统一使用 JSON 格式,字段采用 camelCase 命名。除认证相关接口外,其余接口均需在请求头携带 Bearer token。
#### 5.1 认证接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/auth/send-code | POST | 发送邮箱验证码 |
| /api/auth/register | POST | 注册账号 |
| /api/auth/login | POST | 登录 |
| /api/auth/logout | POST | 登出 |
| /api/auth/me | GET | 获取当前用户信息 |
#### 5.2 行情接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/bonds | GET | 获取全量可转债实时行情 |
| /api/bonds/{code}/kline | GET | 获取指定转债日K线 |
#### 5.3 回测接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/backtest | POST | 执行策略回测 |
#### 5.4 数据接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/status | GET | 获取数据库数据状态 |
| /api/db/bonds | GET | 获取数据库中已有转债列表 |
#### 5.5 任务接口
| 接口 | 方法 | 说明 |
|------|------|------|
| /api/tasks | POST | 创建入库任务 |
| /api/tasks | GET | 获取任务列表 |
| /api/tasks/{id} | GET | 获取单个任务状态 |
| /api/tasks/{id}/cancel | POST | 取消任务 |
---
### 第六章 关键算法设计
#### 6.1 轮动策略算法
轮动策略的核心逻辑为:在每个调仓周期,按指定指标对可转债进行排序,选取排名靠前的 N 只转债作为持仓,卖出不在持仓中的转债,买入新进入的转债。
低价轮动按价格升序选债;双低轮动按「价格 + 溢价率」综合指标升序选债;溢价率轮动按溢价率升序选债。调仓周期、持仓数量、价格区间等参数由用户配置。
#### 6.2 主备切换与熔断算法
数据源请求采用「主源优先,失败切换」策略:
1. 请求首先发往主数据源。
2. 主源失败时,记录失败计数,并立即切换到备用数据源。
3. 当主源连续失败次数达到阈值(3 次)时,开启熔断,后续请求直接使用备用源。
4. 熔断窗口(10 分钟)结束后,放行一次探测请求;探测成功则解除熔断恢复主源。
#### 6.3 全局限速算法
系统采用令牌桶算法实现全局限速。令牌桶以固定速率(默认 400 毫秒一个令牌)生成令牌,初始突发额度为 4。每个数据请求在发出前必须获取一个令牌,未获取到令牌的请求等待。该算法保证数据请求速率稳定,避免因高频请求触发数据源的限流封禁。
#### 6.4 增量同步起点算法
增量同步时,系统一次性查询所有已入库转债的最后K线日期(GROUP BY 聚合查询),形成「转债代码 → 最后日期」映射。对每只转债,其增量同步起点为该最后日期的次日;若指定了起始日期参数,则以两者中较晚者为起点。该设计避免了逐只查询导致的性能损耗。
---
### 第七章 安全设计
#### 7.1 身份认证
系统采用 token 机制进行身份认证。登录成功后服务端生成随机 token,客户端在后续请求中携带 token,服务端校验 token 有效性。未登录用户访问受保护资源时,页面请求自动跳转登录页,接口请求返回 401 未授权。
#### 7.2 密码安全
用户密码采用 bcrypt 算法加盐哈希后存储,数据库中不保存明文密码。bcrypt 算法具有自适应的计算成本,能有效抵御暴力破解。
#### 7.3 数据安全
1. 敏感数据(如密码哈希)仅存储在本地数据库中,不对外暴露。
2. 接口响应仅返回必要字段,不泄露数据库连接信息等敏感数据。
3. 前端对用户输入进行基础校验,后端对请求参数进行统一校验。
#### 7.4 权限控制
系统通过中间件统一实现权限控制,所有受保护接口均经过权限校验中间件,确保只有登录用户才能访问业务数据。
---
### 第八章 性能与容错设计
#### 8.1 性能设计
1. **并发拉取**:数据入库任务采用多 worker 并发拉取数据,默认 8 个并发。
2. **批量写入**:拉取结果汇聚后按批次(默认 20 只)批量写入数据库,减少事务开销。
3. **单写者模型**:SQLite 连接数限制为 1,仅 collector 单 goroutine 写入,避免写锁竞争。
4. **聚合查询**:增量同步使用一次性聚合查询获取全部最后日期,避免逐只查询。
#### 8.2 容错设计
1. **数据源容错**:主备数据源切换 + 熔断机制,保证数据源异常时的可用性。
2. **缓存降级**:Redis 不可用时自动降级到内存空实现,任务系统仍可运行,仅失去实时状态缓存能力。
3. **写入重试**:数据库写入失败时自动重试(最多 3 次),应对文件系统短暂占用。
4. **请求退避**:数据源请求失败时按 3 秒、6 秒递增退避重试。
5. **优雅退出**:服务关闭时自动取消运行中的任务,避免数据不一致。
---
### 第九章 部署设计
#### 9.1 部署架构
系统后端编译为单个可执行文件,前端静态资源随程序提供。数据库为 SQLite 单文件。Redis 作为可选中间件通过 Docker 部署。
#### 9.2 部署步骤
1. 编译后端程序:`go build ./cmd/server`。
2. 配置环境变量(端口、数据库路径、Redis 地址等)。
3. 启动后端服务。
4. 如需 Redis,执行 `docker compose up -d` 启动 Redis 容器。
5. 浏览器访问系统地址完成使用。
#### 9.3 环境变量配置
| 变量 | 默认值 | 说明 |
|------|--------|------|
| PORT | 8080 | 服务端口 |
| STOCK_DB_PATH | 可执行目录下 stock.db | 数据库路径 |
| REDIS_ADDR | localhost:6379 | Redis 地址 |
| REDIS_PASSWORD | 空 | Redis 密码 |
| JOB_WORKERS | 8 | 任务并发数 |
| JOB_BATCH_SIZE | 20 | 批量写入阈值 |
---
### 第十章 总结
「可转债轮动分析系统 V1.0」采用 MVC 架构,通过模块化设计实现了用户认证、实时行情、策略回测、数据入库与异步任务管理五大核心功能。系统在数据源容错、缓存降级、并发性能、权限安全等方面进行了专门设计,具备良好的可用性、健壮性与可扩展性,能够满足可转债量化研究与投资决策的实际需求。