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.
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/LICENSE +1 -1
- pytdxdata-0.5.0/PKG-INFO +156 -0
- pytdxdata-0.5.0/README.md +125 -0
- pytdxdata-0.5.0/pyproject.toml +79 -0
- pytdxdata-0.2.2/pyproject.toml → pytdxdata-0.5.0/pyproject.toml.orig +62 -56
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/__init__.py +1 -1
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/api.py +1291 -930
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/disk.py +13 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/manager.py +15 -13
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/memory.py +4 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cli.py +541 -433
- pytdxdata-0.5.0/src/pytdxdata/codec/__init__.py +20 -0
- pytdxdata-0.5.0/src/pytdxdata/codec/block.py +73 -0
- pytdxdata-0.5.0/src/pytdxdata/codec/financial.py +102 -0
- pytdxdata-0.5.0/src/pytdxdata/codec/industry.py +40 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/config.py +127 -109
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/models/__init__.py +407 -363
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/connection.py +47 -15
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/ex_connection.py +103 -103
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/ex_pool.py +119 -89
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/pool/health.py +61 -61
- pytdxdata-0.5.0/src/pytdxdata/pool/pool.py +328 -0
- pytdxdata-0.5.0/src/pytdxdata/pool/probe_cache.py +162 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/ex_ext.py +171 -171
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/ex_proto.py +125 -125
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/finance.py +64 -64
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/mac_ext.py +508 -508
- pytdxdata-0.5.0/src/pytdxdata/protocol/commands/mac_tick.py +71 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/minute.py +45 -45
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/quotes.py +122 -122
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/security_list.py +60 -60
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/xdxr.py +85 -85
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/datetime_.py +28 -28
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/frame.py +43 -43
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/price.py +67 -67
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/volume.py +46 -46
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/router.py +5 -2
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/scheduler/paginator.py +44 -17
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/server_probe.py +148 -148
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/servers.json +487 -422
- pytdxdata-0.2.2/PKG-INFO +0 -296
- pytdxdata-0.2.2/README.md +0 -265
- pytdxdata-0.2.2/src/pytdxdata/pool/pool.py +0 -328
- pytdxdata-0.2.2/src/pytdxdata/scheduler/__init__.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/_binary.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/__init__.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/key.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/cache/ttl.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/codec/payload.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/indicator.py +0 -0
- {pytdxdata-0.2.2/src/pytdxdata/codec → pytdxdata-0.5.0/src/pytdxdata/pool}/__init__.py +0 -0
- {pytdxdata-0.2.2/src/pytdxdata/pool → pytdxdata-0.5.0/src/pytdxdata/protocol}/__init__.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/__init__.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/base.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/kline.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/mac.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/setup.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/std_ext.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/commands/transaction.py +0 -0
- {pytdxdata-0.2.2 → pytdxdata-0.5.0}/src/pytdxdata/protocol/mac_frame.py +0 -0
- {pytdxdata-0.2.2/src/pytdxdata/protocol → pytdxdata-0.5.0/src/pytdxdata/scheduler}/__init__.py +0 -0
pytdxdata-0.5.0/PKG-INFO
ADDED
|
@@ -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
|
+
[](https://github.com/openbot-coder/pytdxdata/actions/workflows/ci.yml)
|
|
35
|
+
[](https://pypi.org/project/pytdxdata/)
|
|
36
|
+
[](https://pypi.org/project/pytdxdata/)
|
|
37
|
+
[](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
|
|
38
|
+
[](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
|
+
[](https://github.com/openbot-coder/pytdxdata/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/pytdxdata/)
|
|
5
|
+
[](https://pypi.org/project/pytdxdata/)
|
|
6
|
+
[](https://github.com/openbot-coder/pytdxdata/blob/main/LICENSE)
|
|
7
|
+
[](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.
|
|
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 = "
|
|
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/
|
|
29
|
-
Repository = "https://github.com/
|
|
30
|
-
Documentation = "https://github.
|
|
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
|
+
|