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 +6 -0
- alphakit/client.py +111 -0
- alphakit/exceptions.py +9 -0
- alphakit_sdk-0.1.0.dist-info/METADATA +174 -0
- alphakit_sdk-0.1.0.dist-info/RECORD +7 -0
- alphakit_sdk-0.1.0.dist-info/WHEEL +5 -0
- alphakit_sdk-0.1.0.dist-info/top_level.txt +1 -0
alphakit/__init__.py
ADDED
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,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 @@
|
|
|
1
|
+
alphakit
|