alphakit-sdk 0.1.0__py3-none-any.whl

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.
alphakit/__init__.py ADDED
@@ -0,0 +1,6 @@
1
+ """AlphaKit — 简洁的金融数据 API 工具包。"""
2
+ from alphakit.client import AlphaKit, set_token
3
+ from alphakit.exceptions import AlphaKitError
4
+
5
+ __version__ = "0.1.0"
6
+ __all__ = ["AlphaKit", "set_token", "AlphaKitError"]
alphakit/client.py ADDED
@@ -0,0 +1,111 @@
1
+ """AlphaKit 客户端 — 简洁的金融数据 API。"""
2
+ import requests
3
+ import pandas as pd
4
+ from typing import Optional
5
+
6
+ from alphakit.exceptions import AlphaKitError
7
+
8
+ _global_token: Optional[str] = None
9
+ _default_base_url = "http://101.42.11.124:8002"
10
+
11
+
12
+ def set_token(token: str):
13
+ """设置全局 token。"""
14
+ global _global_token
15
+ _global_token = token
16
+
17
+
18
+ class AlphaKit:
19
+ """AlphaKit API 客户端。
20
+
21
+ 用法:
22
+ import alphakit as ak
23
+ ak.set_token('your_token_here')
24
+ api = ak.AlphaKit()
25
+ df = api.daily_basic(trade_date='20260101')
26
+ """
27
+
28
+ def __init__(self, token: Optional[str] = None, base_url: Optional[str] = None):
29
+ self.token = token or _global_token
30
+ if not self.token:
31
+ raise ValueError("未设置 token。请先调用 set_token() 或传入 token 参数。")
32
+ self.base_url = (base_url or _default_base_url).rstrip('/')
33
+ self.endpoint = f"{self.base_url}/api/v1/query"
34
+
35
+ def _query(self, api_name: str, **params) -> pd.DataFrame:
36
+ """内部查询方法:调用 API 并返回 DataFrame。"""
37
+ # 过滤 None 值参数
38
+ filtered = {k: v for k, v in params.items() if v is not None}
39
+
40
+ payload = {
41
+ "api_name": api_name,
42
+ "params": filtered,
43
+ "fields": None
44
+ }
45
+
46
+ headers = {"Authorization": f"Bearer {self.token}"}
47
+
48
+ try:
49
+ resp = requests.post(self.endpoint, json=payload, headers=headers, timeout=30)
50
+ resp.raise_for_status()
51
+ except requests.RequestException as e:
52
+ raise AlphaKitError(9999, f"网络请求失败: {e}")
53
+
54
+ result = resp.json()
55
+
56
+ if result["code"] != 0:
57
+ raise AlphaKitError(result["code"], result["msg"])
58
+
59
+ data = result.get("data")
60
+ if not data or not data.get("items"):
61
+ return pd.DataFrame()
62
+
63
+ return pd.DataFrame(data["items"], columns=data["fields"])
64
+
65
+ # ---- 业务表方法(对标 tushare pro API)----
66
+
67
+ def daily_basic(self, ts_code: Optional[str] = None, trade_date: Optional[str] = None,
68
+ start_date: Optional[str] = None, end_date: Optional[str] = None) -> pd.DataFrame:
69
+ """日线基础数据。"""
70
+ return self._query("daily_basic", ts_code=ts_code, trade_date=trade_date,
71
+ start_date=start_date, end_date=end_date)
72
+
73
+ def opt_basic(self, ts_code: Optional[str] = None, exchange: Optional[str] = None) -> pd.DataFrame:
74
+ """期权基础信息。"""
75
+ return self._query("opt_basic", ts_code=ts_code, exchange=exchange)
76
+
77
+ def opt_daily(self, ts_code: Optional[str] = None, trade_date: Optional[str] = None,
78
+ start_date: Optional[str] = None, end_date: Optional[str] = None) -> pd.DataFrame:
79
+ """期权日线数据。"""
80
+ return self._query("opt_daily", ts_code=ts_code, trade_date=trade_date,
81
+ start_date=start_date, end_date=end_date)
82
+
83
+ def etf_basic(self, ts_code: Optional[str] = None, market: Optional[str] = None) -> pd.DataFrame:
84
+ """ETF 基础信息。"""
85
+ return self._query("etf_basic", ts_code=ts_code, market=market)
86
+
87
+ def etf_daily(self, ts_code: Optional[str] = None, trade_date: Optional[str] = None,
88
+ start_date: Optional[str] = None, end_date: Optional[str] = None) -> pd.DataFrame:
89
+ """ETF 日线数据。"""
90
+ return self._query("etf_daily", ts_code=ts_code, trade_date=trade_date,
91
+ start_date=start_date, end_date=end_date)
92
+
93
+ def etf_nav(self, ts_code: Optional[str] = None, nav_date: Optional[str] = None,
94
+ start_date: Optional[str] = None, end_date: Optional[str] = None) -> pd.DataFrame:
95
+ """ETF 净值数据。"""
96
+ return self._query("etf_nav", ts_code=ts_code, nav_date=nav_date,
97
+ start_date=start_date, end_date=end_date)
98
+
99
+ def etf_share(self, ts_code: Optional[str] = None, trade_date: Optional[str] = None,
100
+ start_date: Optional[str] = None, end_date: Optional[str] = None) -> pd.DataFrame:
101
+ """ETF 份额数据。"""
102
+ return self._query("etf_share", ts_code=ts_code, trade_date=trade_date,
103
+ start_date=start_date, end_date=end_date)
104
+
105
+ def etf_theme_map(self, ts_code: Optional[str] = None, theme: Optional[str] = None) -> pd.DataFrame:
106
+ """ETF 主题映射。"""
107
+ return self._query("etf_theme_map", ts_code=ts_code, theme=theme)
108
+
109
+ def query(self, api_name: str, **params) -> pd.DataFrame:
110
+ """通用查询方法(兜底)。"""
111
+ return self._query(api_name, **params)
alphakit/exceptions.py ADDED
@@ -0,0 +1,9 @@
1
+ """AlphaKit 异常。"""
2
+
3
+
4
+ class AlphaKitError(Exception):
5
+ """SDK 基础异常。"""
6
+ def __init__(self, code: int, message: str):
7
+ self.code = code
8
+ self.message = message
9
+ super().__init__(f"[{code}] {message}")
@@ -0,0 +1,174 @@
1
+ Metadata-Version: 2.4
2
+ Name: alphakit-sdk
3
+ Version: 0.1.0
4
+ Summary: AlphaKit — 简洁的金融数据 API 工具包
5
+ Author: AlphaKit Team
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/yourusername/alphakit
8
+ Keywords: finance,data,api,quant,alpha
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.8
11
+ Classifier: Programming Language :: Python :: 3.9
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Intended Audience :: Financial and Insurance Industry
17
+ Classifier: Topic :: Office/Business :: Financial
18
+ Requires-Python: >=3.8
19
+ Description-Content-Type: text/markdown
20
+ Requires-Dist: requests>=2.28.0
21
+ Requires-Dist: pandas>=1.3.0
22
+
23
+ # AlphaKit
24
+
25
+ 简洁的金融数据 API 工具包,提供类似 tushare 的使用体验。
26
+
27
+ ## 安装
28
+
29
+ ```bash
30
+ pip install alphakit
31
+ ```
32
+
33
+ 本地开发安装:
34
+ ```bash
35
+ cd TokenAuth
36
+ pip install -e .
37
+ ```
38
+
39
+ ## 快速开始
40
+
41
+ ### 方式一:全局 token(推荐)
42
+
43
+ ```python
44
+ import alphakit as ak
45
+
46
+ # 设置全局 token
47
+ ak.set_token('your_token_here')
48
+
49
+ # 创建 API 实例
50
+ api = ak.AlphaKit()
51
+
52
+ # 查询数据
53
+ df = api.daily_basic(trade_date='20260101')
54
+ print(df.head())
55
+ ```
56
+
57
+ ### 方式二:实例化时传入 token
58
+
59
+ ```python
60
+ from alphakit import AlphaKit
61
+
62
+ api = AlphaKit(token='your_token_here')
63
+ df = api.opt_daily(ts_code='10004355.SH', start_date='20260101', end_date='20260131')
64
+ ```
65
+
66
+ ### 方式三:自定义服务器地址
67
+
68
+ ```python
69
+ import alphakit as ak
70
+
71
+ ak.set_token('your_token')
72
+ api = ak.AlphaKit(base_url='http://your-server.com:8002')
73
+ df = api.etf_daily(ts_code='510050.SH', trade_date='20260101')
74
+ ```
75
+
76
+ ## API 方法
77
+
78
+ 所有方法返回 pandas DataFrame。
79
+
80
+ ### 日线基础数据
81
+ ```python
82
+ df = api.daily_basic(
83
+ ts_code='000001.SZ', # 可选
84
+ trade_date='20260101', # 可选
85
+ start_date='20260101', # 可选
86
+ end_date='20260131' # 可选
87
+ )
88
+ ```
89
+
90
+ ### 期权数据
91
+ ```python
92
+ # 期权基础信息
93
+ df = api.opt_basic(ts_code='10004355.SH')
94
+
95
+ # 期权日线
96
+ df = api.opt_daily(
97
+ ts_code='10004355.SH',
98
+ start_date='20260101',
99
+ end_date='20260131'
100
+ )
101
+ ```
102
+
103
+ ### ETF 数据
104
+ ```python
105
+ # ETF 基础信息
106
+ df = api.etf_basic(market='SSE')
107
+
108
+ # ETF 日线
109
+ df = api.etf_daily(ts_code='510050.SH', trade_date='20260101')
110
+
111
+ # ETF 净值
112
+ df = api.etf_nav(ts_code='510050.SH', nav_date='20260101')
113
+
114
+ # ETF 份额
115
+ df = api.etf_share(ts_code='510050.SH', trade_date='20260101')
116
+
117
+ # ETF 主题
118
+ df = api.etf_theme_map(theme='科技')
119
+ ```
120
+
121
+ ### 通用查询(支持所有表)
122
+ ```python
123
+ df = api.query('daily_basic', ts_code='000001.SZ', trade_date='20260101')
124
+ ```
125
+
126
+ ## 错误处理
127
+
128
+ ```python
129
+ from alphakit import AlphaKit, AlphaKitError
130
+
131
+ api = AlphaKit(token='your_token')
132
+
133
+ try:
134
+ df = api.daily_basic(trade_date='20260101')
135
+ except AlphaKitError as e:
136
+ print(f"错误码: {e.code}")
137
+ print(f"错误信息: {e.message}")
138
+ ```
139
+
140
+ 常见错误码:
141
+ - `1001`: Token 无效 / 过期 / 吊销
142
+ - `1002`: 无权限访问该表
143
+ - `1003`: IP 超限 / 封禁
144
+ - `1004`: 每分钟限频
145
+ - `1005`: 每日配额用尽
146
+ - `1006`: 查询参数错误
147
+
148
+ ## 注意事项
149
+
150
+ 1. **大表必须带过滤条件**:`daily_basic`、`opt_daily`、`etf_daily` 等大表必须带 `ts_code` 或日期过滤,否则报错 1006
151
+ 2. **日期格式**:`YYYYMMDD`(如 `20260101`)
152
+ 3. **IP 限制**:每个 token 默认最多绑定 3 个 IP,超限拒绝
153
+ 4. **限流配额**:默认每分钟 60 次、每日 500 次
154
+
155
+ ## 示例脚本
156
+
157
+ ```python
158
+ import alphakit as ak
159
+
160
+ ak.set_token('your_64_char_token_here')
161
+ api = ak.AlphaKit()
162
+
163
+ # 查某股票某天的数据
164
+ df = api.daily_basic(ts_code='000001.SZ', trade_date='20260101')
165
+ print(df)
166
+
167
+ # 查某期权某月的行情
168
+ df = api.opt_daily(ts_code='10004355.SH', start_date='20260101', end_date='20260131')
169
+ print(df.tail())
170
+
171
+ # 查所有 ETF 基础信息(小表可不带过滤)
172
+ df = api.etf_basic()
173
+ print(f"共 {len(df)} 只 ETF")
174
+ ```
@@ -0,0 +1,7 @@
1
+ alphakit/__init__.py,sha256=Sc66hTFUSwzVSAQAldusGQ6WHeKQIg0CiVNVAgNiGO4,228
2
+ alphakit/client.py,sha256=J_YMX10SQD_PHy79WD9vJ1GoaD63PLtJPkjK8m78bS0,4676
3
+ alphakit/exceptions.py,sha256=LLglI0ACFmlq-7IJdvhrOLtsdWgBx3QEOT4kk8YO1j4,242
4
+ alphakit_sdk-0.1.0.dist-info/METADATA,sha256=lFw_H5V9Gi5W8ouG-DMHJgvqr9Y2r52iagTjTQ1UIVk,4193
5
+ alphakit_sdk-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
6
+ alphakit_sdk-0.1.0.dist-info/top_level.txt,sha256=6PdBm22Q3cELg6eF6YseqpH2eirIMqQDImj8cWmUGW0,9
7
+ alphakit_sdk-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ alphakit