Skip to main content

读取本地通达信(TDX)股票数据,增量同步到 PostgreSQL/MySQL/SQLite

Project description

tdx2db

Import TDX (通达信) local A-share market data into PostgreSQL / MySQL / SQLite.

CI

读取本地通达信股票数据(日线 + 5/15/30/60 分钟线),增量同步到数据库。适合想用 SQL / pandas 做 A 股量化分析、又不想依赖收费行情 API 的人。

安装

# Python >= 3.9。默认安装即支持 SQLite(零配置开箱即用)
pip install tdx2db

# 使用 PostgreSQL / MySQL 时安装对应驱动
pip install 'tdx2db[postgres]'   # PostgreSQL
pip install 'tdx2db[mysql]'      # MySQL
pip install 'tdx2db[all]'        # 两者都装

# 国内网络可选用镜像加速:pip install tdx2db -i https://mirrors.aliyun.com/pypi/simple/

PostgreSQL / MySQL 需要先建数据库(表结构会在首次运行时自动创建,数据库本身需要先建好):

createdb tdx_data                                  # PostgreSQL
# mysql -u root -p -e 'CREATE DATABASE tdx_data'   # MySQL
# SQLite 无需此步骤

配置(.env)

运行命令的目录下创建 .env 文件(.env 从当前工作目录读取;也可以直接用环境变量或命令行参数):

# 通达信安装目录(必填)。判断标准:该目录下应存在 vipdoc/sz/lday/*.day 文件
TDX_PATH=C:\new_tdx                # Windows
# TDX_PATH=/Volumes/share/new_tdx  # macOS(SMB 挂载 Windows 共享)
# TDX_PATH=/mnt/share/new_tdx     # Linux(CIFS 挂载)

DB_TYPE=postgresql                 # postgresql / mysql / sqlite
DB_HOST=localhost
DB_PORT=5432
DB_NAME=tdx_data                   # sqlite 时为文件名(生成 tdx_data.db)
DB_USER=postgres
DB_PASSWORD=your_password          # 密码只从 .env 读取,不提供命令行参数

可选项:DB_BATCH_SIZE(批量写入大小)、CSV_OUTPUT_PATH(CSV 导出目录)、USE_TQDM(进度条开关)。

最小化尝鲜(不写 .env,SQLite 落盘为当前目录 tdx_data.db):

tdx2db --tdx-path /path/to/new_tdx --db-type sqlite --db-name tdx_data sync

首次使用

  1. 打开通达信 → 选项 → 盘后数据下载 → 下载日线和分钟线数据(TDX 默认只缓存看过的股票,必须先做这一步)

  2. 同步股票列表:

tdx2db stock-list --db-only
  1. 一键同步所有行情数据:
tdx2db sync

每日更新

tdx2db sync

程序按股票逐只检测数据库最新日期,只同步新数据。

增量同步与唯一约束

增量同步(自动跳过重复数据)依赖 (code, date/datetime) 唯一约束。

新用户:无需任何操作——表结构由程序自动创建,已内建唯一约束。

老用户(v0.2.0 之前建的表没有约束)需执行一次迁移脚本,否则 PostgreSQL 下增量写入会全部失败、MySQL/SQLite 下会静默累积重复数据。不确定的话可先自检:

-- PostgreSQL:有输出说明约束已存在,无需迁移
SELECT conname FROM pg_constraint WHERE conname LIKE 'uq_%';
-- MySQL
SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME LIKE 'uq_%';

迁移脚本:

# PostgreSQL
psql -U your_user -d your_database -f scripts/add_constraints.sql

# MySQL
mysql -u your_user -p your_database < scripts/add_constraints_mysql.sql

脚本会先清理已有重复数据再加约束,执行前请备份。

其他命令

单独同步日线/分钟线
# 日线增量同步(逐股票精确增量)
tdx2db daily --db-only --auto-start --incremental

# 分钟线增量同步
tdx2db minutes --db-only --auto-start --incremental
指定日期范围
tdx2db daily --db-only --start_date 2025-01-01 --end_date 2025-01-31
tdx2db minutes --db-only --start_date 2025-01-01
导出到 CSV
tdx2db daily --csv-only
tdx2db minutes --csv-only

数据表结构

表名 唯一约束 内容
daily_data (code, date) 日线 OHLCV + 均线
minute5_data / minute15_data / minute30_data / minute60_data (code, datetime) 分钟线 OHLCV + 均线(15/30/60 由 5 分钟重采样)
stock_info code 股票列表

均线列ma5 / ma10 / ma60 / ma250 为常规窗口,ma13 / ma21 / ma34 / ma55 / ma89 / ma144 / ma233 为斐波那契窗口(服务缠论类分析,不需要可忽略)。上市不足对应窗口天数的行为 NULL。

⚠️ code 格式差异(跨表查询必读)stock_info.code 带市场前缀(sz000001 / sh600000),而 daily_data / minute*_data 的 code 是 6 位纯数字000001)。跨表 JOIN 需要 RIGHT(stock_info.code, 6) 或等价处理——这是最容易踩的坑。

已知限制

  • stock_info.name 目前是 深A000001 式占位符,不是真实股票名称
  • 收录范围:深市 000 / 001 / 002 / 300 / 301,沪市 60xxxx / 688xxx北交所、ETF、指数暂未纳入

FAQ

Q: 报"无法找到股票列表文件"或读到 0 只股票 A: TDX_PATH 指向错误,或通达信还没下载数据。确认该目录下存在 vipdoc/sz/lday/*.day,并先在通达信里执行"盘后数据下载"。

Q: 报 database "tdx_data" does not exist A: 表结构会自动建,但数据库本身要先创建,见"安装"一节的 createdb

Q: PostgreSQL 报 no unique or exclusion constraint,或 MySQL 数据越导越多 A: 老库缺唯一约束,见"增量同步与唯一约束"一节的自检和迁移脚本。

Q: 为什么没有北交所 / ETF / 指数数据? A: 当前 A 股筛选规则只收深市 000/001/002/300/301 和沪市 60/688。北交所(vipdoc/bj/)等扩展欢迎提 PR(见 CONTRIBUTING.md)。

Q: 数据是否复权? A: 不复权,且默认口径不会改变(设计决策,见 issue #2)。复权请在消费端处理。

开发与贡献

四层管道,单向数据流:

CLI (cli.py)  → Reader (reader.py) → Processor (processor.py) → Storage (storage.py)
 argparse        pytdx 读取本地       校验 + 重采样 + 均线        SQLAlchemy 批量写库
 命令分发 +      .day/.lc5 文件       (OHLCV 校验, resample,     增量 ON CONFLICT +
 同步编排                             MA 计算)                   表名白名单
git clone https://github.com/xbfighting/tdx2db.git && cd tdx2db
pip install -e '.[all]'
pytest tests/          # 单元测试(不需要真实 TDX 数据和数据库)

从源码运行时 python main.py <子命令>tdx2db <子命令> 等价(老用户习惯保留)。

贡献前请读 CONTRIBUTING.md——特别是"不接受的改动"一节(数据契约)。

使用 AI 辅助开发的贡献者:仓库带 CLAUDE.md,包含架构细节与历史坑(code 格式差异、增量逻辑),能让 AI 产出符合数据契约的 PR。

许可证

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tdx2db-0.3.0.tar.gz (25.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tdx2db-0.3.0-py3-none-any.whl (25.8 kB view details)

Uploaded Python 3

File details

Details for the file tdx2db-0.3.0.tar.gz.

File metadata

  • Download URL: tdx2db-0.3.0.tar.gz
  • Upload date:
  • Size: 25.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.15

File hashes

Hashes for tdx2db-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5c365dc7da9361b9ab915956798d479a437b0cc9bbd00747e1d4b58da1e9a09e
MD5 41be2140de81238e30edc49333649539
BLAKE2b-256 c3e0e667cc2f5c74636ab4f023e2cf81eac2f4506cc0c10f60917a774132fb1c

See more details on using hashes here.

File details

Details for the file tdx2db-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: tdx2db-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 25.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.15

File hashes

Hashes for tdx2db-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fd88e4c7737a50c2fcfea0bcf5c6f31c8353d5973428f7c738a6dd272b04b4e6
MD5 74a09f2b500b85be1011ec6961adf1ff
BLAKE2b-256 5324345fb4e67b4d5e6d535a9d62658abe18b727017f54a99cbb9658d925aa8e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page