# tdx-quant
**Repository Path**: bebopze/tdx-quant
## Basic Information
- **Project Name**: tdx-quant
- **Description**: 通达信 - 量化交易
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: https://github.com/bebopze/tdx-quant
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 3
- **Created**: 2025-05-04
- **Last Updated**: 2026-09-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 量化交易, 通达信
## README
# TDX Quant
基于 通达信 本地数据、行情数据 和 交易接口构建的 Java 量化交易系统,覆盖数据解析、行情分析、主线板块筛选、策略回测、持仓管理、委托查询、自动化任务以及大模型多模态调用。
项目当前基于 Spring Boot 4、Java 25、MyBatis Plus 和 ShardingSphere JDBC,默认监听 `7001` 端口。
> [!CAUTION]
> 本项目包含真实下单、撤单、一键卖出、融资操作和定时任务代码。首次运行前必须检查启用的 Spring Profile、交易账户、数据库和任务配置。不要在真实账户环境中直接执行未经验证的接口或测试。
> [!WARNING]
> 当前 `application.yml` 默认启用 `prod` Profile,并开放全部 Actuator 端点及 shutdown。仅应在可信内网使用;公开部署前必须增加认证、限制管理端点并关闭不需要的交易入口。
## 功能概览
- 通达信板块、个股、日线及扩展数据解析。
- 股票、ETF、板块行情与技术指标计算。
- 主线板块、主线个股和市场周期分析。
- 策略回测、交易记录、每日收益及持仓快照。
- ShardingSphere 分库分表存储大规模回测数据。
- 信用账户持仓、历史委托、撤单及快捷交易。
- 定时任务、异步任务、分布式锁和执行进度查询。
- Springdoc OpenAPI、Actuator 和 Spring Boot Admin 集成。
- 基于 Spring AI 的 DeepSeek、Qwen、豆包、MiMo、OpenAI 通用客户端。
- 验证码图片识别和通用图片分析。
## 技术栈
| 组件 | 版本/说明 |
|---|---|
| Java | 25 |
| Spring Boot | 4.1.1 |
| Spring Cloud | 2025.1.3 |
| Spring AI | 2.0.1 |
| Spring Boot Admin | 4.1.2,服务端和客户端开关默认关闭 |
| MyBatis Plus | 3.5.17 |
| PageHelper | 4.1.1 |
| ShardingSphere JDBC | 5.5.3 |
| Druid | 1.2.28,Spring Boot 4 Starter |
| springdoc-openapi | 3.1.0 |
| MySQL | 建议使用 8.x |
| 前端 | 原生 HTML、CSS、JavaScript、Bootstrap |
完整依赖版本以 [`pom.xml`](pom.xml) 为准。
## 项目结构
```text
tdx-quant/
├── docs/
│ ├── DB/ # 主库和回测分片建表脚本
│ └── llm-client.md # 通用大模型客户端文档
├── src/main/java/com/bebopze/tdx/quant/
│ ├── ai/ # Spring AI 通用客户端
│ ├── client/ # 行情、交易及第三方 API 客户端
│ ├── common/ # 配置、缓存、DTO、异常和工具类
│ ├── dal/ # Mapper、Entity、Service
│ ├── indicator/ # 技术指标
│ ├── parser/ # 通达信数据解析
│ ├── service/ # 业务服务
│ ├── strategy/ # 买卖策略与回测策略
│ ├── task/ # 定时任务和后台任务
│ └── web/ # HTTP Controller
├── src/main/resources/
│ ├── static/ # 管理页面
│ ├── application.yml # 公共配置
│ ├── application-{profile}.yml # 业务 Profile 配置
│ ├── application-llm.yml # LLM 公共配置与 Profile 加载入口
│ ├── application-llm-dev.yml # LLM 开发环境配置
│ ├── application-llm-prod.yml # LLM 生产环境配置(本机文件,不提交密钥)
│ ├── shardingsphere-dev.yml # 开发环境数据源与分片规则
│ └── shardingsphere-prod.yml # 生产环境数据源与分片规则
└── src/test/ # 单元测试和上下文测试
```
## 环境要求
- JDK 25。
- Maven 3.9+。
- MySQL 8.x。
- 需要解析通达信本地文件时,准备可访问的通达信数据目录。
- 需要使用交易功能时,准备独立测试账户及有效会话。
- 需要使用大模型时,准备相应供应商的 API Key。
确认本机版本:
```bash
java -version
mvn -version
mysql --version
```
## 快速开始
### 1. 初始化数据库
创建公共数据库并导入基础表:
```sql
CREATE DATABASE IF NOT EXISTS tdx
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
```
```bash
mysql -u root -p tdx < docs/DB/tdx.sql
```
回测记录默认使用两个数据库:
- `tdx_bt_0`
- `tdx_bt_1`
[`docs/DB/tdx_bt_shard.sql`](docs/DB/tdx_bt_shard.sql) 默认创建两个数据库,并在 `tdx_bt_0` 中创建 `bt_trade_record_0..99` 和 `bt_position_record_0..99`。执行一次后,将脚本中的 `USE tdx_bt_0` 改为 `USE tdx_bt_1`,再执行一次以初始化第二个分库。
脚本的 `@mode` 默认是 `1`,表示只创建不存在的表。将其改为 `2` 会先删除分表再重建,会丢失数据,请谨慎使用。
### 2. 配置数据源
项目根据 `spring.profiles.active` 加载:
```text
classpath:shardingsphere-{profile}.yml
```
开发环境对应 [`shardingsphere-dev.yml`](src/main/resources/shardingsphere-dev.yml),生产环境对应 [`shardingsphere-prod.yml`](src/main/resources/shardingsphere-prod.yml)。启动前至少检查:
- `ds_common` 是否指向 `tdx`。
- `ds_0`、`ds_1` 是否指向两个回测分库。
- MySQL 用户名、密码和网络地址是否正确。
- 分片表数量是否与 SQL 脚本一致。
不要提交真实数据库密码、交易 Cookie、验证码、API Key 或其他账户凭证。
### 3. 配置通达信目录
公共配置中的 `tdx-path` 默认是 Windows 示例路径。可以在启动时覆盖:
```bash
java -jar target/tdx-quant-1.0-SNAPSHOT.jar \
--spring.profiles.active=dev \
--tdx-path=/absolute/path/to/new_tdx
```
如果当前任务不需要解析本地通达信文件,也应确认相关定时任务不会在启动后自动访问该目录。
### 4. 构建
```bash
mvn clean package -DskipTests
```
构建产物:
```text
target/tdx-quant-1.0-SNAPSHOT.jar
```
### 5. 启动
开发环境建议显式指定 `dev`,避免使用公共配置中的默认 `prod`:
```bash
java -jar target/tdx-quant-1.0-SNAPSHOT.jar \
--spring.profiles.active=dev
```
也可以使用 Maven:
```bash
mvn spring-boot:run \
-Dspring-boot.run.arguments="--spring.profiles.active=dev"
```
启动完成后访问:
- 功能菜单:
- Swagger UI:
- OpenAPI JSON:
- Actuator:
## 页面入口
| 功能 | 地址 |
|---|---|
| 持仓与当日委托 | |
| 数据分析 | |
| 回测任务 | |
| 主线板块 | |
| 定时任务 | |
| 股票 K 线 | |
页面由 Spring Boot 直接提供静态资源。重新打包并重启服务后,如果浏览器仍显示旧页面,请执行强制刷新:
- macOS:`Cmd + Shift + R`
- Windows/Linux:`Ctrl + F5`
## API 概览
| 前缀 | 功能 |
|---|---|
| `/api/trade` | 持仓、委托、撤单及快捷交易 |
| `/api/backtest` | 回测执行、任务、分析和交易记录 |
| `/api/parser/tdxdata` | 通达信数据导入和 K 线填充 |
| `/api/topBlock` | 主线板块和主线个股计算 |
| `/api/data/analysis` | 数据分析与榜单 |
| `/api/task` | 数据刷新、后台任务和执行进度 |
| `/api/strategy` | 买卖策略执行与信号列表 |
| `/api/stock` | 股票详情和板块信息 |
| `/api/block`、`/api/blockNew` | 板块及其成分股 |
| `/api/market` | 市场周期数据 |
| `/api/monitor` | 缓存及运行状态监控 |
> [!IMPORTANT]
> `/api/trade`、`/api/strategy` 和部分 `/api/task` 接口会改变交易或业务状态。不要把整个 `/api/**` 暴露到公网,也不要通过浏览器、监控探针或爬虫无差别调用。
## 本机 Chrome 登录辅助
项目提供 [`EastMoneyChromeLogin`](src/main/java/com/bebopze/tdx/quant/automation/EastMoneyChromeLogin.java),
可打开本机 Chrome、处理维护公告、填写配置中的资金账号和密码、选择 3 小时在线时间,
将验证码保存为 `tdx_zip/验证码.png`,并在用户查看本地图片、手动输入验证码后提交登录。
登录成功后会在当前浏览器会话中确认持仓接口加载成功,
随后自动关闭本次工具启动的浏览器。
```bash
mvn exec:java \
-Dexec.mainClass=com.bebopze.tdx.quant.automation.EastMoneyChromeLogin
```
该工具不会自动识别验证码,也不会输出或返回 Cookie、validatekey 等认证凭据。完整说明见
[`docs/eastmoney-chrome-login.md`](docs/eastmoney-chrome-login.md)。
## 大模型客户端
项目提供统一的 [`OpenAiLlmClient`](src/main/java/com/bebopze/tdx/quant/llm/OpenAiLlmClient.java),支持:
- Qwen
- 豆包
- OpenAI GPT
- MiMo
- DeepSeek
- 其他兼容 OpenAI Chat Completions 的服务
Spring Boot 根据 `spring.profiles.active` 自动加载 `application-llm-dev.yml` 或 `application-llm-prod.yml`,无需修改 Java 代码。
API Key 建议通过环境变量提供:
```bash
export DASHSCOPE_API_KEY="..."
export ARK_API_KEY="..."
export OPENAI_API_KEY="..."
export MIMO_API_KEY="..."
export DEEPSEEK_API_KEY="..."
```
切换默认供应商:
```yaml
llm:
default-provider: qwen
```
验证码识别示例:
```java
String captcha = llmClient.recognizeCaptcha(imageFile);
String doubaoResult = llmClient.recognizeCaptcha("doubao", imageFile);
// 固定使用 DeepSeek,模型与 API Key 仍从配置读取
String deepSeekResult = deepSeekCaptchaRecognizer.recognize(
Path.of("src/main/java/com/bebopze/tdx/quant/ai/验证码.png"));
```
使用项目自带的 `验证码.png` 和 `dev` 配置调用 Qwen 真实接口:
```bash
mvn -Dtest=QwenCaptchaOcrLiveTest \
-Dqwen.live-test=true \
-Dspring.profiles.active=dev test
```
在线测试默认跳过,只加载大模型相关 Bean,不会连接数据库或初始化交易模块。
图片会发送到所选择的第三方模型服务。不要上传未获授权的交易截图、账户信息或其他敏感资料。
更多说明见 [`docs/llm-client.md`](docs/llm-client.md)。
## 测试
纯单元测试示例:
```bash
mvn -Dtest=OpenAiLlmClientTest,GetOrdersDataRespJsonTest test
```
完整测试:
```bash
mvn test
```
> [!WARNING]
> 当前 `TdxQuantAppTests` 会加载完整 Spring 上下文。由于默认 Profile 是 `prod`,它可能连接 MySQL、初始化交易会话并访问第三方接口。完整测试只能在已隔离的开发环境执行,不要使用真实交易账户。
常用检查命令:
```bash
# 编译
mvn -DskipTests compile
# 打包
mvn -DskipTests package
# 检查可升级的显式版本属性
mvn versions:display-property-updates -DallowSnapshots=false
```
## 配置与安全建议
- 显式指定启动 Profile,不依赖 `application.yml` 中的默认值。
- 将数据库密码、大模型 Key 和交易会话迁移到安全配置中心或环境变量。
- 日志中不得输出 Cookie、API Key、完整账户信息或订单认证参数。
- 生产环境关闭 Swagger,或仅允许内网访问。
- 将 `management.endpoints.web.exposure.include` 改为最小端点集合。
- 禁止公网访问 `/actuator/shutdown`。
- 为交易接口增加认证、授权、审计、幂等和二次确认。
- 在模拟账户完成回归测试后,再逐项开放真实交易能力。
- 定期备份 `tdx`、`tdx_bt_0` 和 `tdx_bt_1`。
## 已知约束
- 公共配置当前默认启用 `prod` Profile。
- Spring Cloud 兼容性检查当前被显式关闭;升级 Spring Boot 或 Spring Cloud 后必须运行完整回归测试。
- 数据源 YAML 由 `MybatisConfig` 直接读取,配置文件名必须与 Profile 一致。
- 通达信目录结构依赖本地客户端版本,升级客户端后应验证解析器。
- 部分页面和接口直接依赖第三方行情、交易服务的字段及会话状态。
- Spring Boot Admin 依赖已集成,但服务端注解和客户端开关默认关闭。
## 端口转发
需要通过 SSH 访问远程服务时,可将本机 `7001` 转发至远程 `localhost:7001`:
```bash
ssh -p 2222 -L 7001:localhost:7001 user@example-host
```
然后访问本机 。不要将管理端口直接暴露到公网。
## License
本项目采用 [Apache License 2.0](LICENSE)。
## 免责声明
本项目仅用于技术研究、数据分析和自动化实验,不构成投资建议。实盘交易可能造成资金损失,使用者应自行评估并承担全部风险。