akshare 1.12.99__py3-none-any.whl → 1.15.72__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of akshare might be problematic. Click here for more details.

Files changed (236) hide show
  1. akshare/__init__.py +441 -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.72.dist-info}/METADATA +52 -69
  215. akshare-1.15.72.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.72.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.72.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
@@ -1,18 +1,20 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/12 14:00
4
+ Date: 2024/10/1 17:00
5
5
  Desc: 中国外汇交易中心暨全国银行间同业拆借中心
6
6
  中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场做市报价
7
7
  中国外汇交易中心暨全国银行间同业拆借中心-市场数据-债券市场行情-现券市场成交行情
8
8
  https://www.chinamoney.com.cn/chinese/mkdatabond/
9
9
  """
10
+
10
11
  from io import StringIO
11
12
 
12
13
  import pandas as pd
13
14
  import requests
14
15
 
15
16
  from akshare.bond.bond_china_money import bond_china_close_return_map
17
+ from akshare.utils.cons import headers
16
18
 
17
19
 
18
20
  def bond_spot_quote() -> pd.DataFrame:
@@ -24,9 +26,6 @@ def bond_spot_quote() -> pd.DataFrame:
24
26
  """
25
27
  bond_china_close_return_map()
26
28
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbMktMakQuot"
27
- headers = {
28
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
29
- }
30
29
  payload = {
31
30
  "flag": "1",
32
31
  "lang": "cn",
@@ -61,16 +60,24 @@ def bond_spot_quote() -> pd.DataFrame:
61
60
  "买入/卖出收益率",
62
61
  ]
63
62
  ]
64
- temp_df["买入净价"] = temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 0]
65
- temp_df["卖出净价"] = temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 1]
66
- temp_df["买入收益率"] = temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 0]
67
- temp_df["卖出收益率"] = temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 1]
63
+ temp_df["买入净价"] = (
64
+ temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 0]
65
+ )
66
+ temp_df["卖出净价"] = (
67
+ temp_df["买入/卖出净价"].str.split("/", expand=True).iloc[:, 1]
68
+ )
69
+ temp_df["买入收益率"] = (
70
+ temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 0]
71
+ )
72
+ temp_df["卖出收益率"] = (
73
+ temp_df["买入/卖出收益率"].str.split("/", expand=True).iloc[:, 1]
74
+ )
68
75
  del temp_df["买入/卖出净价"]
69
76
  del temp_df["买入/卖出收益率"]
70
- temp_df['买入净价'] = pd.to_numeric(temp_df['买入净价'], errors="coerce")
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")
77
+ temp_df["买入净价"] = pd.to_numeric(temp_df["买入净价"], errors="coerce")
78
+ temp_df["卖出净价"] = pd.to_numeric(temp_df["卖出净价"], errors="coerce")
79
+ temp_df["买入收益率"] = pd.to_numeric(temp_df["买入收益率"], errors="coerce")
80
+ temp_df["卖出收益率"] = pd.to_numeric(temp_df["卖出收益率"], errors="coerce")
74
81
  return temp_df
75
82
 
76
83
 
@@ -82,9 +89,6 @@ def bond_spot_deal() -> pd.DataFrame:
82
89
  :rtype: pandas.DataFrame
83
90
  """
84
91
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-md-bond/CbtPri"
85
- headers = {
86
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
87
- }
88
92
  payload = {
89
93
  "flag": "1",
90
94
  "lang": "cn",
@@ -127,16 +131,16 @@ def bond_spot_deal() -> pd.DataFrame:
127
131
  "交易量",
128
132
  ]
129
133
  ]
130
- temp_df['成交净价'] = pd.to_numeric(temp_df['成交净价'], errors="coerce")
131
- temp_df['最新收益率'] = pd.to_numeric(temp_df['最新收益率'], errors="coerce")
132
- temp_df['涨跌'] = pd.to_numeric(temp_df['涨跌'], errors="coerce")
133
- temp_df['加权收益率'] = pd.to_numeric(temp_df['加权收益率'], errors="coerce")
134
- temp_df['交易量'] = pd.to_numeric(temp_df['交易量'], errors="coerce")
134
+ temp_df["成交净价"] = pd.to_numeric(temp_df["成交净价"], errors="coerce")
135
+ temp_df["最新收益率"] = pd.to_numeric(temp_df["最新收益率"], errors="coerce")
136
+ temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
137
+ temp_df["加权收益率"] = pd.to_numeric(temp_df["加权收益率"], errors="coerce")
138
+ temp_df["交易量"] = pd.to_numeric(temp_df["交易量"], errors="coerce")
135
139
  return temp_df
136
140
 
137
141
 
138
142
  def bond_china_yield(
139
- start_date: str = "20200204", end_date: str = "20210124"
143
+ start_date: str = "20200204", end_date: str = "20210124"
140
144
  ) -> pd.DataFrame:
141
145
  """
142
146
  中国债券信息网-国债及其他债券收益率曲线
@@ -152,28 +156,25 @@ def bond_china_yield(
152
156
  """
153
157
  url = "https://yield.chinabond.com.cn/cbweb-pbc-web/pbc/historyQuery"
154
158
  params = {
155
- "startDate": '-'.join([start_date[:4], start_date[4:6], start_date[6:]]),
156
- "endDate": '-'.join([end_date[:4], end_date[4:6], end_date[6:]]),
159
+ "startDate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
160
+ "endDate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
157
161
  "gjqx": "0",
158
162
  "qxId": "ycqx",
159
163
  "locale": "cn_ZH",
160
164
  }
161
- headers = {
162
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
163
- }
164
165
  res = requests.get(url, params=params, headers=headers)
165
166
  data_text = res.text.replace("&nbsp", "")
166
167
  data_df = pd.read_html(StringIO(data_text), header=0)[1]
167
- data_df['日期'] = pd.to_datetime(data_df['日期'], errors="coerce").dt.date
168
- data_df['3月'] = pd.to_numeric(data_df['3月'], errors="coerce")
169
- data_df['6月'] = pd.to_numeric(data_df['6月'], errors="coerce")
170
- data_df['1年'] = pd.to_numeric(data_df['1年'], errors="coerce")
171
- data_df['3年'] = pd.to_numeric(data_df['3年'], errors="coerce")
172
- data_df['5年'] = pd.to_numeric(data_df['5年'], errors="coerce")
173
- data_df['7年'] = pd.to_numeric(data_df['7年'], errors="coerce")
174
- data_df['10年'] = pd.to_numeric(data_df['10年'], errors="coerce")
175
- data_df['30年'] = pd.to_numeric(data_df['30年'], errors="coerce")
176
- data_df.sort_values(by='日期', inplace=True)
168
+ data_df["日期"] = pd.to_datetime(data_df["日期"], errors="coerce").dt.date
169
+ data_df["3月"] = pd.to_numeric(data_df["3月"], errors="coerce")
170
+ data_df["6月"] = pd.to_numeric(data_df["6月"], errors="coerce")
171
+ data_df["1年"] = pd.to_numeric(data_df["1年"], errors="coerce")
172
+ data_df["3年"] = pd.to_numeric(data_df["3年"], errors="coerce")
173
+ data_df["5年"] = pd.to_numeric(data_df["5年"], errors="coerce")
174
+ data_df["7年"] = pd.to_numeric(data_df["7年"], errors="coerce")
175
+ data_df["10年"] = pd.to_numeric(data_df["10年"], errors="coerce")
176
+ data_df["30年"] = pd.to_numeric(data_df["30年"], errors="coerce")
177
+ data_df.sort_values(by="日期", inplace=True)
177
178
  data_df.reset_index(inplace=True, drop=True)
178
179
  return data_df
179
180
 
@@ -185,7 +186,5 @@ if __name__ == "__main__":
185
186
  bond_spot_deal_df = bond_spot_deal()
186
187
  print(bond_spot_deal_df)
187
188
 
188
- bond_china_yield_df = bond_china_yield(
189
- start_date="20210201", end_date="20220201"
190
- )
189
+ bond_china_yield_df = bond_china_yield(start_date="20210201", end_date="20220201")
191
190
  print(bond_china_yield_df)
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/22 18:30
4
+ Date: 2024/6/27 16:00
5
5
  Desc: 收盘收益率曲线历史数据
6
6
  https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
7
7
  """
8
+
8
9
  from functools import lru_cache
9
10
 
10
11
  import pandas as pd
11
12
  import requests
13
+ from akshare.utils.tqdm import get_tqdm
12
14
 
13
15
 
14
16
  def __bond_register_service() -> requests.Session:
@@ -20,16 +22,19 @@ def __bond_register_service() -> requests.Session:
20
22
  """
21
23
  session = requests.Session()
22
24
  headers = {
23
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
24
-
25
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
26
+ "Chrome/108.0.0.0 Safari/537.36",
25
27
  }
26
- session.get(url="https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
27
- headers=headers)
28
+ session.get(
29
+ url="https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
30
+ headers=headers,
31
+ )
28
32
  cookies_dict = session.cookies.get_dict()
29
- cookies_str = '; '.join(f'{k}={v}' for k, v in cookies_dict.items())
30
- data = {
31
- "key": "c3pTblpsYU5UMFg="
32
- }
33
+ cookies_str = "; ".join(f"{k}={v}" for k, v in cookies_dict.items())
34
+ # 此处需要通过未访问的游览器,首次打开
35
+ # https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1
36
+ # 页面进行人工获取
37
+ data = {"key": "TThwSjc2NWkzV0VSOVRzOA=="}
33
38
  headers = {
34
39
  "Accept": "application/json, text/javascript, */*; q=0.01",
35
40
  "Accept-Encoding": "gzip, deflate, br",
@@ -37,7 +42,7 @@ def __bond_register_service() -> requests.Session:
37
42
  "Cache-Control": "no-cache",
38
43
  "Connection": "keep-alive",
39
44
  "Content-Length": "22",
40
- 'Cookie': cookies_str,
45
+ "Cookie": cookies_str,
41
46
  "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
42
47
  "Host": "www.chinamoney.com.cn",
43
48
  "Origin": "https://www.chinamoney.com.cn",
@@ -46,21 +51,26 @@ def __bond_register_service() -> requests.Session:
46
51
  "Sec-Fetch-Dest": "empty",
47
52
  "Sec-Fetch-Mode": "cors",
48
53
  "Sec-Fetch-Site": "same-origin",
49
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
50
- "X-Requested-With": "XMLHttpRequest"
54
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
55
+ "Chrome/108.0.0.0 Safari/537.36",
56
+ "X-Requested-With": "XMLHttpRequest",
51
57
  }
52
- session.post(url="https://www.chinamoney.com.cn/dqs/rest/cm-u-rbt/apply", data=data, headers=headers)
58
+ session.post(
59
+ url="https://www.chinamoney.com.cn/dqs/rest/cm-u-rbt/apply",
60
+ data=data,
61
+ headers=headers,
62
+ )
53
63
 
54
64
  # 20231127 新增部分 https://github.com/akfamily/akshare/issues/4299
55
65
  cookies_dict = session.cookies.get_dict()
56
- cookies_str = '; '.join(f'{k}={v}' for k, v in cookies_dict.items())
66
+ cookies_str = "; ".join(f"{k}={v}" for k, v in cookies_dict.items())
57
67
  headers = {
58
68
  "Accept": "application/json, text/javascript, /; q=0.01",
59
69
  "Accept-Encoding": "gzip, deflate, br",
60
70
  "Accept-Language": "en",
61
71
  "Connection": "keep-alive",
62
72
  "Content-Length": "0",
63
- 'Cookie': cookies_str,
73
+ "Cookie": cookies_str,
64
74
  "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
65
75
  "Host": "www.chinamoney.com.cn",
66
76
  "Origin": "https://www.chinamoney.com.cn",
@@ -68,10 +78,14 @@ def __bond_register_service() -> requests.Session:
68
78
  "Sec-Fetch-Dest": "empty",
69
79
  "Sec-Fetch-Mode": "cors",
70
80
  "Sec-Fetch-Site": "same-origin",
71
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
72
- "X-Requested-With": "XMLHttpRequest"
81
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
82
+ "Chrome/108.0.0.0 Safari/537.36",
83
+ "X-Requested-With": "XMLHttpRequest",
73
84
  }
74
- session.post(url="https://www.chinamoney.com.cn/lss/rest/cm-s-account/getSessionUser", headers=headers)
85
+ session.post(
86
+ url="https://www.chinamoney.com.cn/lss/rest/cm-s-account/getSessionUser",
87
+ headers=headers,
88
+ )
75
89
  return session
76
90
 
77
91
 
@@ -94,14 +108,15 @@ def bond_china_close_return_map() -> pd.DataFrame:
94
108
  "Origin": "https://www.chinamoney.com.cn",
95
109
  "Pragma": "no-cache",
96
110
  "Referer": "https://www.chinamoney.com.cn/chinese/bkcurvclosedyhis/?bondType=CYCC000&reference=1",
97
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
98
- "X-Requested-With": "XMLHttpRequest"
111
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
112
+ "Chrome/108.0.0.0 Safari/537.36",
113
+ "X-Requested-With": "XMLHttpRequest",
99
114
  }
100
- url = "http://www.chinamoney.com.cn/ags/ms/cm-u-bk-currency/ClsYldCurvCurvGO"
115
+ url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-currency/ClsYldCurvCurvGO"
101
116
  try:
102
117
  r = requests.get(url, headers=headers)
103
118
  data_json = r.json()
104
- except:
119
+ except: # noqa: E722
105
120
  session = __bond_register_service()
106
121
  r = session.get(url, headers=headers)
107
122
  data_json = r.json()
@@ -110,10 +125,10 @@ def bond_china_close_return_map() -> pd.DataFrame:
110
125
 
111
126
 
112
127
  def bond_china_close_return(
113
- symbol: str = "国债",
114
- period: str = "1",
115
- start_date: str = "20231101",
116
- end_date: str = "20231101",
128
+ symbol: str = "国债",
129
+ period: str = "1",
130
+ start_date: str = "20231101",
131
+ end_date: str = "20231101",
117
132
  ) -> pd.DataFrame:
118
133
  """
119
134
  收盘收益率曲线历史数据
@@ -133,17 +148,18 @@ def bond_china_close_return(
133
148
  symbol_code = name_code_df[name_code_df["cnLabel"] == symbol]["value"].values[0]
134
149
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bk-currency/ClsYldCurvHis"
135
150
  headers = {
136
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
151
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
152
+ "Chrome/108.0.0.0 Safari/537.36",
137
153
  }
138
154
  params = {
139
155
  "lang": "CN",
140
156
  "reference": "1,2,3",
141
157
  "bondType": symbol_code,
142
- "startDate": '-'.join([start_date[:4], start_date[4:6], start_date[6:]]),
143
- "endDate": '-'.join([end_date[:4], end_date[4:6], end_date[6:]]),
158
+ "startDate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
159
+ "endDate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
144
160
  "termId": period,
145
161
  "pageNum": "1",
146
- "pageSize": "15",
162
+ "pageSize": "50",
147
163
  }
148
164
  r = requests.get(url, params=params, headers=headers)
149
165
  data_json = r.json()
@@ -165,16 +181,16 @@ def bond_china_close_return(
165
181
  "远期收益率",
166
182
  ]
167
183
  ]
168
- temp_df['日期'] = pd.to_datetime(temp_df['日期'], errors='coerce').dt.date
169
- temp_df['期限'] = pd.to_numeric(temp_df['期限'], errors='coerce')
170
- temp_df['到期收益率'] = pd.to_numeric(temp_df['到期收益率'], errors='coerce')
171
- temp_df['即期收益率'] = pd.to_numeric(temp_df['即期收益率'], errors='coerce')
172
- temp_df['远期收益率'] = pd.to_numeric(temp_df['远期收益率'], errors='coerce')
184
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
185
+ temp_df["期限"] = pd.to_numeric(temp_df["期限"], errors="coerce")
186
+ temp_df["到期收益率"] = pd.to_numeric(temp_df["到期收益率"], errors="coerce")
187
+ temp_df["即期收益率"] = pd.to_numeric(temp_df["即期收益率"], errors="coerce")
188
+ temp_df["远期收益率"] = pd.to_numeric(temp_df["远期收益率"], errors="coerce")
173
189
  return temp_df
174
190
 
175
191
 
176
192
  def macro_china_swap_rate(
177
- start_date: str = "20231101", end_date: str = "20231204"
193
+ start_date: str = "20231101", end_date: str = "20231204"
178
194
  ) -> pd.DataFrame:
179
195
  """
180
196
  FR007 利率互换曲线历史数据; 只能获取近一年的数据
@@ -218,7 +234,8 @@ def macro_china_swap_rate(
218
234
  "Sec-Fetch-Dest": "empty",
219
235
  "Sec-Fetch-Mode": "cors",
220
236
  "Sec-Fetch-Site": "same-origin",
221
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
237
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
238
+ "Chrome/107.0.0.0 Safari/537.36",
222
239
  "X-Requested-With": "XMLHttpRequest",
223
240
  }
224
241
  r = requests.post(url, data=params, headers=headers)
@@ -257,7 +274,7 @@ def macro_china_swap_rate(
257
274
  "7Y",
258
275
  "10Y",
259
276
  ]
260
- big_df = pd.concat([temp_df, price_df], axis=1)
277
+ big_df = pd.concat(objs=[temp_df, price_df], axis=1)
261
278
  big_df = big_df[
262
279
  [
263
280
  "日期",
@@ -289,6 +306,7 @@ def macro_china_swap_rate(
289
306
  big_df["5Y"] = pd.to_numeric(big_df["5Y"], errors="coerce")
290
307
  big_df["7Y"] = pd.to_numeric(big_df["7Y"], errors="coerce")
291
308
  big_df["10Y"] = pd.to_numeric(big_df["10Y"], errors="coerce")
309
+ big_df.sort_values(["日期"], inplace=True, ignore_index=True)
292
310
  return big_df
293
311
 
294
312
 
@@ -302,7 +320,8 @@ def macro_china_bond_public() -> pd.DataFrame:
302
320
  bond_china_close_return_map()
303
321
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-an/bnBondEmit"
304
322
  headers = {
305
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
323
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
324
+ "Chrome/107.0.0.0 Safari/537.36",
306
325
  }
307
326
  payload = {
308
327
  "enty": "",
@@ -310,13 +329,21 @@ def macro_china_bond_public() -> pd.DataFrame:
310
329
  "bondNameCode": "",
311
330
  "leadUnderwriter": "",
312
331
  "pageNo": "1",
313
- "pageSize": "1000",
332
+ "pageSize": "10",
314
333
  "limit": "1",
315
334
  }
316
335
  r = requests.post(url, data=payload, headers=headers)
317
336
  data_json = r.json()
318
- temp_df = pd.DataFrame(data_json["records"])
319
- temp_df.columns = [
337
+ total_page = int(data_json["data"]["pageTotalSize"]) + 1
338
+ big_df = pd.DataFrame()
339
+ tqdm = get_tqdm()
340
+ for page in tqdm(range(1, total_page), leave=False):
341
+ payload.update({"pageNo": page})
342
+ r = requests.post(url, data=payload, headers=headers)
343
+ data_json = r.json()
344
+ temp_df = pd.DataFrame(data_json["records"])
345
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
346
+ big_df.columns = [
320
347
  "债券全称",
321
348
  "债券类型",
322
349
  "-",
@@ -331,7 +358,7 @@ def macro_china_bond_public() -> pd.DataFrame:
331
358
  "价格",
332
359
  "计划发行量",
333
360
  ]
334
- temp_df = temp_df[
361
+ big_df = big_df[
335
362
  [
336
363
  "债券全称",
337
364
  "债券类型",
@@ -343,19 +370,19 @@ def macro_china_bond_public() -> pd.DataFrame:
343
370
  "债券评级",
344
371
  ]
345
372
  ]
346
- temp_df["价格"] = pd.to_numeric(temp_df["价格"], errors="coerce")
347
- temp_df["计划发行量"] = pd.to_numeric(temp_df["计划发行量"], errors="coerce")
348
- return temp_df
373
+ big_df["价格"] = pd.to_numeric(big_df["价格"], errors="coerce")
374
+ big_df["计划发行量"] = pd.to_numeric(big_df["计划发行量"], errors="coerce")
375
+ return big_df
349
376
 
350
377
 
351
378
  if __name__ == "__main__":
352
379
  bond_china_close_return_df = bond_china_close_return(
353
- symbol="国债", period="1", start_date="20240101", end_date="20240112"
380
+ symbol="同业存单(AAA)", period="1", start_date="20240607", end_date="20240607"
354
381
  )
355
382
  print(bond_china_close_return_df)
356
383
 
357
384
  macro_china_swap_rate_df = macro_china_swap_rate(
358
- start_date="20240101", end_date="20240112"
385
+ start_date="20240501", end_date="20240531"
359
386
  )
360
387
  print(macro_china_swap_rate_df)
361
388
 
@@ -1,15 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/11/9 18:08
4
+ Date: 2024/5/10 14:00
5
5
  Desc: 中国外汇交易中心暨全国银行间同业拆借中心
6
6
  https://www.chinamoney.com.cn/chinese/scsjzqxx/
7
7
  """
8
+
8
9
  import functools
9
10
 
10
11
  import pandas as pd
11
12
  import requests
12
- from tqdm import tqdm
13
+ from akshare.utils.tqdm import get_tqdm
14
+ from akshare.bond.bond_china import bond_china_close_return_map
13
15
 
14
16
 
15
17
  @functools.lru_cache()
@@ -22,10 +24,12 @@ def bond_info_cm_query(symbol: str = "评级等级") -> pd.DataFrame:
22
24
  :return: 查询相关指标的参数
23
25
  :rtype: pandas.DataFrame
24
26
  """
27
+ bond_china_close_return_map()
25
28
  if symbol == "主承销商":
26
29
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/EntyFullNameSearchCondition"
27
30
  headers = {
28
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
31
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
32
+ "Chrome/109.0.0.0 Safari/537.36"
29
33
  }
30
34
  r = requests.post(url, headers=headers)
31
35
  data_json = r.json()
@@ -42,7 +46,8 @@ def bond_info_cm_query(symbol: str = "评级等级") -> pd.DataFrame:
42
46
  }
43
47
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/BondBaseInfoSearchCondition"
44
48
  headers = {
45
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
49
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
50
+ "Chrome/109.0.0.0 Safari/537.36"
46
51
  }
47
52
  r = requests.post(url, headers=headers)
48
53
  data_json = r.json()
@@ -88,6 +93,7 @@ def bond_info_cm(
88
93
  :return: 信息查询结果
89
94
  :rtype: pandas.DataFrame
90
95
  """
96
+ bond_china_close_return_map()
91
97
  if bond_type:
92
98
  bond_type_df = bond_info_cm_query(symbol="债券类型")
93
99
  bond_type_df_value = bond_type_df[bond_type_df["name"] == bond_type][
@@ -127,18 +133,20 @@ def bond_info_cm(
127
133
  "rtngShrt": grade,
128
134
  }
129
135
  headers = {
130
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
136
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
137
+ "Chrome/109.0.0.0 Safari/537.36"
131
138
  }
132
139
  r = requests.post(url, data=payload, headers=headers)
133
140
  data_json = r.json()
134
141
  total_page = data_json["data"]["pageTotal"]
135
142
  big_df = pd.DataFrame()
143
+ tqdm = get_tqdm()
136
144
  for page in tqdm(range(1, total_page + 1), leave=False):
137
145
  payload.update({"pageNo": page})
138
146
  r = requests.post(url, data=payload, headers=headers)
139
147
  data_json = r.json()
140
148
  temp_df = pd.DataFrame(data_json["data"]["resultList"])
141
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
149
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
142
150
  big_df.rename(
143
151
  columns={
144
152
  "bondDefinedCode": "查询代码",
@@ -156,7 +164,17 @@ def bond_info_cm(
156
164
  },
157
165
  inplace=True,
158
166
  )
159
- big_df = big_df[["债券简称", "债券代码", "发行人/受托机构", "债券类型", "发行日期", "最新债项评级", "查询代码"]]
167
+ big_df = big_df[
168
+ [
169
+ "债券简称",
170
+ "债券代码",
171
+ "发行人/受托机构",
172
+ "债券类型",
173
+ "发行日期",
174
+ "最新债项评级",
175
+ "查询代码",
176
+ ]
177
+ ]
160
178
  return big_df
161
179
 
162
180
 
@@ -170,12 +188,14 @@ def bond_info_detail_cm(symbol: str = "淮安农商行CDSD2022021012") -> pd.Dat
170
188
  :return: 债券详情
171
189
  :rtype: pandas.DataFrame
172
190
  """
191
+ bond_china_close_return_map()
173
192
  url = "https://www.chinamoney.com.cn/ags/ms/cm-u-bond-md/BondDetailInfo"
174
193
  inner_bond_info_cm_df = bond_info_cm(bond_name=symbol)
175
194
  bond_code = inner_bond_info_cm_df["查询代码"].values[0]
176
195
  payload = {"bondDefinedCode": bond_code}
177
196
  headers = {
178
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
197
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
198
+ "Chrome/109.0.0.0 Safari/537.36"
179
199
  }
180
200
  r = requests.post(url, data=payload, headers=headers)
181
201
  data_json = r.json()