akshare 1.15.43__py3-none-any.whl → 1.15.45__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.
Potentially problematic release.
This version of akshare might be problematic. Click here for more details.
- akshare/__init__.py +3 -26
- akshare/futures/futures_basis.py +27 -7
- akshare/stock_feature/stock_gdfx_em.py +180 -95
- akshare/stock_feature/stock_jgdy_em.py +41 -38
- {akshare-1.15.43.dist-info → akshare-1.15.45.dist-info}/METADATA +1 -1
- {akshare-1.15.43.dist-info → akshare-1.15.45.dist-info}/RECORD +9 -12
- akshare/bond/bond_investing.py +0 -139
- akshare/futures/futures_international.py +0 -170
- akshare/index/index_investing.py +0 -232
- {akshare-1.15.43.dist-info → akshare-1.15.45.dist-info}/LICENSE +0 -0
- {akshare-1.15.43.dist-info → akshare-1.15.45.dist-info}/WHEEL +0 -0
- {akshare-1.15.43.dist-info → akshare-1.15.45.dist-info}/top_level.txt +0 -0
akshare/__init__.py
CHANGED
|
@@ -2953,9 +2953,11 @@ amac_manager_cancelled_info # 中国证券投资基金业协会-信息公示-诚
|
|
|
2953
2953
|
1.15.41 fix: fix macro_china_fdi interface
|
|
2954
2954
|
1.15.42 fix: fix get_roll_yield_bar interface
|
|
2955
2955
|
1.15.43 fix: fix macro_china_urban_unemployment interface
|
|
2956
|
+
1.15.44 fix: fix index_detail_hist_adjust_cni interface
|
|
2957
|
+
1.15.45 fix: fix stock_jgdy_detail_em interface
|
|
2956
2958
|
"""
|
|
2957
2959
|
|
|
2958
|
-
__version__ = "1.15.
|
|
2960
|
+
__version__ = "1.15.45"
|
|
2959
2961
|
__author__ = "AKFamily"
|
|
2960
2962
|
|
|
2961
2963
|
import sys
|
|
@@ -5274,14 +5276,6 @@ from akshare.economic.macro_china_nbs import (
|
|
|
5274
5276
|
macro_china_nbs_region
|
|
5275
5277
|
)
|
|
5276
5278
|
|
|
5277
|
-
"""
|
|
5278
|
-
全球期货
|
|
5279
|
-
"""
|
|
5280
|
-
from akshare.futures.futures_international import (
|
|
5281
|
-
futures_global_commodity_hist,
|
|
5282
|
-
futures_global_commodity_name_url_map,
|
|
5283
|
-
)
|
|
5284
|
-
|
|
5285
5279
|
"""
|
|
5286
5280
|
外汇
|
|
5287
5281
|
"""
|
|
@@ -5307,23 +5301,6 @@ from akshare.option.option_commodity import (
|
|
|
5307
5301
|
option_gfex_daily,
|
|
5308
5302
|
)
|
|
5309
5303
|
|
|
5310
|
-
"""
|
|
5311
|
-
英为财情-债券
|
|
5312
|
-
"""
|
|
5313
|
-
from akshare.bond.bond_investing import (
|
|
5314
|
-
bond_investing_global,
|
|
5315
|
-
bond_investing_global_country_name_url,
|
|
5316
|
-
)
|
|
5317
|
-
|
|
5318
|
-
"""
|
|
5319
|
-
英为财情-指数
|
|
5320
|
-
"""
|
|
5321
|
-
from akshare.index.index_investing import (
|
|
5322
|
-
index_investing_global,
|
|
5323
|
-
index_investing_global_area_index_name_code,
|
|
5324
|
-
index_investing_global_area_index_name_url,
|
|
5325
|
-
)
|
|
5326
|
-
|
|
5327
5304
|
"""
|
|
5328
5305
|
99期货-期货库存数据
|
|
5329
5306
|
"""
|
akshare/futures/futures_basis.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/12/12 17:00
|
|
5
5
|
Desc: 生意社网站采集大宗商品现货价格及相应基差数据, 数据时间段从 20110104-至今
|
|
6
6
|
备注:现期差 = 现货价格 - 期货价格(这里的期货价格为结算价)
|
|
7
7
|
黄金为 元/克, 白银为 元/千克, 玻璃现货为 元/平方米, 鸡蛋现货为 元/公斤, 鸡蛋期货为 元/500千克, 其余为 元/吨.
|
|
@@ -124,9 +124,9 @@ def futures_spot_price(
|
|
|
124
124
|
return temp_df
|
|
125
125
|
else:
|
|
126
126
|
time.sleep(3)
|
|
127
|
-
except: # noqa: E722
|
|
127
|
+
except Exception as e: # noqa: E722
|
|
128
128
|
print(
|
|
129
|
-
f"{date.strftime('%Y-%m-%d')}
|
|
129
|
+
f"{date.strftime('%Y-%m-%d')}日生意社数据连接失败[错误信息:{e}],第{str(i)}次尝试,最多5次"
|
|
130
130
|
)
|
|
131
131
|
i += 1
|
|
132
132
|
if i > 5:
|
|
@@ -187,6 +187,8 @@ def _check_information(df_data, date):
|
|
|
187
187
|
"郑州商品交易所",
|
|
188
188
|
"大连商品交易所",
|
|
189
189
|
"广州期货交易所",
|
|
190
|
+
# 某些天网站没有数据,比如 20180912,此时返回"暂无数据",但并不是网站被墙了
|
|
191
|
+
"暂无数据",
|
|
190
192
|
]:
|
|
191
193
|
symbol = chinese_to_english(news)
|
|
192
194
|
record = pd.DataFrame(df_data[df_data["symbol"] == string])
|
|
@@ -206,6 +208,16 @@ def _check_information(df_data, date):
|
|
|
206
208
|
record.loc[:, "spot_price"] = float(record["spot_price"].iloc[0]) * 1000
|
|
207
209
|
records = pd.concat([records, record])
|
|
208
210
|
|
|
211
|
+
# 20241129:如果某日没有数据,直接返回返回空表
|
|
212
|
+
if records.empty:
|
|
213
|
+
records = df_data.iloc[0:0]
|
|
214
|
+
records["near_basis"] = pd.Series(dtype="float")
|
|
215
|
+
records["dom_basis"] = pd.Series(dtype="float")
|
|
216
|
+
records["near_basis_rate"] = pd.Series(dtype="float")
|
|
217
|
+
records["dom_basis_rate"] = pd.Series(dtype="float")
|
|
218
|
+
records["date"] = pd.Series(dtype="object")
|
|
219
|
+
return records
|
|
220
|
+
|
|
209
221
|
records.loc[:, ["near_contract_price", "dominant_contract_price", "spot_price"]] = (
|
|
210
222
|
records.loc[
|
|
211
223
|
:, ["near_contract_price", "dominant_contract_price", "spot_price"]
|
|
@@ -259,6 +271,7 @@ def _check_information(df_data, date):
|
|
|
259
271
|
records["dom_basis_rate"] = (
|
|
260
272
|
records["dominant_contract_price"] / records["spot_price"] - 1
|
|
261
273
|
)
|
|
274
|
+
# records.loc[:, "date"] = date.strftime("%Y%m%d")
|
|
262
275
|
records.insert(0, "date", date.strftime("%Y%m%d"))
|
|
263
276
|
return records
|
|
264
277
|
|
|
@@ -300,8 +313,15 @@ def futures_spot_price_previous(date: str = "20240430") -> pd.DataFrame:
|
|
|
300
313
|
values = main[main[4].str.endswith("%")]
|
|
301
314
|
values.columns = header
|
|
302
315
|
# Basis
|
|
303
|
-
|
|
316
|
+
# 对于没有数据的天,xml文件中没有数据,所以content[2:-1]可能为空
|
|
317
|
+
if len(content[2:-1]) > 0:
|
|
318
|
+
basis = pd.concat(content[2:-1])
|
|
319
|
+
else:
|
|
320
|
+
basis = pd.DataFrame(columns=["主力合约基差", "主力合约基差(%)"])
|
|
321
|
+
|
|
304
322
|
basis.columns = ["主力合约基差", "主力合约基差(%)"]
|
|
323
|
+
# 20241125(jasonudu):因为部分日期,存在多个品种的现货价格,比如20151125的白糖、豆粕、豆油等,如果用商品名来merge,会出现重复列名,所以改用index来merge
|
|
324
|
+
# basis["商品"] = values["商品"].tolist()
|
|
305
325
|
basis.index = values.index
|
|
306
326
|
basis = pd.merge(
|
|
307
327
|
values[["商品", "现货价格", "主力合约代码", "主力合约价格"]],
|
|
@@ -338,12 +358,12 @@ def futures_spot_price_previous(date: str = "20240430") -> pd.DataFrame:
|
|
|
338
358
|
|
|
339
359
|
if __name__ == "__main__":
|
|
340
360
|
futures_spot_price_daily_df = futures_spot_price_daily(
|
|
341
|
-
start_day="
|
|
361
|
+
start_day="20240415", end_day="20240418", vars_list=["CU", "RB"]
|
|
342
362
|
)
|
|
343
363
|
print(futures_spot_price_daily_df)
|
|
344
364
|
|
|
345
|
-
futures_spot_price_df = futures_spot_price(date="
|
|
365
|
+
futures_spot_price_df = futures_spot_price(date="20240430")
|
|
346
366
|
print(futures_spot_price_df)
|
|
347
367
|
|
|
348
|
-
futures_spot_price_previous_df = futures_spot_price_previous(date="
|
|
368
|
+
futures_spot_price_previous_df = futures_spot_price_previous(date="20240430")
|
|
349
369
|
print(futures_spot_price_previous_df)
|
|
@@ -5,13 +5,14 @@ Date: 2023/11/27 18:00
|
|
|
5
5
|
Desc: 东方财富网-数据中心-股东分析
|
|
6
6
|
https://data.eastmoney.com/gdfx/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
from tqdm import tqdm
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
def stock_gdfx_free_holding_statistics_em(
|
|
14
|
-
|
|
15
|
+
date: str = "20210630",
|
|
15
16
|
) -> pd.DataFrame:
|
|
16
17
|
"""
|
|
17
18
|
东方财富网-数据中心-股东分析-股东持股统计-十大流通股东
|
|
@@ -83,15 +84,33 @@ def stock_gdfx_free_holding_statistics_em(
|
|
|
83
84
|
]
|
|
84
85
|
]
|
|
85
86
|
big_df["统计次数"] = pd.to_numeric(big_df["统计次数"])
|
|
86
|
-
big_df["公告日后涨幅统计-10个交易日-平均涨幅"] = pd.to_numeric(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
big_df["公告日后涨幅统计-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
big_df["公告日后涨幅统计-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
big_df["公告日后涨幅统计-10个交易日-平均涨幅"] = pd.to_numeric(
|
|
88
|
+
big_df["公告日后涨幅统计-10个交易日-平均涨幅"]
|
|
89
|
+
)
|
|
90
|
+
big_df["公告日后涨幅统计-10个交易日-最大涨幅"] = pd.to_numeric(
|
|
91
|
+
big_df["公告日后涨幅统计-10个交易日-最大涨幅"]
|
|
92
|
+
)
|
|
93
|
+
big_df["公告日后涨幅统计-10个交易日-最小涨幅"] = pd.to_numeric(
|
|
94
|
+
big_df["公告日后涨幅统计-10个交易日-最小涨幅"]
|
|
95
|
+
)
|
|
96
|
+
big_df["公告日后涨幅统计-30个交易日-平均涨幅"] = pd.to_numeric(
|
|
97
|
+
big_df["公告日后涨幅统计-30个交易日-平均涨幅"]
|
|
98
|
+
)
|
|
99
|
+
big_df["公告日后涨幅统计-30个交易日-最大涨幅"] = pd.to_numeric(
|
|
100
|
+
big_df["公告日后涨幅统计-30个交易日-最大涨幅"]
|
|
101
|
+
)
|
|
102
|
+
big_df["公告日后涨幅统计-30个交易日-最小涨幅"] = pd.to_numeric(
|
|
103
|
+
big_df["公告日后涨幅统计-30个交易日-最小涨幅"]
|
|
104
|
+
)
|
|
105
|
+
big_df["公告日后涨幅统计-60个交易日-平均涨幅"] = pd.to_numeric(
|
|
106
|
+
big_df["公告日后涨幅统计-60个交易日-平均涨幅"]
|
|
107
|
+
)
|
|
108
|
+
big_df["公告日后涨幅统计-60个交易日-最大涨幅"] = pd.to_numeric(
|
|
109
|
+
big_df["公告日后涨幅统计-60个交易日-最大涨幅"]
|
|
110
|
+
)
|
|
111
|
+
big_df["公告日后涨幅统计-60个交易日-最小涨幅"] = pd.to_numeric(
|
|
112
|
+
big_df["公告日后涨幅统计-60个交易日-最小涨幅"]
|
|
113
|
+
)
|
|
95
114
|
return big_df
|
|
96
115
|
|
|
97
116
|
|
|
@@ -167,15 +186,33 @@ def stock_gdfx_holding_statistics_em(date: str = "20210930") -> pd.DataFrame:
|
|
|
167
186
|
]
|
|
168
187
|
]
|
|
169
188
|
big_df["统计次数"] = pd.to_numeric(big_df["统计次数"])
|
|
170
|
-
big_df["公告日后涨幅统计-10个交易日-平均涨幅"] = pd.to_numeric(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
big_df["公告日后涨幅统计-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
big_df["公告日后涨幅统计-
|
|
177
|
-
|
|
178
|
-
|
|
189
|
+
big_df["公告日后涨幅统计-10个交易日-平均涨幅"] = pd.to_numeric(
|
|
190
|
+
big_df["公告日后涨幅统计-10个交易日-平均涨幅"]
|
|
191
|
+
)
|
|
192
|
+
big_df["公告日后涨幅统计-10个交易日-最大涨幅"] = pd.to_numeric(
|
|
193
|
+
big_df["公告日后涨幅统计-10个交易日-最大涨幅"]
|
|
194
|
+
)
|
|
195
|
+
big_df["公告日后涨幅统计-10个交易日-最小涨幅"] = pd.to_numeric(
|
|
196
|
+
big_df["公告日后涨幅统计-10个交易日-最小涨幅"]
|
|
197
|
+
)
|
|
198
|
+
big_df["公告日后涨幅统计-30个交易日-平均涨幅"] = pd.to_numeric(
|
|
199
|
+
big_df["公告日后涨幅统计-30个交易日-平均涨幅"]
|
|
200
|
+
)
|
|
201
|
+
big_df["公告日后涨幅统计-30个交易日-最大涨幅"] = pd.to_numeric(
|
|
202
|
+
big_df["公告日后涨幅统计-30个交易日-最大涨幅"]
|
|
203
|
+
)
|
|
204
|
+
big_df["公告日后涨幅统计-30个交易日-最小涨幅"] = pd.to_numeric(
|
|
205
|
+
big_df["公告日后涨幅统计-30个交易日-最小涨幅"]
|
|
206
|
+
)
|
|
207
|
+
big_df["公告日后涨幅统计-60个交易日-平均涨幅"] = pd.to_numeric(
|
|
208
|
+
big_df["公告日后涨幅统计-60个交易日-平均涨幅"]
|
|
209
|
+
)
|
|
210
|
+
big_df["公告日后涨幅统计-60个交易日-最大涨幅"] = pd.to_numeric(
|
|
211
|
+
big_df["公告日后涨幅统计-60个交易日-最大涨幅"]
|
|
212
|
+
)
|
|
213
|
+
big_df["公告日后涨幅统计-60个交易日-最小涨幅"] = pd.to_numeric(
|
|
214
|
+
big_df["公告日后涨幅统计-60个交易日-最小涨幅"]
|
|
215
|
+
)
|
|
179
216
|
return big_df
|
|
180
217
|
|
|
181
218
|
|
|
@@ -334,7 +371,7 @@ def stock_gdfx_holding_change_em(date: str = "20210930") -> pd.DataFrame:
|
|
|
334
371
|
|
|
335
372
|
|
|
336
373
|
def stock_gdfx_free_top_10_em(
|
|
337
|
-
|
|
374
|
+
symbol: str = "sh688686", date: str = "20240930"
|
|
338
375
|
) -> pd.DataFrame:
|
|
339
376
|
"""
|
|
340
377
|
东方财富网-个股-十大流通股东
|
|
@@ -384,14 +421,16 @@ def stock_gdfx_free_top_10_em(
|
|
|
384
421
|
"变动比率",
|
|
385
422
|
]
|
|
386
423
|
]
|
|
387
|
-
temp_df["持股数"] = pd.to_numeric(temp_df["持股数"])
|
|
388
|
-
temp_df["占总流通股本持股比例"] = pd.to_numeric(
|
|
389
|
-
|
|
424
|
+
temp_df["持股数"] = pd.to_numeric(temp_df["持股数"], errors="coerce")
|
|
425
|
+
temp_df["占总流通股本持股比例"] = pd.to_numeric(
|
|
426
|
+
temp_df["占总流通股本持股比例"], errors="coerce"
|
|
427
|
+
)
|
|
428
|
+
temp_df["变动比率"] = pd.to_numeric(temp_df["变动比率"], errors="coerce")
|
|
390
429
|
return temp_df
|
|
391
430
|
|
|
392
431
|
|
|
393
432
|
def stock_gdfx_top_10_em(
|
|
394
|
-
|
|
433
|
+
symbol: str = "sh688686", date: str = "20210630"
|
|
395
434
|
) -> pd.DataFrame:
|
|
396
435
|
"""
|
|
397
436
|
东方财富网-个股-十大股东
|
|
@@ -477,24 +516,27 @@ def stock_gdfx_free_holding_detail_em(date: str = "20210930") -> pd.DataFrame:
|
|
|
477
516
|
|
|
478
517
|
big_df.reset_index(inplace=True)
|
|
479
518
|
big_df["index"] = big_df.index + 1
|
|
480
|
-
big_df.rename(
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
519
|
+
big_df.rename(
|
|
520
|
+
columns={
|
|
521
|
+
"index": "序号",
|
|
522
|
+
"HOLDER_NAME": "股东名称",
|
|
523
|
+
"HOLDER_TYPE": "股东类型",
|
|
524
|
+
"SHARES_TYPE": "股份类型",
|
|
525
|
+
"HOLDER_RANK": "股东排名",
|
|
526
|
+
"SECURITY_CODE": "股票代码",
|
|
527
|
+
"SECURITY_NAME_ABBR": "股票简称",
|
|
528
|
+
"HOLD_NUM": "期末持股-数量",
|
|
529
|
+
"FREE_HOLDNUM_RATIO": "期末持股-持股占流通股比",
|
|
530
|
+
"XZCHANGE": "期末持股-数量变化",
|
|
531
|
+
"CHANGE_RATIO": "期末持股-数量变化比例",
|
|
532
|
+
"HOLDNUM_CHANGE_NAME": "期末持股-持股变动",
|
|
533
|
+
"HOLDER_MARKET_CAP": "期末持股-流通市值",
|
|
534
|
+
"END_DATE": "报告期",
|
|
535
|
+
"UPDATE_DATE": "公告日",
|
|
536
|
+
"REPORT_DATE_NAME": "报告名称",
|
|
537
|
+
},
|
|
538
|
+
inplace=True,
|
|
539
|
+
)
|
|
498
540
|
|
|
499
541
|
big_df = big_df[
|
|
500
542
|
[
|
|
@@ -515,13 +557,21 @@ def stock_gdfx_free_holding_detail_em(date: str = "20210930") -> pd.DataFrame:
|
|
|
515
557
|
big_df["报告期"] = pd.to_datetime(big_df["报告期"], errors="coerce").dt.date
|
|
516
558
|
big_df["公告日"] = pd.to_datetime(big_df["公告日"], errors="coerce").dt.date
|
|
517
559
|
big_df["期末持股-数量"] = pd.to_numeric(big_df["期末持股-数量"], errors="coerce")
|
|
518
|
-
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
519
|
-
|
|
520
|
-
|
|
560
|
+
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
561
|
+
big_df["期末持股-数量变化"], errors="coerce"
|
|
562
|
+
)
|
|
563
|
+
big_df["期末持股-数量变化比例"] = pd.to_numeric(
|
|
564
|
+
big_df["期末持股-数量变化比例"], errors="coerce"
|
|
565
|
+
)
|
|
566
|
+
big_df["期末持股-流通市值"] = pd.to_numeric(
|
|
567
|
+
big_df["期末持股-流通市值"], errors="coerce"
|
|
568
|
+
)
|
|
521
569
|
return big_df
|
|
522
570
|
|
|
523
571
|
|
|
524
|
-
def stock_gdfx_holding_detail_em(
|
|
572
|
+
def stock_gdfx_holding_detail_em(
|
|
573
|
+
date: str = "20230331", indicator: str = "个人", symbol: str = "新进"
|
|
574
|
+
) -> pd.DataFrame:
|
|
525
575
|
"""
|
|
526
576
|
东方财富网-数据中心-股东分析-股东持股明细-十大股东
|
|
527
577
|
https://data.eastmoney.com/gdfx/HoldingAnalyse.html
|
|
@@ -559,22 +609,24 @@ def stock_gdfx_holding_detail_em(date: str = "20230331", indicator: str = "个
|
|
|
559
609
|
|
|
560
610
|
big_df.reset_index(inplace=True)
|
|
561
611
|
big_df["index"] = big_df.index + 1
|
|
562
|
-
big_df.rename(
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
612
|
+
big_df.rename(
|
|
613
|
+
columns={
|
|
614
|
+
"index": "序号",
|
|
615
|
+
"HOLDER_NAME": "股东名称",
|
|
616
|
+
"HOLDER_NEWTYPE": "股东类型",
|
|
617
|
+
"RANK": "股东排名",
|
|
618
|
+
"SECURITY_CODE": "股票代码",
|
|
619
|
+
"SECURITY_NAME_ABBR": "股票简称",
|
|
620
|
+
"END_DATE": "报告期",
|
|
621
|
+
"HOLD_NUM": "期末持股-数量",
|
|
622
|
+
"HOLD_NUM_CHANGE": "期末持股-数量变化",
|
|
623
|
+
"HOLD_RATIO_CHANGE": "期末持股-数量变化比例",
|
|
624
|
+
"HOLDNUM_CHANGE_NAME": "期末持股-持股变动",
|
|
625
|
+
"HOLDER_MARKET_CAP": "期末持股-流通市值",
|
|
626
|
+
"NOTICE_DATE": "公告日",
|
|
627
|
+
},
|
|
628
|
+
inplace=True,
|
|
629
|
+
)
|
|
578
630
|
|
|
579
631
|
big_df = big_df[
|
|
580
632
|
[
|
|
@@ -596,9 +648,15 @@ def stock_gdfx_holding_detail_em(date: str = "20230331", indicator: str = "个
|
|
|
596
648
|
big_df["报告期"] = pd.to_datetime(big_df["报告期"], errors="coerce").dt.date
|
|
597
649
|
big_df["公告日"] = pd.to_datetime(big_df["公告日"], errors="coerce").dt.date
|
|
598
650
|
big_df["期末持股-数量"] = pd.to_numeric(big_df["期末持股-数量"], errors="coerce")
|
|
599
|
-
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
600
|
-
|
|
601
|
-
|
|
651
|
+
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
652
|
+
big_df["期末持股-数量变化"], errors="coerce"
|
|
653
|
+
)
|
|
654
|
+
big_df["期末持股-数量变化比例"] = pd.to_numeric(
|
|
655
|
+
big_df["期末持股-数量变化比例"], errors="coerce"
|
|
656
|
+
)
|
|
657
|
+
big_df["期末持股-流通市值"] = pd.to_numeric(
|
|
658
|
+
big_df["期末持股-流通市值"], errors="coerce"
|
|
659
|
+
)
|
|
602
660
|
big_df["股东排名"] = pd.to_numeric(big_df["股东排名"], errors="coerce")
|
|
603
661
|
return big_df
|
|
604
662
|
|
|
@@ -637,23 +695,26 @@ def stock_gdfx_free_holding_analyse_em(date: str = "20230930") -> pd.DataFrame:
|
|
|
637
695
|
|
|
638
696
|
big_df.reset_index(inplace=True)
|
|
639
697
|
big_df["index"] = big_df.index + 1
|
|
640
|
-
big_df.rename(
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
698
|
+
big_df.rename(
|
|
699
|
+
columns={
|
|
700
|
+
"index": "序号",
|
|
701
|
+
"HOLDER_NAME": "股东名称",
|
|
702
|
+
"HOLDER_TYPE": "股东类型",
|
|
703
|
+
"SECURITY_CODE": "股票代码",
|
|
704
|
+
"SECURITY_NAME_ABBR": "股票简称",
|
|
705
|
+
"END_DATE": "报告期",
|
|
706
|
+
"HOLD_NUM": "期末持股-数量",
|
|
707
|
+
"XZCHANGE": "期末持股-数量变化",
|
|
708
|
+
"HOLD_RATIO_CHANGE": "期末持股-数量变化比例",
|
|
709
|
+
"HOLDNUM_CHANGE_NAME": "期末持股-持股变动",
|
|
710
|
+
"HOLDER_MARKET_CAP": "期末持股-流通市值",
|
|
711
|
+
"UPDATE_DATE": "公告日",
|
|
712
|
+
"D10_ADJCHRATE": "公告日后涨跌幅-10个交易日",
|
|
713
|
+
"D30_ADJCHRATE": "公告日后涨跌幅-30个交易日",
|
|
714
|
+
"D60_ADJCHRATE": "公告日后涨跌幅-60个交易日",
|
|
715
|
+
},
|
|
716
|
+
inplace=True,
|
|
717
|
+
)
|
|
657
718
|
big_df = big_df[
|
|
658
719
|
[
|
|
659
720
|
"序号",
|
|
@@ -676,12 +737,24 @@ def stock_gdfx_free_holding_analyse_em(date: str = "20230930") -> pd.DataFrame:
|
|
|
676
737
|
big_df["报告期"] = pd.to_datetime(big_df["报告期"], errors="coerce").dt.date
|
|
677
738
|
big_df["公告日"] = pd.to_datetime(big_df["公告日"], errors="coerce").dt.date
|
|
678
739
|
big_df["期末持股-数量"] = pd.to_numeric(big_df["期末持股-数量"], errors="coerce")
|
|
679
|
-
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
big_df["
|
|
683
|
-
|
|
684
|
-
|
|
740
|
+
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
741
|
+
big_df["期末持股-数量变化"], errors="coerce"
|
|
742
|
+
)
|
|
743
|
+
big_df["期末持股-数量变化比例"] = pd.to_numeric(
|
|
744
|
+
big_df["期末持股-数量变化比例"], errors="coerce"
|
|
745
|
+
)
|
|
746
|
+
big_df["期末持股-流通市值"] = pd.to_numeric(
|
|
747
|
+
big_df["期末持股-流通市值"], errors="coerce"
|
|
748
|
+
)
|
|
749
|
+
big_df["公告日后涨跌幅-10个交易日"] = pd.to_numeric(
|
|
750
|
+
big_df["公告日后涨跌幅-10个交易日"], errors="coerce"
|
|
751
|
+
)
|
|
752
|
+
big_df["公告日后涨跌幅-30个交易日"] = pd.to_numeric(
|
|
753
|
+
big_df["公告日后涨跌幅-30个交易日"], errors="coerce"
|
|
754
|
+
)
|
|
755
|
+
big_df["公告日后涨跌幅-60个交易日"] = pd.to_numeric(
|
|
756
|
+
big_df["公告日后涨跌幅-60个交易日"], errors="coerce"
|
|
757
|
+
)
|
|
685
758
|
return big_df
|
|
686
759
|
|
|
687
760
|
|
|
@@ -718,7 +791,7 @@ def stock_gdfx_holding_analyse_em(date: str = "20230331") -> pd.DataFrame:
|
|
|
718
791
|
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
719
792
|
|
|
720
793
|
big_df.reset_index(inplace=True)
|
|
721
|
-
big_df[
|
|
794
|
+
big_df["index"] = big_df["index"] + 1
|
|
722
795
|
big_df.rename(
|
|
723
796
|
columns={
|
|
724
797
|
"index": "序号",
|
|
@@ -766,12 +839,24 @@ def stock_gdfx_holding_analyse_em(date: str = "20230331") -> pd.DataFrame:
|
|
|
766
839
|
big_df["公告日"] = pd.to_datetime(big_df["公告日"]).dt.date
|
|
767
840
|
big_df["报告期"] = pd.to_datetime(big_df["报告期"]).dt.date
|
|
768
841
|
big_df["期末持股-数量"] = pd.to_numeric(big_df["期末持股-数量"], errors="coerce")
|
|
769
|
-
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
big_df["
|
|
773
|
-
|
|
774
|
-
|
|
842
|
+
big_df["期末持股-数量变化"] = pd.to_numeric(
|
|
843
|
+
big_df["期末持股-数量变化"], errors="coerce"
|
|
844
|
+
)
|
|
845
|
+
big_df["期末持股-数量变化比例"] = pd.to_numeric(
|
|
846
|
+
big_df["期末持股-数量变化比例"], errors="coerce"
|
|
847
|
+
)
|
|
848
|
+
big_df["期末持股-流通市值"] = pd.to_numeric(
|
|
849
|
+
big_df["期末持股-流通市值"], errors="coerce"
|
|
850
|
+
)
|
|
851
|
+
big_df["公告日后涨跌幅-10个交易日"] = pd.to_numeric(
|
|
852
|
+
big_df["公告日后涨跌幅-10个交易日"], errors="coerce"
|
|
853
|
+
)
|
|
854
|
+
big_df["公告日后涨跌幅-30个交易日"] = pd.to_numeric(
|
|
855
|
+
big_df["公告日后涨跌幅-30个交易日"], errors="coerce"
|
|
856
|
+
)
|
|
857
|
+
big_df["公告日后涨跌幅-60个交易日"] = pd.to_numeric(
|
|
858
|
+
big_df["公告日后涨跌幅-60个交易日"], errors="coerce"
|
|
859
|
+
)
|
|
775
860
|
return big_df
|
|
776
861
|
|
|
777
862
|
|
|
@@ -7,6 +7,7 @@ http://data.eastmoney.com/jgdy/
|
|
|
7
7
|
东方财富网-数据中心-特色数据-机构调研-机构调研统计: http://data.eastmoney.com/jgdy/tj.html
|
|
8
8
|
东方财富网-数据中心-特色数据-机构调研-机构调研详细: http://data.eastmoney.com/jgdy/xx.html
|
|
9
9
|
"""
|
|
10
|
+
|
|
10
11
|
import pandas as pd
|
|
11
12
|
import requests
|
|
12
13
|
from tqdm import tqdm
|
|
@@ -23,26 +24,26 @@ def stock_jgdy_tj_em(date: str = "20220101") -> pd.DataFrame:
|
|
|
23
24
|
"""
|
|
24
25
|
url = "http://datacenter-web.eastmoney.com/api/data/v1/get"
|
|
25
26
|
params = {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
"sortColumns": "NOTICE_DATE,SUM,RECEIVE_START_DATE,SECURITY_CODE",
|
|
28
|
+
"sortTypes": "-1,-1,-1,1",
|
|
29
|
+
"pageSize": "500",
|
|
30
|
+
"pageNumber": "1",
|
|
31
|
+
"reportName": "RPT_ORG_SURVEYNEW",
|
|
32
|
+
"columns": "ALL",
|
|
33
|
+
"quoteColumns": "f2~01~SECURITY_CODE~CLOSE_PRICE,f3~01~SECURITY_CODE~CHANGE_RATE",
|
|
34
|
+
"source": "WEB",
|
|
35
|
+
"client": "WEB",
|
|
36
|
+
"filter": f"""(NUMBERNEW="1")(IS_SOURCE="1")(RECEIVE_START_DATE>'{'-'.join([date[:4], date[4:6], date[6:]])}')""",
|
|
36
37
|
}
|
|
37
38
|
r = requests.get(url, params=params)
|
|
38
39
|
data_json = r.json()
|
|
39
|
-
total_page = data_json[
|
|
40
|
+
total_page = data_json["result"]["pages"]
|
|
40
41
|
big_df = pd.DataFrame()
|
|
41
|
-
for page in tqdm(range(1, total_page+1), leave=False):
|
|
42
|
+
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
42
43
|
params.update({"pageNumber": page})
|
|
43
44
|
r = requests.get(url, params=params)
|
|
44
45
|
data_json = r.json()
|
|
45
|
-
temp_df = pd.DataFrame(data_json[
|
|
46
|
+
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
46
47
|
big_df = pd.concat([big_df, temp_df])
|
|
47
48
|
big_df.reset_index(inplace=True)
|
|
48
49
|
big_df["index"] = list(range(1, len(big_df) + 1))
|
|
@@ -96,45 +97,47 @@ def stock_jgdy_tj_em(date: str = "20220101") -> pd.DataFrame:
|
|
|
96
97
|
"公告日期",
|
|
97
98
|
]
|
|
98
99
|
]
|
|
99
|
-
big_df[
|
|
100
|
-
big_df[
|
|
101
|
-
big_df[
|
|
102
|
-
big_df[
|
|
103
|
-
big_df[
|
|
100
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
|
|
101
|
+
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
|
|
102
|
+
big_df["接待机构数量"] = pd.to_numeric(big_df["接待机构数量"], errors="coerce")
|
|
103
|
+
big_df["接待日期"] = pd.to_datetime(big_df["接待日期"]).dt.date
|
|
104
|
+
big_df["公告日期"] = pd.to_datetime(big_df["公告日期"]).dt.date
|
|
104
105
|
return big_df
|
|
105
106
|
|
|
106
107
|
|
|
107
|
-
def stock_jgdy_detail_em(date: str = "
|
|
108
|
+
def stock_jgdy_detail_em(date: str = "20241211") -> pd.DataFrame:
|
|
108
109
|
"""
|
|
109
110
|
东方财富网-数据中心-特色数据-机构调研-机构调研详细
|
|
110
|
-
|
|
111
|
+
https://data.eastmoney.com/jgdy/xx.html
|
|
111
112
|
:param date: 开始时间
|
|
112
113
|
:type date: str
|
|
113
114
|
:return: 机构调研详细
|
|
114
115
|
:rtype: pandas.DataFrame
|
|
115
116
|
"""
|
|
116
|
-
url = "
|
|
117
|
+
url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
|
|
117
118
|
params = {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
119
|
+
"sortColumns": "NOTICE_DATE,RECEIVE_START_DATE,SECURITY_CODE,NUMBERNEW",
|
|
120
|
+
"sortTypes": "-1,-1,1,-1",
|
|
121
|
+
"pageSize": "50",
|
|
122
|
+
"pageNumber": "1",
|
|
123
|
+
"reportName": "RPT_ORG_SURVEY",
|
|
124
|
+
"columns": "SECUCODE,SECURITY_CODE,SECURITY_NAME_ABBR,NOTICE_DATE,RECEIVE_START_DATE,"
|
|
125
|
+
"RECEIVE_OBJECT,RECEIVE_PLACE,RECEIVE_WAY_EXPLAIN,INVESTIGATORS,RECEPTIONIST,ORG_TYPE",
|
|
126
|
+
"quoteColumns": "f2~01~SECURITY_CODE~CLOSE_PRICE,f3~01~SECURITY_CODE~CHANGE_RATE",
|
|
127
|
+
"quoteType": "0",
|
|
128
|
+
"source": "WEB",
|
|
129
|
+
"client": "WEB",
|
|
130
|
+
"filter": f"""(IS_SOURCE="1")(RECEIVE_START_DATE>'{'-'.join([date[:4], date[4:6], date[6:]])}')""",
|
|
128
131
|
}
|
|
129
132
|
r = requests.get(url, params=params)
|
|
130
133
|
data_json = r.json()
|
|
131
|
-
total_page = data_json[
|
|
134
|
+
total_page = data_json["result"]["pages"]
|
|
132
135
|
big_df = pd.DataFrame()
|
|
133
|
-
for page in tqdm(range(1, total_page+1), leave=False):
|
|
136
|
+
for page in tqdm(range(1, total_page + 1), leave=False):
|
|
134
137
|
params.update({"pageNumber": page})
|
|
135
138
|
r = requests.get(url, params=params)
|
|
136
139
|
data_json = r.json()
|
|
137
|
-
temp_df = pd.DataFrame(data_json[
|
|
140
|
+
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
138
141
|
big_df = pd.concat([big_df, temp_df])
|
|
139
142
|
big_df.reset_index(inplace=True)
|
|
140
143
|
big_df["index"] = list(range(1, len(big_df) + 1))
|
|
@@ -171,10 +174,10 @@ def stock_jgdy_detail_em(date: str = "20220101") -> pd.DataFrame:
|
|
|
171
174
|
"公告日期",
|
|
172
175
|
]
|
|
173
176
|
]
|
|
174
|
-
big_df[
|
|
175
|
-
big_df[
|
|
176
|
-
big_df[
|
|
177
|
-
big_df[
|
|
177
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
|
|
178
|
+
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"], errors="coerce")
|
|
179
|
+
big_df["调研日期"] = pd.to_datetime(big_df["调研日期"], errors="coerce").dt.date
|
|
180
|
+
big_df["公告日期"] = pd.to_datetime(big_df["公告日期"], errors="coerce").dt.date
|
|
178
181
|
return big_df
|
|
179
182
|
|
|
180
183
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
akshare/__init__.py,sha256=
|
|
1
|
+
akshare/__init__.py,sha256=ACpa0FRN-FBpuz43nJ_CUGfGHwjVNVqqj2wlZZPRxhM,184449
|
|
2
2
|
akshare/datasets.py,sha256=-qdwaQjgBlftX84uM74KJqCYJYkQ50PV416_neA4uls,995
|
|
3
3
|
akshare/exceptions.py,sha256=WEJjIhSmJ_xXNW6grwV4nufE_cfmmyuhmueVGiN1VAg,878
|
|
4
4
|
akshare/request.py,sha256=HtFFf9MhfEibR-ETWe-1Tts6ELU4VKSqA-ghaXjegQM,4252
|
|
@@ -27,7 +27,6 @@ akshare/bond/bond_china_money.py,sha256=IInePsQJDby5w0AYd84ipiJL_nbyVAaRC7SaHLWD
|
|
|
27
27
|
akshare/bond/bond_convert.py,sha256=9w94nIdSN4BUL27sPbVEUouBaAm30WMBiokYr4yM0sI,12649
|
|
28
28
|
akshare/bond/bond_em.py,sha256=Ck5hCloZ25I8updarLPzqHYYZPeOsjIFy4g2oaZvFMs,5318
|
|
29
29
|
akshare/bond/bond_info_cm.py,sha256=VBu9UM9tUcGDRV07pndU9yttLDF_Nk3b0vU0n65qpHs,7890
|
|
30
|
-
akshare/bond/bond_investing.py,sha256=nWONMggn-KV8XwUSs5CqIXKHX9F7W1tb4w8umH5rWho,4992
|
|
31
30
|
akshare/bond/bond_issue_cninfo.py,sha256=tPoZhF-_sIX9ztCKB0K0-Z4Kd9b-389bP3_CdFK7Wb0,21672
|
|
32
31
|
akshare/bond/bond_nafmii.py,sha256=cekcobyXKMG1zDuM8wHWOn__SuWELxYmUwfGVmLRP40,2155
|
|
33
32
|
akshare/bond/bond_summary.py,sha256=ECwCRcs5YMIro4I1Yayf6SZ8nz1Hr97RhmKT6aGaQDg,3581
|
|
@@ -105,7 +104,7 @@ akshare/fund/fund_xq.py,sha256=AxMZB-940bNY7-BatVLZiseHNxiWA17hQzTfuxGibPU,11306
|
|
|
105
104
|
akshare/futures/__init__.py,sha256=RMTf1bT5EOE3ttWpn3hGu1LtUmsVxDoa0W7W0gXHOy8,81
|
|
106
105
|
akshare/futures/cons.py,sha256=zD2uRQK3v-mywcDZfL28sDdRl6WIeWthHTfu8nrcQAo,16252
|
|
107
106
|
akshare/futures/cot.py,sha256=Kkza2slS7JQpXndKrQEEykzIjZIT3vhvtZHVJ7P1yac,58573
|
|
108
|
-
akshare/futures/futures_basis.py,sha256=
|
|
107
|
+
akshare/futures/futures_basis.py,sha256=pmXNXdWnfvJCRs6xKJ0Ed9R2v92-NK2Sp3AjlwecErc,15691
|
|
109
108
|
akshare/futures/futures_comex_em.py,sha256=V-mkKQkH5N8PyaZWKdyggb2lTnY8DDDxiUPt-1leQu0,3171
|
|
110
109
|
akshare/futures/futures_comm_ctp.py,sha256=V8TEKO0R0i6LfE8DDFqrMA3JGwNlpmaQCvvMugKZ1I8,1004
|
|
111
110
|
akshare/futures/futures_comm_qihuo.py,sha256=uQfabZ63qME8sTaxUbIUVQBVi8yTaPPDhD7voR9PEx0,10504
|
|
@@ -115,7 +114,6 @@ akshare/futures/futures_foreign.py,sha256=oSIoAg5oy-CIlPWHkQffcvZGu02Y2GWOrt-6aP
|
|
|
115
114
|
akshare/futures/futures_hf_em.py,sha256=jne-wUYr2QTUkDq3qAxYKE0Hm90L3H8qUDu3JavKiUg,3338
|
|
116
115
|
akshare/futures/futures_hq_sina.py,sha256=eK1gEan4DPvpYmln8-tNnzh_J_733s95DBr--NqNYVA,9576
|
|
117
116
|
akshare/futures/futures_index_ccidx.py,sha256=9Rhk3ps-H69tU-NIV0W2NdLFUDTSUx0bwtePA6gLMZA,4566
|
|
118
|
-
akshare/futures/futures_international.py,sha256=EE_JTjQKekx8_FU8M12wHSd1DSlfMXYFiBJ6_wmThfc,6946
|
|
119
117
|
akshare/futures/futures_inventory_99.py,sha256=Nvw39obGGhgOkk_C4jOrV4gdq78dtHPOnits_B0Ljxk,8450
|
|
120
118
|
akshare/futures/futures_inventory_em.py,sha256=C5nt4F51WB-oc8o3GrMvEGo0SO2mIq_H1vHVl42vzT0,2340
|
|
121
119
|
akshare/futures/futures_news_baidu.py,sha256=uqXUgQa7_aNjj1g4IBt6Ic4DhlsuBvjEEYC3OTPeqmA,1544
|
|
@@ -161,7 +159,6 @@ akshare/index/index_drewry.py,sha256=BM7V6P8K4QUFQArsdaWRu5qJUZaCoyNz97_b8dmLeCw
|
|
|
161
159
|
akshare/index/index_eri.py,sha256=7X0KNDBntEkE_qSb2jb6IBv-S8PsevLFdxGT8nKT3W0,2111
|
|
162
160
|
akshare/index/index_fear_greed_funddb.py,sha256=7Z6GqYkKPJHNHMEN-uZNu2KnNNLTWvJcVlYpfAShJJc,2378
|
|
163
161
|
akshare/index/index_hog.py,sha256=kb867BVagt70_ycZMn22ks5Z9jlVbMiuTsvq5ygjeig,1657
|
|
164
|
-
akshare/index/index_investing.py,sha256=BPGIAD-_QNhpMivQi7bSGvBF2KWd8gfHsNf0hqHKrR0,8897
|
|
165
162
|
akshare/index/index_kq_fz.py,sha256=Y-cbxWLpRyGcFcMSDxZZQXdAuD85IuQH5xC2rhtGbRc,3395
|
|
166
163
|
akshare/index/index_kq_ss.py,sha256=m4hAMNnzHk8JNAnKjkYYVeyG4zUC5zR5i0-u-OxmaGU,3333
|
|
167
164
|
akshare/index/index_option_qvix.py,sha256=sCx0iiIetkp5ELE9sDwesVFgJNfa_1tAEWVCJI-I2u4,3270
|
|
@@ -309,7 +306,7 @@ akshare/stock_feature/stock_fhps_em.py,sha256=85gfdMP3OtA3wsEGlB2RkdHiOEZjFff1ls
|
|
|
309
306
|
akshare/stock_feature/stock_fhps_ths.py,sha256=NosH1xyT1Pif4T9tchdtJTBEpe6g1Wq2kjvxJDsZD_Y,1805
|
|
310
307
|
akshare/stock_feature/stock_fund_flow.py,sha256=cqBqsFrzwmuLP3k3wYQzvW085QUUfHZ4nBW8Zx7egkQ,18669
|
|
311
308
|
akshare/stock_feature/stock_gddh_em.py,sha256=I_MUJhyy0mwjNG46ZsQINEQvHR42EmS7gJBQujXr5Bw,3467
|
|
312
|
-
akshare/stock_feature/stock_gdfx_em.py,sha256=
|
|
309
|
+
akshare/stock_feature/stock_gdfx_em.py,sha256=rnGnHYmPH7b2mk4R9LJ3xl5XTMUaQqsFyQejje0qhyQ,38645
|
|
313
310
|
akshare/stock_feature/stock_gdhs.py,sha256=Z6ZMy1A03BqMu9TghcIu2Sd_wwEtpIH7qawHun9G7ns,9036
|
|
314
311
|
akshare/stock_feature/stock_gdzjc_em.py,sha256=SHJH5iS3_NhvjTqRXF0vPooZl0s_ASeyZmNCC50ZYqs,4426
|
|
315
312
|
akshare/stock_feature/stock_gpzy_em.py,sha256=8NvLfWbLLQyjTlg6iSpg1LxlIAKLv534JZAiUAVxF1M,17443
|
|
@@ -324,7 +321,7 @@ akshare/stock_feature/stock_hsgt_min_em.py,sha256=KLeez7MQwBAcO-RT7n41LOikUfvXDG
|
|
|
324
321
|
akshare/stock_feature/stock_info.py,sha256=AQ4ZMXAks3qCxk3lbH_YpsqC-qQHpZ49UGk0Mm08d2E,9192
|
|
325
322
|
akshare/stock_feature/stock_inner_trade_xq.py,sha256=jsARS5It6_UNn3WL8vnTK4F90Rx1dMvarxtiVbzOLrM,2682
|
|
326
323
|
akshare/stock_feature/stock_irm_cninfo.py,sha256=xD028gllzaHYj6xU9pRKvSLI_gIkVhCTnFH0dSPv1gY,6112
|
|
327
|
-
akshare/stock_feature/stock_jgdy_em.py,sha256=
|
|
324
|
+
akshare/stock_feature/stock_jgdy_em.py,sha256=B39Il7p1a_hx0FXL4zo_Xsxi10Z8W7_EZv8f9nNnwXg,6080
|
|
328
325
|
akshare/stock_feature/stock_lh_yybpm.py,sha256=7VlqA-UGbfiQ4ez7Ah9znIfUcVI-7Fxxz_V03JO8LTY,3614
|
|
329
326
|
akshare/stock_feature/stock_lhb_em.py,sha256=vDUeuJp9mRHmgrtjLPLXG-IFb4VVzXkr2-Q4UBzEtzc,34334
|
|
330
327
|
akshare/stock_feature/stock_lhb_sina.py,sha256=W5F5aPlxAmHzzxcf1AAiJuMVtTK9PlYMo_XamCZ5N1o,9232
|
|
@@ -383,8 +380,8 @@ akshare/utils/token_process.py,sha256=K4rGXjh_tgugbRcyOK2h2x0jP3PT65IIK7nxhUKhOe
|
|
|
383
380
|
akshare/utils/tqdm.py,sha256=MuPNwcswkOGjwWQOMWXi9ZvQ_RmW4obCWRj2i7HM7FE,847
|
|
384
381
|
tests/__init__.py,sha256=gNzhlO0UPjFq6Ieb38kaVIODXv4cTDByrdohAZnDYt4,82
|
|
385
382
|
tests/test_func.py,sha256=j1MGYbZI2if2j_LY1S4FLsf4qfq4NwVqD5wmRlv5Log,832
|
|
386
|
-
akshare-1.15.
|
|
387
|
-
akshare-1.15.
|
|
388
|
-
akshare-1.15.
|
|
389
|
-
akshare-1.15.
|
|
390
|
-
akshare-1.15.
|
|
383
|
+
akshare-1.15.45.dist-info/LICENSE,sha256=mmSZCPgfHiVw34LXuFArd-SUgQtBJ_QsIlh-kWlDHfs,1073
|
|
384
|
+
akshare-1.15.45.dist-info/METADATA,sha256=i3mygGTuHA_N5-Jvv3KIwajE9NEQ8xqK0oVtuyDyqdA,13423
|
|
385
|
+
akshare-1.15.45.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
386
|
+
akshare-1.15.45.dist-info/top_level.txt,sha256=jsf9ZzZPmHaISTVumQPsAw7vv7Yv-PdEVW70SMEelQQ,14
|
|
387
|
+
akshare-1.15.45.dist-info/RECORD,,
|
akshare/bond/bond_investing.py
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding:utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Date: 2021/5/7 13:50
|
|
5
|
-
Desc: 英为财情-利率国债-全球政府债券行情与收益率
|
|
6
|
-
https://cn.investing.com/rates-bonds/
|
|
7
|
-
"""
|
|
8
|
-
import re
|
|
9
|
-
|
|
10
|
-
import pandas as pd
|
|
11
|
-
import requests
|
|
12
|
-
from bs4 import BeautifulSoup
|
|
13
|
-
|
|
14
|
-
from akshare.index.cons import short_headers, long_headers
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _get_global_country_name_url() -> dict:
|
|
18
|
-
"""
|
|
19
|
-
指数数据国家对应的 URL
|
|
20
|
-
https://cn.investing.com/rates-bonds/
|
|
21
|
-
:return: 指数数据国家对应的 URL
|
|
22
|
-
:rtype: dict
|
|
23
|
-
"""
|
|
24
|
-
url = "https://cn.investing.com/rates-bonds/"
|
|
25
|
-
res = requests.get(url, headers=short_headers, timeout=30)
|
|
26
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
27
|
-
name_url_option_list = soup.find("select", attrs={"name": "country"}).find_all(
|
|
28
|
-
"option"
|
|
29
|
-
)[1:]
|
|
30
|
-
url_list = [item["value"] for item in name_url_option_list]
|
|
31
|
-
name_list = [item.get_text() for item in name_url_option_list]
|
|
32
|
-
name_code_map_dict = {}
|
|
33
|
-
name_code_map_dict.update(zip(name_list, url_list))
|
|
34
|
-
return name_code_map_dict
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def bond_investing_global_country_name_url(country: str = "中国") -> dict:
|
|
38
|
-
"""
|
|
39
|
-
参考网页: https://cn.investing.com/rates-bonds/
|
|
40
|
-
获取选择国家对应的: 主要指数, 主要行业, 附加指数, 其他指数
|
|
41
|
-
:param country: str 中文国家名称, 对应 get_global_country_name_url 函数返回的国家名称
|
|
42
|
-
:return: dict
|
|
43
|
-
"""
|
|
44
|
-
name_url_dict = _get_global_country_name_url()
|
|
45
|
-
url = f"https://cn.investing.com{name_url_dict[country]}"
|
|
46
|
-
res = requests.get(url, headers=short_headers, timeout=30)
|
|
47
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
48
|
-
url_list = [
|
|
49
|
-
item.find("a")["href"] for item in soup.find_all(attrs={"class": "plusIconTd"})
|
|
50
|
-
]
|
|
51
|
-
name_list = [
|
|
52
|
-
item.find("a").get_text()
|
|
53
|
-
for item in soup.find_all(attrs={"class": "plusIconTd"})
|
|
54
|
-
]
|
|
55
|
-
name_code_map_dict = {}
|
|
56
|
-
name_code_map_dict.update(zip(name_list, url_list))
|
|
57
|
-
return name_code_map_dict
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def bond_investing_global(
|
|
61
|
-
country: str = "中国",
|
|
62
|
-
index_name: str = "中国1年期国债",
|
|
63
|
-
period: str = "每日",
|
|
64
|
-
start_date: str = "20000101",
|
|
65
|
-
end_date: str = "20191017",
|
|
66
|
-
) -> pd.DataFrame:
|
|
67
|
-
"""
|
|
68
|
-
具体国家的具体指数的从 start_date 到 end_date 期间的数据
|
|
69
|
-
https://cn.investing.com/rates-bonds/
|
|
70
|
-
:param country: 对应函数中的国家名称
|
|
71
|
-
:type country: str
|
|
72
|
-
:param index_name: 对应函数中的指数名称
|
|
73
|
-
:type index_name: str
|
|
74
|
-
:param period: choice of {"每日", "每周", "每月"}
|
|
75
|
-
:type period: str
|
|
76
|
-
:param start_date: '2000-01-01', 注意格式
|
|
77
|
-
:type start_date: str
|
|
78
|
-
:param end_date: '2019-10-17', 注意格式
|
|
79
|
-
:type end_date: str
|
|
80
|
-
:return: 指定参数的数据
|
|
81
|
-
:rtype: pandas.DataFrame
|
|
82
|
-
"""
|
|
83
|
-
start_date = "/".join([start_date[:4], start_date[4:6], start_date[6:]])
|
|
84
|
-
end_date = "/".join([end_date[:4], end_date[4:6], end_date[6:]])
|
|
85
|
-
period_map = {"每日": "Daily", "每周": "Weekly", "每月": "Monthly"}
|
|
86
|
-
name_code_dict = bond_investing_global_country_name_url(country)
|
|
87
|
-
temp_url = f"https://cn.investing.com/{name_code_dict[index_name]}-historical-data"
|
|
88
|
-
res = requests.get(temp_url, headers=short_headers, timeout=30)
|
|
89
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
90
|
-
title = soup.find("h2", attrs={"class": "float_lang_base_1"}).get_text()
|
|
91
|
-
data = soup.find_all(text=re.compile("window.histDataExcessInfo"))[0].strip()
|
|
92
|
-
para_data = re.findall(r"\d+", data)
|
|
93
|
-
payload = {
|
|
94
|
-
"curr_id": para_data[0],
|
|
95
|
-
"smlID": para_data[1],
|
|
96
|
-
"header": title,
|
|
97
|
-
"st_date": start_date,
|
|
98
|
-
"end_date": end_date,
|
|
99
|
-
"interval_sec": period_map[period],
|
|
100
|
-
"sort_col": "date",
|
|
101
|
-
"sort_ord": "DESC",
|
|
102
|
-
"action": "historical_data",
|
|
103
|
-
}
|
|
104
|
-
url = "https://cn.investing.com/instruments/HistoricalDataAjax"
|
|
105
|
-
res = requests.post(url, data=payload, headers=long_headers, timeout=60)
|
|
106
|
-
df_data = pd.read_html(res.text)[0]
|
|
107
|
-
df_data.columns = [
|
|
108
|
-
"日期",
|
|
109
|
-
"收盘",
|
|
110
|
-
"开盘",
|
|
111
|
-
"高",
|
|
112
|
-
"低",
|
|
113
|
-
"涨跌幅",
|
|
114
|
-
]
|
|
115
|
-
if period == "每月":
|
|
116
|
-
df_data.index = pd.to_datetime(df_data["日期"], format="%Y年%m月")
|
|
117
|
-
else:
|
|
118
|
-
df_data.index = pd.to_datetime(df_data["日期"], format="%Y年%m月%d日")
|
|
119
|
-
df_data = df_data[["收盘", "开盘", "高", "低", "涨跌幅"]]
|
|
120
|
-
df_data["涨跌幅"] = df_data["涨跌幅"].str.replace("%", "")
|
|
121
|
-
df_data["涨跌幅"] = df_data["涨跌幅"].str.replace(",", "")
|
|
122
|
-
df_data = df_data.astype(float)
|
|
123
|
-
return df_data
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if __name__ == "__main__":
|
|
127
|
-
bond_investing_global_country_name_url_df = bond_investing_global_country_name_url(
|
|
128
|
-
"中国"
|
|
129
|
-
)
|
|
130
|
-
print(bond_investing_global_country_name_url_df)
|
|
131
|
-
|
|
132
|
-
bond_investing_global_df = bond_investing_global(
|
|
133
|
-
country="中国",
|
|
134
|
-
index_name="中国10年期国债",
|
|
135
|
-
period="每日",
|
|
136
|
-
start_date="20100101",
|
|
137
|
-
end_date="20210318",
|
|
138
|
-
)
|
|
139
|
-
print(bond_investing_global_df)
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding:utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Date: 2021/5/10 17:06
|
|
5
|
-
Desc: 提供英为财情-国际大宗商品期货
|
|
6
|
-
https://cn.investing.com/commodities/brent-oil-historical-data
|
|
7
|
-
"""
|
|
8
|
-
import re
|
|
9
|
-
|
|
10
|
-
import pandas as pd
|
|
11
|
-
import requests
|
|
12
|
-
from bs4 import BeautifulSoup
|
|
13
|
-
|
|
14
|
-
from akshare.index.cons import short_headers, long_headers
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def get_sector_symbol_name_url() -> dict:
|
|
18
|
-
"""
|
|
19
|
-
期货所对应板块的 URL
|
|
20
|
-
:return: dict
|
|
21
|
-
{'能源': '/commodities/energy',
|
|
22
|
-
'金属': '/commodities/metals',
|
|
23
|
-
'农业': '/commodities/softs',
|
|
24
|
-
'商品指数': '/indices/commodities-indices'}
|
|
25
|
-
"""
|
|
26
|
-
url = "https://cn.investing.com/commodities/"
|
|
27
|
-
res = requests.get(url, headers=short_headers)
|
|
28
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
29
|
-
name_url_option_list = soup.find_all(attrs={"class": "linkTitle"}) # 去掉-所有国家及地区
|
|
30
|
-
url_list = [item.find("a")["href"] for item in name_url_option_list]
|
|
31
|
-
name_list = [item.get_text() for item in name_url_option_list]
|
|
32
|
-
name_code_map_dict = {}
|
|
33
|
-
name_code_map_dict.update(zip(name_list, url_list))
|
|
34
|
-
return name_code_map_dict
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def futures_global_commodity_name_url_map(sector: str = "能源") -> dict:
|
|
38
|
-
"""
|
|
39
|
-
参考网页: https://cn.investing.com/commodities/
|
|
40
|
-
获取选择板块对应的: 具体期货品种的 url 地址
|
|
41
|
-
:param sector: 板块, 对应 get_global_country_name_url 品种名称
|
|
42
|
-
:type sector: str
|
|
43
|
-
:return: dict of name-url
|
|
44
|
-
:rtype: dict
|
|
45
|
-
{'伦敦布伦特原油': '/commodities/brent-oil',
|
|
46
|
-
'WTI原油': '/commodities/crude-oil',
|
|
47
|
-
'伦敦汽油': '/commodities/london-gas-oil',
|
|
48
|
-
'天然气': '/commodities/natural-gas?cid=49787',
|
|
49
|
-
'燃料油': '/commodities/heating-oil',
|
|
50
|
-
'碳排放': '/commodities/carbon-emissions',
|
|
51
|
-
'RBOB汽油': '/commodities/gasoline-rbob',
|
|
52
|
-
'布伦特原油': '/commodities/brent-oil?cid=49769',
|
|
53
|
-
'原油': '/commodities/crude-oil?cid=49774'}
|
|
54
|
-
"""
|
|
55
|
-
name_url_dict = get_sector_symbol_name_url()
|
|
56
|
-
url = f"https://cn.investing.com{name_url_dict[sector]}"
|
|
57
|
-
res = requests.post(url, headers=short_headers)
|
|
58
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
59
|
-
url_list = [
|
|
60
|
-
item.find("a")["href"].split("?")[0]
|
|
61
|
-
for item in soup.find_all(attrs={"class": "plusIconTd"})
|
|
62
|
-
]
|
|
63
|
-
name_list = [
|
|
64
|
-
item.find("a").get_text()
|
|
65
|
-
for item in soup.find_all(attrs={"class": "plusIconTd"})
|
|
66
|
-
]
|
|
67
|
-
name_code_map_dict = {}
|
|
68
|
-
name_code_map_dict.update(zip(name_list, url_list))
|
|
69
|
-
return name_code_map_dict
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def futures_global_commodity_hist(
|
|
73
|
-
sector: str = "能源",
|
|
74
|
-
symbol: str = "伦敦布伦特原油",
|
|
75
|
-
start_date: str = "20000101",
|
|
76
|
-
end_date: str = "20191017",
|
|
77
|
-
) -> pd.DataFrame:
|
|
78
|
-
"""
|
|
79
|
-
国际大宗商品的历史量价数据
|
|
80
|
-
https://cn.investing.com/commodities
|
|
81
|
-
:param sector: 板块名称; 调用 futures_global_commodity_name_url_map 函数获取
|
|
82
|
-
:type sector: str
|
|
83
|
-
:param symbol: 品种名称; 通过访问网站查询
|
|
84
|
-
:type symbol: str
|
|
85
|
-
:param start_date: 开始日期
|
|
86
|
-
:type start_date: str
|
|
87
|
-
:param end_date: 结束日期
|
|
88
|
-
:type end_date: str
|
|
89
|
-
:return: 国际大宗商品的历史量价数据
|
|
90
|
-
:rtype: pandas.DataFrame
|
|
91
|
-
"""
|
|
92
|
-
start_date = "/".join([start_date[:4], start_date[4:6], start_date[6:]])
|
|
93
|
-
end_date = "/".join([end_date[:4], end_date[4:6], end_date[6:]])
|
|
94
|
-
name_code_dict = futures_global_commodity_name_url_map(sector)
|
|
95
|
-
temp_url = f"https://cn.investing.com/{name_code_dict[symbol]}-historical-data"
|
|
96
|
-
res = requests.post(temp_url, headers=short_headers)
|
|
97
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
98
|
-
title = soup.find("h2", attrs={"class": "float_lang_base_1"}).get_text()
|
|
99
|
-
res = requests.post(temp_url, headers=short_headers)
|
|
100
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
101
|
-
data = soup.find_all(text=re.compile("window.histDataExcessInfo"))[0].strip()
|
|
102
|
-
para_data = re.findall(r"\d+", data)
|
|
103
|
-
payload = {
|
|
104
|
-
"curr_id": para_data[0],
|
|
105
|
-
"smlID": para_data[1],
|
|
106
|
-
"header": title,
|
|
107
|
-
"st_date": start_date,
|
|
108
|
-
"end_date": end_date,
|
|
109
|
-
"interval_sec": "Daily",
|
|
110
|
-
"sort_col": "date",
|
|
111
|
-
"sort_ord": "DESC",
|
|
112
|
-
"action": "historical_data",
|
|
113
|
-
}
|
|
114
|
-
url = "https://cn.investing.com/instruments/HistoricalDataAjax"
|
|
115
|
-
r = requests.post(url, data=payload, headers=long_headers)
|
|
116
|
-
temp_df = pd.read_html(r.text)[0]
|
|
117
|
-
temp_df["日期"] = pd.to_datetime(temp_df["日期"], format="%Y年%m月%d日")
|
|
118
|
-
if any(temp_df["交易量"].astype(str).str.contains("-")):
|
|
119
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("-")] = temp_df["交易量"][
|
|
120
|
-
temp_df["交易量"].str.contains("-")
|
|
121
|
-
].replace("-", 0)
|
|
122
|
-
if any(temp_df["交易量"].astype(str).str.contains("B")):
|
|
123
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("B").fillna(False)] = (
|
|
124
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("B").fillna(False)]
|
|
125
|
-
.str.replace("B", "")
|
|
126
|
-
.astype(float)
|
|
127
|
-
* 1000000000
|
|
128
|
-
)
|
|
129
|
-
if any(temp_df["交易量"].astype(str).str.contains("M")):
|
|
130
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("M").fillna(False)] = (
|
|
131
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("M").fillna(False)]
|
|
132
|
-
.str.replace("M", "")
|
|
133
|
-
.astype(float)
|
|
134
|
-
* 1000000
|
|
135
|
-
)
|
|
136
|
-
if any(temp_df["交易量"].astype(str).str.contains("K")):
|
|
137
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("K").fillna(False)] = (
|
|
138
|
-
temp_df["交易量"][temp_df["交易量"].str.contains("K").fillna(False)]
|
|
139
|
-
.str.replace("K", "")
|
|
140
|
-
.astype(float)
|
|
141
|
-
* 1000
|
|
142
|
-
)
|
|
143
|
-
temp_df["交易量"] = temp_df["交易量"].astype(float)
|
|
144
|
-
temp_df["涨跌幅"] = pd.DataFrame(
|
|
145
|
-
round(temp_df["涨跌幅"].str.replace("%", "").astype(float) / 100, 6)
|
|
146
|
-
)
|
|
147
|
-
temp_df.name = title
|
|
148
|
-
temp_df.columns.name = None
|
|
149
|
-
temp_df.sort_values(["日期"], ascending=False, inplace=True)
|
|
150
|
-
return temp_df
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if __name__ == "__main__":
|
|
154
|
-
temp_dict = futures_global_commodity_name_url_map(sector="能源")
|
|
155
|
-
print(temp_dict)
|
|
156
|
-
|
|
157
|
-
futures_global_commodity_hist_df = futures_global_commodity_hist(
|
|
158
|
-
sector="能源", symbol="伦敦布伦特原油", start_date="19700101", end_date="20210510"
|
|
159
|
-
)
|
|
160
|
-
print(futures_global_commodity_hist_df)
|
|
161
|
-
|
|
162
|
-
# futures_global_commodity_hist_df = futures_global_commodity_hist(
|
|
163
|
-
# sector="能源", symbol="伦敦布伦特原油", start_date="1970/01/01", end_date="2021/05/10"
|
|
164
|
-
# )
|
|
165
|
-
# print(futures_global_commodity_hist_df.to_csv("伦敦布伦特原油_19880627_20080319.csv", encoding="gb2312"))
|
|
166
|
-
#
|
|
167
|
-
# futures_global_commodity_hist_df = futures_global_commodity_hist(
|
|
168
|
-
# sector="能源", symbol="伦敦布伦特原油", start_date="2008/03/19", end_date="2021/05/10"
|
|
169
|
-
# )
|
|
170
|
-
# print(futures_global_commodity_hist_df.to_csv("伦敦布伦特原油_20080319_20210510.csv", encoding="gb2312"))
|
akshare/index/index_investing.py
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding:utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Date: 2022/8/8 19:53
|
|
5
|
-
Desc: 英为财情-股票指数-全球股指与期货指数数据接口
|
|
6
|
-
https://cn.investing.com/indices/volatility-s-p-500-historical-data
|
|
7
|
-
"""
|
|
8
|
-
import json
|
|
9
|
-
|
|
10
|
-
import pandas as pd
|
|
11
|
-
import requests
|
|
12
|
-
from bs4 import BeautifulSoup
|
|
13
|
-
|
|
14
|
-
from akshare.index.cons import short_headers
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _get_global_index_area_name_code() -> dict:
|
|
18
|
-
"""
|
|
19
|
-
全球指数-各国的全球指数数据
|
|
20
|
-
https://cn.investing.com/indices/global-indices?majorIndices=on&primarySectors=on&bonds=on&additionalIndices=on&otherIndices=on&c_id=37
|
|
21
|
-
:return: 国家和代码
|
|
22
|
-
:rtype: dict
|
|
23
|
-
"""
|
|
24
|
-
url = "https://cn.investing.com/indices/global-indices"
|
|
25
|
-
params = {
|
|
26
|
-
"majorIndices": "on",
|
|
27
|
-
"primarySectors": "on",
|
|
28
|
-
"bonds": "on",
|
|
29
|
-
"additionalIndices": "on",
|
|
30
|
-
"otherIndices": "on",
|
|
31
|
-
}
|
|
32
|
-
r = requests.get(url, params=params, headers=short_headers)
|
|
33
|
-
data_text = r.text
|
|
34
|
-
soup = BeautifulSoup(data_text, "lxml")
|
|
35
|
-
name_url_option_list = soup.find_all("option")[1:]
|
|
36
|
-
url_list = [
|
|
37
|
-
item["value"]
|
|
38
|
-
for item in name_url_option_list
|
|
39
|
-
if "c_id" in item["value"]
|
|
40
|
-
]
|
|
41
|
-
url_list_code = [
|
|
42
|
-
item["value"].split("?")[1].split("=")[1]
|
|
43
|
-
for item in name_url_option_list
|
|
44
|
-
if "c_id" in item["value"]
|
|
45
|
-
]
|
|
46
|
-
name_list = [item.get_text() for item in name_url_option_list][
|
|
47
|
-
: len(url_list)
|
|
48
|
-
]
|
|
49
|
-
_temp_df = pd.DataFrame([name_list, url_list_code]).T
|
|
50
|
-
name_code_list = dict(zip(_temp_df.iloc[:, 0], _temp_df.iloc[:, 1]))
|
|
51
|
-
return name_code_list
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def _get_global_country_name_url() -> dict:
|
|
55
|
-
"""
|
|
56
|
-
可获得指数数据国家对应的 URL
|
|
57
|
-
https://cn.investing.com/indices/
|
|
58
|
-
:return: 国家和 URL
|
|
59
|
-
:rtype: dict
|
|
60
|
-
"""
|
|
61
|
-
url = "https://cn.investing.com/indices/"
|
|
62
|
-
res = requests.post(url, headers=short_headers)
|
|
63
|
-
soup = BeautifulSoup(res.text, "lxml")
|
|
64
|
-
name_url_option_list = soup.find(
|
|
65
|
-
"select", attrs={"name": "country"}
|
|
66
|
-
).find_all("option")[
|
|
67
|
-
1:
|
|
68
|
-
] # 去掉-所有国家及地区
|
|
69
|
-
url_list = [item["value"] for item in name_url_option_list]
|
|
70
|
-
name_list = [item.get_text() for item in name_url_option_list]
|
|
71
|
-
name_code_map_dict = {}
|
|
72
|
-
name_code_map_dict.update(zip(name_list, url_list))
|
|
73
|
-
return name_code_map_dict
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def index_investing_global_area_index_name_code(area: str = "中国") -> dict:
|
|
77
|
-
"""
|
|
78
|
-
指定 area 的所有指数和代码
|
|
79
|
-
https://cn.investing.com/indices/
|
|
80
|
-
:param area: 指定的国家或地区;ak._get_global_country_name_url() 函数返回的国家或地区的名称
|
|
81
|
-
:type area: str
|
|
82
|
-
:return: 指定 area 的所有指数和代码
|
|
83
|
-
:rtype: dict
|
|
84
|
-
"""
|
|
85
|
-
pd.set_option("mode.chained_assignment", None)
|
|
86
|
-
name_url_dict = _get_global_country_name_url()
|
|
87
|
-
url = f"https://cn.investing.com{name_url_dict[area]}?&majorIndices=on&primarySectors=on&additionalIndices=on&otherIndices=on"
|
|
88
|
-
r = requests.get(url)
|
|
89
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
90
|
-
code_list = [
|
|
91
|
-
item["data-id"]
|
|
92
|
-
for item in soup.find_all("table")[1].find_all(
|
|
93
|
-
"span", attrs={"class": "alertBellGrayPlus"}
|
|
94
|
-
)
|
|
95
|
-
]
|
|
96
|
-
name_list = [
|
|
97
|
-
item.find("a").text
|
|
98
|
-
for item in soup.find_all("td", attrs={"class": "plusIconTd"})
|
|
99
|
-
]
|
|
100
|
-
name_code_map_dict = {}
|
|
101
|
-
name_code_map_dict.update(zip(name_list, code_list))
|
|
102
|
-
return name_code_map_dict
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def index_investing_global_area_index_name_url(area: str = "中国") -> dict:
|
|
106
|
-
"""
|
|
107
|
-
指定 area 的所有指数和 URL 地址
|
|
108
|
-
https://cn.investing.com/indices/
|
|
109
|
-
:param area: 指定的国家或地区;ak._get_global_country_name_url() 函数返回的国家或地区的名称
|
|
110
|
-
:type area: str
|
|
111
|
-
:return: 指定 area 的所有指数和 URL 地址
|
|
112
|
-
:rtype: dict
|
|
113
|
-
"""
|
|
114
|
-
pd.set_option("mode.chained_assignment", None)
|
|
115
|
-
name_url_dict = _get_global_country_name_url()
|
|
116
|
-
url = f"https://cn.investing.com{name_url_dict[area]}?&majorIndices=on&primarySectors=on&additionalIndices=on&otherIndices=on"
|
|
117
|
-
r = requests.get(url)
|
|
118
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
119
|
-
code_list = [
|
|
120
|
-
item.find("a")["href"]
|
|
121
|
-
for item in soup.find_all("td", attrs={"class": "plusIconTd"})
|
|
122
|
-
]
|
|
123
|
-
name_list = [
|
|
124
|
-
item.find("a").text
|
|
125
|
-
for item in soup.find_all("td", attrs={"class": "plusIconTd"})
|
|
126
|
-
]
|
|
127
|
-
name_code_map_dict = {}
|
|
128
|
-
name_code_map_dict.update(zip(name_list, code_list))
|
|
129
|
-
return name_code_map_dict
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def index_investing_global(
|
|
133
|
-
area: str = "中国",
|
|
134
|
-
symbol: str = "上证指数",
|
|
135
|
-
period: str = "每日",
|
|
136
|
-
start_date: str = "20100101",
|
|
137
|
-
end_date: str = "20211031",
|
|
138
|
-
) -> pd.DataFrame:
|
|
139
|
-
"""
|
|
140
|
-
具体国家或地区的从 start_date 到 end_date 期间的数据
|
|
141
|
-
https://cn.investing.com/indices/ftse-epra-nareit-hong-kong-historical-data
|
|
142
|
-
:param area: 对应函数中的国家或地区名称
|
|
143
|
-
:type area: str
|
|
144
|
-
:param symbol: 对应函数中的指数名称
|
|
145
|
-
:type symbol: str
|
|
146
|
-
:param period: choice of {"每日", "每周", "每月"}
|
|
147
|
-
:type period: str
|
|
148
|
-
:param start_date: '20000101', 注意格式
|
|
149
|
-
:type start_date: str
|
|
150
|
-
:param end_date: '20191017', 注意格式
|
|
151
|
-
:type end_date: str
|
|
152
|
-
:return: 指定参数的数据
|
|
153
|
-
:rtype: pandas.DataFrame
|
|
154
|
-
"""
|
|
155
|
-
start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
|
|
156
|
-
end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
|
|
157
|
-
period_map = {"每日": "Daily", "每周": "Weekly", "每月": "Monthly"}
|
|
158
|
-
name_code_dict = index_investing_global_area_index_name_code(area)
|
|
159
|
-
url = f"https://api.investing.com/api/financialdata/historical/{name_code_dict[symbol]}"
|
|
160
|
-
params = {
|
|
161
|
-
"start-date": start_date,
|
|
162
|
-
"end-date": end_date,
|
|
163
|
-
"time-frame": period_map[period],
|
|
164
|
-
"add-missing-rows": "false",
|
|
165
|
-
}
|
|
166
|
-
headers = {
|
|
167
|
-
"accept": "application/json, text/plain, */*",
|
|
168
|
-
"accept-encoding": "gzip, deflate, br",
|
|
169
|
-
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
170
|
-
"cache-control": "no-cache",
|
|
171
|
-
"domain-id": "cn",
|
|
172
|
-
"origin": "https://cn.investing.com",
|
|
173
|
-
"pragma": "no-cache",
|
|
174
|
-
"referer": "https://cn.investing.com/",
|
|
175
|
-
"sec-ch-ua": '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"',
|
|
176
|
-
"sec-ch-ua-mobile": "?0",
|
|
177
|
-
"sec-ch-ua-platform": '"Windows"',
|
|
178
|
-
"sec-fetch-dest": "empty",
|
|
179
|
-
"sec-fetch-mode": "cors",
|
|
180
|
-
"sec-fetch-site": "same-site",
|
|
181
|
-
"authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjM2NjQ1NzUsImp0aSI6IjIyODA4MDM5MSIsImlhdCI6MTY2MzY2MDk3NSwiaXNzIjoiaW52ZXN0aW5nLmNvbSIsInVzZXJfaWQiOjIyODA4MDM5MSwicHJpbWFyeV9kb21haW5faWQiOiIxIiwiQXV0aG5TeXN0ZW1Ub2tlbiI6IiIsIkF1dGhuU2Vzc2lvblRva2VuIjoiIiwiRGV2aWNlVG9rZW4iOiIiLCJVYXBpVG9rZW4iOiJObmclMkJmMlJyUHpjeWRtdHRaell5TW1JN1pUNWliV1prTURJMVB6czlNeVUySWpVN1lEYzNjV1ZxYWlSZ1kyVjVNamRsWWpRMFptWTFQMkk4TnpCdlBEWXlQbVJrWXo4M01tQnJaMmN3TW1aaU1HVm9ZbWRtWmpBNU5UWTdhRE0lMkJOalUxTW1Cdk56VmxPbW93WUR4bGJUSWdaWGswY0daM05XZGlNamQyYnlnMk9UNSUyRlpEUSUyRllESm1hMjluTURJeFlqRmxQV0l3Wmpjd1pUVXhPenN6S3paOSIsIkF1dGhuSWQiOiIiLCJJc0RvdWJsZUVuY3J5cHRlZCI6ZmFsc2UsIkRldmljZUlkIjoiIiwiUmVmcmVzaEV4cGlyZWRBdCI6MTY2NjE4MDk3NX0.uRLTP1IG3696uxHm3Qq0D8z4o3nfsD3CaIS9cZGjsV0",
|
|
182
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
|
|
183
|
-
}
|
|
184
|
-
r = requests.get(url, params=params, headers=headers)
|
|
185
|
-
r.encoding = "utf-8"
|
|
186
|
-
r = requests.get(url, params=params, headers=headers)
|
|
187
|
-
data_json = r.json()
|
|
188
|
-
df_data = pd.DataFrame(data_json["data"])
|
|
189
|
-
df_data.columns = [
|
|
190
|
-
"-",
|
|
191
|
-
"-",
|
|
192
|
-
"-",
|
|
193
|
-
"日期",
|
|
194
|
-
"-",
|
|
195
|
-
"-",
|
|
196
|
-
"-",
|
|
197
|
-
"-",
|
|
198
|
-
"-",
|
|
199
|
-
"交易量",
|
|
200
|
-
"-",
|
|
201
|
-
"收盘",
|
|
202
|
-
"开盘",
|
|
203
|
-
"高",
|
|
204
|
-
"低",
|
|
205
|
-
"涨跌幅",
|
|
206
|
-
]
|
|
207
|
-
df_data = df_data[["日期", "收盘", "开盘", "高", "低", "交易量", "涨跌幅"]]
|
|
208
|
-
df_data["日期"] = pd.to_datetime(df_data["日期"]).dt.date
|
|
209
|
-
df_data["收盘"] = pd.to_numeric(df_data["收盘"])
|
|
210
|
-
df_data["开盘"] = pd.to_numeric(df_data["开盘"])
|
|
211
|
-
df_data["高"] = pd.to_numeric(df_data["高"])
|
|
212
|
-
df_data["低"] = pd.to_numeric(df_data["低"])
|
|
213
|
-
df_data["交易量"] = pd.to_numeric(df_data["交易量"])
|
|
214
|
-
df_data["涨跌幅"] = pd.to_numeric(df_data["涨跌幅"])
|
|
215
|
-
df_data.sort_values("日期", inplace=True)
|
|
216
|
-
df_data.reset_index(inplace=True, drop=True)
|
|
217
|
-
return df_data
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if __name__ == "__main__":
|
|
221
|
-
print(index_investing_global_area_index_name_url("香港"))
|
|
222
|
-
|
|
223
|
-
print(index_investing_global_area_index_name_code("香港"))
|
|
224
|
-
|
|
225
|
-
index_investing_global_df = index_investing_global(
|
|
226
|
-
area="中国",
|
|
227
|
-
symbol="富时中国A50指数",
|
|
228
|
-
period="每日",
|
|
229
|
-
start_date="20100101",
|
|
230
|
-
end_date="20220808",
|
|
231
|
-
)
|
|
232
|
-
print(index_investing_global_df)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|