akshare 1.12.99__py3-none-any.whl → 1.15.72__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 +441 -138
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +29 -43
- akshare/air/sunrise_tad.py +32 -17
- akshare/bank/bank_cbirc_2020.py +12 -9
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +75 -48
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_zh_cov.py +1 -1
- akshare/bond/bond_zh_sina.py +57 -51
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/currency/currency_safe.py +7 -6
- akshare/data/cninfo.js +15 -0
- akshare/datasets.py +10 -21
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_china.py +772 -1024
- akshare/economic/macro_china_hk.py +65 -243
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_constitute.py +17 -12
- akshare/economic/macro_euro.py +13 -6
- akshare/economic/macro_finance_ths.py +133 -0
- akshare/economic/macro_info_ws.py +100 -0
- akshare/economic/macro_japan.py +5 -4
- akshare/economic/macro_other.py +12 -9
- akshare/economic/macro_usa.py +376 -1940
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +94 -125
- akshare/event/migration.py +3 -2
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/fortune/fortune_500.py +15 -48
- akshare/fund/fund_amac.py +157 -75
- akshare/fund/fund_em.py +191 -184
- akshare/fund/fund_etf_em.py +16 -15
- akshare/fund/fund_etf_sina.py +71 -23
- akshare/fund/fund_etf_ths.py +93 -0
- akshare/fund/fund_fee_em.py +98 -0
- akshare/fund/fund_portfolio_em.py +60 -50
- akshare/fund/fund_rank_em.py +91 -82
- akshare/fund/fund_report_cninfo.py +63 -48
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +139 -109
- akshare/futures/cons.py +8 -31
- akshare/futures/cot.py +185 -137
- akshare/futures/futures_basis.py +97 -32
- akshare/futures/futures_comm_ctp.py +37 -0
- akshare/futures/futures_comm_qihuo.py +74 -45
- akshare/futures/futures_daily_bar.py +121 -184
- akshare/futures/futures_hf_em.py +66 -61
- akshare/futures/futures_hq_sina.py +79 -61
- akshare/futures/futures_index_ccidx.py +6 -3
- akshare/futures/futures_inventory_99.py +61 -272
- akshare/futures/futures_news_shmet.py +4 -2
- akshare/futures/futures_roll_yield.py +12 -25
- akshare/futures/futures_spot_stock_em.py +19 -13
- akshare/futures/futures_stock_js.py +14 -12
- akshare/futures/futures_to_spot.py +38 -33
- akshare/futures/futures_warehouse_receipt.py +75 -71
- akshare/futures/futures_zh_sina.py +5 -5
- akshare/futures/symbol_var.py +18 -13
- akshare/futures_derivative/futures_contract_info_czce.py +60 -52
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
- akshare/futures_derivative/futures_cot_sina.py +26 -19
- akshare/futures_derivative/futures_spot_sys.py +21 -8
- akshare/fx/currency_investing.py +19 -285
- akshare/index/index_cflp.py +29 -26
- akshare/index/index_cni.py +86 -88
- akshare/index/index_cons.py +26 -10
- akshare/index/index_cx.py +248 -47
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_option_qvix.py +329 -0
- akshare/index/index_research_fund_sw.py +134 -0
- akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +35 -16
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +180 -89
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +46 -23
- akshare/index/index_zh_a_scope.py +48 -0
- akshare/index/index_zh_em.py +6 -4
- akshare/interest_rate/interbank_rate_em.py +14 -9
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/news_baidu.py +78 -44
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +6 -3
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +11 -11
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +178 -51
- akshare/option/option_daily_stats_sse_szse.py +146 -0
- akshare/option/option_em.py +147 -138
- akshare/option/option_finance_sina.py +160 -137
- akshare/option/option_lhb_em.py +62 -56
- akshare/option/option_risk_indicator_sse.py +17 -14
- akshare/other/other_car_cpca.py +934 -0
- akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/request.py +117 -0
- akshare/spot/spot_hog_soozhu.py +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +63 -10
- akshare/stock/stock_allotment_cninfo.py +10 -9
- akshare/stock/stock_board_concept_em.py +23 -14
- akshare/stock/stock_board_industry_em.py +40 -34
- akshare/stock/stock_cg_equity_mortgage.py +15 -11
- akshare/stock/stock_cg_guarantee.py +41 -51
- akshare/stock/stock_cg_lawsuit.py +36 -35
- akshare/stock/stock_dividend_cninfo.py +12 -6
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +332 -84
- akshare/stock/stock_hk_famous.py +108 -0
- akshare/stock/stock_hk_sina.py +8 -7
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -3
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- akshare/stock/stock_hot_rank_em.py +2 -1
- akshare/stock/stock_hot_search_baidu.py +5 -2
- akshare/stock/stock_industry_cninfo.py +24 -18
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +9 -10
- akshare/stock/stock_info.py +25 -15
- akshare/stock/stock_info_em.py +5 -2
- akshare/stock/stock_intraday_em.py +5 -2
- akshare/stock/stock_intraday_sina.py +22 -18
- akshare/stock/stock_ipo_summary_cninfo.py +25 -10
- akshare/stock/stock_new_cninfo.py +32 -19
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +9 -8
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- akshare/stock/stock_share_hold.py +24 -19
- akshare/stock/stock_summary.py +54 -26
- akshare/stock/stock_us_famous.py +15 -6
- akshare/stock/stock_us_pink.py +7 -5
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_xq.py +38 -12
- akshare/stock/stock_zh_a_sina.py +53 -78
- akshare/stock/stock_zh_b_sina.py +32 -55
- akshare/stock/stock_zh_kcb_report.py +11 -9
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +12 -9
- akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
- akshare/stock_feature/stock_account_em.py +58 -40
- akshare/stock_feature/stock_analyst_em.py +36 -27
- akshare/stock_feature/stock_board_industry_ths.py +136 -400
- akshare/stock_feature/stock_comment_em.py +118 -85
- akshare/stock_feature/stock_concept_futu.py +183 -0
- akshare/stock_feature/stock_cyq_em.py +58 -54
- akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
- akshare/stock_feature/stock_esg_sina.py +216 -11
- akshare/stock_feature/stock_fhps_em.py +60 -25
- akshare/stock_feature/stock_fhps_ths.py +25 -6
- akshare/stock_feature/stock_fund_flow.py +38 -25
- akshare/stock_feature/stock_gdfx_em.py +180 -95
- akshare/stock_feature/stock_gdhs.py +73 -49
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_hist_em.py +55 -23
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hsgt_em.py +184 -452
- akshare/stock_feature/stock_info.py +52 -29
- akshare/stock_feature/stock_inner_trade_xq.py +39 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +41 -38
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +135 -71
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +102 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
- akshare/stock_feature/stock_market_legu.py +13 -8
- akshare/stock_feature/stock_pankou_em.py +72 -34
- akshare/stock_feature/stock_report_em.py +244 -54
- akshare/stock_feature/stock_research_report_em.py +48 -19
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +86 -33
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +35 -13
- akshare/stock_feature/stock_three_report_em.py +119 -77
- akshare/stock_feature/stock_ttm_lyr.py +4 -7
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_wencai.py +21 -9
- akshare/stock_feature/stock_yjyg_em.py +63 -28
- akshare/stock_feature/stock_zf_pg.py +61 -38
- akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
- akshare/stock_feature/stock_ztb_em.py +62 -40
- akshare/stock_fundamental/stock_finance.py +150 -58
- akshare/stock_fundamental/stock_finance_ths.py +116 -31
- akshare/stock_fundamental/stock_mda_ym.py +5 -3
- akshare/stock_fundamental/stock_notice.py +29 -15
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
- akshare/stock_fundamental/stock_register_em.py +448 -0
- akshare/stock_fundamental/stock_restricted_em.py +79 -32
- akshare/stock_fundamental/stock_zygc.py +10 -8
- akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
- akshare/tool/trade_date_hist.py +4 -3
- akshare/utils/cons.py +10 -0
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2 -2
- akshare/utils/func.py +26 -0
- akshare/utils/tqdm.py +13 -3
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
- akshare-1.15.72.dist-info/RECORD +385 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
- tests/test_func.py +3 -5
- akshare/bond/bond_futures.py +0 -50
- akshare/bond/bond_investing.py +0 -139
- akshare/crypto/crypto_hist_investing.py +0 -249
- akshare/fortune/fortune_it_juzi.py +0 -123
- akshare/futures/futures_international.py +0 -170
- akshare/futures/futures_news_baidu.py +0 -54
- akshare/futures/inventory_data.py +0 -100
- akshare/futures_derivative/futures_index_price_nh.py +0 -61
- akshare/futures_derivative/futures_index_return_nh.py +0 -47
- akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -71
- akshare/index/index_investing.py +0 -232
- akshare/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_board_concept_ths.py +0 -422
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.12.99.dist-info/RECORD +0 -374
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
akshare/stock/stock_us_sina.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/1/14 17:00
|
|
5
5
|
Desc: 新浪财经-美股实时行情数据和历史行情数据
|
|
6
6
|
https://finance.sina.com.cn/stock/usstock/sector.shtml
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import json
|
|
9
10
|
from functools import lru_cache
|
|
10
11
|
|
|
11
12
|
import pandas as pd
|
|
12
13
|
import requests
|
|
13
|
-
|
|
14
|
+
import py_mini_racer
|
|
14
15
|
from tqdm import tqdm
|
|
15
16
|
|
|
16
17
|
from akshare.stock.cons import (
|
|
@@ -42,7 +43,7 @@ def __get_us_page_count() -> int:
|
|
|
42
43
|
us_sina_stock_list_url.format(dict_list),
|
|
43
44
|
params=us_sina_stock_dict_payload,
|
|
44
45
|
)
|
|
45
|
-
data_json = json.loads(res.text[res.text.find("({") + 1: res.text.rfind(");")])
|
|
46
|
+
data_json = json.loads(res.text[res.text.find("({") + 1 : res.text.rfind(");")])
|
|
46
47
|
if not isinstance(int(data_json["count"]) / 20, int):
|
|
47
48
|
page_count = int(int(data_json["count"]) / 20) + 1
|
|
48
49
|
else:
|
|
@@ -75,8 +76,10 @@ def get_us_stock_name() -> pd.DataFrame:
|
|
|
75
76
|
us_sina_stock_list_url.format(dict_list),
|
|
76
77
|
params=us_sina_stock_dict_payload,
|
|
77
78
|
)
|
|
78
|
-
data_json = json.loads(res.text[res.text.find("({") + 1: res.text.rfind(");")])
|
|
79
|
-
big_df = pd.concat(
|
|
79
|
+
data_json = json.loads(res.text[res.text.find("({") + 1 : res.text.rfind(");")])
|
|
80
|
+
big_df = pd.concat(
|
|
81
|
+
objs=[big_df, pd.DataFrame(data_json["data"])], ignore_index=True
|
|
82
|
+
)
|
|
80
83
|
return big_df[["name", "cname", "symbol"]]
|
|
81
84
|
|
|
82
85
|
|
|
@@ -104,8 +107,10 @@ def stock_us_spot() -> pd.DataFrame:
|
|
|
104
107
|
us_sina_stock_list_url.format(dict_list),
|
|
105
108
|
params=us_sina_stock_dict_payload,
|
|
106
109
|
)
|
|
107
|
-
data_json = json.loads(res.text[res.text.find("({") + 1: res.text.rfind(");")])
|
|
108
|
-
big_df = pd.concat(
|
|
110
|
+
data_json = json.loads(res.text[res.text.find("({") + 1 : res.text.rfind(");")])
|
|
111
|
+
big_df = pd.concat(
|
|
112
|
+
objs=[big_df, pd.DataFrame(data_json["data"])], ignore_index=True
|
|
113
|
+
)
|
|
109
114
|
return big_df
|
|
110
115
|
|
|
111
116
|
|
|
@@ -127,9 +132,7 @@ def stock_us_daily(symbol: str = "FB", adjust: str = "") -> pd.DataFrame:
|
|
|
127
132
|
res = requests.get(url)
|
|
128
133
|
js_code = py_mini_racer.MiniRacer()
|
|
129
134
|
js_code.eval(zh_js_decode)
|
|
130
|
-
dict_list = js_code.call(
|
|
131
|
-
"d", res.text.split("=")[1].split(";")[0].replace('"', "")
|
|
132
|
-
)
|
|
135
|
+
dict_list = js_code.call("d", res.text.split("=")[1].split(";")[0].replace('"', ""))
|
|
133
136
|
data_df = pd.DataFrame(dict_list)
|
|
134
137
|
data_df["date"] = pd.to_datetime(data_df["date"]).dt.date
|
|
135
138
|
data_df.index = pd.to_datetime(data_df["date"])
|
|
@@ -168,7 +171,7 @@ def stock_us_daily(symbol: str = "FB", adjust: str = "") -> pd.DataFrame:
|
|
|
168
171
|
try:
|
|
169
172
|
# try for pandas >= 2.1.0
|
|
170
173
|
temp_df.ffill(inplace=True)
|
|
171
|
-
except Exception
|
|
174
|
+
except Exception:
|
|
172
175
|
try:
|
|
173
176
|
# try for pandas < 2.1.0
|
|
174
177
|
temp_df.fillna(method="ffill", inplace=True)
|
|
@@ -177,7 +180,7 @@ def stock_us_daily(symbol: str = "FB", adjust: str = "") -> pd.DataFrame:
|
|
|
177
180
|
try:
|
|
178
181
|
# try for pandas >= 2.1.0
|
|
179
182
|
temp_df.bfill(inplace=True)
|
|
180
|
-
except Exception
|
|
183
|
+
except Exception:
|
|
181
184
|
try:
|
|
182
185
|
# try for pandas < 2.1.0
|
|
183
186
|
temp_df.fillna(method="bfill", inplace=True)
|
akshare/stock/stock_xq.py
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
# !/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/12/18 17:50
|
|
5
5
|
Desc: 雪球-行情中心-个股
|
|
6
6
|
https://xueqiu.com/S/SH513520
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import re
|
|
10
|
+
from datetime import datetime
|
|
9
11
|
|
|
10
12
|
import pandas as pd
|
|
11
13
|
import requests
|
|
12
14
|
|
|
13
15
|
|
|
16
|
+
def _convert_timestamp(timestamp_ms: int) -> str:
|
|
17
|
+
"""
|
|
18
|
+
时间戳转换为字符串时间
|
|
19
|
+
:param timestamp_ms: 时间戳
|
|
20
|
+
:type timestamp_ms: int
|
|
21
|
+
:return: 字符串
|
|
22
|
+
:rtype: str
|
|
23
|
+
"""
|
|
24
|
+
timestamp_s = timestamp_ms / 1000
|
|
25
|
+
datetime_obj = datetime.fromtimestamp(timestamp_s)
|
|
26
|
+
return datetime_obj.strftime("%Y-%m-%d %H:%M:%S")
|
|
27
|
+
|
|
28
|
+
|
|
14
29
|
def stock_individual_spot_xq(
|
|
15
|
-
|
|
16
|
-
|
|
30
|
+
symbol: str = "SH600000",
|
|
31
|
+
timeout: float = None,
|
|
32
|
+
token: str = None,
|
|
17
33
|
) -> pd.DataFrame:
|
|
18
34
|
"""
|
|
19
35
|
雪球-行情中心-个股
|
|
@@ -22,16 +38,21 @@ def stock_individual_spot_xq(
|
|
|
22
38
|
:type symbol: str
|
|
23
39
|
:param timeout: choice of None or a positive float number
|
|
24
40
|
:type timeout: float
|
|
41
|
+
:param token: set xueqiu token
|
|
42
|
+
:type token: str
|
|
25
43
|
:return: 证券最新行情
|
|
26
44
|
:rtype: pandas.DataFrame
|
|
27
45
|
"""
|
|
28
|
-
|
|
46
|
+
session = requests.Session()
|
|
47
|
+
xq_a_token = token or "cccb558956c11f5aaf8b9a30bcf1f214117e8d67"
|
|
29
48
|
headers = {
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
"
|
|
49
|
+
"cookie": f"xq_a_token={xq_a_token};",
|
|
50
|
+
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 "
|
|
51
|
+
"(KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
|
|
33
52
|
}
|
|
34
|
-
|
|
53
|
+
session.get(url="https://xueqiu.com", headers=headers)
|
|
54
|
+
url = f"https://stock.xueqiu.com/v5/stock/quote.json?symbol={symbol}&extend=detail"
|
|
55
|
+
r = session.get(url, headers=headers, timeout=timeout)
|
|
35
56
|
column_name_map = {
|
|
36
57
|
"acc_unit_nav": "累计净值",
|
|
37
58
|
"amount": "成交额",
|
|
@@ -76,9 +97,10 @@ def stock_individual_spot_xq(
|
|
|
76
97
|
"turnover_rate": "周转率",
|
|
77
98
|
"unit_nav": "单位净值",
|
|
78
99
|
"volume": "成交量",
|
|
100
|
+
"time": "时间",
|
|
79
101
|
}
|
|
80
|
-
json_data = r.json()
|
|
81
|
-
temp_df = pd.json_normalize(json_data)
|
|
102
|
+
json_data = r.json()
|
|
103
|
+
temp_df = pd.json_normalize(json_data["data"]["quote"])
|
|
82
104
|
temp_df.columns = [
|
|
83
105
|
*map(
|
|
84
106
|
lambda x: column_name_map[x] if x in column_name_map.keys() else x,
|
|
@@ -88,17 +110,21 @@ def stock_individual_spot_xq(
|
|
|
88
110
|
temp_df = temp_df[
|
|
89
111
|
list(
|
|
90
112
|
filter(
|
|
91
|
-
lambda x: re.search(
|
|
113
|
+
lambda x: re.search(pattern="[\u4e00-\u9fa5]", string=x),
|
|
114
|
+
temp_df.columns,
|
|
92
115
|
) # 过滤temp_df,留下包含汉字的列
|
|
93
116
|
)
|
|
94
117
|
]
|
|
95
118
|
temp_df = temp_df.T.reset_index()
|
|
96
119
|
temp_df.columns = ["item", "value"]
|
|
120
|
+
temp_df.loc[temp_df["item"] == "时间", "value"] = temp_df.loc[
|
|
121
|
+
temp_df["item"] == "时间", "value"
|
|
122
|
+
].apply(lambda x: _convert_timestamp(int(x)))
|
|
97
123
|
return temp_df
|
|
98
124
|
|
|
99
125
|
|
|
100
126
|
if __name__ == "__main__":
|
|
101
|
-
stock_individual_spot_xq_df = stock_individual_spot_xq(symbol="
|
|
127
|
+
stock_individual_spot_xq_df = stock_individual_spot_xq(symbol="BJ430139")
|
|
102
128
|
print(stock_individual_spot_xq_df)
|
|
103
129
|
|
|
104
130
|
stock_individual_spot_xq_df = stock_individual_spot_xq(symbol="SH000001")
|
akshare/stock/stock_zh_a_sina.py
CHANGED
|
@@ -5,13 +5,13 @@ Date: 2023/12/5 19:20
|
|
|
5
5
|
Desc: 新浪财经-A股-实时行情数据和历史行情数据(包含前复权和后复权因子)
|
|
6
6
|
https://finance.sina.com.cn/realstock/company/sh689009/nc.shtml
|
|
7
7
|
"""
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
import json
|
|
10
|
+
import re
|
|
10
11
|
|
|
11
|
-
from akshare.utils import demjson
|
|
12
|
-
from py_mini_racer import py_mini_racer
|
|
13
12
|
import pandas as pd
|
|
14
13
|
import requests
|
|
14
|
+
import py_mini_racer
|
|
15
15
|
from tqdm import tqdm
|
|
16
16
|
|
|
17
17
|
from akshare.stock.cons import (
|
|
@@ -24,6 +24,7 @@ from akshare.stock.cons import (
|
|
|
24
24
|
zh_sina_a_stock_qfq_url,
|
|
25
25
|
zh_sina_a_stock_amount_url,
|
|
26
26
|
)
|
|
27
|
+
from akshare.utils import demjson
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
def _get_zh_a_page_count() -> int:
|
|
@@ -52,16 +53,12 @@ def stock_zh_a_spot() -> pd.DataFrame:
|
|
|
52
53
|
page_count = _get_zh_a_page_count()
|
|
53
54
|
zh_sina_stock_payload_copy = zh_sina_a_stock_payload.copy()
|
|
54
55
|
for page in tqdm(
|
|
55
|
-
|
|
56
|
+
range(1, page_count + 1), leave=False, desc="Please wait for a moment"
|
|
56
57
|
):
|
|
57
58
|
zh_sina_stock_payload_copy.update({"page": page})
|
|
58
|
-
r = requests.get(
|
|
59
|
-
zh_sina_a_stock_url, params=zh_sina_stock_payload_copy
|
|
60
|
-
)
|
|
59
|
+
r = requests.get(zh_sina_a_stock_url, params=zh_sina_stock_payload_copy)
|
|
61
60
|
data_json = demjson.decode(r.text)
|
|
62
|
-
big_df = pd.concat(
|
|
63
|
-
[big_df, pd.DataFrame(data_json)], ignore_index=True
|
|
64
|
-
)
|
|
61
|
+
big_df = pd.concat([big_df, pd.DataFrame(data_json)], ignore_index=True)
|
|
65
62
|
|
|
66
63
|
big_df = big_df.astype(
|
|
67
64
|
{
|
|
@@ -127,10 +124,10 @@ def stock_zh_a_spot() -> pd.DataFrame:
|
|
|
127
124
|
|
|
128
125
|
|
|
129
126
|
def stock_zh_a_daily(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
127
|
+
symbol: str = "sh603843",
|
|
128
|
+
start_date: str = "19900101",
|
|
129
|
+
end_date: str = "21000118",
|
|
130
|
+
adjust: str = "",
|
|
134
131
|
) -> pd.DataFrame:
|
|
135
132
|
"""
|
|
136
133
|
新浪财经-A 股-个股的历史行情数据, 大量抓取容易封 IP
|
|
@@ -141,7 +138,7 @@ def stock_zh_a_daily(
|
|
|
141
138
|
:type start_date: str
|
|
142
139
|
:param end_date: 20201103; 结束日期
|
|
143
140
|
:type end_date: str
|
|
144
|
-
:param adjust: 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子;
|
|
141
|
+
:param adjust: 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子; qfq-factor: 返回前复权因子
|
|
145
142
|
:type adjust: str
|
|
146
143
|
:return: 行情数据
|
|
147
144
|
:rtype: pandas.DataFrame
|
|
@@ -187,20 +184,18 @@ def stock_zh_a_daily(
|
|
|
187
184
|
del data_df["date"]
|
|
188
185
|
try:
|
|
189
186
|
del data_df["prevclose"]
|
|
190
|
-
except:
|
|
187
|
+
except: # noqa: E722
|
|
191
188
|
pass
|
|
192
189
|
try:
|
|
193
190
|
del data_df["postVol"]
|
|
194
191
|
del data_df["postAmt"]
|
|
195
|
-
except:
|
|
192
|
+
except: # noqa: E722
|
|
196
193
|
pass
|
|
197
194
|
data_df = data_df.astype("float")
|
|
198
195
|
r = requests.get(zh_sina_a_stock_amount_url.format(symbol, symbol))
|
|
199
|
-
amount_data_json = demjson.decode(
|
|
200
|
-
r.text[r.text.find("["): r.text.rfind("]") + 1]
|
|
201
|
-
)
|
|
196
|
+
amount_data_json = demjson.decode(r.text[r.text.find("[") : r.text.rfind("]") + 1])
|
|
202
197
|
amount_data_df = pd.DataFrame(amount_data_json)
|
|
203
|
-
amount_data_df.columns = [
|
|
198
|
+
amount_data_df.columns = ["date", "outstanding_share"]
|
|
204
199
|
amount_data_df.index = pd.to_datetime(amount_data_df.date)
|
|
205
200
|
del amount_data_df["date"]
|
|
206
201
|
temp_df = pd.merge(
|
|
@@ -209,7 +204,7 @@ def stock_zh_a_daily(
|
|
|
209
204
|
try:
|
|
210
205
|
# try for pandas >= 2.1.0
|
|
211
206
|
temp_df.ffill(inplace=True)
|
|
212
|
-
except Exception
|
|
207
|
+
except Exception:
|
|
213
208
|
try:
|
|
214
209
|
temp_df.fillna(method="ffill", inplace=True)
|
|
215
210
|
except Exception as e:
|
|
@@ -240,7 +235,7 @@ def stock_zh_a_daily(
|
|
|
240
235
|
temp_df.dropna(inplace=True)
|
|
241
236
|
temp_df.drop_duplicates(inplace=True)
|
|
242
237
|
temp_df.reset_index(inplace=True)
|
|
243
|
-
temp_df[
|
|
238
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
|
|
244
239
|
return temp_df
|
|
245
240
|
if adjust == "hfq":
|
|
246
241
|
res = requests.get(zh_sina_a_stock_hfq_url.format(symbol))
|
|
@@ -260,7 +255,7 @@ def stock_zh_a_daily(
|
|
|
260
255
|
try:
|
|
261
256
|
# try for pandas >= 2.1.0
|
|
262
257
|
temp_df.ffill(inplace=True)
|
|
263
|
-
except Exception
|
|
258
|
+
except Exception:
|
|
264
259
|
try:
|
|
265
260
|
# try for pandas < 2.1.0
|
|
266
261
|
temp_df.fillna(method="ffill", inplace=True)
|
|
@@ -283,7 +278,7 @@ def stock_zh_a_daily(
|
|
|
283
278
|
temp_df["close"] = round(temp_df["close"], 2)
|
|
284
279
|
temp_df.dropna(inplace=True)
|
|
285
280
|
temp_df.reset_index(inplace=True)
|
|
286
|
-
temp_df[
|
|
281
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
|
|
287
282
|
return temp_df
|
|
288
283
|
|
|
289
284
|
if adjust == "qfq":
|
|
@@ -304,7 +299,7 @@ def stock_zh_a_daily(
|
|
|
304
299
|
try:
|
|
305
300
|
# try for pandas >= 2.1.0
|
|
306
301
|
temp_df.ffill(inplace=True)
|
|
307
|
-
except Exception
|
|
302
|
+
except Exception:
|
|
308
303
|
try:
|
|
309
304
|
# try for pandas < 2.1.0
|
|
310
305
|
temp_df.fillna(method="ffill", inplace=True)
|
|
@@ -327,14 +322,14 @@ def stock_zh_a_daily(
|
|
|
327
322
|
temp_df["close"] = round(temp_df["close"], 2)
|
|
328
323
|
temp_df.dropna(inplace=True)
|
|
329
324
|
temp_df.reset_index(inplace=True)
|
|
330
|
-
temp_df[
|
|
325
|
+
temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
|
|
331
326
|
return temp_df
|
|
332
327
|
|
|
333
328
|
|
|
334
329
|
def stock_zh_a_cdr_daily(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
330
|
+
symbol: str = "sh689009",
|
|
331
|
+
start_date: str = "19900101",
|
|
332
|
+
end_date: str = "22201116",
|
|
338
333
|
) -> pd.DataFrame:
|
|
339
334
|
"""
|
|
340
335
|
新浪财经-A股-CDR个股的历史行情数据, 大量抓取容易封 IP
|
|
@@ -369,7 +364,7 @@ def stock_zh_a_cdr_daily(
|
|
|
369
364
|
|
|
370
365
|
|
|
371
366
|
def stock_zh_a_minute(
|
|
372
|
-
|
|
367
|
+
symbol: str = "sh600519", period: str = "1", adjust: str = ""
|
|
373
368
|
) -> pd.DataFrame:
|
|
374
369
|
"""
|
|
375
370
|
股票及股票指数历史行情数据-分钟数据
|
|
@@ -383,7 +378,9 @@ def stock_zh_a_minute(
|
|
|
383
378
|
:return: specific data
|
|
384
379
|
:rtype: pandas.DataFrame
|
|
385
380
|
"""
|
|
386
|
-
url =
|
|
381
|
+
url = (
|
|
382
|
+
"https://quotes.sina.cn/cn/api/jsonp_v2.php/=/CN_MarketDataService.getKLineData"
|
|
383
|
+
)
|
|
387
384
|
params = {
|
|
388
385
|
"symbol": symbol,
|
|
389
386
|
"scale": period,
|
|
@@ -395,7 +392,7 @@ def stock_zh_a_minute(
|
|
|
395
392
|
try:
|
|
396
393
|
data_json = json.loads(data_text.split("=(")[1].split(");")[0])
|
|
397
394
|
temp_df = pd.DataFrame(data_json).iloc[:, :6]
|
|
398
|
-
except:
|
|
395
|
+
except: # noqa: E722
|
|
399
396
|
url = f"https://quotes.sina.cn/cn/api/jsonp_v2.php/var%20_{symbol}_{period}_1658852984203=/CN_MarketDataService.getKLineData"
|
|
400
397
|
params = {
|
|
401
398
|
"symbol": symbol,
|
|
@@ -412,7 +409,7 @@ def stock_zh_a_minute(
|
|
|
412
409
|
return pd.DataFrame()
|
|
413
410
|
try:
|
|
414
411
|
stock_zh_a_daily(symbol=symbol, adjust="qfq")
|
|
415
|
-
except:
|
|
412
|
+
except: # noqa: E722
|
|
416
413
|
return temp_df
|
|
417
414
|
|
|
418
415
|
if adjust == "":
|
|
@@ -430,28 +427,16 @@ def stock_zh_a_minute(
|
|
|
430
427
|
need_df.drop_duplicates(subset=["date"], keep="last", inplace=True)
|
|
431
428
|
need_df.index = pd.to_datetime(need_df["date"])
|
|
432
429
|
stock_zh_a_daily_qfq_df = stock_zh_a_daily(symbol=symbol, adjust="qfq")
|
|
433
|
-
stock_zh_a_daily_qfq_df.index = pd.to_datetime(
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
"close"
|
|
438
|
-
].astype(float) / need_df["close"].astype(float)
|
|
430
|
+
stock_zh_a_daily_qfq_df.index = pd.to_datetime(stock_zh_a_daily_qfq_df["date"])
|
|
431
|
+
result_df = stock_zh_a_daily_qfq_df.iloc[-len(need_df) :, :]["close"].astype(
|
|
432
|
+
float
|
|
433
|
+
) / need_df["close"].astype(float)
|
|
439
434
|
temp_df.index = pd.to_datetime(temp_df["date"])
|
|
440
|
-
merged_df = pd.merge(
|
|
441
|
-
|
|
442
|
-
)
|
|
443
|
-
merged_df["
|
|
444
|
-
|
|
445
|
-
)
|
|
446
|
-
merged_df["high"] = (
|
|
447
|
-
merged_df["high"].astype(float) * merged_df["close_y"]
|
|
448
|
-
)
|
|
449
|
-
merged_df["low"] = (
|
|
450
|
-
merged_df["low"].astype(float) * merged_df["close_y"]
|
|
451
|
-
)
|
|
452
|
-
merged_df["close"] = (
|
|
453
|
-
merged_df["close_x"].astype(float) * merged_df["close_y"]
|
|
454
|
-
)
|
|
435
|
+
merged_df = pd.merge(temp_df, result_df, left_index=True, right_index=True)
|
|
436
|
+
merged_df["open"] = merged_df["open"].astype(float) * merged_df["close_y"]
|
|
437
|
+
merged_df["high"] = merged_df["high"].astype(float) * merged_df["close_y"]
|
|
438
|
+
merged_df["low"] = merged_df["low"].astype(float) * merged_df["close_y"]
|
|
439
|
+
merged_df["close"] = merged_df["close_x"].astype(float) * merged_df["close_y"]
|
|
455
440
|
temp_df = merged_df[["day", "open", "high", "low", "close", "volume"]]
|
|
456
441
|
temp_df.reset_index(drop=True, inplace=True)
|
|
457
442
|
return temp_df
|
|
@@ -467,28 +452,16 @@ def stock_zh_a_minute(
|
|
|
467
452
|
need_df.drop_duplicates(subset=["date"], keep="last", inplace=True)
|
|
468
453
|
need_df.index = pd.to_datetime(need_df["date"])
|
|
469
454
|
stock_zh_a_daily_hfq_df = stock_zh_a_daily(symbol=symbol, adjust="hfq")
|
|
470
|
-
stock_zh_a_daily_hfq_df.index = pd.to_datetime(
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
"close"
|
|
475
|
-
].astype(float) / need_df["close"].astype(float)
|
|
455
|
+
stock_zh_a_daily_hfq_df.index = pd.to_datetime(stock_zh_a_daily_hfq_df["date"])
|
|
456
|
+
result_df = stock_zh_a_daily_hfq_df.iloc[-len(need_df) :, :]["close"].astype(
|
|
457
|
+
float
|
|
458
|
+
) / need_df["close"].astype(float)
|
|
476
459
|
temp_df.index = pd.to_datetime(temp_df["date"])
|
|
477
|
-
merged_df = pd.merge(
|
|
478
|
-
|
|
479
|
-
)
|
|
480
|
-
merged_df["
|
|
481
|
-
|
|
482
|
-
)
|
|
483
|
-
merged_df["high"] = (
|
|
484
|
-
merged_df["high"].astype(float) * merged_df["close_y"]
|
|
485
|
-
)
|
|
486
|
-
merged_df["low"] = (
|
|
487
|
-
merged_df["low"].astype(float) * merged_df["close_y"]
|
|
488
|
-
)
|
|
489
|
-
merged_df["close"] = (
|
|
490
|
-
merged_df["close_x"].astype(float) * merged_df["close_y"]
|
|
491
|
-
)
|
|
460
|
+
merged_df = pd.merge(temp_df, result_df, left_index=True, right_index=True)
|
|
461
|
+
merged_df["open"] = merged_df["open"].astype(float) * merged_df["close_y"]
|
|
462
|
+
merged_df["high"] = merged_df["high"].astype(float) * merged_df["close_y"]
|
|
463
|
+
merged_df["low"] = merged_df["low"].astype(float) * merged_df["close_y"]
|
|
464
|
+
merged_df["close"] = merged_df["close_x"].astype(float) * merged_df["close_y"]
|
|
492
465
|
temp_df = merged_df[["day", "open", "high", "low", "close", "volume"]]
|
|
493
466
|
temp_df.reset_index(drop=True, inplace=True)
|
|
494
467
|
return temp_df
|
|
@@ -527,7 +500,9 @@ if __name__ == "__main__":
|
|
|
527
500
|
)
|
|
528
501
|
print(stock_zh_a_daily_hfq_factor_df)
|
|
529
502
|
|
|
530
|
-
stock_zh_a_daily_df = stock_zh_a_daily(
|
|
503
|
+
stock_zh_a_daily_df = stock_zh_a_daily(
|
|
504
|
+
symbol="sz300798", start_date="20200601", end_date="20231101", adjust="hfq"
|
|
505
|
+
)
|
|
531
506
|
print(stock_zh_a_daily_df)
|
|
532
507
|
|
|
533
508
|
stock_zh_a_cdr_daily_df = stock_zh_a_cdr_daily(
|
|
@@ -539,7 +514,7 @@ if __name__ == "__main__":
|
|
|
539
514
|
print(stock_zh_a_spot_df)
|
|
540
515
|
|
|
541
516
|
stock_zh_a_minute_df = stock_zh_a_minute(
|
|
542
|
-
symbol="
|
|
517
|
+
symbol="sz000876", period="1", adjust="qfq"
|
|
543
518
|
)
|
|
544
519
|
print(stock_zh_a_minute_df)
|
|
545
520
|
|