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,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/13 15:00
4
+ Date: 2024/11/23 17:00
5
5
  Desc: 东方财富-财经早餐
6
6
  https://stock.eastmoney.com/a/czpnc.html
7
7
  """
@@ -10,6 +10,9 @@ from datetime import datetime
10
10
 
11
11
  import pandas as pd
12
12
  import requests
13
+ from bs4 import BeautifulSoup
14
+
15
+ from akshare.request import make_request_with_retry_json
13
16
 
14
17
 
15
18
  def stock_info_cjzc_em() -> pd.DataFrame:
@@ -37,7 +40,7 @@ def stock_info_cjzc_em() -> pd.DataFrame:
37
40
  r = requests.get(url, params=params)
38
41
  data_json = r.json()
39
42
  temp_df = pd.DataFrame(data_json["data"]["list"])
40
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
43
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
41
44
 
42
45
  big_df = big_df[["title", "summary", "showTime", "uniqueUrl"]]
43
46
  big_df.rename(
@@ -200,34 +203,10 @@ def stock_info_global_cls(symbol: str = "全部") -> pd.DataFrame:
200
203
  :return: 财联社-电报
201
204
  :rtype: pandas.DataFrame
202
205
  """
203
- session = requests.session()
204
- url = "https://m.cls.cn/telegraph"
205
- session.get(url) # 获取 cookies
206
- params = {
207
- "refresh_type": "1",
208
- "rn": "10",
209
- "last_time": "",
210
- "app": "CailianpressWap",
211
- "sv": "1",
212
- }
213
- ts = pd.Timestamp(pd.Timestamp.now())
214
- current_time = int(ts.timestamp())
215
- params.update({"last_time": current_time})
216
- url = "https://m.cls.cn/nodeapi/telegraphs"
217
- r = session.get(url, params=params)
218
- data_json = r.json()
206
+ url = "https://www.cls.cn/nodeapi/telegraphList"
207
+ data_json = make_request_with_retry_json(url, max_retries=10)
219
208
  temp_df = pd.DataFrame(data_json["data"]["roll_data"])
220
- next_time = temp_df["modified_time"].values[-1]
221
- n = 1
222
209
  big_df = temp_df.copy()
223
- while n < 15:
224
- params.update({"last_time": next_time})
225
- r = session.get(url, params=params)
226
- data_json = r.json()
227
- temp_df = pd.DataFrame(data_json["data"]["roll_data"])
228
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
229
- next_time = temp_df["modified_time"].values[-1]
230
- n += 1
231
210
  big_df = big_df[["title", "content", "ctime", "level"]]
232
211
  big_df["ctime"] = pd.to_datetime(big_df["ctime"], unit="s", utc=True).dt.tz_convert(
233
212
  "Asia/Shanghai"
@@ -237,7 +216,6 @@ def stock_info_global_cls(symbol: str = "全部") -> pd.DataFrame:
237
216
  big_df.reset_index(inplace=True, drop=True)
238
217
  big_df["发布日期"] = big_df["发布时间"].dt.date
239
218
  big_df["发布时间"] = big_df["发布时间"].dt.time
240
-
241
219
  if symbol == "重点":
242
220
  big_df = big_df[(big_df["等级"] == "B") | (big_df["等级"] == "A")]
243
221
  big_df.reset_index(inplace=True, drop=True)
@@ -248,6 +226,48 @@ def stock_info_global_cls(symbol: str = "全部") -> pd.DataFrame:
248
226
  return big_df
249
227
 
250
228
 
229
+ def stock_info_broker_sina(page: str = "1") -> pd.DataFrame:
230
+ """
231
+ 新浪财经-证券-证券原创
232
+ https://finance.sina.com.cn/roll/index.d.html?cid=221431
233
+ :param page: 页面号
234
+ :type page: str
235
+ :return: 证券原创文章
236
+ :rtype: pandas.DataFrame
237
+ """
238
+ url = "https://finance.sina.com.cn/roll/index.d.html?cid=221431"
239
+ params = {"page": page}
240
+ r = requests.get(url, params=params)
241
+ r.encoding = "utf-8"
242
+ data_text = r.text
243
+ soup = BeautifulSoup(data_text, features="lxml")
244
+ data = []
245
+ from datetime import datetime
246
+
247
+ current_year = datetime.now().year
248
+ for ul_index in range(0, 11):
249
+ for li_index in range(0, 6):
250
+ a_selector = f"#Main > div:nth-of-type(3) > ul:nth-of-type({ul_index}) > li:nth-of-type({li_index}) > a"
251
+ span_selector = f"#Main > div:nth-of-type(3) > ul:nth-of-type({ul_index}) > li:nth-of-type({li_index}) > span"
252
+ # 获取<a>标签和<span>标签内的文本内容
253
+ a_element = soup.select_one(a_selector)
254
+ span_element = soup.select_one(span_selector)
255
+ if a_element and span_element:
256
+ href = a_element.get("href")
257
+ target = a_element.get("target")
258
+ date = str(current_year) + "年" + span_element.text[1:-1]
259
+ text = a_element.text
260
+ data.append(
261
+ {"href": href, "target": target, "date": date, "text": text}
262
+ )
263
+
264
+ temp_df = pd.DataFrame(data)
265
+ temp_df = temp_df[["date", "text", "href"]]
266
+ temp_df.columns = ["时间", "内容", "链接"]
267
+ temp_df.sort_values(["时间"], ignore_index=True, inplace=True)
268
+ return temp_df
269
+
270
+
251
271
  if __name__ == "__main__":
252
272
  stock_info_cjzc_em_df = stock_info_cjzc_em()
253
273
  print(stock_info_cjzc_em_df)
@@ -266,3 +286,6 @@ if __name__ == "__main__":
266
286
 
267
287
  stock_info_global_cls_df = stock_info_global_cls(symbol="全部")
268
288
  print(stock_info_global_cls_df)
289
+
290
+ stock_info_broker_sina_df = stock_info_broker_sina(page="1")
291
+ print(stock_info_broker_sina_df)
@@ -1,10 +1,11 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2022/4/29 17:01
4
+ Date: 2024/11/5 16:00
5
5
  Desc: 雪球-行情中心-沪深股市-内部交易
6
6
  https://xueqiu.com/hq/insider
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -18,10 +19,10 @@ def stock_inner_trade_xq() -> pd.DataFrame:
18
19
  """
19
20
  url = "https://xueqiu.com/service/v5/stock/f10/cn/skholderchg"
20
21
  params = {
21
- 'size': '100000',
22
- 'page': '1',
23
- 'extend': 'true',
24
- '_': '1651223013040',
22
+ "size": "100000",
23
+ "page": "1",
24
+ "extend": "true",
25
+ "_": "1651223013040",
25
26
  }
26
27
  headers = {
27
28
  "Accept": "*/*",
@@ -38,39 +39,46 @@ def stock_inner_trade_xq() -> pd.DataFrame:
38
39
  "Sec-Fetch-Dest": "empty",
39
40
  "Sec-Fetch-Mode": "cors",
40
41
  "Sec-Fetch-Site": "same-origin",
41
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
42
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
43
+ "Chrome/100.0.4896.127 Safari/537.36",
42
44
  "X-Requested-With": "XMLHttpRequest",
43
45
  }
44
46
  r = requests.get(url, params=params, headers=headers)
45
47
  data_json = r.json()
46
48
  temp_df = pd.DataFrame(data_json["data"]["items"])
47
49
  temp_df.columns = [
48
- '股票代码',
49
- '股票名称',
50
- '变动人',
51
- '-',
52
- '变动日期',
53
- '变动股数',
54
- '成交均价',
55
- '变动后持股数',
56
- '与董监高关系',
57
- '董监高职务',
50
+ "股票代码",
51
+ "股票名称",
52
+ "变动人",
53
+ "-",
54
+ "变动日期",
55
+ "变动股数",
56
+ "成交均价",
57
+ "变动后持股数",
58
+ "与董监高关系",
59
+ "董监高职务",
60
+ ]
61
+ temp_df = temp_df[
62
+ [
63
+ "股票代码",
64
+ "股票名称",
65
+ "变动日期",
66
+ "变动人",
67
+ "变动股数",
68
+ "成交均价",
69
+ "变动后持股数",
70
+ "与董监高关系",
71
+ "董监高职务",
72
+ ]
58
73
  ]
59
- temp_df = temp_df[[
60
- '股票代码',
61
- '股票名称',
62
- '变动日期',
63
- '变动人',
64
- '变动股数',
65
- '成交均价',
66
- '变动后持股数',
67
- '与董监高关系',
68
- '董监高职务',
69
- ]]
70
- temp_df['变动日期'] = pd.to_datetime(temp_df['变动日期'], unit="ms").dt.date
71
- temp_df['变动股数'] = pd.to_numeric(temp_df['变动股数'], errors="coerce")
72
- temp_df['成交均价'] = pd.to_numeric(temp_df['成交均价'], errors="coerce")
73
- temp_df['变动后持股数'] = pd.to_numeric(temp_df['变动后持股数'], errors="coerce")
74
+ temp_df["变动日期"] = (
75
+ pd.to_datetime(temp_df["变动日期"], unit="ms", utc=True)
76
+ .dt.tz_convert("Asia/Shanghai")
77
+ .dt.date
78
+ )
79
+ temp_df["变动股数"] = pd.to_numeric(temp_df["变动股数"], errors="coerce")
80
+ temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"], errors="coerce")
81
+ temp_df["变动后持股数"] = pd.to_numeric(temp_df["变动后持股数"], errors="coerce")
74
82
  return temp_df
75
83
 
76
84
 
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/8/4 19:20
4
+ Date: 2024/5/20 16:00
5
5
  Desc: 互动易-提问与回答
6
6
  https://irm.cninfo.com.cn/
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
- from tqdm import tqdm
11
+
12
+ from akshare.utils.tqdm import get_tqdm
11
13
 
12
14
 
13
15
  def _fetch_org_id(symbol: str = "000001") -> str:
@@ -51,12 +53,13 @@ def stock_irm_cninfo(symbol: str = "002594") -> pd.DataFrame:
51
53
  total_page = int(data_json["totalPage"])
52
54
  total_page = 10 if total_page > 10 else total_page
53
55
  big_df = pd.DataFrame()
56
+ tqdm = get_tqdm()
54
57
  for page in tqdm(range(1, 1 + total_page), leave=False):
55
58
  params.update({"pageNum": page})
56
59
  r = requests.post(url, params=params)
57
60
  data_json = r.json()
58
61
  temp_df = pd.DataFrame(data_json["rows"])
59
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
62
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
60
63
  big_df.rename(
61
64
  columns={
62
65
  "indexId": "问题编号",
@@ -111,8 +114,18 @@ def stock_irm_cninfo(symbol: str = "002594") -> pd.DataFrame:
111
114
  ]
112
115
  big_df["行业"] = [item[0] for item in big_df["行业"]]
113
116
  big_df["行业代码"] = [item[0] for item in big_df["行业代码"]]
114
- big_df["提问时间"] = pd.to_datetime(big_df["提问时间"], unit="ms")
115
- big_df["更新时间"] = pd.to_datetime(big_df["更新时间"], unit="ms")
117
+ big_df["提问时间"] = (
118
+ pd.to_datetime(big_df["提问时间"], unit="ms", errors="coerce")
119
+ .dt.tz_localize("UTC")
120
+ .dt.tz_convert("Asia/Shanghai")
121
+ .dt.strftime("%Y-%m-%d %H:%M:%S")
122
+ )
123
+ big_df["更新时间"] = (
124
+ pd.to_datetime(big_df["更新时间"], unit="ms", errors="coerce")
125
+ .dt.tz_localize("UTC")
126
+ .dt.tz_convert("Asia/Shanghai")
127
+ .dt.strftime("%Y-%m-%d %H:%M:%S")
128
+ )
116
129
  big_df["来源"] = big_df["来源"].map(
117
130
  {
118
131
  "2": "APP",
@@ -120,7 +133,7 @@ def stock_irm_cninfo(symbol: str = "002594") -> pd.DataFrame:
120
133
  "4": "网站",
121
134
  }
122
135
  )
123
- big_df["来源"].fillna("网站", inplace=True)
136
+ big_df["来源"] = big_df["来源"].fillna("网站")
124
137
  return big_df
125
138
 
126
139
 
@@ -128,7 +141,7 @@ def stock_irm_ans_cninfo(symbol: str = "1513586704097333248") -> pd.DataFrame:
128
141
  """
129
142
  互动易-回答
130
143
  https://irm.cninfo.com.cn/ircs/question/questionDetail?questionId=1515236357817618432
131
- :param symbol: 提问者编号; 通过 ak.stock_irm_cninfo 来获取具体的提问者编号
144
+ :param symbol: 提问者编号; 通过 ak.stock_irm_cninfo() 来获取具体的提问者编号
132
145
  :type symbol: str
133
146
  :return: 回答
134
147
  :rtype: str
@@ -163,8 +176,18 @@ def stock_irm_ans_cninfo(symbol: str = "1513586704097333248") -> pd.DataFrame:
163
176
  "回答时间",
164
177
  ]
165
178
  ]
166
- temp_df["提问时间"] = pd.to_datetime(temp_df["提问时间"], unit="ms", errors="coerce")
167
- temp_df["回答时间"] = pd.to_datetime(temp_df["回答时间"], unit="ms", errors="coerce")
179
+ temp_df["提问时间"] = (
180
+ pd.to_datetime(temp_df["提问时间"], unit="ms", errors="coerce")
181
+ .dt.tz_localize("UTC")
182
+ .dt.tz_convert("Asia/Shanghai")
183
+ .dt.strftime("%Y-%m-%d %H:%M:%S")
184
+ )
185
+ temp_df["回答时间"] = (
186
+ pd.to_datetime(temp_df["回答时间"], unit="ms", errors="coerce")
187
+ .dt.tz_localize("UTC")
188
+ .dt.tz_convert("Asia/Shanghai")
189
+ .dt.strftime("%Y-%m-%d %H:%M:%S")
190
+ )
168
191
  return temp_df
169
192
 
170
193
 
@@ -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
- 'sortColumns': 'NOTICE_DATE,SUM,RECEIVE_START_DATE,SECURITY_CODE',
27
- 'sortTypes': '-1,-1,-1,1',
28
- 'pageSize': '500',
29
- 'pageNumber': '1',
30
- 'reportName': 'RPT_ORG_SURVEYNEW',
31
- 'columns': 'ALL',
32
- 'quoteColumns': 'f2~01~SECURITY_CODE~CLOSE_PRICE,f3~01~SECURITY_CODE~CHANGE_RATE',
33
- 'source': 'WEB',
34
- 'client': 'WEB',
35
- 'filter': f"""(NUMBERNEW="1")(IS_SOURCE="1")(RECEIVE_START_DATE>'{'-'.join([date[:4], date[4:6], date[6:]])}')"""
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['result']['pages']
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['result']['data'])
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['最新价'] = pd.to_numeric(big_df['最新价'], errors="coerce")
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_datetime(big_df['接待日期']).dt.date
103
- big_df['公告日期'] = pd.to_datetime(big_df['公告日期']).dt.date
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 = "20220101") -> pd.DataFrame:
108
+ def stock_jgdy_detail_em(date: str = "20241211") -> pd.DataFrame:
108
109
  """
109
110
  东方财富网-数据中心-特色数据-机构调研-机构调研详细
110
- http://data.eastmoney.com/jgdy/xx.html
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 = "http://datacenter-web.eastmoney.com/api/data/v1/get"
117
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
117
118
  params = {
118
- 'sortColumns': 'NOTICE_DATE,RECEIVE_START_DATE,SECURITY_CODE,NUMBERNEW',
119
- 'sortTypes': '-1,-1,1,-1',
120
- 'pageSize': '50000',
121
- 'pageNumber': '1',
122
- 'reportName': 'RPT_ORG_SURVEY',
123
- 'columns': 'SECUCODE,SECURITY_CODE,SECURITY_NAME_ABBR,NOTICE_DATE,RECEIVE_START_DATE,RECEIVE_OBJECT,RECEIVE_PLACE,RECEIVE_WAY_EXPLAIN,INVESTIGATORS,RECEPTIONIST,ORG_TYPE',
124
- 'quoteColumns': 'f2~01~SECURITY_CODE~CLOSE_PRICE,f3~01~SECURITY_CODE~CHANGE_RATE',
125
- 'source': 'WEB',
126
- 'client': 'WEB',
127
- 'filter': f"""(IS_SOURCE="1")(RECEIVE_START_DATE>'{'-'.join([date[:4], date[4:6], date[6:]])}')"""
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['result']['pages']
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['result']['data'])
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['最新价'] = pd.to_numeric(big_df['最新价'], errors="coerce")
175
- big_df['涨跌幅'] = pd.to_numeric(big_df['涨跌幅'], errors="coerce")
176
- big_df['调研日期'] = pd.to_datetime(big_df['调研日期']).dt.date
177
- big_df['公告日期'] = pd.to_datetime(big_df['公告日期']).dt.date
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,37 +1,40 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/5/3 20:30
4
+ Date: 2024/5/6 20:30
5
5
  Desc: 同花顺-数据中心-营业部排名
6
- http://data.10jqka.com.cn/market/longhu/
6
+ https://data.10jqka.com.cn/market/longhu/
7
7
  """
8
- import requests
8
+
9
+ from io import StringIO
10
+
9
11
  import pandas as pd
10
- from tqdm import tqdm
12
+ import requests
11
13
  from bs4 import BeautifulSoup
12
14
 
15
+ from akshare.utils.tqdm import get_tqdm
16
+ from akshare.utils.cons import headers
17
+
13
18
 
14
19
  def stock_lh_yyb_most() -> pd.DataFrame:
15
20
  """
16
21
  同花顺-数据中心-营业部排名-上榜次数最多
17
- http://data.10jqka.com.cn/market/longhu/
22
+ https://data.10jqka.com.cn/market/longhu/
18
23
  :return: 上榜次数最多
19
24
  :rtype: pandas.DataFrame
20
25
  """
21
- url = "http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/sbcs/field/sbcs/sort/desc/page/1/"
22
- headers = {
23
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
24
- }
26
+ url = "https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/sbcs/field/sbcs/sort/desc/page/1/"
25
27
  r = requests.get(url, headers=headers)
26
- soup = BeautifulSoup(r.text, "lxml")
27
- page_str = soup.find("span", attrs={"class": "page_info"}).text
28
+ soup = BeautifulSoup(r.text, features="lxml")
29
+ page_str = soup.find(name="span", attrs={"class": "page_info"}).text
28
30
  total_page = int(page_str.split("/")[1]) + 1
29
31
  big_df = pd.DataFrame()
30
- for page in tqdm(range(1, total_page)):
31
- url = f"http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/sbcs/field/sbcs/sort/desc/page/{page}/"
32
+ tqdm = get_tqdm()
33
+ for page in tqdm(range(1, total_page), leave=False):
34
+ url = f"https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/sbcs/field/sbcs/sort/desc/page/{page}/"
32
35
  r = requests.get(url, headers=headers)
33
- temp_df = pd.read_html(r.text)[0]
34
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
36
+ temp_df = pd.read_html(StringIO(r.text))[0]
37
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
35
38
  big_df.reset_index(inplace=True, drop=True)
36
39
  return big_df
37
40
 
@@ -39,24 +42,22 @@ def stock_lh_yyb_most() -> pd.DataFrame:
39
42
  def stock_lh_yyb_capital() -> pd.DataFrame:
40
43
  """
41
44
  同花顺-数据中心-营业部排名-资金实力最强
42
- http://data.10jqka.com.cn/market/longhu/
45
+ https://data.10jqka.com.cn/market/longhu/
43
46
  :return: 资金实力最强
44
47
  :rtype: pandas.DataFrame
45
48
  """
46
- url = "http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/zjsl/field/zgczje/sort/desc/page/1/"
47
- headers = {
48
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
49
- }
49
+ url = "https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/zjsl/field/zgczje/sort/desc/page/1/"
50
50
  r = requests.get(url, headers=headers)
51
- soup = BeautifulSoup(r.text, "lxml")
52
- page_str = soup.find("span", attrs={"class": "page_info"}).text
51
+ soup = BeautifulSoup(r.text, features="lxml")
52
+ page_str = soup.find(name="span", attrs={"class": "page_info"}).text
53
53
  total_page = int(page_str.split("/")[1]) + 1
54
54
  big_df = pd.DataFrame()
55
- for page in tqdm(range(1, total_page)):
56
- url = f"http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/zjsl/field/zgczje/sort/desc/page/{page}/"
55
+ tqdm = get_tqdm()
56
+ for page in tqdm(range(1, total_page), leave=False):
57
+ url = f"https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/zjsl/field/zgczje/sort/desc/page/{page}/"
57
58
  r = requests.get(url, headers=headers)
58
- temp_df = pd.read_html(r.text)[0]
59
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
59
+ temp_df = pd.read_html(StringIO(r.text))[0]
60
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
60
61
  big_df.reset_index(inplace=True, drop=True)
61
62
  return big_df
62
63
 
@@ -64,24 +65,22 @@ def stock_lh_yyb_capital() -> pd.DataFrame:
64
65
  def stock_lh_yyb_control() -> pd.DataFrame:
65
66
  """
66
67
  同花顺-数据中心-营业部排名-抱团操作实力
67
- http://data.10jqka.com.cn/market/longhu/
68
+ https://data.10jqka.com.cn/market/longhu/
68
69
  :return: 抱团操作实力
69
70
  :rtype: pandas.DataFrame
70
71
  """
71
- url = "http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/btcz/field/xsjs/sort/desc/page/1/"
72
- headers = {
73
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
74
- }
72
+ url = "https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/btcz/field/xsjs/sort/desc/page/1/"
75
73
  r = requests.get(url, headers=headers)
76
- soup = BeautifulSoup(r.text, "lxml")
77
- page_str = soup.find("span", attrs={"class": "page_info"}).text
74
+ soup = BeautifulSoup(r.text, features="lxml")
75
+ page_str = soup.find(name="span", attrs={"class": "page_info"}).text
78
76
  total_page = int(page_str.split("/")[1]) + 1
79
77
  big_df = pd.DataFrame()
80
- for page in tqdm(range(1, total_page)):
81
- url = f"http://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/btcz/field/xsjs/sort/desc/page/{page}/"
78
+ tqdm = get_tqdm()
79
+ for page in tqdm(range(1, total_page), leave=False):
80
+ url = f"https://data.10jqka.com.cn/ifmarket/lhbyyb/type/1/tab/btcz/field/xsjs/sort/desc/page/{page}/"
82
81
  r = requests.get(url, headers=headers)
83
- temp_df = pd.read_html(r.text)[0]
84
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
82
+ temp_df = pd.read_html(StringIO(r.text))[0]
83
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
85
84
  big_df.reset_index(inplace=True, drop=True)
86
85
  return big_df
87
86