tdx2db 可以将通达信数据导入到 DuckDB 中。
- 快速运行:Go 语言实现,全量导入不到 6s
- 增量更新:支持间隔数天后数据补全
- 分时数据:增量更新可选导入 1min 和 5min 分时数据
- 复权计算:增量更新会自动计算前后复权因子和行情
- 换手率和市值:视图 v_turnover 存放了换手率和市值信息
- 使用通达信数据:稳定可靠,不用买积分或被限流
- 单文件无依赖:程序和数据库都只有一个文件
项目会利用 github action 构建容器镜像,windows 和 mac 可以通过 docker 或 podman 使用:
docker run --rm --platform=linux/amd64 ghcr.io/jing2uo/tdx2db:latest -h从 releases 下载对应系统的二进制文件,解压后移至 $PATH,二进制仅支持在 Linux 中直接使用:
sudo mv tdx2db /usr/local/bin/ && tdx2db -h首次使用需要全量导入历史数据,可以从 通达信券商数据 下载沪深京日线数据完整包。
下载文件:
# linux mac
mkdir -p vipdoc
wget https://data.tdx.com.cn/vipdoc/hsjday.zip && unzip -q hsjday.zip -d vipdoc
# windows powershell
Invoke-WebRequest -Uri "https://data.tdx.com.cn/vipdoc/hsjday.zip" -OutFile "hsjday.zip"
Expand-Archive -Path "hsjday.zip" -DestinationPath "vipdoc" -Force注意如果vipdoc目录下全是类似 sh\lday\sh000001.day 的文件,则运行下面命令
cd vipdoc
for f in *.day; do mv "$f" "${f##*\\}"; done二进制:
tdx2db init --dayfiledir vipdoc --dbpath tdx.dbdocker 或 podman:
# linux、mac docker
docker run --rm --platform=linux/amd64 -v "$(pwd)":/data \
ghcr.io/jing2uo/tdx2db:latest \
init --dayfiledir /data/vipdoc --dbpath /data/tdx.db
# windows docker
docker run --rm --platform=linux/amd64 -v "${PWD}:/data" \
ghcr.io/jing2uo/tdx2db:latest \
init --dayfiledir /data/vipdoc --dbpath /data/tdx.db
# 后续不再提示 docker 用法
# 根据二进制示例修改第三行命令即可运行结束后 tdx.db 会在当前工作目录,和 vipdoc 在同一级, hsjday.zip 和 vipdoc 初始化后可删除。
必填参数:
--dayfiledir:通达信 .day 文件所在目录路径--dbpath:DuckDB 数据库文件路径
cron 命令会更新数据库至最新日期,包括股票数据、股本变迁数据 (gbbq),并计算前收盘价和复权因子。
初次使用时,请在 init 后立刻执行一次 cron,以获得复权相关数据。
tdx2db cron --dbpath tdx.db必填参数:
--dbpath:DuckDB 数据库文件路径(使用 init 时创建的文件,db 文件可以移动,通过路径能找到即可)
cron 命令支持 1min 和 5min 分时数据导入
# --minline 可选 1、5、1,5 ,分别表示只处理1分钟、只处理5分钟、两种都处理
tdx2db cron --dbpath tdx.db --minline 1,5注意
- 分时数据下载和导入比较耗时,数据量极大,确认需要再开启
- 历史分时数据通达信没提供,请自行检索后使用 duckdb 导入
- 每次更新都要明确指定 --minline 才能保证分时数据完整
- 股票代码变更不会处理历史记录
raw_ 前缀的表名用于存储基础数据,v_ 前缀的表名是视图
- raw_adjust_factor: 前收盘价和前复权因子
- raw_gbbq:股本变迁数据
- raw_stocks_daily: 股票日线
- raw_stocks_1min: 1 分钟 K 线(cron 导入后才有)
- raw_stocks_5min: 5 分钟 K 线(cron 导入后才有)
- v_qfq_stocks:前复权股票日线
- v_hfq_stocks:后复权股票日线
- v_xdxr:股票除权除息记录
- v_turnover:换手率和市值信息
复权数据:
# 前复权
select * from v_qfq_stocks where symbol='sz000001' order by date;
# 后复权
select * from v_hfq_stocks where symbol='sz000001' order by date;前收盘价和复权因子,复权因子支持分时数据使用,可以根据前收盘价拓展其他复权算法:
select * from raw_adjust_factor where symbol='sz000001';算法来自 QUANTAXIS,原理参考:点击查看
复权结果和 QUANTAXIS、通达信等比复权一致;其中前复权结果和雪球、新浪也一致。
分时表字段和类型如下:
| symbol | open | high | low | close | amount | volume | datetime |
|---|---|---|---|---|---|---|---|
| varchar | double | double | double | double | double | int64 | timestamp |
convert 命令支持转换通达信 .day .01 .5 文件、四代行情 zip、四代 TIC zip 到 csv,四代数据可以在 每日数据 下载。
tdx2db convert --output ./ --dayfiledir vipdoc # 转换 .day 日线文件
tdx2db convert --output ./ --m1filedir vipdoc # 转换 .01 1分钟线文件
tdx2db convert --output ./ --m5filedir vipdoc # 转换 .5 5分钟线文件
tdx2db convert --output ./ --ticzip 20251110.zip # 转换四代 TIC
tdx2db convert --output ./ --dayzip 20251111.zip # 转换四代行情
tdx2db convert --output ./ --gbbqzip gbbq.zip # 转换股本变迁数据转换会查找目录中所有文件,包含指数、概念等很多非股票的记录,空文件会跳过处理。
- 可以直接复制一份 db 文件,简单快捷
- 可以用 duckdb 命令导出行情数据为 parquet 或 csv
duckdb 命令使用:
# 导出 stocks 表
duckdb tdx.db -s "copy (select * from raw_stocks_daily order by symbol,date) to 'stocks.parquet' (format parquet, compression 'zstd')"
duckdb tdx.db -s "copy (select * from raw_stocks_daily order by symbol,date) to 'stocks.csv' (format csv)"
# 从 paruet 或 csv 建表
duckdb new.db -s "create table raw_stocks_daily as select * from read_parquet('stocks.parquet');"
duckdb new.db -s "create table raw_stocks_daily as select * from read_csv('stocks.csv');"有任何使用问题都可以开 issue 讨论,也期待 pr~