akshare 1.12.95__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.

Files changed (240) hide show
  1. akshare/__init__.py +446 -139
  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_convert.py +40 -16
  10. akshare/bond/bond_info_cm.py +28 -8
  11. akshare/bond/bond_issue_cninfo.py +73 -30
  12. akshare/bond/{bond_zh_cov_sina.py → bond_zh_cov.py} +41 -17
  13. akshare/bond/bond_zh_sina.py +57 -51
  14. akshare/cal/__init__.py +0 -0
  15. akshare/cal/rv.py +170 -0
  16. akshare/cost/cost_living.py +7 -5
  17. akshare/currency/currency_safe.py +7 -6
  18. akshare/data/cninfo.js +15 -0
  19. akshare/datasets.py +10 -21
  20. akshare/economic/macro_bank.py +95 -653
  21. akshare/economic/macro_china.py +772 -1024
  22. akshare/economic/macro_china_hk.py +65 -243
  23. akshare/economic/macro_china_nbs.py +24 -7
  24. akshare/economic/macro_constitute.py +17 -12
  25. akshare/economic/macro_euro.py +13 -6
  26. akshare/economic/macro_finance_ths.py +133 -0
  27. akshare/economic/macro_info_ws.py +100 -0
  28. akshare/economic/macro_japan.py +5 -4
  29. akshare/economic/macro_other.py +12 -9
  30. akshare/economic/macro_usa.py +376 -1940
  31. akshare/economic/marco_cnbs.py +11 -6
  32. akshare/energy/energy_carbon.py +94 -125
  33. akshare/event/migration.py +3 -2
  34. akshare/exceptions.py +43 -0
  35. akshare/file_fold/calendar.json +245 -2
  36. akshare/fortune/fortune_500.py +15 -48
  37. akshare/fund/fund_amac.py +157 -75
  38. akshare/fund/fund_em.py +191 -184
  39. akshare/fund/fund_etf_em.py +20 -19
  40. akshare/fund/fund_etf_sina.py +71 -23
  41. akshare/fund/fund_etf_ths.py +93 -0
  42. akshare/fund/fund_fee_em.py +98 -0
  43. akshare/fund/fund_lof_em.py +10 -8
  44. akshare/fund/fund_portfolio_em.py +60 -50
  45. akshare/fund/fund_rank_em.py +91 -82
  46. akshare/fund/fund_report_cninfo.py +63 -48
  47. akshare/fund/fund_scale_sina.py +20 -10
  48. akshare/fund/fund_xq.py +139 -109
  49. akshare/futures/cons.py +8 -31
  50. akshare/futures/cot.py +185 -137
  51. akshare/futures/futures_basis.py +97 -32
  52. akshare/futures/futures_comm_ctp.py +37 -0
  53. akshare/futures/futures_comm_qihuo.py +74 -45
  54. akshare/futures/futures_daily_bar.py +121 -184
  55. akshare/futures/futures_hf_em.py +66 -61
  56. akshare/futures/futures_hq_sina.py +79 -61
  57. akshare/futures/futures_index_ccidx.py +6 -3
  58. akshare/futures/futures_inventory_99.py +61 -272
  59. akshare/futures/futures_news_shmet.py +4 -2
  60. akshare/futures/futures_roll_yield.py +12 -25
  61. akshare/futures/futures_spot_stock_em.py +19 -13
  62. akshare/futures/futures_stock_js.py +14 -12
  63. akshare/futures/futures_to_spot.py +38 -33
  64. akshare/futures/futures_warehouse_receipt.py +75 -71
  65. akshare/futures/futures_zh_sina.py +73 -50
  66. akshare/futures/symbol_var.py +18 -13
  67. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  68. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  69. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  70. akshare/futures_derivative/futures_cot_sina.py +26 -19
  71. akshare/futures_derivative/futures_spot_sys.py +21 -8
  72. akshare/fx/currency_investing.py +19 -285
  73. akshare/index/index_cflp.py +29 -26
  74. akshare/index/index_cni.py +86 -88
  75. akshare/index/index_cons.py +26 -10
  76. akshare/index/index_cx.py +248 -47
  77. akshare/index/index_drewry.py +17 -16
  78. akshare/index/index_hog.py +27 -26
  79. akshare/index/index_option_qvix.py +329 -0
  80. akshare/index/index_research_fund_sw.py +134 -0
  81. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  82. akshare/index/index_spot.py +9 -5
  83. akshare/index/index_stock_hk.py +35 -16
  84. akshare/index/index_stock_us_sina.py +1 -1
  85. akshare/index/index_stock_zh.py +180 -89
  86. akshare/index/index_stock_zh_csindex.py +15 -369
  87. akshare/index/index_sw.py +62 -34
  88. akshare/index/index_yw.py +46 -23
  89. akshare/index/index_zh_a_scope.py +48 -0
  90. akshare/index/index_zh_em.py +17 -14
  91. akshare/interest_rate/interbank_rate_em.py +14 -9
  92. akshare/movie/artist_yien.py +32 -5
  93. akshare/movie/movie_yien.py +92 -18
  94. akshare/movie/video_yien.py +28 -5
  95. akshare/news/news_baidu.py +78 -44
  96. akshare/news/news_cctv.py +38 -38
  97. akshare/news/news_stock.py +6 -3
  98. akshare/nlp/nlp_interface.py +7 -8
  99. akshare/option/cons.py +11 -11
  100. akshare/option/option_comm_qihuo.py +86 -0
  101. akshare/option/option_commodity.py +178 -51
  102. akshare/option/option_daily_stats_sse_szse.py +146 -0
  103. akshare/option/option_em.py +147 -138
  104. akshare/option/option_finance_sina.py +160 -137
  105. akshare/option/option_lhb_em.py +62 -56
  106. akshare/option/option_risk_indicator_sse.py +17 -14
  107. akshare/other/other_car_cpca.py +934 -0
  108. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  109. akshare/qdii/__init__.py +0 -0
  110. akshare/qdii/qdii_jsl.py +233 -0
  111. akshare/request.py +117 -0
  112. akshare/spot/spot_hog_soozhu.py +232 -0
  113. akshare/spot/spot_price_qh.py +121 -0
  114. akshare/spot/spot_sge.py +63 -10
  115. akshare/stock/stock_allotment_cninfo.py +10 -9
  116. akshare/stock/stock_ask_bid_em.py +27 -3
  117. akshare/stock/stock_board_concept_em.py +23 -14
  118. akshare/stock/stock_board_industry_em.py +40 -34
  119. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  120. akshare/stock/stock_cg_guarantee.py +41 -51
  121. akshare/stock/stock_cg_lawsuit.py +36 -35
  122. akshare/stock/stock_dividend_cninfo.py +12 -6
  123. akshare/stock/stock_dzjy_em.py +347 -260
  124. akshare/stock/stock_fund_em.py +332 -84
  125. akshare/stock/stock_hk_famous.py +108 -0
  126. akshare/stock/stock_hk_sina.py +8 -7
  127. akshare/stock/stock_hold_control_cninfo.py +100 -15
  128. akshare/stock/stock_hold_control_em.py +4 -3
  129. akshare/stock/stock_hold_num_cninfo.py +18 -12
  130. akshare/stock/stock_hot_rank_em.py +2 -1
  131. akshare/stock/stock_hot_search_baidu.py +5 -2
  132. akshare/stock/stock_industry_cninfo.py +24 -18
  133. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  134. akshare/stock/stock_industry_sw.py +9 -10
  135. akshare/stock/stock_info.py +25 -15
  136. akshare/stock/stock_info_em.py +5 -2
  137. akshare/stock/stock_intraday_em.py +5 -2
  138. akshare/stock/stock_intraday_sina.py +22 -18
  139. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  140. akshare/stock/stock_new_cninfo.py +32 -19
  141. akshare/stock/stock_news_cx.py +39 -0
  142. akshare/stock/stock_profile_cninfo.py +9 -8
  143. akshare/stock/stock_rank_forecast.py +8 -6
  144. akshare/stock/stock_share_changes_cninfo.py +18 -14
  145. akshare/stock/stock_share_hold.py +24 -19
  146. akshare/stock/stock_summary.py +54 -26
  147. akshare/stock/stock_us_famous.py +15 -6
  148. akshare/stock/stock_us_pink.py +7 -5
  149. akshare/stock/stock_us_sina.py +15 -12
  150. akshare/stock/stock_xq.py +38 -12
  151. akshare/stock/stock_zh_a_sina.py +53 -78
  152. akshare/stock/stock_zh_b_sina.py +32 -55
  153. akshare/stock/stock_zh_kcb_report.py +11 -9
  154. akshare/stock/stock_zh_kcb_sina.py +67 -64
  155. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  156. akshare/stock_feature/stock_a_high_low.py +5 -2
  157. akshare/stock_feature/stock_a_indicator.py +12 -9
  158. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  159. akshare/stock_feature/stock_account_em.py +58 -40
  160. akshare/stock_feature/stock_analyst_em.py +36 -27
  161. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  162. akshare/stock_feature/stock_comment_em.py +118 -85
  163. akshare/stock_feature/stock_concept_futu.py +183 -0
  164. akshare/stock_feature/stock_cyq_em.py +58 -54
  165. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  166. akshare/stock_feature/stock_esg_sina.py +216 -11
  167. akshare/stock_feature/stock_fhps_em.py +60 -25
  168. akshare/stock_feature/stock_fhps_ths.py +25 -6
  169. akshare/stock_feature/stock_fund_flow.py +38 -25
  170. akshare/stock_feature/stock_gdfx_em.py +180 -95
  171. akshare/stock_feature/stock_gdhs.py +73 -49
  172. akshare/stock_feature/stock_gpzy_em.py +78 -46
  173. akshare/stock_feature/stock_hist_em.py +164 -111
  174. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  175. akshare/stock_feature/stock_hsgt_em.py +184 -452
  176. akshare/stock_feature/stock_info.py +52 -29
  177. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  178. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  179. akshare/stock_feature/stock_jgdy_em.py +41 -38
  180. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  181. akshare/stock_feature/stock_lhb_em.py +135 -71
  182. akshare/stock_feature/stock_lhb_sina.py +93 -46
  183. akshare/stock_feature/stock_margin_em.py +102 -0
  184. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  185. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  186. akshare/stock_feature/stock_market_legu.py +13 -8
  187. akshare/stock_feature/stock_pankou_em.py +72 -34
  188. akshare/stock_feature/stock_report_em.py +244 -54
  189. akshare/stock_feature/stock_research_report_em.py +48 -19
  190. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  191. akshare/stock_feature/stock_sy_em.py +86 -33
  192. akshare/stock_feature/stock_technology_ths.py +152 -120
  193. akshare/stock_feature/stock_tfp_em.py +35 -13
  194. akshare/stock_feature/stock_three_report_em.py +119 -77
  195. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  196. akshare/stock_feature/stock_value_em.py +83 -0
  197. akshare/stock_feature/stock_wencai.py +21 -9
  198. akshare/stock_feature/stock_yjyg_em.py +63 -28
  199. akshare/stock_feature/stock_zf_pg.py +61 -38
  200. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  201. akshare/stock_feature/stock_ztb_em.py +62 -40
  202. akshare/stock_fundamental/stock_finance.py +150 -58
  203. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  204. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  205. akshare/stock_fundamental/stock_notice.py +29 -15
  206. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  207. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  208. akshare/stock_fundamental/stock_register_em.py +448 -0
  209. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  210. akshare/stock_fundamental/stock_zygc.py +10 -8
  211. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  212. akshare/tool/trade_date_hist.py +4 -3
  213. akshare/utils/cons.py +10 -0
  214. akshare/utils/context.py +43 -0
  215. akshare/utils/demjson.py +2 -2
  216. akshare/utils/func.py +26 -0
  217. akshare/utils/tqdm.py +13 -3
  218. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  219. akshare-1.15.72.dist-info/RECORD +385 -0
  220. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  221. tests/test_func.py +3 -5
  222. akshare/bond/bond_futures.py +0 -50
  223. akshare/bond/bond_investing.py +0 -139
  224. akshare/crypto/crypto_hist_investing.py +0 -249
  225. akshare/fortune/fortune_it_juzi.py +0 -123
  226. akshare/futures/futures_international.py +0 -170
  227. akshare/futures/futures_news_baidu.py +0 -54
  228. akshare/futures/inventory_data.py +0 -100
  229. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  230. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  231. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  232. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  233. akshare/index/index_fear_greed_funddb.py +0 -71
  234. akshare/index/index_investing.py +0 -232
  235. akshare/sport/sport_olympic_winter.py +0 -39
  236. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  237. akshare/stock_fundamental/stock_register.py +0 -292
  238. akshare-1.12.95.dist-info/RECORD +0 -374
  239. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  240. {akshare-1.12.95.dist-info → akshare-1.15.72.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/10/23 19:00
4
+ Date: 2024/4/4 19:00
5
5
  Desc: 东方财富网-概念板-行情中心-日K-筹码分布
6
6
  https://quote.eastmoney.com/concept/sz000001.html
7
7
  """
8
+
8
9
  import json
9
10
  from datetime import datetime
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
 
15
16
  from akshare.stock_feature.stock_hist_em import code_id_map_em
16
17
 
@@ -34,6 +35,9 @@ def stock_cyq_em(symbol: str = "000001", adjust: str = "") -> pd.DataFrame:
34
35
  * @param {number} index 当前选中的K线的索引
35
36
  * @return {{x: Array.<number>, y: Array.<number>}}
36
37
  */
38
+ /**
39
+ this.range = 120;
40
+ */
37
41
  function CYQCalculator(index, klinedata) {
38
42
  var maxprice = 0;
39
43
  var minprice = 0;
@@ -222,35 +226,35 @@ def stock_cyq_em(symbol: str = "000001", adjust: str = "") -> pd.DataFrame:
222
226
  url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
223
227
  params = {
224
228
  "secid": f"{code_id_dict[symbol]}.{symbol}",
225
- 'ut': 'fa5fd1943c7b386f172d6893dbfba10b',
226
- 'fields1': 'f1,f2,f3,f4,f5,f6',
227
- 'fields2': 'f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61',
228
- 'klt': '101',
229
- 'fqt': adjust_dict[adjust],
230
- 'end': datetime.now().date().strftime("%Y%m%d"),
231
- 'lmt': '210',
232
- 'cb': 'quote_jp1',
229
+ "ut": "fa5fd1943c7b386f172d6893dbfba10b",
230
+ "fields1": "f1,f2,f3,f4,f5,f6",
231
+ "fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
232
+ "klt": "101",
233
+ "fqt": adjust_dict[adjust],
234
+ "end": datetime.now().date().strftime("%Y%m%d"),
235
+ "lmt": "210",
236
+ "cb": "quote_jp1",
233
237
  }
234
238
  r = requests.get(url, params=params)
235
239
  data_json = r.text.strip("quote_jp1(").strip(");")
236
240
  data_json = json.loads(data_json)
237
- temp_df = pd.DataFrame([item.split(",") for item in data_json['data']['klines']])
241
+ temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["klines"]])
238
242
  temp_df.columns = [
239
- 'date',
240
- 'open',
241
- 'close',
242
- 'high',
243
- 'low',
244
- 'volume',
245
- 'volume_money',
246
- 'zf',
247
- 'zdf',
248
- 'zde',
249
- 'hsl',
243
+ "date",
244
+ "open",
245
+ "close",
246
+ "high",
247
+ "low",
248
+ "volume",
249
+ "volume_money",
250
+ "zf",
251
+ "zdf",
252
+ "zde",
253
+ "hsl",
250
254
  ]
251
255
  for item in temp_df.columns[1:]:
252
256
  temp_df[item] = pd.to_numeric(temp_df[item])
253
- temp_df['index'] = range(0, len(temp_df))
257
+ temp_df["index"] = range(0, len(temp_df))
254
258
  records = temp_df.to_dict(orient="records")
255
259
  date_list = []
256
260
  benefit_part = []
@@ -263,27 +267,27 @@ def stock_cyq_em(symbol: str = "000001", adjust: str = "") -> pd.DataFrame:
263
267
  pct_90_con = []
264
268
  for i in range(0, len(records)):
265
269
  mcode = js_code.call("CYQCalculator", i, records)
266
- date_list.append(records[i]['date'])
267
- benefit_part.append(mcode['benefitPart'])
268
- avg_cost.append(mcode['avgCost'])
269
- pct_70_low.append(mcode["percentChips"]['70']['priceRange'][0])
270
- pct_70_high.append(mcode["percentChips"]['70']['priceRange'][1])
271
- pct_90_low.append(mcode["percentChips"]['90']['priceRange'][0])
272
- pct_90_high.append(mcode["percentChips"]['90']['priceRange'][1])
273
- pct_70_con.append(mcode["percentChips"]['70']['concentration'])
274
- pct_90_con.append(mcode["percentChips"]['90']['concentration'])
275
- temp_df = pd.DataFrame([
276
- date_list,
277
- benefit_part,
278
- avg_cost,
279
- pct_90_low,
280
- pct_90_high,
281
- pct_90_con,
282
- pct_70_low,
283
- pct_70_high,
284
- pct_70_con,
285
-
286
- ]
270
+ date_list.append(records[i]["date"])
271
+ benefit_part.append(mcode["benefitPart"])
272
+ avg_cost.append(mcode["avgCost"])
273
+ pct_70_low.append(mcode["percentChips"]["70"]["priceRange"][0])
274
+ pct_70_high.append(mcode["percentChips"]["70"]["priceRange"][1])
275
+ pct_90_low.append(mcode["percentChips"]["90"]["priceRange"][0])
276
+ pct_90_high.append(mcode["percentChips"]["90"]["priceRange"][1])
277
+ pct_70_con.append(mcode["percentChips"]["70"]["concentration"])
278
+ pct_90_con.append(mcode["percentChips"]["90"]["concentration"])
279
+ temp_df = pd.DataFrame(
280
+ [
281
+ date_list,
282
+ benefit_part,
283
+ avg_cost,
284
+ pct_90_low,
285
+ pct_90_high,
286
+ pct_90_con,
287
+ pct_70_low,
288
+ pct_70_high,
289
+ pct_70_con,
290
+ ]
287
291
  ).T
288
292
  temp_df.columns = [
289
293
  "日期",
@@ -296,20 +300,20 @@ def stock_cyq_em(symbol: str = "000001", adjust: str = "") -> pd.DataFrame:
296
300
  "70成本-高",
297
301
  "70集中度",
298
302
  ]
299
- temp_df['日期'] = pd.to_datetime(temp_df['日期'], errors="coerce").dt.date
300
- temp_df['获利比例'] = pd.to_numeric(temp_df['获利比例'], errors="coerce")
301
- temp_df['平均成本'] = pd.to_numeric(temp_df['平均成本'], errors="coerce")
302
- temp_df['90成本-低'] = pd.to_numeric(temp_df['90成本-低'], errors="coerce")
303
- temp_df['90成本-高'] = pd.to_numeric(temp_df['90成本-高'], errors="coerce")
304
- temp_df['90集中度'] = pd.to_numeric(temp_df['90集中度'], errors="coerce")
305
- temp_df['70成本-低'] = pd.to_numeric(temp_df['70成本-低'], errors="coerce")
306
- temp_df['70成本-高'] = pd.to_numeric(temp_df['70成本-高'], errors="coerce")
307
- temp_df['70集中度'] = pd.to_numeric(temp_df['70集中度'], errors="coerce")
303
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
304
+ temp_df["获利比例"] = pd.to_numeric(temp_df["获利比例"], errors="coerce")
305
+ temp_df["平均成本"] = pd.to_numeric(temp_df["平均成本"], errors="coerce")
306
+ temp_df["90成本-低"] = pd.to_numeric(temp_df["90成本-低"], errors="coerce")
307
+ temp_df["90成本-高"] = pd.to_numeric(temp_df["90成本-高"], errors="coerce")
308
+ temp_df["90集中度"] = pd.to_numeric(temp_df["90集中度"], errors="coerce")
309
+ temp_df["70成本-低"] = pd.to_numeric(temp_df["70成本-低"], errors="coerce")
310
+ temp_df["70成本-高"] = pd.to_numeric(temp_df["70成本-高"], errors="coerce")
311
+ temp_df["70集中度"] = pd.to_numeric(temp_df["70集中度"], errors="coerce")
308
312
  temp_df = temp_df.iloc[-90:, :].copy()
309
313
  temp_df.reset_index(inplace=True, drop=True)
310
314
  return temp_df
311
315
 
312
316
 
313
- if __name__ == '__main__':
317
+ if __name__ == "__main__":
314
318
  stock_cyq_em_df = stock_cyq_em(symbol="000001", adjust="")
315
319
  print(stock_cyq_em_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/12/19 18:00
4
+ Date: 2024/5/1 20:00
5
5
  Desc: 巨潮资讯-首页-公告查询-信息披露
6
6
  http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search
7
7
  """
8
+
8
9
  import math
9
10
  from functools import lru_cache
10
11
 
@@ -22,33 +23,34 @@ def __get_category_dict() -> dict:
22
23
  :return: dict
23
24
  :rtype: dict
24
25
  """
25
- big_dict = {'年报': 'category_ndbg_szsh',
26
- '半年报': 'category_bndbg_szsh',
27
- '一季报': 'category_yjdbg_szsh',
28
- '三季报': 'category_sjdbg_szsh',
29
- '业绩预告': 'category_yjygjxz_szsh',
30
- '权益分派': 'category_qyfpxzcs_szsh',
31
- '董事会': 'category_dshgg_szsh',
32
- '监事会': 'category_jshgg_szsh',
33
- '股东大会': 'category_gddh_szsh',
34
- '日常经营': 'category_rcjy_szsh',
35
- '公司治理': 'category_gszl_szsh',
36
- '中介报告': 'category_zj_szsh',
37
- '首发': 'category_sf_szsh',
38
- '增发': 'category_zf_szsh',
39
- '股权激励': 'category_gqjl_szsh',
40
- '配股': 'category_pg_szsh',
41
- '解禁': 'category_jj_szsh',
42
- '公司债': 'category_gszq_szsh',
43
- '可转债': 'category_kzzq_szsh',
44
- '其他融资': 'category_qtrz_szsh',
45
- '股权变动': 'category_gqbd_szsh',
46
- '补充更正': 'category_bcgz_szsh',
47
- '澄清致歉': 'category_cqdq_szsh',
48
- '风险提示': 'category_fxts_szsh',
49
- '特别处理和退市': 'category_tbclts_szsh',
50
- '退市整理期': 'category_tszlq_szsh'
51
- }
26
+ big_dict = {
27
+ "年报": "category_ndbg_szsh",
28
+ "半年报": "category_bndbg_szsh",
29
+ "一季报": "category_yjdbg_szsh",
30
+ "三季报": "category_sjdbg_szsh",
31
+ "业绩预告": "category_yjygjxz_szsh",
32
+ "权益分派": "category_qyfpxzcs_szsh",
33
+ "董事会": "category_dshgg_szsh",
34
+ "监事会": "category_jshgg_szsh",
35
+ "股东大会": "category_gddh_szsh",
36
+ "日常经营": "category_rcjy_szsh",
37
+ "公司治理": "category_gszl_szsh",
38
+ "中介报告": "category_zj_szsh",
39
+ "首发": "category_sf_szsh",
40
+ "增发": "category_zf_szsh",
41
+ "股权激励": "category_gqjl_szsh",
42
+ "配股": "category_pg_szsh",
43
+ "解禁": "category_jj_szsh",
44
+ "公司债": "category_gszq_szsh",
45
+ "可转债": "category_kzzq_szsh",
46
+ "其他融资": "category_qtrz_szsh",
47
+ "股权变动": "category_gqbd_szsh",
48
+ "补充更正": "category_bcgz_szsh",
49
+ "澄清致歉": "category_cqdq_szsh",
50
+ "风险提示": "category_fxts_szsh",
51
+ "特别处理和退市": "category_tbclts_szsh",
52
+ "退市整理期": "category_tszlq_szsh",
53
+ }
52
54
  return big_dict
53
55
 
54
56
 
@@ -74,16 +76,17 @@ def __get_stock_json(symbol: str = "沪深京") -> dict:
74
76
  url = "http://www.cninfo.com.cn/new/data/bond_stock.json"
75
77
  r = requests.get(url)
76
78
  text_json = r.json()
77
- temp_df = pd.DataFrame([item for item in text_json['stockList']])
78
- return dict(zip(temp_df['code'], temp_df['orgId']))
79
+ temp_df = pd.DataFrame([item for item in text_json["stockList"]])
80
+ return dict(zip(temp_df["code"], temp_df["orgId"]))
79
81
 
80
82
 
81
83
  def stock_zh_a_disclosure_report_cninfo(
82
- symbol: str = "000001",
83
- market: str = "沪深京",
84
- category: str = "",
85
- start_date: str = "20230618",
86
- end_date: str = "20231219"
84
+ symbol: str = "000001",
85
+ market: str = "沪深京",
86
+ keyword: str = "",
87
+ category: str = "",
88
+ start_date: str = "20230618",
89
+ end_date: str = "20231219",
87
90
  ) -> pd.DataFrame:
88
91
  """
89
92
  巨潮资讯-首页-公告查询-信息披露公告
@@ -92,7 +95,12 @@ def stock_zh_a_disclosure_report_cninfo(
92
95
  :type symbol: str
93
96
  :param market: choice of {"沪深京", "港股", "三板", "基金", "债券", "监管", "预披露"}
94
97
  :type market: str
95
- :param category: choice of {'年报', '半年报', '一季报', '三季报', '业绩预告', '权益分派', '董事会', '监事会', '股东大会', '日常经营', '公司治理', '中介报告', '首发', '增发', '股权激励', '配股', '解禁', '公司债', '可转债', '其他融资', '股权变动', '补充更正', '澄清致歉', '风险提示', '特别处理和退市', '退市整理期'}
98
+ :param keyword: 关键词
99
+ :type keyword: str
100
+ :param category: choice of {'年报', '半年报', '一季报', '三季报', '业绩预告', '权益分派',
101
+ '董事会', '监事会', '股东大会', '日常经营', '公司治理', '中介报告',
102
+ '首发', '增发', '股权激励', '配股', '解禁', '公司债', '可转债', '其他融资',
103
+ '股权变动', '补充更正', '澄清致歉', '风险提示', '特别处理和退市', '退市整理期'}
96
104
  :type category: str
97
105
  :param start_date: 开始时间
98
106
  :type start_date: str
@@ -110,6 +118,7 @@ def stock_zh_a_disclosure_report_cninfo(
110
118
  "监管": "regulator",
111
119
  "预披露": "pre_disclosure",
112
120
  }
121
+ stock_id_map = ""
113
122
  if market == "沪深京":
114
123
  stock_id_map = __get_stock_json(symbol)
115
124
  category_dict = __get_category_dict()
@@ -117,24 +126,25 @@ def stock_zh_a_disclosure_report_cninfo(
117
126
  stock_item = "" if symbol == "" else f"{symbol},{stock_id_map[symbol]}"
118
127
  category_item = "" if category == "" else f"{category_dict[category]}"
119
128
  payload = {
120
- 'pageNum': '1',
121
- 'pageSize': '30',
122
- 'column': column_map[market],
123
- 'tabName': 'fulltext',
124
- 'plate': '',
125
- 'stock': stock_item,
126
- 'searchkey': '',
127
- 'secid': '',
128
- 'category': category_item,
129
- 'trade': '',
130
- 'seDate': f'{"-".join([start_date[:4], start_date[4:6], start_date[6:]])}~{"-".join([end_date[:4], end_date[4:6], end_date[6:]])}',
131
- 'sortName': '',
132
- 'sortType': '',
133
- 'isHLtitle': 'true'
129
+ "pageNum": "1",
130
+ "pageSize": "30",
131
+ "column": column_map[market],
132
+ "tabName": "fulltext",
133
+ "plate": "",
134
+ "stock": stock_item,
135
+ "searchkey": keyword,
136
+ "secid": "",
137
+ "category": category_item,
138
+ "trade": "",
139
+ "seDate": f'{"-".join([start_date[:4], start_date[4:6], start_date[6:]])}~'
140
+ f'{"-".join([end_date[:4], end_date[4:6], end_date[6:]])}',
141
+ "sortName": "",
142
+ "sortType": "",
143
+ "isHLtitle": "true",
134
144
  }
135
- r = requests.post(url, data=payload)
145
+ r = requests.post(url, params=payload)
136
146
  text_json = r.json()
137
- page_num = math.ceil(int(text_json['totalAnnouncement']) / 30)
147
+ page_num = math.ceil(int(text_json["totalAnnouncement"]) / 30)
138
148
  big_df = pd.DataFrame()
139
149
  tqdm = get_tqdm()
140
150
  for page in tqdm(range(1, page_num + 1), leave=False):
@@ -142,27 +152,45 @@ def stock_zh_a_disclosure_report_cninfo(
142
152
  r = requests.post(url, data=payload)
143
153
  text_json = r.json()
144
154
  temp_df = pd.DataFrame(text_json["announcements"])
145
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
146
- big_df.rename(columns={
147
- "secCode": "代码",
148
- "secName": "简称",
149
- "announcementTitle": "公告标题",
150
- "announcementTime": "公告时间",
151
- }, inplace=True)
152
- big_df = big_df[["代码", "简称", "公告标题", "公告时间", 'announcementId', 'orgId']]
153
- big_df['公告时间'] = pd.to_datetime(big_df['公告时间'], unit="ms", utc=True, errors="coerce")
154
- big_df['公告时间'] = big_df['公告时间'].dt.tz_convert('Asia/Shanghai').dt.date
155
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
156
+ big_df.rename(
157
+ columns={
158
+ "secCode": "代码",
159
+ "secName": "简称",
160
+ "announcementTitle": "公告标题",
161
+ "announcementTime": "公告时间",
162
+ },
163
+ inplace=True,
164
+ )
165
+ big_df = big_df[["代码", "简称", "公告标题", "公告时间", "announcementId", "orgId"]]
166
+ big_df["公告时间"] = pd.to_datetime(
167
+ big_df["公告时间"], unit="ms", utc=True, errors="coerce"
168
+ )
169
+ big_df["公告时间"] = (
170
+ big_df["公告时间"]
171
+ .dt.tz_convert("Asia/Shanghai")
172
+ .dt.tz_localize(None)
173
+ .astype(str)
174
+ )
155
175
  url_list = []
156
- for item in zip(big_df['代码'], big_df['announcementId'], big_df['orgId'], big_df['公告时间']):
157
- url_format = f"http://www.cninfo.com.cn/new/disclosure/detail?stockCode={item[0]}&announcementId={item[1]}&orgId={item[2]}&announcementTime={item[3]}"
176
+ for item in zip(
177
+ big_df["代码"], big_df["announcementId"], big_df["orgId"], big_df["公告时间"]
178
+ ):
179
+ url_format = (
180
+ f"http://www.cninfo.com.cn/new/disclosure/detail?stockCode={item[0]}&"
181
+ f"announcementId={item[1]}&orgId={item[2]}&announcementTime={item[3]}"
182
+ )
158
183
  url_list.append(url_format)
159
- big_df['公告链接'] = url_list
184
+ big_df["公告链接"] = url_list
160
185
  big_df = big_df[["代码", "简称", "公告标题", "公告时间", "公告链接"]]
161
186
  return big_df
162
187
 
163
188
 
164
189
  def stock_zh_a_disclosure_relation_cninfo(
165
- symbol: str = "000001", market: str = "沪深京", start_date: str = "20230618", end_date: str = "20231219"
190
+ symbol: str = "000001",
191
+ market: str = "沪深京",
192
+ start_date: str = "20230618",
193
+ end_date: str = "20231219",
166
194
  ) -> pd.DataFrame:
167
195
  """
168
196
  巨潮资讯-首页-数据-预约披露调研
@@ -187,29 +215,31 @@ def stock_zh_a_disclosure_relation_cninfo(
187
215
  "监管": "regulator",
188
216
  "预披露": "pre_disclosure",
189
217
  }
218
+ stock_id_map = ""
190
219
  if market == "沪深京":
191
220
  stock_id_map = __get_stock_json(symbol)
192
221
  stock_item = "" if symbol == "" else f"{symbol},{stock_id_map[symbol]}"
193
222
  url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"
194
223
  payload = {
195
- 'pageNum': '1',
196
- 'pageSize': '30',
197
- 'column': column_map[market],
198
- 'tabName': 'relation',
199
- 'plate': '',
200
- 'stock': stock_item,
201
- 'searchkey': '',
202
- 'secid': '',
203
- 'category': '',
204
- 'trade': '',
205
- 'seDate': f'{"-".join([start_date[:4], start_date[4:6], start_date[6:]])}~{"-".join([end_date[:4], end_date[4:6], end_date[6:]])}',
206
- 'sortName': '',
207
- 'sortType': '',
208
- 'isHLtitle': 'true'
224
+ "pageNum": "1",
225
+ "pageSize": "30",
226
+ "column": column_map[market],
227
+ "tabName": "relation",
228
+ "plate": "",
229
+ "stock": stock_item,
230
+ "searchkey": "",
231
+ "secid": "",
232
+ "category": "",
233
+ "trade": "",
234
+ "seDate": f'{"-".join([start_date[:4], start_date[4:6], start_date[6:]])}~'
235
+ f'{"-".join([end_date[:4], end_date[4:6], end_date[6:]])}',
236
+ "sortName": "",
237
+ "sortType": "",
238
+ "isHLtitle": "true",
209
239
  }
210
240
  r = requests.post(url, data=payload)
211
241
  text_json = r.json()
212
- page_num = math.ceil(int(text_json['totalAnnouncement']) / 30)
242
+ page_num = math.ceil(int(text_json["totalAnnouncement"]) / 30)
213
243
  big_df = pd.DataFrame()
214
244
  tqdm = get_tqdm()
215
245
  for page in tqdm(range(1, page_num + 1), leave=False):
@@ -217,37 +247,52 @@ def stock_zh_a_disclosure_relation_cninfo(
217
247
  r = requests.post(url, data=payload)
218
248
  text_json = r.json()
219
249
  temp_df = pd.DataFrame(text_json["announcements"])
220
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
221
- big_df.rename(columns={
222
- "secCode": "代码",
223
- "secName": "简称",
224
- "announcementTitle": "公告标题",
225
- "announcementTime": "公告时间",
226
- }, inplace=True)
227
- big_df = big_df[["代码", "简称", "公告标题", "公告时间", 'announcementId', 'orgId']]
228
- big_df['公告时间'] = pd.to_datetime(big_df['公告时间'], unit="ms", utc=True, errors="coerce")
229
- big_df['公告时间'] = big_df['公告时间'].dt.tz_convert('Asia/Shanghai').dt.date
250
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
251
+ big_df.rename(
252
+ columns={
253
+ "secCode": "代码",
254
+ "secName": "简称",
255
+ "announcementTitle": "公告标题",
256
+ "announcementTime": "公告时间",
257
+ },
258
+ inplace=True,
259
+ )
260
+ big_df = big_df[["代码", "简称", "公告标题", "公告时间", "announcementId", "orgId"]]
261
+ big_df["公告时间"] = pd.to_datetime(
262
+ big_df["公告时间"], unit="ms", utc=True, errors="coerce"
263
+ )
264
+ big_df["公告时间"] = (
265
+ big_df["公告时间"]
266
+ .dt.tz_convert("Asia/Shanghai")
267
+ .dt.tz_convert(None)
268
+ .astype(str)
269
+ )
230
270
  url_list = []
231
- for item in zip(big_df['代码'], big_df['announcementId'], big_df['orgId'], big_df['公告时间']):
232
- url_format = f"http://www.cninfo.com.cn/new/disclosure/detail?stockCode={item[0]}&announcementId={item[1]}&orgId={item[2]}&announcementTime={item[3]}"
271
+ for item in zip(
272
+ big_df["代码"], big_df["announcementId"], big_df["orgId"], big_df["公告时间"]
273
+ ):
274
+ url_format = (
275
+ f"http://www.cninfo.com.cn/new/disclosure/detail?stockCode={item[0]}"
276
+ f"&announcementId={item[1]}&orgId={item[2]}&announcementTime={item[3]}"
277
+ )
233
278
  url_list.append(url_format)
234
- big_df['公告链接'] = url_list
279
+ big_df["公告链接"] = url_list
235
280
  big_df = big_df[["代码", "简称", "公告标题", "公告时间", "公告链接"]]
236
281
  return big_df
237
282
 
238
283
 
239
284
  if __name__ == "__main__":
240
285
  stock_zh_a_disclosure_report_cninfo_df = stock_zh_a_disclosure_report_cninfo(
241
- symbol="000001",
286
+ symbol="",
242
287
  market="沪深京",
243
- category="公司治理",
244
- start_date="20230619",
245
- end_date="20231220")
288
+ keyword="大模型",
289
+ category="",
290
+ start_date="20231003",
291
+ end_date="20240430",
292
+ )
246
293
  print(stock_zh_a_disclosure_report_cninfo_df)
247
294
 
248
295
  stock_zh_a_disclosure_relation_cninfo_df = stock_zh_a_disclosure_relation_cninfo(
249
- symbol="000001",
250
- market="沪深京",
251
- start_date="20230619",
252
- end_date="20231220")
296
+ symbol="000001", market="沪深京", start_date="20230619", end_date="20231220"
297
+ )
253
298
  print(stock_zh_a_disclosure_relation_cninfo_df)