告别二进制文件:使用 tdx2db 将通达信行情数据持久化至数据库
对于量化交易者或金融数据分析师来说,通达信(Tdx)提供的行情数据虽然详尽,但其存储方式采用了私有的二进制格式(.dat 文件)。这种存储方式导致了几个核心痛点:无法直接使用 SQL 进行复杂查询、难以与 Python/R 等分析工具高效对接、在大规模数据检索时性能低下。
tdx2db 是一个基于 Golang 开发的高效工具,旨在解决上述问题。它能够将通达信本地的二进制行情数据解析并同步到关系型数据库(如 MySQL, PostgreSQL, SQLite 等)中,为量化研究提供一个标准化的数据底座。
1. 项目核心价值
tdx2db 不仅仅是一个简单的格式转换工具,它在设计上考虑了金融数据的特性:
- 高性能解析:利用 Go 语言的并发特性和高效的二进制处理能力,能够快速扫描数以万计的行情文件。
- 标准化存储:将非结构化的二进制流转换为结构化的数据库表,支持 K 线(日线、分时)数据的完整迁移。
- 低侵入性:无需运行通达信客户端,直接读取其存储在磁盘上的数据文件。
- 灵活配置:支持多种数据库后端,方便用户根据数据量级选择轻量级的 SQLite 或企业级的 MySQL。
2. 核心工作原理
通达信的数据存储在安装目录的 vipdoc 或 snp 文件夹下,文件名通常是股票代码的十六进制表示。tdx2db 的工作流程如下:
- 文件扫描:遍历指定目录下的所有
.dat文件。 - 二进制解码:根据通达信的特定字节偏移量(Offset)和数据类型(int32, float 等),将二进制数据还原为日期、开盘价、最高价、最低价、收盘价、成交量等字段。
- 数据清洗:处理异常值或填充缺失数据。
- 批量写入:通过数据库驱动,将解析后的结构化数据以批量插入(Batch Insert)的方式写入目标数据库,以保证写入效率。
3. 快速上手实例
3.1 环境准备
在开始之前,请确保你的系统中已安装:
* Go 环境 (1.18+)
* 目标数据库 (例如 MySQL 8.0)
* 通达信数据路径 (通常在 C:\newconcept\vipdoc 或类似路径)
3.2 安装与编译
# 克隆项目 git clone https://github.com/jing2uo/tdx2db.git cd tdx2db # 下载依赖 go mod download # 编译可执行文件 go build -o tdx2db main.go
3.3 配置与运行
该项目通常通过配置文件或命令行参数指定数据源和数据库连接串。
假设你的配置如下:
* 数据路径:/home/user/tdx/vipdoc
* 数据库:MySQL (user:password@tcp(127.0.0.1:3306)/tdx_data)
执行命令:
./tdx2db -path /home/user/tdx/vipdoc -dsn "user:password@tcp(127.0.0.1:3306)/tdx_data?charset=utf8mb4&parseTime=True&loc=Local"
4. 数据库表结构预览
运行 tdx2db 后,数据库中会自动生成或填充行情表。典型的 K 线表结构如下:
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
code |
VARCHAR(10) | 股票代码 | 600519 |
trade_date |
DATE | 交易日期 | 2023-10-27 |
open |
DECIMAL(10,2) | 开盘价 | 1750.00 |
high |
DECIMAL(10,2) | 最高价 | 1765.50 |
low |
DECIMAL(10,2) | 最低价 | 1740.00 |
close |
DECIMAL(10,2) | 收盘价 | 1755.00 |
volume |
BIGINT | 成交量 | 1200000 |
amount |
DECIMAL(20,2) | 成交额 | 2100000000 |
5. 进阶应用场景
一旦数据进入数据库,你可以实现许多在通达信软件中难以完成的操作:
场景 A:跨股票的复杂筛选
使用 SQL 快速找出所有“今日收盘价突破 20 日均线且成交量放大 2 倍”的股票:
SELECT code FROM daily_k WHERE trade_date = '2023-10-27' AND close > (SELECT AVG(close) FROM daily_k WHERE code = t.code AND trade_date > '2023-10-01') AND volume > (SELECT AVG(volume) * 2 FROM daily_k WHERE code = t.code AND trade_date > '2023-10-01');
场景 B:对接 Python 量化框架
你可以直接使用 Pandas 读取数据库,无需再处理繁琐的 CSV 文件:
“`python
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine(‘mysql+pymysql://user:password@localhost/tdx_data’) df = pd.read_sql(“SELECT * FROM daily_k WHERE code = ‘600519’”, engine)



还没有评论,来说两句吧...