pytdxdata 0.2.2__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/LICENSE +1 -1
  2. pytdxdata-0.5.0/PKG-INFO +156 -0
  3. pytdxdata-0.5.0/README.md +125 -0
  4. pytdxdata-0.5.0/pyproject.toml +79 -0
  5. pytdxdata-0.2.2/pyproject.toml → pytdxdata-0.5.0/pyproject.toml.orig +62 -56
  6. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/__init__.py +1 -1
  7. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/api.py +1291 -930
  8. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/disk.py +13 -0
  9. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/manager.py +15 -13
  10. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/memory.py +4 -0
  11. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cli.py +541 -433
  12. pytdxdata-0.5.0/src/pytdxdata/codec/__init__.py +20 -0
  13. pytdxdata-0.5.0/src/pytdxdata/codec/block.py +73 -0
  14. pytdxdata-0.5.0/src/pytdxdata/codec/financial.py +102 -0
  15. pytdxdata-0.5.0/src/pytdxdata/codec/industry.py +40 -0
  16. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/config.py +127 -109
  17. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/models/__init__.py +407 -363
  18. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/connection.py +47 -15
  19. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/ex_connection.py +103 -103
  20. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/ex_pool.py +119 -89
  21. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/health.py +61 -61
  22. pytdxdata-0.5.0/src/pytdxdata/pool/pool.py +328 -0
  23. pytdxdata-0.5.0/src/pytdxdata/pool/probe_cache.py +162 -0
  24. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/ex_ext.py +171 -171
  25. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/ex_proto.py +125 -125
  26. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/finance.py +64 -64
  27. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/mac_ext.py +508 -508
  28. pytdxdata-0.5.0/src/pytdxdata/protocol/commands/mac_tick.py +71 -0
  29. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/minute.py +45 -45
  30. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/quotes.py +122 -122
  31. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/security_list.py +60 -60
  32. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/xdxr.py +85 -85
  33. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/datetime_.py +28 -28
  34. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/frame.py +43 -43
  35. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/price.py +67 -67
  36. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/volume.py +46 -46
  37. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/router.py +5 -2
  38. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/scheduler/paginator.py +44 -17
  39. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/server_probe.py +148 -148
  40. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/servers.json +487 -422
  41. pytdxdata-0.2.2/PKG-INFO +0 -296
  42. pytdxdata-0.2.2/README.md +0 -265
  43. pytdxdata-0.2.2/src/pytdxdata/pool/pool.py +0 -328
  44. pytdxdata-0.2.2/src/pytdxdata/scheduler/__init__.py +0 -0
  45. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/_binary.py +0 -0
  46. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/__init__.py +0 -0
  47. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/key.py +0 -0
  48. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/ttl.py +0 -0
  49. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/codec/payload.py +0 -0
  50. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/indicator.py +0 -0
  51. {pytdxdata-0.2.2/src/pytdxdata/codec → pytdxdata-0.5.0/src/pytdxdata/pool}/__init__.py +0 -0
  52. {pytdxdata-0.2.2/src/pytdxdata/pool → pytdxdata-0.5.0/src/pytdxdata/protocol}/__init__.py +0 -0
  53. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/__init__.py +0 -0
  54. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/base.py +0 -0
  55. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/kline.py +0 -0
  56. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/mac.py +0 -0
  57. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/setup.py +0 -0
  58. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/std_ext.py +0 -0
  59. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/transaction.py +0 -0
  60. {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/mac_frame.py +0 -0
  61. {pytdxdata-0.2.2/src/pytdxdata/protocol → pytdxdata-0.5.0/src/pytdxdata/scheduler}/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 vex1023
3
+ Copyright (c) 2026 openbot-coder
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: pytdxdata
3
+ Version: 0.5.0
4
+ Summary: 通达信(TongDaXin)行情数据客户端:动态连接池 + 双层TTL缓存 + 3连接并发分页,纯asyncio零运行时依赖,支持A股/港股/美股/期货/期权
5
+ Keywords: tdx,trading,stock,kline,quote,通达信,A股,港股,美股,期货,asyncio,quant
6
+ Author: openbot-coder
7
+ Author-email: openbot-coder <openbot-coder@users.noreply.github.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Financial and Insurance Industry
13
+ Classifier: Topic :: Office/Business :: Financial :: Investment
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Framework :: AsyncIO
19
+ Classifier: Typing :: Typed
20
+ Requires-Dist: pytest>=8.0 ; extra == 'dev'
21
+ Requires-Dist: pytest-asyncio>=0.24 ; extra == 'dev'
22
+ Requires-Dist: ruff>=0.6 ; extra == 'dev'
23
+ Requires-Dist: uvloop>=0.21 ; extra == 'uvloop'
24
+ Requires-Python: >=3.11
25
+ Project-URL: Homepage, https://github.com/openbot-coder/pytdxdata
26
+ Project-URL: Repository, https://github.com/openbot-coder/pytdxdata
27
+ Project-URL: Documentation, https://openbot-coder.github.io/pytdxdata/
28
+ Provides-Extra: dev
29
+ Provides-Extra: uvloop
30
+ Description-Content-Type: text/markdown
31
+
32
+ # pytdxdata
33
+
34
+ [![CI](https://img.shields.io/github/actions/workflow/status/openbot-coder/pytdxdata/ci.yml?branch=main&label=CI)](https://github.com/openbot-coder/pytdxdata/actions/workflows/ci.yml)
35
+ [![PyPI version](https://img.shields.io/pypi/v/pytdxdata)](https://pypi.org/project/pytdxdata/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/pytdxdata)](https://pypi.org/project/pytdxdata/)
37
+ [![License](https://img.shields.io/pypi/l/pytdxdata)](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
38
+ [![PyPI downloads](https://img.shields.io/pypi/dm/pytdxdata)](https://pypi.org/project/pytdxdata/)
39
+
40
+ 通达信(TongDaXin)行情数据客户端:**动态连接池 + 双层 TTL 缓存 + 多连接并发分页**,纯 asyncio、**零运行时依赖**。
41
+
42
+ **A股(沪/深/北) + 港股 + 美股 + 期货 + 期权**,一套接口全市场。
43
+
44
+ 📖 **完整文档:<https://openbot-coder.github.io/pytdxdata/>**
45
+
46
+ ## 安装
47
+
48
+ ```bash
49
+ pip install pytdxdata # 或 uv add pytdxdata
50
+ ```
51
+
52
+ 可选异步加速:
53
+
54
+ ```bash
55
+ pip install "pytdxdata[uvloop]"
56
+ ```
57
+
58
+ ## 30 秒上手
59
+
60
+ ```python
61
+ import asyncio
62
+ from pytdxdata import TdxData
63
+ from pytdxdata.models import Market, KlinePeriod, Adjust
64
+
65
+ async def main():
66
+ async with TdxData() as td: # 自动建连接池 + 缓存
67
+ # 日K线(count 超过单页大小会自动多连接并发分页)
68
+ bars = await td.get_kline(Market.SH, "600000", KlinePeriod.DAY, count=240)
69
+ # 前复权(自动走 MAC 通道)
70
+ qfq = await td.get_kline(Market.SZ, "300308", KlinePeriod.DAY,
71
+ count=500, adjust=Adjust.QFQ)
72
+ # 五档报价(传 (market, code) 元组列表,>80 只自动切批)
73
+ quotes = await td.get_quotes([(Market.SH, "600000"), (Market.SZ, "000001")])
74
+ # 逐笔成交(MAC 通道,支持历史日期)
75
+ ticks = await td.get_transactions(Market.SZ, "000001", date=20260811)
76
+ print(bars[-1].close, quotes[0].price, len(ticks))
77
+
78
+ asyncio.run(main())
79
+ ```
80
+
81
+ 返回的是标准库 `dataclass` 组成的 `list`(库本身不依赖 pandas)。要 DataFrame 一行转:
82
+
83
+ ```python
84
+ from dataclasses import asdict
85
+ import pandas as pd
86
+ df = pd.DataFrame([asdict(b) for b in bars])
87
+ ```
88
+
89
+ ## 特性
90
+
91
+ | 特性 | 说明 |
92
+ |------|------|
93
+ | 🧩 动态连接池 | 启动时对服务器**真实 K 线探测**选优(剔除握手正常但数据为空的坏节点),健康分 + EWMA 延迟选路,跨服务器故障转移 |
94
+ | 🗄️ 双层 TTL 缓存 | 内存 LRU + 磁盘 SQLite(WAL),TTL 分级;single-flight 并发同键去重;缓存**已解析记录**(重复请求 0 网络 0 解析) |
95
+ | ⚡ 并发分页 | 单请求拆 N 页(显式 start 偏移 → 无状态可并行)并行拉取、按序拼接、失败换连接重试 |
96
+ | 🔀 双通道整合 | 标准通道(经典行情)+ MAC 通道(逐笔 / 复权 / 1 分钟 K 线),按命令自动选路 |
97
+ | 📦 零重型依赖 | 纯 asyncio + stdlib(socket / zlib / struct / sqlite3) |
98
+ | 📊 全市场覆盖 | A股、港股、美股、期货、期权(46 个扩展市场) |
99
+ | 📄 服务器文件解析 | 板块 `block_*.dat` / 行业 `tdxhy.cfg` / 财报 `gpcw*.zip` **下载即解析**成 dataclass |
100
+ | 🤖 AI 助手友好 | 内置 [`SKILL.md`](https://github.com/openbot-coder/pytdxdata/blob/main/SKILL.md) 与 [`llms.txt`](https://openbot-coder.github.io/pytdxdata/llms.txt) |
101
+
102
+ ## 文档导航
103
+
104
+ | 我想… | 去哪 |
105
+ |------|------|
106
+ | 装好跑起来 | [快速开始](https://openbot-coder.github.io/pytdxdata/getting-started/) |
107
+ | 抄场景代码(转 DataFrame / 批量下载 / 离线板块快照) | [场景示例](https://openbot-coder.github.io/pytdxdata/cookbook/) |
108
+ | 查方法签名与参数 | [TdxData 方法](https://openbot-coder.github.io/pytdxdata/api/tdxdata/) — 由 docstring 自动生成 |
109
+ | 搞清枚举该填几 | [枚举速查](https://openbot-coder.github.io/pytdxdata/api/enums/) |
110
+ | 看协议二进制格式、三池路由、缓存策略 | [深入原理](https://openbot-coder.github.io/pytdxdata/internals/architecture/) |
111
+ | 用命令行 | [命令行工具](https://openbot-coder.github.io/pytdxdata/cli/) |
112
+ | 完整接口清单(51 个数据方法) | [`docs/API_REFERENCE.md`](https://openbot-coder.github.io/pytdxdata/API_REFERENCE/) |
113
+ | 版本变更 | [`CHANGELOG.md`](https://github.com/openbot-coder/pytdxdata/blob/main/CHANGELOG.md) |
114
+
115
+ > 本 README 只做**入口层**。深度内容一律在文档站,避免两处维护造成漂移。
116
+
117
+ ## 给 AI 助手用
118
+
119
+ 仓库根的 [`SKILL.md`](https://github.com/openbot-coder/pytdxdata/blob/main/SKILL.md) 是一份可直接加载的技能:三条必守约定、`KlinePeriod` 等枚举取值表、
120
+ 「想做什么 → 用哪个方法」决策表、以及 9 条真实陷阱。AI 编程助手读完就能一次写对,不必翻源码。
121
+
122
+ ```bash
123
+ # 丢进你所用 AI 助手的 skills 目录即可
124
+ curl -o ~/.workbuddy/skills/pytdxdata/SKILL.md --create-dirs \
125
+ https://raw.githubusercontent.com/openbot-coder/pytdxdata/main/SKILL.md
126
+ ```
127
+
128
+ ## 示例
129
+
130
+ - [`examples/quickstart.py`](https://github.com/openbot-coder/pytdxdata/blob/main/examples/quickstart.py) — 报价 / K线 / 分时 / 板块
131
+ - [`examples/server_files.py`](https://github.com/openbot-coder/pytdxdata/blob/main/examples/server_files.py) — 板块 / 行业 / 财报 下载 + 解析
132
+
133
+ ## 开发
134
+
135
+ ```bash
136
+ uv sync # 建虚拟环境 + 注册 tdx 命令
137
+ uv run pytest tests/ # 109 个测试用例(协议 / 池 / 缓存 / 分页 / API / 文件解析 / CLI / 文档漂移)
138
+ uv sync --group docs # 文档站依赖(mkdocs-material + mkdocstrings)
139
+ uv run mkdocs serve # 本地预览文档站
140
+ ```
141
+
142
+ ## 已知限制
143
+
144
+ - 行情来自通达信公开服务器,**15 分钟延时**;需实时数据请使用券商行情
145
+ - 标准通道 K 线 `count < 100` 部分服务器返回空 → 分页器已强制 `min_page=100` 规避
146
+ - 港股 / 美股期权在通达信协议内无数据
147
+ - 服务器可用性随时间变化,可用 `python -m pytdxdata.server_probe` 重新探测
148
+
149
+ ## 免责声明
150
+
151
+ 本包仅用于**技术研究与教育目的**。行情数据来自通达信公开接口,不保证实时性与准确性;
152
+ 作者不对任何投资决策负责。使用前请遵守通达信服务条款及相关法律法规。
153
+
154
+ ## License
155
+
156
+ [MIT](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
@@ -0,0 +1,125 @@
1
+ # pytdxdata
2
+
3
+ [![CI](https://img.shields.io/github/actions/workflow/status/openbot-coder/pytdxdata/ci.yml?branch=main&label=CI)](https://github.com/openbot-coder/pytdxdata/actions/workflows/ci.yml)
4
+ [![PyPI version](https://img.shields.io/pypi/v/pytdxdata)](https://pypi.org/project/pytdxdata/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/pytdxdata)](https://pypi.org/project/pytdxdata/)
6
+ [![License](https://img.shields.io/pypi/l/pytdxdata)](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
7
+ [![PyPI downloads](https://img.shields.io/pypi/dm/pytdxdata)](https://pypi.org/project/pytdxdata/)
8
+
9
+ 通达信(TongDaXin)行情数据客户端:**动态连接池 + 双层 TTL 缓存 + 多连接并发分页**,纯 asyncio、**零运行时依赖**。
10
+
11
+ **A股(沪/深/北) + 港股 + 美股 + 期货 + 期权**,一套接口全市场。
12
+
13
+ 📖 **完整文档:<https://openbot-coder.github.io/pytdxdata/>**
14
+
15
+ ## 安装
16
+
17
+ ```bash
18
+ pip install pytdxdata # 或 uv add pytdxdata
19
+ ```
20
+
21
+ 可选异步加速:
22
+
23
+ ```bash
24
+ pip install "pytdxdata[uvloop]"
25
+ ```
26
+
27
+ ## 30 秒上手
28
+
29
+ ```python
30
+ import asyncio
31
+ from pytdxdata import TdxData
32
+ from pytdxdata.models import Market, KlinePeriod, Adjust
33
+
34
+ async def main():
35
+ async with TdxData() as td: # 自动建连接池 + 缓存
36
+ # 日K线(count 超过单页大小会自动多连接并发分页)
37
+ bars = await td.get_kline(Market.SH, "600000", KlinePeriod.DAY, count=240)
38
+ # 前复权(自动走 MAC 通道)
39
+ qfq = await td.get_kline(Market.SZ, "300308", KlinePeriod.DAY,
40
+ count=500, adjust=Adjust.QFQ)
41
+ # 五档报价(传 (market, code) 元组列表,>80 只自动切批)
42
+ quotes = await td.get_quotes([(Market.SH, "600000"), (Market.SZ, "000001")])
43
+ # 逐笔成交(MAC 通道,支持历史日期)
44
+ ticks = await td.get_transactions(Market.SZ, "000001", date=20260811)
45
+ print(bars[-1].close, quotes[0].price, len(ticks))
46
+
47
+ asyncio.run(main())
48
+ ```
49
+
50
+ 返回的是标准库 `dataclass` 组成的 `list`(库本身不依赖 pandas)。要 DataFrame 一行转:
51
+
52
+ ```python
53
+ from dataclasses import asdict
54
+ import pandas as pd
55
+ df = pd.DataFrame([asdict(b) for b in bars])
56
+ ```
57
+
58
+ ## 特性
59
+
60
+ | 特性 | 说明 |
61
+ |------|------|
62
+ | 🧩 动态连接池 | 启动时对服务器**真实 K 线探测**选优(剔除握手正常但数据为空的坏节点),健康分 + EWMA 延迟选路,跨服务器故障转移 |
63
+ | 🗄️ 双层 TTL 缓存 | 内存 LRU + 磁盘 SQLite(WAL),TTL 分级;single-flight 并发同键去重;缓存**已解析记录**(重复请求 0 网络 0 解析) |
64
+ | ⚡ 并发分页 | 单请求拆 N 页(显式 start 偏移 → 无状态可并行)并行拉取、按序拼接、失败换连接重试 |
65
+ | 🔀 双通道整合 | 标准通道(经典行情)+ MAC 通道(逐笔 / 复权 / 1 分钟 K 线),按命令自动选路 |
66
+ | 📦 零重型依赖 | 纯 asyncio + stdlib(socket / zlib / struct / sqlite3) |
67
+ | 📊 全市场覆盖 | A股、港股、美股、期货、期权(46 个扩展市场) |
68
+ | 📄 服务器文件解析 | 板块 `block_*.dat` / 行业 `tdxhy.cfg` / 财报 `gpcw*.zip` **下载即解析**成 dataclass |
69
+ | 🤖 AI 助手友好 | 内置 [`SKILL.md`](https://github.com/openbot-coder/pytdxdata/blob/main/SKILL.md) 与 [`llms.txt`](https://openbot-coder.github.io/pytdxdata/llms.txt) |
70
+
71
+ ## 文档导航
72
+
73
+ | 我想… | 去哪 |
74
+ |------|------|
75
+ | 装好跑起来 | [快速开始](https://openbot-coder.github.io/pytdxdata/getting-started/) |
76
+ | 抄场景代码(转 DataFrame / 批量下载 / 离线板块快照) | [场景示例](https://openbot-coder.github.io/pytdxdata/cookbook/) |
77
+ | 查方法签名与参数 | [TdxData 方法](https://openbot-coder.github.io/pytdxdata/api/tdxdata/) — 由 docstring 自动生成 |
78
+ | 搞清枚举该填几 | [枚举速查](https://openbot-coder.github.io/pytdxdata/api/enums/) |
79
+ | 看协议二进制格式、三池路由、缓存策略 | [深入原理](https://openbot-coder.github.io/pytdxdata/internals/architecture/) |
80
+ | 用命令行 | [命令行工具](https://openbot-coder.github.io/pytdxdata/cli/) |
81
+ | 完整接口清单(51 个数据方法) | [`docs/API_REFERENCE.md`](https://openbot-coder.github.io/pytdxdata/API_REFERENCE/) |
82
+ | 版本变更 | [`CHANGELOG.md`](https://github.com/openbot-coder/pytdxdata/blob/main/CHANGELOG.md) |
83
+
84
+ > 本 README 只做**入口层**。深度内容一律在文档站,避免两处维护造成漂移。
85
+
86
+ ## 给 AI 助手用
87
+
88
+ 仓库根的 [`SKILL.md`](https://github.com/openbot-coder/pytdxdata/blob/main/SKILL.md) 是一份可直接加载的技能:三条必守约定、`KlinePeriod` 等枚举取值表、
89
+ 「想做什么 → 用哪个方法」决策表、以及 9 条真实陷阱。AI 编程助手读完就能一次写对,不必翻源码。
90
+
91
+ ```bash
92
+ # 丢进你所用 AI 助手的 skills 目录即可
93
+ curl -o ~/.workbuddy/skills/pytdxdata/SKILL.md --create-dirs \
94
+ https://raw.githubusercontent.com/openbot-coder/pytdxdata/main/SKILL.md
95
+ ```
96
+
97
+ ## 示例
98
+
99
+ - [`examples/quickstart.py`](https://github.com/openbot-coder/pytdxdata/blob/main/examples/quickstart.py) — 报价 / K线 / 分时 / 板块
100
+ - [`examples/server_files.py`](https://github.com/openbot-coder/pytdxdata/blob/main/examples/server_files.py) — 板块 / 行业 / 财报 下载 + 解析
101
+
102
+ ## 开发
103
+
104
+ ```bash
105
+ uv sync # 建虚拟环境 + 注册 tdx 命令
106
+ uv run pytest tests/ # 109 个测试用例(协议 / 池 / 缓存 / 分页 / API / 文件解析 / CLI / 文档漂移)
107
+ uv sync --group docs # 文档站依赖(mkdocs-material + mkdocstrings)
108
+ uv run mkdocs serve # 本地预览文档站
109
+ ```
110
+
111
+ ## 已知限制
112
+
113
+ - 行情来自通达信公开服务器,**15 分钟延时**;需实时数据请使用券商行情
114
+ - 标准通道 K 线 `count < 100` 部分服务器返回空 → 分页器已强制 `min_page=100` 规避
115
+ - 港股 / 美股期权在通达信协议内无数据
116
+ - 服务器可用性随时间变化,可用 `python -m pytdxdata.server_probe` 重新探测
117
+
118
+ ## 免责声明
119
+
120
+ 本包仅用于**技术研究与教育目的**。行情数据来自通达信公开接口,不保证实时性与准确性;
121
+ 作者不对任何投资决策负责。使用前请遵守通达信服务条款及相关法律法规。
122
+
123
+ ## License
124
+
125
+ [MIT](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
@@ -0,0 +1,79 @@
1
+ [project]
2
+ name = "pytdxdata"
3
+ version = "0.5.0"
4
+ description = "通达信(TongDaXin)行情数据客户端:动态连接池 + 双层TTL缓存 + 3连接并发分页,纯asyncio零运行时依赖,支持A股/港股/美股/期货/期权"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
9
+ keywords = [
10
+ "tdx",
11
+ "trading",
12
+ "stock",
13
+ "kline",
14
+ "quote",
15
+ "通达信",
16
+ "A股",
17
+ "港股",
18
+ "美股",
19
+ "期货",
20
+ "asyncio",
21
+ "quant",
22
+ ]
23
+ classifiers = [
24
+ "Development Status :: 4 - Beta",
25
+ "Intended Audience :: Developers",
26
+ "Intended Audience :: Financial and Insurance Industry",
27
+ "Topic :: Office/Business :: Financial :: Investment",
28
+ "Programming Language :: Python :: 3.11",
29
+ "Programming Language :: Python :: 3.12",
30
+ "Programming Language :: Python :: 3.13",
31
+ "Operating System :: OS Independent",
32
+ "Framework :: AsyncIO",
33
+ "Typing :: Typed",
34
+ ]
35
+ dependencies = []
36
+
37
+ [[project.authors]]
38
+ name = "openbot-coder"
39
+ email = "openbot-coder@users.noreply.github.com"
40
+
41
+ [project.urls]
42
+ Homepage = "https://github.com/openbot-coder/pytdxdata"
43
+ Repository = "https://github.com/openbot-coder/pytdxdata"
44
+ Documentation = "https://openbot-coder.github.io/pytdxdata/"
45
+
46
+ [project.optional-dependencies]
47
+ uvloop = ["uvloop>=0.21"]
48
+ dev = [
49
+ "pytest>=8.0",
50
+ "pytest-asyncio>=0.24",
51
+ "ruff>=0.6",
52
+ ]
53
+
54
+ [project.scripts]
55
+ tdx = "pytdxdata.cli:main"
56
+
57
+ [build-system]
58
+ requires = ["uv_build>=0.11.1,<0.12.0"]
59
+ build-backend = "uv_build"
60
+
61
+ [tool.ruff]
62
+ line-length = 100
63
+ target-version = "py313"
64
+
65
+ [tool.pytest.ini_options]
66
+ asyncio_mode = "auto"
67
+ testpaths = ["tests"]
68
+
69
+ [dependency-groups]
70
+ dev = [
71
+ "pytest>=9.1.1",
72
+ "pytest-asyncio>=1.4.0",
73
+ ]
74
+ docs = [
75
+ "mkdocs-material>=9.5",
76
+ "mkdocstrings[python]>=0.26",
77
+ "ruff>=0.6",
78
+ "jieba>=0.42",
79
+ ]
@@ -1,56 +1,62 @@
1
- [project]
2
- name = "pytdxdata"
3
- version = "0.2.2"
4
- description = "通达信(TongDaXin)行情数据客户端:动态连接池 + 双层TTL缓存 + 3连接并发分页,纯asyncio零运行时依赖,支持A股/港股/美股/期货/期权"
5
- readme = "README.md"
6
- requires-python = ">=3.11"
7
- license = "MIT"
8
- license-files = ["LICENSE"]
9
- keywords = ["tdx", "trading", "stock", "kline", "quote", "通达信", "A股", "港股", "美股", "期货", "asyncio", "quant"]
10
- authors = [
11
- { name = "vex1023", email = "vex1023@qq.com" }
12
- ]
13
- classifiers = [
14
- "Development Status :: 4 - Beta",
15
- "Intended Audience :: Developers",
16
- "Intended Audience :: Financial and Insurance Industry",
17
- "Topic :: Office/Business :: Financial :: Investment",
18
- "Programming Language :: Python :: 3.11",
19
- "Programming Language :: Python :: 3.12",
20
- "Programming Language :: Python :: 3.13",
21
- "Operating System :: OS Independent",
22
- "Framework :: AsyncIO",
23
- "Typing :: Typed",
24
- ]
25
- dependencies = []
26
-
27
- [project.urls]
28
- Homepage = "https://github.com/vex1023/pytdxdata"
29
- Repository = "https://github.com/vex1023/pytdxdata"
30
- Documentation = "https://github.com/vex1023/pytdxdata#readme"
31
-
32
- [project.optional-dependencies]
33
- uvloop = ["uvloop>=0.21"]
34
- dev = ["pytest>=8.0", "pytest-asyncio>=0.24", "ruff>=0.6"]
35
-
36
- [project.scripts]
37
- tdx = "pytdxdata.cli:main"
38
-
39
- [build-system]
40
- requires = ["uv_build>=0.11.1,<0.12.0"]
41
- build-backend = "uv_build"
42
-
43
- [tool.ruff]
44
- line-length = 100
45
- target-version = "py313"
46
-
47
- [tool.pytest.ini_options]
48
- asyncio_mode = "auto"
49
- testpaths = ["tests"]
50
-
51
- [dependency-groups]
52
- dev = [
53
- "pytest>=9.1.1",
54
- "pytest-asyncio>=1.4.0",
55
- ]
56
-
1
+ [project]
2
+ name = "pytdxdata"
3
+ version = "0.5.0"
4
+ description = "通达信(TongDaXin)行情数据客户端:动态连接池 + 双层TTL缓存 + 3连接并发分页,纯asyncio零运行时依赖,支持A股/港股/美股/期货/期权"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
9
+ keywords = ["tdx", "trading", "stock", "kline", "quote", "通达信", "A股", "港股", "美股", "期货", "asyncio", "quant"]
10
+ authors = [
11
+ { name = "openbot-coder", email = "openbot-coder@users.noreply.github.com" }
12
+ ]
13
+ classifiers = [
14
+ "Development Status :: 4 - Beta",
15
+ "Intended Audience :: Developers",
16
+ "Intended Audience :: Financial and Insurance Industry",
17
+ "Topic :: Office/Business :: Financial :: Investment",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Programming Language :: Python :: 3.13",
21
+ "Operating System :: OS Independent",
22
+ "Framework :: AsyncIO",
23
+ "Typing :: Typed",
24
+ ]
25
+ dependencies = []
26
+
27
+ [project.urls]
28
+ Homepage = "https://github.com/openbot-coder/pytdxdata"
29
+ Repository = "https://github.com/openbot-coder/pytdxdata"
30
+ Documentation = "https://openbot-coder.github.io/pytdxdata/"
31
+
32
+ [project.optional-dependencies]
33
+ uvloop = ["uvloop>=0.21"]
34
+ dev = ["pytest>=8.0", "pytest-asyncio>=0.24", "ruff>=0.6"]
35
+
36
+ [project.scripts]
37
+ tdx = "pytdxdata.cli:main"
38
+
39
+ [build-system]
40
+ requires = ["uv_build>=0.11.1,<0.12.0"]
41
+ build-backend = "uv_build"
42
+
43
+ [tool.ruff]
44
+ line-length = 100
45
+ target-version = "py313"
46
+
47
+ [tool.pytest.ini_options]
48
+ asyncio_mode = "auto"
49
+ testpaths = ["tests"]
50
+
51
+ [dependency-groups]
52
+ dev = [
53
+ "pytest>=9.1.1",
54
+ "pytest-asyncio>=1.4.0",
55
+ ]
56
+ docs = [
57
+ "mkdocs-material>=9.5",
58
+ "mkdocstrings[python]>=0.26",
59
+ "ruff>=0.6",
60
+ "jieba>=0.42",
61
+ ]
62
+
@@ -16,7 +16,7 @@ from .models import (
16
16
  XdxrRecord,
17
17
  )
18
18
 
19
- __version__ = "0.2.2"
19
+ __version__ = "0.5.0"
20
20
  __all__ = [
21
21
  "TdxData",
22
22
  "Market",