datapush-sdk 0.1.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 (29) hide show
  1. datapush_sdk-0.1.0/LICENSE +21 -0
  2. datapush_sdk-0.1.0/PKG-INFO +174 -0
  3. datapush_sdk-0.1.0/README.md +138 -0
  4. datapush_sdk-0.1.0/pyproject.toml +68 -0
  5. datapush_sdk-0.1.0/setup.cfg +4 -0
  6. datapush_sdk-0.1.0/src/datapush/__init__.py +104 -0
  7. datapush_sdk-0.1.0/src/datapush/_endpoints.py +68 -0
  8. datapush_sdk-0.1.0/src/datapush/_version.py +7 -0
  9. datapush_sdk-0.1.0/src/datapush/adjust.py +114 -0
  10. datapush_sdk-0.1.0/src/datapush/cache.py +405 -0
  11. datapush_sdk-0.1.0/src/datapush/cli.py +716 -0
  12. datapush_sdk-0.1.0/src/datapush/client.py +594 -0
  13. datapush_sdk-0.1.0/src/datapush/config.py +170 -0
  14. datapush_sdk-0.1.0/src/datapush/errors.py +150 -0
  15. datapush_sdk-0.1.0/src/datapush/models.py +483 -0
  16. datapush_sdk-0.1.0/src/datapush/py.typed +0 -0
  17. datapush_sdk-0.1.0/src/datapush/rest.py +295 -0
  18. datapush_sdk-0.1.0/src/datapush/ws.py +389 -0
  19. datapush_sdk-0.1.0/src/datapush_sdk/__init__.py +17 -0
  20. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/PKG-INFO +174 -0
  21. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/SOURCES.txt +27 -0
  22. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/dependency_links.txt +1 -0
  23. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/entry_points.txt +2 -0
  24. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/requires.txt +8 -0
  25. datapush_sdk-0.1.0/src/datapush_sdk.egg-info/top_level.txt +2 -0
  26. datapush_sdk-0.1.0/tests/test_cli.py +141 -0
  27. datapush_sdk-0.1.0/tests/test_client_cache.py +139 -0
  28. datapush_sdk-0.1.0/tests/test_rest.py +133 -0
  29. datapush_sdk-0.1.0/tests/test_ws_contract.py +257 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 datapush
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,174 @@
1
+ Metadata-Version: 2.4
2
+ Name: datapush-sdk
3
+ Version: 0.1.0
4
+ Summary: datapush A 股行情 SDK:实时推送 + 历史 K 线 + 复权因子 + 本地按需缓存(CLI 与 Python 两种用法)
5
+ Author-email: datapush <support@datapush.vip>
6
+ License: MIT
7
+ Project-URL: Homepage, https://api.datapush.vip
8
+ Project-URL: Documentation, https://api.datapush.vip/dp/docs
9
+ Project-URL: Source, https://api.datapush.vip
10
+ Project-URL: Bug Tracker, https://api.datapush.vip
11
+ Keywords: datapush,a-share,stock,market-data,kline,quote,websocket,quant,sdk
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Financial and Insurance Industry
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Classifier: Topic :: Office/Business :: Financial :: Investment
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.9
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7; extra == "dev"
31
+ Requires-Dist: build>=1.0; extra == "dev"
32
+ Requires-Dist: twine>=4.0; extra == "dev"
33
+ Provides-Extra: pandas
34
+ Requires-Dist: pandas>=1.3; extra == "pandas"
35
+ Dynamic: license-file
36
+
37
+ # datapush-sdk
38
+
39
+ **datapush A 股行情 SDK**(Python):REST 历史 + WebSocket 实时 + **本地按需缓存**。
40
+ **零第三方依赖**(只用标准库),`pip install` 后即可用 **命令行** 与 **Python 两种方式**使用,前缀都是 `datapush`。
41
+
42
+ ```bash
43
+ pip install datapush-sdk
44
+ datapush config set-key sk-xxx # 保存 API Key(也可用环境变量 DATAPUSH_API_KEY)
45
+ datapush kline 000001 # 一行拿到最近 30 个交易日日K(自动缓存)
46
+ ```
47
+
48
+ ```python
49
+ import datapush
50
+ c = datapush.Client() # Key 自动读;缓存默认开启
51
+ page = c.kline("000001", days=250) # 一行拿数据;第二次调用命中缓存
52
+ for bar in page:
53
+ print(bar.time, bar.close)
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 1. 安装与配置
59
+
60
+ ```bash
61
+ pip install datapush-sdk # 运行时零依赖
62
+ pip install "datapush-sdk[pandas]" # 可选:需要 to_pandas()
63
+ ```
64
+
65
+ API Key 的解析优先级(高 → 低):**显式参数 → 环境变量 `DATAPUSH_API_KEY` → `~/.datapush/config.json`**。
66
+ 推荐用 CLI 保存一次即可:`datapush config set-key sk-xxx`(也可 `datapush config show` 查看,Key 会打码)。
67
+
68
+ 服务地址默认 `https://api.datapush.vip`,可用 `--base-url` / `DATAPUSH_BASE_URL` / 配置文件覆盖。
69
+
70
+ ## 2. 本地按需缓存(默认开启,用户无感)
71
+
72
+ - **只存不复权原始价**(`adj=none`)+ 复权因子表 ⇒ 历史永不失效、只需追加;
73
+ - **复权在本地算**:`kind="qfq"|"hfq"|"raw"`,除权后自动正确、**无需重下历史**;
74
+ - **增量续拉**:用游标 `latest_time` 只拉新增(当日 forming bar 同键覆盖写,天然幂等);
75
+ - **范围自动补拉**:这次要 30 天、下次要 250 天,会自动把缺的那段补上;
76
+ - **断网可读**:`Client(offline=True)` 或 `--offline` 只读本地缓存;
77
+ - 缓存位置:`~/.datapush/cache/datapush.db`(SQLite 单文件);可用 `--cache-dir` / `DATAPUSH_CACHE_DIR`
78
+ / 配置文件 `cache_dir` 指定;`DATAPUSH_NO_CACHE=1` 或 `--no-cache` 彻底关闭。
79
+
80
+ ```bash
81
+ datapush cache info # 路径 / 大小 / 标的数 / 根数 / 时间范围
82
+ datapush cache path # 只打印缓存文件路径(脚本友好)
83
+ datapush cache prune --days 90 # 只保留最近 90 天
84
+ datapush cache clear --code 000001 # 清掉某只票
85
+ datapush update 000001 --period 1m # 手动增量(平时查询时自动做)
86
+ ```
87
+
88
+ **股票列表 / 基础信息 / 交易日 / 板块** 属于实时数据,**直连不缓存**(流量很小):
89
+ `datapush codes`(全市场代码,约 6 页 / 约 1MB)、`datapush stock 000001`。
90
+
91
+ ## 3. Python 用法速查
92
+
93
+ ```python
94
+ import datapush
95
+ c = datapush.Client() # 也可 Client(api_key=..., cache=False, offline=True)
96
+
97
+ # 历史
98
+ c.codes() # 全市场代码(实时)
99
+ c.stocks(all=True) # 全市场列表(实时);c.stocks(page=1, page_size=20) 单页
100
+ c.stock("000001") # 基础信息 12 字段(实时)
101
+ c.kline("000001", days=250) # 日K(前复权)
102
+ c.kline("000001", days=250, kind="hfq") # 后复权(本地因子表算)
103
+ c.kline("000001", start="2026-01-01", end="2026-09-26", kind="raw")
104
+ c.minute("000001", days=1) # 1 分钟 K 线(当日)
105
+ c.fiveminute("000001", days=5) # 5 分钟 K 线
106
+ c.kline("000001", since="2026-09-26 14:59") # 增量(闭区间,含该根)
107
+ c.xdxr("000001") # 复权因子表(TTL 1 天,除权后自动刷新)
108
+ c.factors("000001", size=30, fields="close,ma5") # 量化因子(高级用户)
109
+ c.factor_catalog() # 因子目录
110
+
111
+ # 实时(WebSocket)
112
+ q = c.quote("000001") # 一次快照(WS 首帧;REST 没有该接口)
113
+ for e in c.watch(["000001", "600108"], types=["quote", "k1"], seconds=30):
114
+ if e.type == "quote":
115
+ print(e.quote.price)
116
+
117
+ # 导出与缓存
118
+ c.kline("000001", days=250).to_csv("000001.csv")
119
+ c.kline("000001", days=250).to_dicts() # list[dict]
120
+ c.to_pandas(c.kline("000001", days=250)) # 需要 pandas
121
+ c.cache_info(); c.update("000001", period="day"); c.close()
122
+ ```
123
+
124
+ ## 4. CLI 速查
125
+
126
+ ```bash
127
+ datapush kline 000001 [--days 250 | --size 100 --offset 0 | --start 2026-01-01 --end 2026-09-26 | --since "..."]
128
+ [--period day|1m|5m] [--kind qfq|hfq|raw] [--limit 60] [--csv out.csv] [--json] [--no-refresh]
129
+ datapush minute 000001 --days 1
130
+ datapush fiveminute 000001 --days 5
131
+ datapush xdxr 000001 [--refresh]
132
+ datapush stocks [--page 1 --page-size 20] [--all]
133
+ datapush codes [--market sh|sz|bj] [--prefixed] # 默认一行一个,可直接管道
134
+ datapush stock 000001
135
+ datapush factors 000001 --size 30 [--fields close,ma5] [--daily-kline 0]
136
+ datapush quote 000001 [--types quote|depth]
137
+ datapush watch 000001 600108 [--types quote,k1] [--seconds 30]
138
+ datapush update 000001 --period 1m
139
+ datapush cache info|path|clear|prune
140
+ datapush config set-key sk-xxx | config show | config path | config set cache_dir D:/datapush-cache
141
+ datapush doctor # 一键排障
142
+ datapush get /api/v1/stocks/000001/xdxr --param k=v # 通用逃生舱(调试新接口)
143
+ ```
144
+
145
+ 通用选项可写在命令前或命令后:`--json`(原始 JSON,便于管道)、`--csv FILE`、`--api-key`、`--base-url`、
146
+ `--timeout`、`--cache-dir`、`--no-cache`、`--offline`。
147
+ 退出码:`0` 成功 / `1` 业务或网络错误 / `2` 参数错误。
148
+
149
+ ## 5. 本地复权(与官方文档公式一致)
150
+
151
+ `adj=none` 取原始价 + `xdxr()` 取因子表 ⇒ **一次乘法**:
152
+
153
+ ```
154
+ 段 = segments 里第一个 from ≤ bar.date(都不满足 ⇒ from 为空的兜底段)
155
+ 前复权价 = raw价 × seg.qfq 后复权价 = raw价 × seg.hfq
156
+ 换手率 = cjl / ltgb × seg.share_ratio × 100 自检:seg.hfq × P == seg.qfq(P = 兜底段 qfq)
157
+ ```
158
+
159
+ SDK 已内置:`datapush.adjust_bars(bars, table, kind=...)`、`datapush.pick_segment(table, date)`、
160
+ `datapush.verify_segments(table)`。细节见官方文档「复权因子表(本地复权计算)」。
161
+
162
+ ## 6. 常见问题
163
+
164
+ - **`import datapush` 不是我装的这个包?** PyPI 上另有一个无关的 `datapush`(MySQL 数据生成器)。
165
+ 两者同装会互相覆盖顶层模块,此时用别名:`import datapush_sdk as datapush`。
166
+ - **需要 Key 但没有?** 先 `datapush config set-key sk-xxx`(注册后在控制台复制);`datapush doctor` 可自查。
167
+ - **返回 402 / 429?** 402 = 积分不足;429 = 分钟接口限流(10 QPS/用户,SDK 已按 `Retry-After` 自动退避重试)。
168
+ - **能离线用吗?** 能:缓存过的标的用 `offline=True`/`--offline` 可读;实时接口必须联网。
169
+ - **WS 单连接能订阅多少?** 最多 50 个 code(SDK 会自动分批订阅);普通用户最多 10 个连接。
170
+
171
+ ## 7. 兼容性与许可
172
+
173
+ - Python **3.9+**(Windows / macOS / Linux),运行时**零第三方依赖**;`py.typed` 已附带,支持类型检查。
174
+ - License: **MIT**。接口与字段含义以官方文档为准(`https://api.datapush.vip/dp/docs`)。
@@ -0,0 +1,138 @@
1
+ # datapush-sdk
2
+
3
+ **datapush A 股行情 SDK**(Python):REST 历史 + WebSocket 实时 + **本地按需缓存**。
4
+ **零第三方依赖**(只用标准库),`pip install` 后即可用 **命令行** 与 **Python 两种方式**使用,前缀都是 `datapush`。
5
+
6
+ ```bash
7
+ pip install datapush-sdk
8
+ datapush config set-key sk-xxx # 保存 API Key(也可用环境变量 DATAPUSH_API_KEY)
9
+ datapush kline 000001 # 一行拿到最近 30 个交易日日K(自动缓存)
10
+ ```
11
+
12
+ ```python
13
+ import datapush
14
+ c = datapush.Client() # Key 自动读;缓存默认开启
15
+ page = c.kline("000001", days=250) # 一行拿数据;第二次调用命中缓存
16
+ for bar in page:
17
+ print(bar.time, bar.close)
18
+ ```
19
+
20
+ ---
21
+
22
+ ## 1. 安装与配置
23
+
24
+ ```bash
25
+ pip install datapush-sdk # 运行时零依赖
26
+ pip install "datapush-sdk[pandas]" # 可选:需要 to_pandas()
27
+ ```
28
+
29
+ API Key 的解析优先级(高 → 低):**显式参数 → 环境变量 `DATAPUSH_API_KEY` → `~/.datapush/config.json`**。
30
+ 推荐用 CLI 保存一次即可:`datapush config set-key sk-xxx`(也可 `datapush config show` 查看,Key 会打码)。
31
+
32
+ 服务地址默认 `https://api.datapush.vip`,可用 `--base-url` / `DATAPUSH_BASE_URL` / 配置文件覆盖。
33
+
34
+ ## 2. 本地按需缓存(默认开启,用户无感)
35
+
36
+ - **只存不复权原始价**(`adj=none`)+ 复权因子表 ⇒ 历史永不失效、只需追加;
37
+ - **复权在本地算**:`kind="qfq"|"hfq"|"raw"`,除权后自动正确、**无需重下历史**;
38
+ - **增量续拉**:用游标 `latest_time` 只拉新增(当日 forming bar 同键覆盖写,天然幂等);
39
+ - **范围自动补拉**:这次要 30 天、下次要 250 天,会自动把缺的那段补上;
40
+ - **断网可读**:`Client(offline=True)` 或 `--offline` 只读本地缓存;
41
+ - 缓存位置:`~/.datapush/cache/datapush.db`(SQLite 单文件);可用 `--cache-dir` / `DATAPUSH_CACHE_DIR`
42
+ / 配置文件 `cache_dir` 指定;`DATAPUSH_NO_CACHE=1` 或 `--no-cache` 彻底关闭。
43
+
44
+ ```bash
45
+ datapush cache info # 路径 / 大小 / 标的数 / 根数 / 时间范围
46
+ datapush cache path # 只打印缓存文件路径(脚本友好)
47
+ datapush cache prune --days 90 # 只保留最近 90 天
48
+ datapush cache clear --code 000001 # 清掉某只票
49
+ datapush update 000001 --period 1m # 手动增量(平时查询时自动做)
50
+ ```
51
+
52
+ **股票列表 / 基础信息 / 交易日 / 板块** 属于实时数据,**直连不缓存**(流量很小):
53
+ `datapush codes`(全市场代码,约 6 页 / 约 1MB)、`datapush stock 000001`。
54
+
55
+ ## 3. Python 用法速查
56
+
57
+ ```python
58
+ import datapush
59
+ c = datapush.Client() # 也可 Client(api_key=..., cache=False, offline=True)
60
+
61
+ # 历史
62
+ c.codes() # 全市场代码(实时)
63
+ c.stocks(all=True) # 全市场列表(实时);c.stocks(page=1, page_size=20) 单页
64
+ c.stock("000001") # 基础信息 12 字段(实时)
65
+ c.kline("000001", days=250) # 日K(前复权)
66
+ c.kline("000001", days=250, kind="hfq") # 后复权(本地因子表算)
67
+ c.kline("000001", start="2026-01-01", end="2026-09-26", kind="raw")
68
+ c.minute("000001", days=1) # 1 分钟 K 线(当日)
69
+ c.fiveminute("000001", days=5) # 5 分钟 K 线
70
+ c.kline("000001", since="2026-09-26 14:59") # 增量(闭区间,含该根)
71
+ c.xdxr("000001") # 复权因子表(TTL 1 天,除权后自动刷新)
72
+ c.factors("000001", size=30, fields="close,ma5") # 量化因子(高级用户)
73
+ c.factor_catalog() # 因子目录
74
+
75
+ # 实时(WebSocket)
76
+ q = c.quote("000001") # 一次快照(WS 首帧;REST 没有该接口)
77
+ for e in c.watch(["000001", "600108"], types=["quote", "k1"], seconds=30):
78
+ if e.type == "quote":
79
+ print(e.quote.price)
80
+
81
+ # 导出与缓存
82
+ c.kline("000001", days=250).to_csv("000001.csv")
83
+ c.kline("000001", days=250).to_dicts() # list[dict]
84
+ c.to_pandas(c.kline("000001", days=250)) # 需要 pandas
85
+ c.cache_info(); c.update("000001", period="day"); c.close()
86
+ ```
87
+
88
+ ## 4. CLI 速查
89
+
90
+ ```bash
91
+ datapush kline 000001 [--days 250 | --size 100 --offset 0 | --start 2026-01-01 --end 2026-09-26 | --since "..."]
92
+ [--period day|1m|5m] [--kind qfq|hfq|raw] [--limit 60] [--csv out.csv] [--json] [--no-refresh]
93
+ datapush minute 000001 --days 1
94
+ datapush fiveminute 000001 --days 5
95
+ datapush xdxr 000001 [--refresh]
96
+ datapush stocks [--page 1 --page-size 20] [--all]
97
+ datapush codes [--market sh|sz|bj] [--prefixed] # 默认一行一个,可直接管道
98
+ datapush stock 000001
99
+ datapush factors 000001 --size 30 [--fields close,ma5] [--daily-kline 0]
100
+ datapush quote 000001 [--types quote|depth]
101
+ datapush watch 000001 600108 [--types quote,k1] [--seconds 30]
102
+ datapush update 000001 --period 1m
103
+ datapush cache info|path|clear|prune
104
+ datapush config set-key sk-xxx | config show | config path | config set cache_dir D:/datapush-cache
105
+ datapush doctor # 一键排障
106
+ datapush get /api/v1/stocks/000001/xdxr --param k=v # 通用逃生舱(调试新接口)
107
+ ```
108
+
109
+ 通用选项可写在命令前或命令后:`--json`(原始 JSON,便于管道)、`--csv FILE`、`--api-key`、`--base-url`、
110
+ `--timeout`、`--cache-dir`、`--no-cache`、`--offline`。
111
+ 退出码:`0` 成功 / `1` 业务或网络错误 / `2` 参数错误。
112
+
113
+ ## 5. 本地复权(与官方文档公式一致)
114
+
115
+ `adj=none` 取原始价 + `xdxr()` 取因子表 ⇒ **一次乘法**:
116
+
117
+ ```
118
+ 段 = segments 里第一个 from ≤ bar.date(都不满足 ⇒ from 为空的兜底段)
119
+ 前复权价 = raw价 × seg.qfq 后复权价 = raw价 × seg.hfq
120
+ 换手率 = cjl / ltgb × seg.share_ratio × 100 自检:seg.hfq × P == seg.qfq(P = 兜底段 qfq)
121
+ ```
122
+
123
+ SDK 已内置:`datapush.adjust_bars(bars, table, kind=...)`、`datapush.pick_segment(table, date)`、
124
+ `datapush.verify_segments(table)`。细节见官方文档「复权因子表(本地复权计算)」。
125
+
126
+ ## 6. 常见问题
127
+
128
+ - **`import datapush` 不是我装的这个包?** PyPI 上另有一个无关的 `datapush`(MySQL 数据生成器)。
129
+ 两者同装会互相覆盖顶层模块,此时用别名:`import datapush_sdk as datapush`。
130
+ - **需要 Key 但没有?** 先 `datapush config set-key sk-xxx`(注册后在控制台复制);`datapush doctor` 可自查。
131
+ - **返回 402 / 429?** 402 = 积分不足;429 = 分钟接口限流(10 QPS/用户,SDK 已按 `Retry-After` 自动退避重试)。
132
+ - **能离线用吗?** 能:缓存过的标的用 `offline=True`/`--offline` 可读;实时接口必须联网。
133
+ - **WS 单连接能订阅多少?** 最多 50 个 code(SDK 会自动分批订阅);普通用户最多 10 个连接。
134
+
135
+ ## 7. 兼容性与许可
136
+
137
+ - Python **3.9+**(Windows / macOS / Linux),运行时**零第三方依赖**;`py.typed` 已附带,支持类型检查。
138
+ - License: **MIT**。接口与字段含义以官方文档为准(`https://api.datapush.vip/dp/docs`)。
@@ -0,0 +1,68 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "datapush-sdk"
7
+ dynamic = ["version"]
8
+ description = "datapush A 股行情 SDK:实时推送 + 历史 K 线 + 复权因子 + 本地按需缓存(CLI 与 Python 两种用法)"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "datapush", email = "support@datapush.vip" }]
13
+ keywords = [
14
+ "datapush",
15
+ "a-share",
16
+ "stock",
17
+ "market-data",
18
+ "kline",
19
+ "quote",
20
+ "websocket",
21
+ "quant",
22
+ "sdk",
23
+ ]
24
+ classifiers = [
25
+ "Development Status :: 4 - Beta",
26
+ "Intended Audience :: Developers",
27
+ "Intended Audience :: Financial and Insurance Industry",
28
+ "License :: OSI Approved :: MIT License",
29
+ "Operating System :: OS Independent",
30
+ "Programming Language :: Python :: 3",
31
+ "Programming Language :: Python :: 3.9",
32
+ "Programming Language :: Python :: 3.10",
33
+ "Programming Language :: Python :: 3.11",
34
+ "Programming Language :: Python :: 3.12",
35
+ "Programming Language :: Python :: 3.13",
36
+ "Programming Language :: Python :: 3.14",
37
+ "Topic :: Office/Business :: Financial :: Investment",
38
+ "Typing :: Typed",
39
+ ]
40
+ dependencies = []
41
+
42
+ [project.optional-dependencies]
43
+ # 仅开发/发布用;运行 SDK 本身零依赖(标准库)
44
+ dev = ["pytest>=7", "build>=1.0", "twine>=4.0"]
45
+ # 可选:把结果集转成 DataFrame(不装也能用 to_list/to_csv/to_json)
46
+ pandas = ["pandas>=1.3"]
47
+
48
+ [project.urls]
49
+ Homepage = "https://api.datapush.vip"
50
+ Documentation = "https://api.datapush.vip/dp/docs"
51
+ Source = "https://api.datapush.vip"
52
+ "Bug Tracker" = "https://api.datapush.vip"
53
+
54
+ [project.scripts]
55
+ datapush = "datapush.cli:main"
56
+
57
+ [tool.setuptools]
58
+ package-dir = { "" = "src" }
59
+ include-package-data = true
60
+
61
+ [tool.setuptools.packages.find]
62
+ where = ["src"]
63
+
64
+ [tool.setuptools.package-data]
65
+ datapush = ["py.typed"]
66
+
67
+ [tool.setuptools.dynamic]
68
+ version = { attr = "datapush._version.__version__" }
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,104 @@
1
+ """datapush SDK —— A 股行情数据(REST + WebSocket)与本地按需缓存。
2
+
3
+ 两种用法,前缀都是 `datapush`::
4
+
5
+ # 1) Python
6
+ import datapush
7
+ c = datapush.Client() # Key 自动读 DATAPUSH_API_KEY / ~/.datapush/config.json
8
+ bars = c.kline("000001", days=250) # 一行拿到日K(自动缓存 + 增量刷新)
9
+ for m in c.watch("000001", types=["quote"]): ...
10
+
11
+ # 2) 命令行
12
+ $ datapush kline 000001 --days 250
13
+ $ datapush quote 000001
14
+ $ datapush cache info
15
+
16
+ 设计要点:
17
+ - **零第三方运行时依赖**(只用标准库),`pip install datapush-sdk` 即刻可用;
18
+ - **按需本地缓存**:只存不复权原始价 + 复权因子表,复权值读取时现算,除权后无需重下历史;
19
+ - 实时接口(股票列表 / 基础信息 / 交易日 / 板块)**直连不缓存**。
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ from ._endpoints import PERIODS
25
+ from ._version import __version__
26
+ from .adjust import adjust_bars, pick_segment, turnover, verify_segments
27
+ from .cache import Cache
28
+ from .client import Client
29
+ from .config import DEFAULT_BASE_URL, config_file, default_cache_file, home_dir
30
+ from .errors import (
31
+ AuthError,
32
+ BadRequestError,
33
+ ConfigError,
34
+ DatapushError,
35
+ NetworkError,
36
+ NotFoundError,
37
+ OfflineError,
38
+ PermissionError,
39
+ ProtocolError,
40
+ QuotaError,
41
+ RateLimitError,
42
+ ServerError,
43
+ WSError,
44
+ )
45
+ from .models import (
46
+ AdjSegment,
47
+ AdjTable,
48
+ Bar,
49
+ Depth,
50
+ FactorTable,
51
+ KlinePage,
52
+ Quote,
53
+ StockDetail,
54
+ StockInfo,
55
+ WSEvent,
56
+ )
57
+ from .rest import ApiResponse, RestClient
58
+ from .ws import WsClient
59
+
60
+ __all__ = [
61
+ "__version__",
62
+ # 客户端
63
+ "Client",
64
+ "RestClient",
65
+ "WsClient",
66
+ "Cache",
67
+ "ApiResponse",
68
+ # 模型
69
+ "Bar",
70
+ "KlinePage",
71
+ "Quote",
72
+ "Depth",
73
+ "WSEvent",
74
+ "StockInfo",
75
+ "StockDetail",
76
+ "AdjTable",
77
+ "AdjSegment",
78
+ "FactorTable",
79
+ # 本地复权
80
+ "adjust_bars",
81
+ "pick_segment",
82
+ "turnover",
83
+ "verify_segments",
84
+ # 配置与常量
85
+ "PERIODS",
86
+ "DEFAULT_BASE_URL",
87
+ "home_dir",
88
+ "config_file",
89
+ "default_cache_file",
90
+ # 异常
91
+ "DatapushError",
92
+ "ConfigError",
93
+ "OfflineError",
94
+ "NetworkError",
95
+ "AuthError",
96
+ "QuotaError",
97
+ "PermissionError",
98
+ "NotFoundError",
99
+ "RateLimitError",
100
+ "BadRequestError",
101
+ "ServerError",
102
+ "ProtocolError",
103
+ "WSError",
104
+ ]
@@ -0,0 +1,68 @@
1
+ """datapush 后端接口路径的**唯一来源**。
2
+
3
+ CLI、SDK 与测试都从这里取路径,好处有三:
4
+
5
+ 1. 拼错路径在开发期就暴露(而不是线上 404);
6
+ 2. `tests/test_endpoints_match_router.py` 可用本文件的路径集合与后端
7
+ `server_go/internal/router/router.go` 做对照,防止 SDK 与后端契约漂移;
8
+ 3. 文档里出现的路径可被 `grep` 一次核清。
9
+
10
+ 后端统一响应:`{"code": 0, "message": "ok", "data": ...}`(`code` 与 HTTP 状态码同值)。
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ # ---- 公开(无需 API Key)----
16
+ HEALTH = "/health"
17
+ STATS = "/api/v1/stats"
18
+ MARKET_BOARD = "/api/v1/market/board"
19
+ MARKET_FEATURED = "/api/v1/market/featured"
20
+
21
+ # ---- 需 API Key ----
22
+ STOCKS = "/api/v1/stocks" # 列表:page / page_size(≤1000)
23
+ STOCK = "/api/v1/stocks/{code}" # 单只基础信息(12 字段)
24
+ KLINE = "/api/v1/stocks/{code}/kline" # 日K(offset/size/since/adj)
25
+ MINUTE = "/api/v1/stocks/{code}/minute" # 1 分钟 K 线(offset/size/since/adj)
26
+ FIVEMINUTE = "/api/v1/stocks/{code}/fiveminute" # 5 分钟 K 线
27
+ XDXR = "/api/v1/stocks/{code}/xdxr" # 复权因子表(segments + ltgb + latest_event_date)
28
+ FACTOR_CATALOG = "/api/v1/factors" # 量化因子目录(高级用户)
29
+ FACTORS = "/api/v1/stocks/{code}/factors" # 量化因子数组(日K + 因子列)
30
+ TRADING_TODAY = "/api/v1/trading/today" # 今日是否交易 / 交易日信息
31
+ MARKET_BOARDS = "/api/v1/market/boards" # 指数 / 板块清单
32
+
33
+ # ---- WebSocket ----
34
+ WS = "/ws" # 需 API Key 的实时推送
35
+ WS_BOARD = "/ws/board" # 公开:首页行情面板广播
36
+
37
+ #: 支持缓存的 K 线周期(与后端 `period` 取值一致)
38
+ PERIODS = ("day", "1m", "5m")
39
+
40
+ #: 「必须联网、不缓存」的接口(列表 / 基础信息 / 交易日 / 板块 / 公开接口)
41
+ NO_CACHE_PATHS = frozenset(
42
+ {HEALTH, STATS, STOCKS, STOCK, TRADING_TODAY, MARKET_BOARDS, MARKET_BOARD, MARKET_FEATURED}
43
+ )
44
+
45
+ #: 全部后端路径模板(含 `{code}` 占位)——供防漂移测试对照 router.go
46
+ PATH_TEMPLATES = (
47
+ HEALTH,
48
+ STATS,
49
+ MARKET_BOARD,
50
+ MARKET_FEATURED,
51
+ STOCKS,
52
+ STOCK,
53
+ KLINE,
54
+ MINUTE,
55
+ FIVEMINUTE,
56
+ XDXR,
57
+ FACTOR_CATALOG,
58
+ FACTORS,
59
+ TRADING_TODAY,
60
+ MARKET_BOARDS,
61
+ WS,
62
+ WS_BOARD,
63
+ )
64
+
65
+
66
+ def format_path(template: str, code: str = "") -> str:
67
+ """把 `{code}` 占位替换成标的代码(其余模板原样返回)。"""
68
+ return template.replace("{code}", code) if code else template
@@ -0,0 +1,7 @@
1
+ """版本号唯一来源。
2
+
3
+ `pyproject.toml` 通过 `[tool.setuptools.dynamic] version = { attr = "datapush._version.__version__" }`
4
+ 引用本文件,因此只要改这里,包元数据、`datapush.__version__` 与 CLI `datapush --version` 同步变化。
5
+ """
6
+
7
+ __version__ = "0.1.0"