akshare 1.12.99__py3-none-any.whl → 1.15.73__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.

Files changed (236) hide show
  1. akshare/__init__.py +442 -138
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +29 -43
  4. akshare/air/sunrise_tad.py +32 -17
  5. akshare/bank/bank_cbirc_2020.py +12 -9
  6. akshare/bond/bond_cb_ths.py +17 -9
  7. akshare/bond/bond_china.py +38 -39
  8. akshare/bond/bond_china_money.py +75 -48
  9. akshare/bond/bond_info_cm.py +28 -8
  10. akshare/bond/bond_issue_cninfo.py +73 -30
  11. akshare/bond/bond_zh_cov.py +1 -1
  12. akshare/bond/bond_zh_sina.py +57 -51
  13. akshare/cal/__init__.py +0 -0
  14. akshare/cal/rv.py +170 -0
  15. akshare/cost/cost_living.py +7 -5
  16. akshare/currency/currency_safe.py +7 -6
  17. akshare/data/cninfo.js +15 -0
  18. akshare/datasets.py +10 -21
  19. akshare/economic/macro_bank.py +95 -653
  20. akshare/economic/macro_china.py +772 -1024
  21. akshare/economic/macro_china_hk.py +65 -243
  22. akshare/economic/macro_china_nbs.py +24 -7
  23. akshare/economic/macro_constitute.py +17 -12
  24. akshare/economic/macro_euro.py +13 -6
  25. akshare/economic/macro_finance_ths.py +133 -0
  26. akshare/economic/macro_info_ws.py +100 -0
  27. akshare/economic/macro_japan.py +5 -4
  28. akshare/economic/macro_other.py +12 -9
  29. akshare/economic/macro_usa.py +376 -1940
  30. akshare/economic/marco_cnbs.py +11 -6
  31. akshare/energy/energy_carbon.py +94 -125
  32. akshare/event/migration.py +3 -2
  33. akshare/exceptions.py +43 -0
  34. akshare/file_fold/calendar.json +245 -2
  35. akshare/fortune/fortune_500.py +15 -48
  36. akshare/fund/fund_amac.py +157 -75
  37. akshare/fund/fund_em.py +191 -184
  38. akshare/fund/fund_etf_em.py +16 -15
  39. akshare/fund/fund_etf_sina.py +71 -23
  40. akshare/fund/fund_etf_ths.py +93 -0
  41. akshare/fund/fund_fee_em.py +98 -0
  42. akshare/fund/fund_portfolio_em.py +60 -50
  43. akshare/fund/fund_rank_em.py +91 -82
  44. akshare/fund/fund_report_cninfo.py +63 -48
  45. akshare/fund/fund_scale_sina.py +20 -10
  46. akshare/fund/fund_xq.py +139 -109
  47. akshare/futures/cons.py +8 -31
  48. akshare/futures/cot.py +185 -137
  49. akshare/futures/futures_basis.py +97 -32
  50. akshare/futures/futures_comm_ctp.py +37 -0
  51. akshare/futures/futures_comm_qihuo.py +74 -45
  52. akshare/futures/futures_daily_bar.py +121 -184
  53. akshare/futures/futures_hf_em.py +66 -61
  54. akshare/futures/futures_hq_sina.py +79 -61
  55. akshare/futures/futures_index_ccidx.py +6 -3
  56. akshare/futures/futures_inventory_99.py +61 -272
  57. akshare/futures/futures_news_shmet.py +4 -2
  58. akshare/futures/futures_roll_yield.py +12 -25
  59. akshare/futures/futures_spot_stock_em.py +19 -13
  60. akshare/futures/futures_stock_js.py +14 -12
  61. akshare/futures/futures_to_spot.py +38 -33
  62. akshare/futures/futures_warehouse_receipt.py +75 -71
  63. akshare/futures/futures_zh_sina.py +5 -5
  64. akshare/futures/symbol_var.py +18 -13
  65. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  66. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  67. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  68. akshare/futures_derivative/futures_cot_sina.py +26 -19
  69. akshare/futures_derivative/futures_spot_sys.py +21 -8
  70. akshare/fx/currency_investing.py +19 -285
  71. akshare/index/index_cflp.py +29 -26
  72. akshare/index/index_cni.py +86 -88
  73. akshare/index/index_cons.py +26 -10
  74. akshare/index/index_cx.py +248 -47
  75. akshare/index/index_drewry.py +17 -16
  76. akshare/index/index_option_qvix.py +329 -0
  77. akshare/index/index_research_fund_sw.py +134 -0
  78. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  79. akshare/index/index_spot.py +9 -5
  80. akshare/index/index_stock_hk.py +35 -16
  81. akshare/index/index_stock_us_sina.py +1 -1
  82. akshare/index/index_stock_zh.py +180 -89
  83. akshare/index/index_stock_zh_csindex.py +15 -369
  84. akshare/index/index_sw.py +62 -34
  85. akshare/index/index_yw.py +46 -23
  86. akshare/index/index_zh_a_scope.py +48 -0
  87. akshare/index/index_zh_em.py +6 -4
  88. akshare/interest_rate/interbank_rate_em.py +14 -9
  89. akshare/movie/artist_yien.py +32 -5
  90. akshare/movie/movie_yien.py +92 -18
  91. akshare/movie/video_yien.py +28 -5
  92. akshare/news/news_baidu.py +78 -44
  93. akshare/news/news_cctv.py +38 -38
  94. akshare/news/news_stock.py +6 -3
  95. akshare/nlp/nlp_interface.py +7 -8
  96. akshare/option/cons.py +11 -11
  97. akshare/option/option_comm_qihuo.py +86 -0
  98. akshare/option/option_commodity.py +178 -51
  99. akshare/option/option_daily_stats_sse_szse.py +146 -0
  100. akshare/option/option_em.py +147 -138
  101. akshare/option/option_finance_sina.py +160 -137
  102. akshare/option/option_lhb_em.py +62 -56
  103. akshare/option/option_risk_indicator_sse.py +17 -14
  104. akshare/other/other_car_cpca.py +934 -0
  105. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  106. akshare/qdii/__init__.py +0 -0
  107. akshare/qdii/qdii_jsl.py +233 -0
  108. akshare/request.py +117 -0
  109. akshare/spot/spot_hog_soozhu.py +232 -0
  110. akshare/spot/spot_price_qh.py +121 -0
  111. akshare/spot/spot_sge.py +63 -10
  112. akshare/stock/stock_allotment_cninfo.py +10 -9
  113. akshare/stock/stock_board_concept_em.py +23 -14
  114. akshare/stock/stock_board_industry_em.py +40 -34
  115. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  116. akshare/stock/stock_cg_guarantee.py +41 -51
  117. akshare/stock/stock_cg_lawsuit.py +36 -35
  118. akshare/stock/stock_dividend_cninfo.py +12 -6
  119. akshare/stock/stock_dzjy_em.py +347 -260
  120. akshare/stock/stock_fund_em.py +332 -84
  121. akshare/stock/stock_hk_famous.py +108 -0
  122. akshare/stock/stock_hk_sina.py +8 -7
  123. akshare/stock/stock_hold_control_cninfo.py +100 -15
  124. akshare/stock/stock_hold_control_em.py +4 -3
  125. akshare/stock/stock_hold_num_cninfo.py +18 -12
  126. akshare/stock/stock_hot_rank_em.py +2 -1
  127. akshare/stock/stock_hot_search_baidu.py +5 -2
  128. akshare/stock/stock_industry_cninfo.py +24 -18
  129. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  130. akshare/stock/stock_industry_sw.py +9 -10
  131. akshare/stock/stock_info.py +25 -15
  132. akshare/stock/stock_info_em.py +5 -2
  133. akshare/stock/stock_intraday_em.py +5 -2
  134. akshare/stock/stock_intraday_sina.py +22 -18
  135. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  136. akshare/stock/stock_new_cninfo.py +32 -19
  137. akshare/stock/stock_news_cx.py +39 -0
  138. akshare/stock/stock_profile_cninfo.py +9 -8
  139. akshare/stock/stock_rank_forecast.py +8 -6
  140. akshare/stock/stock_share_changes_cninfo.py +18 -14
  141. akshare/stock/stock_share_hold.py +24 -19
  142. akshare/stock/stock_summary.py +54 -26
  143. akshare/stock/stock_us_famous.py +15 -6
  144. akshare/stock/stock_us_pink.py +7 -5
  145. akshare/stock/stock_us_sina.py +15 -12
  146. akshare/stock/stock_xq.py +38 -12
  147. akshare/stock/stock_zh_a_sina.py +53 -78
  148. akshare/stock/stock_zh_b_sina.py +32 -55
  149. akshare/stock/stock_zh_kcb_report.py +11 -9
  150. akshare/stock/stock_zh_kcb_sina.py +67 -64
  151. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  152. akshare/stock_feature/stock_a_high_low.py +5 -2
  153. akshare/stock_feature/stock_a_indicator.py +12 -9
  154. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  155. akshare/stock_feature/stock_account_em.py +58 -40
  156. akshare/stock_feature/stock_analyst_em.py +36 -27
  157. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  158. akshare/stock_feature/stock_comment_em.py +118 -85
  159. akshare/stock_feature/stock_concept_futu.py +183 -0
  160. akshare/stock_feature/stock_cyq_em.py +58 -54
  161. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  162. akshare/stock_feature/stock_esg_sina.py +216 -11
  163. akshare/stock_feature/stock_fhps_em.py +60 -25
  164. akshare/stock_feature/stock_fhps_ths.py +25 -6
  165. akshare/stock_feature/stock_fund_flow.py +38 -25
  166. akshare/stock_feature/stock_gdfx_em.py +180 -95
  167. akshare/stock_feature/stock_gdhs.py +73 -49
  168. akshare/stock_feature/stock_gpzy_em.py +78 -46
  169. akshare/stock_feature/stock_hist_em.py +55 -23
  170. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  171. akshare/stock_feature/stock_hsgt_em.py +184 -452
  172. akshare/stock_feature/stock_info.py +52 -29
  173. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  174. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  175. akshare/stock_feature/stock_jgdy_em.py +41 -38
  176. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  177. akshare/stock_feature/stock_lhb_em.py +135 -71
  178. akshare/stock_feature/stock_lhb_sina.py +93 -46
  179. akshare/stock_feature/stock_margin_em.py +102 -0
  180. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  181. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  182. akshare/stock_feature/stock_market_legu.py +13 -8
  183. akshare/stock_feature/stock_pankou_em.py +72 -34
  184. akshare/stock_feature/stock_report_em.py +244 -54
  185. akshare/stock_feature/stock_research_report_em.py +48 -19
  186. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  187. akshare/stock_feature/stock_sy_em.py +86 -33
  188. akshare/stock_feature/stock_technology_ths.py +152 -120
  189. akshare/stock_feature/stock_tfp_em.py +35 -13
  190. akshare/stock_feature/stock_three_report_em.py +119 -77
  191. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  192. akshare/stock_feature/stock_value_em.py +83 -0
  193. akshare/stock_feature/stock_wencai.py +21 -9
  194. akshare/stock_feature/stock_yjyg_em.py +63 -28
  195. akshare/stock_feature/stock_zf_pg.py +61 -38
  196. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  197. akshare/stock_feature/stock_ztb_em.py +62 -40
  198. akshare/stock_fundamental/stock_finance.py +150 -58
  199. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  200. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  201. akshare/stock_fundamental/stock_notice.py +29 -15
  202. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  203. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  204. akshare/stock_fundamental/stock_register_em.py +448 -0
  205. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  206. akshare/stock_fundamental/stock_zygc.py +10 -8
  207. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  208. akshare/tool/trade_date_hist.py +4 -3
  209. akshare/utils/cons.py +10 -0
  210. akshare/utils/context.py +43 -0
  211. akshare/utils/demjson.py +2 -2
  212. akshare/utils/func.py +26 -0
  213. akshare/utils/tqdm.py +13 -3
  214. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/METADATA +52 -69
  215. akshare-1.15.73.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/WHEEL +1 -1
  217. tests/test_func.py +3 -5
  218. akshare/bond/bond_futures.py +0 -50
  219. akshare/bond/bond_investing.py +0 -139
  220. akshare/crypto/crypto_hist_investing.py +0 -249
  221. akshare/fortune/fortune_it_juzi.py +0 -123
  222. akshare/futures/futures_international.py +0 -170
  223. akshare/futures/futures_news_baidu.py +0 -54
  224. akshare/futures/inventory_data.py +0 -100
  225. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  226. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  227. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  228. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  229. akshare/index/index_fear_greed_funddb.py +0 -71
  230. akshare/index/index_investing.py +0 -232
  231. akshare/sport/sport_olympic_winter.py +0 -39
  232. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  233. akshare/stock_fundamental/stock_register.py +0 -292
  234. akshare-1.12.99.dist-info/RECORD +0 -374
  235. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/12/7 15:30
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
- from py_mini_racer import py_mini_racer
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([big_df, pd.DataFrame(data_json["data"])], ignore_index=True)
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([big_df, pd.DataFrame(data_json["data"])], ignore_index=True)
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 as e:
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 as e:
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/3/7 22:30
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
- symbol: str = "SH600000",
16
- timeout: float = None,
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
- url = f"https://stock.xueqiu.com/v5/stock/quote.json?symbol={symbol}&extend=detail"
46
+ session = requests.Session()
47
+ xq_a_token = token or "cccb558956c11f5aaf8b9a30bcf1f214117e8d67"
29
48
  headers = {
30
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"
31
- "80.0.3987.149 Safari/537.36",
32
- "Cookie": "xqat=52dfb79aed5f2cdd1e7c2cfc56054ac1f5b77fc3",
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
- r = requests.get(url, headers=headers, timeout=timeout)
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()["data"]["quote"]
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(r"[\u4e00-\u9fa5]", x), temp_df.columns
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="SH600000")
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")
@@ -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
- import re
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
- range(1, page_count + 1), leave=False, desc="Please wait for a moment"
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
- symbol: str = "sh603843",
131
- start_date: str = "19900101",
132
- end_date: str = "21000118",
133
- adjust: str = "",
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: 返回后复权因子; 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 = ['date', 'outstanding_share']
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 as e:
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['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
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 as e:
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['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
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 as e:
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['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
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
- symbol: str = "sh689009",
336
- start_date: str = "19900101",
337
- end_date: str = "22201116",
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
- symbol: str = "sh600519", period: str = "1", adjust: str = ""
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 = "https://quotes.sina.cn/cn/api/jsonp_v2.php/=/CN_MarketDataService.getKLineData"
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
- stock_zh_a_daily_qfq_df["date"]
435
- )
436
- result_df = stock_zh_a_daily_qfq_df.iloc[-len(need_df):, :][
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
- temp_df, result_df, left_index=True, right_index=True
442
- )
443
- merged_df["open"] = (
444
- merged_df["open"].astype(float) * merged_df["close_y"]
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
- stock_zh_a_daily_hfq_df["date"]
472
- )
473
- result_df = stock_zh_a_daily_hfq_df.iloc[-len(need_df):, :][
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
- temp_df, result_df, left_index=True, right_index=True
479
- )
480
- merged_df["open"] = (
481
- merged_df["open"].astype(float) * merged_df["close_y"]
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(symbol="sz300798", start_date="20200601", end_date="20231101", adjust="hfq")
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="sh600519", period="1", adjust=""
517
+ symbol="sz000876", period="1", adjust="qfq"
543
518
  )
544
519
  print(stock_zh_a_minute_df)
545
520