rquote 0.4.8__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.
- {rquote-0.4.8 → rquote-0.5.0}/PKG-INFO +11 -5
- {rquote-0.4.8 → rquote-0.5.0}/README.md +10 -4
- {rquote-0.4.8 → rquote-0.5.0}/pyproject.toml +1 -1
- {rquote-0.4.8 → rquote-0.5.0}/rquote/api/lists.py +36 -2
- {rquote-0.4.8 → rquote-0.5.0}/rquote/api/price.py +14 -5
- {rquote-0.4.8 → rquote-0.5.0}/rquote.egg-info/PKG-INFO +11 -5
- {rquote-0.4.8 → rquote-0.5.0}/rquote/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/api/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/api/stock_info.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/api/tick.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/cache/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/cache/base.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/cache/memory.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/cache/persistent.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/config.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/data_sources/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/data_sources/base.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/data_sources/sina.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/data_sources/tencent.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/exceptions.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/factors/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/factors/technical.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/base.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/cn_stock.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/factory.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/future.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/hk_stock.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/markets/us_stock.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/parsers/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/parsers/kline.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/plots.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/__init__.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/date.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/helpers.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/http.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/logging.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils/web.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote/utils.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote.egg-info/SOURCES.txt +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote.egg-info/dependency_links.txt +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote.egg-info/requires.txt +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/rquote.egg-info/top_level.txt +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/setup.cfg +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/tests/test_api.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/tests/test_cache.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/tests/test_config.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/tests/test_exceptions.py +0 -0
- {rquote-0.4.8 → rquote-0.5.0}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rquote
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Mostly day quotes of cn/hk/us/fund/future markets, side with quote list fetch
|
|
5
5
|
Requires-Python: >=3.9.0
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -18,7 +18,7 @@ Requires-Dist: duckdb>=0.9.0; extra == "persistent"
|
|
|
18
18
|
|
|
19
19
|
## 版本信息
|
|
20
20
|
|
|
21
|
-
当前版本:**0.
|
|
21
|
+
当前版本:**0.5.0**
|
|
22
22
|
|
|
23
23
|
## 主要特性
|
|
24
24
|
|
|
@@ -172,15 +172,18 @@ sid, nm, df = get_price('fuM2601', freq='min')
|
|
|
172
172
|
| 2024-02-06 | 2680.48 | 2789.49 | 2802.93 | 2669.67 | 502849313 |
|
|
173
173
|
| 2024-02-07 | 2791.51 | 2829.70 | 2829.70 | 2770.53 | 547117439 |
|
|
174
174
|
|
|
175
|
-
#### `get_price_longer(i, l=2, dd=
|
|
175
|
+
#### `get_price_longer(i, l=2, edate='', freq='day', fq='qfq', dd=None)`
|
|
176
176
|
|
|
177
|
-
获取更长时间的历史数据,默认获取2
|
|
177
|
+
获取更长时间的历史数据,默认获取2年数据,并且参数与 `get_price` 保持一致
|
|
178
178
|
|
|
179
179
|
```python
|
|
180
180
|
from rquote import get_price_longer
|
|
181
181
|
|
|
182
|
-
# 获取3
|
|
182
|
+
# 获取3年的历史数据(默认日线、前复权,以最新交易日为结束)
|
|
183
183
|
sid, nm, df = get_price_longer('sh000001', l=3)
|
|
184
|
+
|
|
185
|
+
# 指定结束日期与频率(例如获取到 2024-02-01 的周线数据)
|
|
186
|
+
sid, nm, df = get_price_longer('sh000001', l=3, edate='2024-02-01', freq='week', fq='qfq')
|
|
184
187
|
```
|
|
185
188
|
|
|
186
189
|
### 股票列表获取
|
|
@@ -238,8 +241,11 @@ zz1000_stocks = get_cnindex_stocks('zz1000')
|
|
|
238
241
|
|
|
239
242
|
支持的指数类型:
|
|
240
243
|
- `'hs300'`: 沪深300
|
|
244
|
+
- `'sz50'`: 上证50
|
|
241
245
|
- `'zz500'`: 中证500
|
|
246
|
+
- `'kc500'`: 科创500
|
|
242
247
|
- `'zz1000'`: 中证1000
|
|
248
|
+
- `'zz2000'`: 中证2000
|
|
243
249
|
|
|
244
250
|
### 基金和期货
|
|
245
251
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 版本信息
|
|
6
6
|
|
|
7
|
-
当前版本:**0.
|
|
7
|
+
当前版本:**0.5.0**
|
|
8
8
|
|
|
9
9
|
## 主要特性
|
|
10
10
|
|
|
@@ -158,15 +158,18 @@ sid, nm, df = get_price('fuM2601', freq='min')
|
|
|
158
158
|
| 2024-02-06 | 2680.48 | 2789.49 | 2802.93 | 2669.67 | 502849313 |
|
|
159
159
|
| 2024-02-07 | 2791.51 | 2829.70 | 2829.70 | 2770.53 | 547117439 |
|
|
160
160
|
|
|
161
|
-
#### `get_price_longer(i, l=2, dd=
|
|
161
|
+
#### `get_price_longer(i, l=2, edate='', freq='day', fq='qfq', dd=None)`
|
|
162
162
|
|
|
163
|
-
获取更长时间的历史数据,默认获取2
|
|
163
|
+
获取更长时间的历史数据,默认获取2年数据,并且参数与 `get_price` 保持一致
|
|
164
164
|
|
|
165
165
|
```python
|
|
166
166
|
from rquote import get_price_longer
|
|
167
167
|
|
|
168
|
-
# 获取3
|
|
168
|
+
# 获取3年的历史数据(默认日线、前复权,以最新交易日为结束)
|
|
169
169
|
sid, nm, df = get_price_longer('sh000001', l=3)
|
|
170
|
+
|
|
171
|
+
# 指定结束日期与频率(例如获取到 2024-02-01 的周线数据)
|
|
172
|
+
sid, nm, df = get_price_longer('sh000001', l=3, edate='2024-02-01', freq='week', fq='qfq')
|
|
170
173
|
```
|
|
171
174
|
|
|
172
175
|
### 股票列表获取
|
|
@@ -224,8 +227,11 @@ zz1000_stocks = get_cnindex_stocks('zz1000')
|
|
|
224
227
|
|
|
225
228
|
支持的指数类型:
|
|
226
229
|
- `'hs300'`: 沪深300
|
|
230
|
+
- `'sz50'`: 上证50
|
|
227
231
|
- `'zz500'`: 中证500
|
|
232
|
+
- `'kc500'`: 科创500
|
|
228
233
|
- `'zz1000'`: 中证1000
|
|
234
|
+
- `'zz2000'`: 中证2000
|
|
229
235
|
|
|
230
236
|
### 基金和期货
|
|
231
237
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "rquote"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.5.0"
|
|
8
8
|
description = "Mostly day quotes of cn/hk/us/fund/future markets, side with quote list fetch"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# requires-python = ">=3.6.1" # duckdb requires higher python version
|
|
@@ -191,8 +191,11 @@ def get_cnindex_stocks(index_type='hs300'):
|
|
|
191
191
|
# 指数类型到 TYPE 值的映射
|
|
192
192
|
index_type_map = {
|
|
193
193
|
'hs300': '1',
|
|
194
|
+
'sz50': '2',
|
|
194
195
|
'zz500': '3',
|
|
195
|
-
'
|
|
196
|
+
'kc500': '4',
|
|
197
|
+
'zz1000': '7',
|
|
198
|
+
'zz2000': '13'
|
|
196
199
|
}
|
|
197
200
|
|
|
198
201
|
if index_type not in index_type_map:
|
|
@@ -202,6 +205,10 @@ def get_cnindex_stocks(index_type='hs300'):
|
|
|
202
205
|
|
|
203
206
|
# 构建 URL
|
|
204
207
|
base_url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'
|
|
208
|
+
page_size = 500
|
|
209
|
+
all_data = []
|
|
210
|
+
|
|
211
|
+
# 先获取第一页,确定总数
|
|
205
212
|
params = {
|
|
206
213
|
'callback': 'jQuery112308471143523381743_1763517709888',
|
|
207
214
|
'sortColumns': 'SECURITY_CODE',
|
|
@@ -232,7 +239,34 @@ def get_cnindex_stocks(index_type='hs300'):
|
|
|
232
239
|
|
|
233
240
|
# 返回 result.data 中的数据列表
|
|
234
241
|
if data.get('result') and data['result'].get('data'):
|
|
235
|
-
|
|
242
|
+
all_data.extend(data['result']['data'])
|
|
243
|
+
total = int(index_type[2:])
|
|
244
|
+
|
|
245
|
+
# 如果总数超过 page_size,需要分页获取
|
|
246
|
+
if total > page_size:
|
|
247
|
+
total_pages = (total + page_size - 1) // page_size # 向上取整
|
|
248
|
+
|
|
249
|
+
# 从第二页开始获取
|
|
250
|
+
for page_num in range(2, total_pages + 1):
|
|
251
|
+
params['pageNumber'] = str(page_num)
|
|
252
|
+
url = f'{base_url}?{urlencode(params)}'
|
|
253
|
+
|
|
254
|
+
a = hget(url)
|
|
255
|
+
if not a:
|
|
256
|
+
logger.warning(f'Failed to fetch page {page_num} for {index_type}')
|
|
257
|
+
continue
|
|
258
|
+
|
|
259
|
+
json_str = a.text.split('(', 1)[1].rstrip(');')
|
|
260
|
+
page_data = json.loads(json_str)
|
|
261
|
+
|
|
262
|
+
if page_data.get('result') and page_data['result'].get('data'):
|
|
263
|
+
all_data.extend(page_data['result']['data'])
|
|
264
|
+
|
|
265
|
+
# 避免请求过快
|
|
266
|
+
time.sleep(0.1)
|
|
267
|
+
|
|
268
|
+
logger.debug(f'Fetched {len(all_data)} stocks for {index_type} (total: {total})')
|
|
269
|
+
return all_data
|
|
236
270
|
else:
|
|
237
271
|
logger.warning(f'No data found in response for {index_type}')
|
|
238
272
|
return []
|
|
@@ -38,7 +38,7 @@ def _normalize_dataframe_index(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
38
38
|
return df
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def get_price(i: str, sdate: str = '', edate: str = '', freq: str = 'day',
|
|
41
|
+
def get_price(i: str, sdate: str = '', edate: str = '', freq: str = 'day',
|
|
42
42
|
days: int = 320, fq: str = 'qfq', dd=None) -> Tuple[str, str, pd.DataFrame]:
|
|
43
43
|
'''
|
|
44
44
|
获取价格数据
|
|
@@ -84,19 +84,24 @@ def get_price(i: str, sdate: str = '', edate: str = '', freq: str = 'day',
|
|
|
84
84
|
return symbol, name, df
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def get_price_longer(i: str, l: int = 2,
|
|
87
|
+
def get_price_longer(i: str, l: int = 2, edate: str = '', freq: str = 'day',
|
|
88
|
+
fq: str = 'qfq', dd=None) -> Tuple[str, str, pd.DataFrame]:
|
|
88
89
|
"""
|
|
89
90
|
获取更长时间的历史数据
|
|
90
91
|
|
|
91
92
|
Args:
|
|
92
93
|
i: 股票代码
|
|
93
94
|
l: 年数
|
|
95
|
+
edate: 结束日期,同 ``get_price``
|
|
96
|
+
freq: 频率,同 ``get_price``
|
|
97
|
+
fq: 复权方式,同 ``get_price``
|
|
94
98
|
dd: 缓存对象
|
|
95
99
|
|
|
96
100
|
Returns:
|
|
97
101
|
(symbol, name, DataFrame)
|
|
98
102
|
"""
|
|
99
|
-
|
|
103
|
+
# 首段数据直接复用 get_price,透传 edate/freq/fq 参数
|
|
104
|
+
_, name, a = get_price(i, edate=edate, freq=freq, fq=fq, dd=dd)
|
|
100
105
|
# 使用 DatetimeIndex 的格式化方法(get_price 已统一转换为 DatetimeIndex)
|
|
101
106
|
if isinstance(a.index, pd.DatetimeIndex) and len(a.index) > 0:
|
|
102
107
|
d1 = a.index[0].strftime('%Y%m%d')
|
|
@@ -104,12 +109,16 @@ def get_price_longer(i: str, l: int = 2, dd=None) -> Tuple[str, str, pd.DataFram
|
|
|
104
109
|
# 降级处理:如果索引不是 DatetimeIndex(理论上不应该发生),尝试格式化
|
|
105
110
|
try:
|
|
106
111
|
d1 = str(a.index[0])[:8] if len(str(a.index[0])) >= 8 else str(a.index[0])
|
|
107
|
-
except:
|
|
112
|
+
except Exception:
|
|
108
113
|
d1 = a.index.format()[0] if hasattr(a.index, 'format') else str(a.index[0])
|
|
109
114
|
|
|
110
115
|
for y in range(1, l):
|
|
111
116
|
d0 = str(int(d1[:4]) - 1) + d1[4:]
|
|
112
|
-
|
|
117
|
+
# 逐年向前补数据,保持与 get_price 相同的 freq/fq 配置
|
|
118
|
+
a = pd.concat(
|
|
119
|
+
(get_price(i, d0, d1, freq=freq, fq=fq, dd=dd)[2], a),
|
|
120
|
+
0
|
|
121
|
+
).drop_duplicates()
|
|
113
122
|
d1 = d0
|
|
114
123
|
return i, name, a
|
|
115
124
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rquote
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Mostly day quotes of cn/hk/us/fund/future markets, side with quote list fetch
|
|
5
5
|
Requires-Python: >=3.9.0
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -18,7 +18,7 @@ Requires-Dist: duckdb>=0.9.0; extra == "persistent"
|
|
|
18
18
|
|
|
19
19
|
## 版本信息
|
|
20
20
|
|
|
21
|
-
当前版本:**0.
|
|
21
|
+
当前版本:**0.5.0**
|
|
22
22
|
|
|
23
23
|
## 主要特性
|
|
24
24
|
|
|
@@ -172,15 +172,18 @@ sid, nm, df = get_price('fuM2601', freq='min')
|
|
|
172
172
|
| 2024-02-06 | 2680.48 | 2789.49 | 2802.93 | 2669.67 | 502849313 |
|
|
173
173
|
| 2024-02-07 | 2791.51 | 2829.70 | 2829.70 | 2770.53 | 547117439 |
|
|
174
174
|
|
|
175
|
-
#### `get_price_longer(i, l=2, dd=
|
|
175
|
+
#### `get_price_longer(i, l=2, edate='', freq='day', fq='qfq', dd=None)`
|
|
176
176
|
|
|
177
|
-
获取更长时间的历史数据,默认获取2
|
|
177
|
+
获取更长时间的历史数据,默认获取2年数据,并且参数与 `get_price` 保持一致
|
|
178
178
|
|
|
179
179
|
```python
|
|
180
180
|
from rquote import get_price_longer
|
|
181
181
|
|
|
182
|
-
# 获取3
|
|
182
|
+
# 获取3年的历史数据(默认日线、前复权,以最新交易日为结束)
|
|
183
183
|
sid, nm, df = get_price_longer('sh000001', l=3)
|
|
184
|
+
|
|
185
|
+
# 指定结束日期与频率(例如获取到 2024-02-01 的周线数据)
|
|
186
|
+
sid, nm, df = get_price_longer('sh000001', l=3, edate='2024-02-01', freq='week', fq='qfq')
|
|
184
187
|
```
|
|
185
188
|
|
|
186
189
|
### 股票列表获取
|
|
@@ -238,8 +241,11 @@ zz1000_stocks = get_cnindex_stocks('zz1000')
|
|
|
238
241
|
|
|
239
242
|
支持的指数类型:
|
|
240
243
|
- `'hs300'`: 沪深300
|
|
244
|
+
- `'sz50'`: 上证50
|
|
241
245
|
- `'zz500'`: 中证500
|
|
246
|
+
- `'kc500'`: 科创500
|
|
242
247
|
- `'zz1000'`: 中证1000
|
|
248
|
+
- `'zz2000'`: 中证2000
|
|
243
249
|
|
|
244
250
|
### 基金和期货
|
|
245
251
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|