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,56 +1,18 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/20 23:00
5
- Desc: 乘联会
6
- https://data.cpcaauto.com/FuelMarket
7
- 汽车行业制造企业数据库
8
- https://i.gasgoo.com/data/ranking
4
+ Date: 2024/4/3 19:00
5
+ Desc: 汽车行业制造企业数据库
6
+ http://i.gasgoo.com/data/ranking
9
7
  """
8
+
10
9
  import pandas as pd
11
10
  import requests
12
11
 
13
12
  from akshare.utils import demjson
14
13
 
15
14
 
16
- def car_energy_sale_cpca() -> pd.DataFrame:
17
- """
18
- 乘联会-新能源细分市场-整体市场
19
- https://data.cpcaauto.com/FuelMarket
20
- :return: 新能源细分市场-整体市场
21
- :rtype: pandas.DataFrame
22
- """
23
- url = "http://data.cpcaauto.com/api/chartlist"
24
- params = {"charttype": "6"}
25
- r = requests.get(url, params=params)
26
- data_json = r.json()
27
- temp_df = pd.DataFrame(data_json[0]["dataList"])
28
- temp_current_year_list = []
29
- temp_previous_year_list = []
30
- for item in data_json[0]["dataList"]:
31
- temp_previous_year_list.append(item[temp_df.columns[2]])
32
- try:
33
- temp_current_year_list.append(item[temp_df.columns[1]])
34
- except:
35
- continue
36
- temp_current_year_df = pd.DataFrame(temp_current_year_list)
37
- temp_previous_year_df = pd.DataFrame(temp_previous_year_list)
38
- big_df = pd.DataFrame(
39
- [temp_current_year_df.iloc[:, 2], temp_previous_year_df.iloc[:, 2]]
40
- ).T
41
- big_df.columns = [temp_df.columns[1], temp_df.columns[2]]
42
- big_df["月份"] = temp_df["month"]
43
- big_df = big_df[
44
- [
45
- "月份",
46
- temp_df.columns[2],
47
- temp_df.columns[1],
48
- ]
49
- ]
50
- return big_df
51
-
52
-
53
- def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.DataFrame:
15
+ def car_sale_rank_gasgoo(symbol: str = "车企榜", date: str = "202109") -> pd.DataFrame:
54
16
  """
55
17
  盖世汽车-汽车行业制造企业数据库-销量数据
56
18
  https://i.gasgoo.com/data/ranking
@@ -88,7 +50,8 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
88
50
  "Connection": "keep-alive",
89
51
  "Content-Length": "195",
90
52
  "Content-Type": "application/json; charset=UTF-8",
91
- "Cookie": "Hm_lvt_8e90480b1bf68ede548c407057660718=1636981448; _ga=GA1.2.858318653.1636981449; _gid=GA1.2.1448165285.1636981449; _gat=1; Hm_lpvt_8e90480b1bf68ede548c407057660718=1636982578",
53
+ "Cookie": "Hm_lvt_8e90480b1bf68ede548c407057660718=1636981448; _ga=GA1.2.858318653.1636981449; "
54
+ "_gid=GA1.2.1448165285.1636981449; _gat=1; Hm_lpvt_8e90480b1bf68ede548c407057660718=1636982578",
92
55
  "Host": "i.gasgoo.com",
93
56
  "Origin": "https://i.gasgoo.com",
94
57
  "Pragma": "no-cache",
@@ -99,7 +62,8 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
99
62
  "Sec-Fetch-Dest": "empty",
100
63
  "Sec-Fetch-Mode": "cors",
101
64
  "Sec-Fetch-Site": "same-origin",
102
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
65
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
66
+ "Chrome/95.0.4638.69 Safari/537.36",
103
67
  "X-Requested-With": "XMLHttpRequest",
104
68
  }
105
69
  r = requests.post(url, json=payload, headers=headers)
@@ -110,14 +74,11 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
110
74
 
111
75
 
112
76
  if __name__ == "__main__":
113
- car_energy_sale_cpca_df = car_energy_sale_cpca()
114
- print(car_energy_sale_cpca_df)
115
-
116
- car_gasgoo_sale_rank_df = car_gasgoo_sale_rank(symbol="品牌榜", date="202311")
117
- print(car_gasgoo_sale_rank_df)
77
+ car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="品牌榜", date="202311")
78
+ print(car_sale_rank_gasgoo_df)
118
79
 
119
- car_gasgoo_sale_rank_df = car_gasgoo_sale_rank(symbol="车型榜", date="202311")
120
- print(car_gasgoo_sale_rank_df)
80
+ car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="车型榜", date="202311")
81
+ print(car_sale_rank_gasgoo_df)
121
82
 
122
- car_gasgoo_sale_rank_df = car_gasgoo_sale_rank(symbol="车企榜", date="202311")
123
- print(car_gasgoo_sale_rank_df)
83
+ car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="车企榜", date="202311")
84
+ print(car_sale_rank_gasgoo_df)
File without changes
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding:utf-8 -*-
3
+ """
4
+ Date: 2024/10/6 17:00
5
+ Desc: 集思录-T+0 QDII
6
+ 集思录:https://www.jisilu.cn/data/qdii/#qdiie
7
+ """
8
+
9
+ import pandas as pd
10
+
11
+ from akshare.request import make_request_with_retry_json
12
+
13
+
14
+ def qdii_e_index_jsl() -> pd.DataFrame:
15
+ """
16
+ 集思录-T+0 QDII-欧美市场-欧美指数
17
+ https://www.jisilu.cn/data/qdii/#qdiia
18
+ :return: T+0 QDII-亚洲市场
19
+ :rtype: pandas.DataFrame
20
+ """
21
+ url = "https://www.jisilu.cn/data/qdii/qdii_list/E"
22
+ params = {
23
+ "___jsl": "LST___t=1728207798534",
24
+ "rp": "22",
25
+ }
26
+ data_json = make_request_with_retry_json(url, params)
27
+ temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
28
+ temp_df.rename(
29
+ columns={
30
+ "fund_id": "代码",
31
+ "fund_nm": "名称",
32
+ "price": "现价",
33
+ "increase_rt": "涨幅",
34
+ "volume": "成交",
35
+ "amount": "场内份额",
36
+ "amount_incr": "场内新增",
37
+ "fund_nav": "T-2净值",
38
+ "nav_dt": "净值日期",
39
+ "estimate_value": "T-1估值",
40
+ "last_est_dt": "估值日期",
41
+ "discount_rt": "T-1溢价率",
42
+ "index_nm": "相关标的",
43
+ "ref_increase_rt": "T-1指数涨幅",
44
+ "apply_fee": "申购费",
45
+ "redeem_fee": "赎回费",
46
+ "mt_fee": "托管费",
47
+ "issuer_nm": "基金公司",
48
+ },
49
+ inplace=True,
50
+ )
51
+ temp_df = temp_df[
52
+ [
53
+ "代码",
54
+ "名称",
55
+ "现价",
56
+ "涨幅",
57
+ "成交",
58
+ "场内份额",
59
+ "场内新增",
60
+ "T-2净值",
61
+ "净值日期",
62
+ "T-1估值",
63
+ "估值日期",
64
+ "T-1溢价率",
65
+ "相关标的",
66
+ "T-1指数涨幅",
67
+ "申购费",
68
+ "赎回费",
69
+ "托管费",
70
+ "基金公司",
71
+ ]
72
+ ]
73
+ temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
74
+ temp_df["估值日期"] = pd.to_datetime(temp_df["估值日期"], errors="coerce").dt.date
75
+ temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
76
+ 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["T-2净值"] = pd.to_numeric(temp_df["T-2净值"], errors="coerce")
80
+ temp_df["T-1估值"] = pd.to_numeric(temp_df["T-1估值"], errors="coerce")
81
+ temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
82
+ return temp_df
83
+
84
+
85
+ def qdii_e_comm_jsl() -> pd.DataFrame:
86
+ """
87
+ 集思录-T+0 QDII-欧美市场-商品
88
+ https://www.jisilu.cn/data/qdii/#qdiia
89
+ :return: T+0 QDII-欧美市场-商品
90
+ :rtype: pandas.DataFrame
91
+ """
92
+ url = "https://www.jisilu.cn/data/qdii/qdii_list/C"
93
+ params = {
94
+ "___jsl": "LST___t=1728207798534",
95
+ "rp": "22",
96
+ }
97
+ data_json = make_request_with_retry_json(url, params=params)
98
+ temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
99
+ temp_df.rename(
100
+ columns={
101
+ "fund_id": "代码",
102
+ "fund_nm": "名称",
103
+ "price": "现价",
104
+ "increase_rt": "涨幅",
105
+ "volume": "成交",
106
+ "amount": "场内份额",
107
+ "amount_incr": "场内新增",
108
+ "fund_nav": "T-2净值",
109
+ "nav_dt": "净值日期",
110
+ "estimate_value": "T-1估值",
111
+ "last_est_dt": "估值日期",
112
+ "discount_rt": "T-1溢价率",
113
+ "index_nm": "相关标的",
114
+ "ref_increase_rt": "T-1指数涨幅",
115
+ "apply_fee": "申购费",
116
+ "redeem_fee": "赎回费",
117
+ "mt_fee": "托管费",
118
+ "issuer_nm": "基金公司",
119
+ },
120
+ inplace=True,
121
+ )
122
+ temp_df = temp_df[
123
+ [
124
+ "代码",
125
+ "名称",
126
+ "现价",
127
+ "涨幅",
128
+ "成交",
129
+ "场内份额",
130
+ "场内新增",
131
+ "T-2净值",
132
+ "净值日期",
133
+ "T-1估值",
134
+ "估值日期",
135
+ "T-1溢价率",
136
+ "相关标的",
137
+ "T-1指数涨幅",
138
+ "申购费",
139
+ "赎回费",
140
+ "托管费",
141
+ "基金公司",
142
+ ]
143
+ ]
144
+ temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
145
+ temp_df["估值日期"] = pd.to_datetime(temp_df["估值日期"], errors="coerce").dt.date
146
+ temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
147
+ temp_df["成交"] = pd.to_numeric(temp_df["成交"], errors="coerce")
148
+ temp_df["场内份额"] = pd.to_numeric(temp_df["场内份额"], errors="coerce")
149
+ temp_df["场内新增"] = pd.to_numeric(temp_df["场内新增"], errors="coerce")
150
+ temp_df["T-2净值"] = pd.to_numeric(temp_df["T-2净值"], errors="coerce")
151
+ temp_df["T-1估值"] = pd.to_numeric(temp_df["T-1估值"], errors="coerce")
152
+ temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
153
+ return temp_df
154
+
155
+
156
+ def qdii_a_index_jsl() -> pd.DataFrame:
157
+ """
158
+ 集思录-T+0 QDII-亚洲市场-亚洲指数
159
+ https://www.jisilu.cn/data/qdii/#qdiia
160
+ :return: T+0 QDII-亚洲市场-亚洲指数
161
+ :rtype: pandas.DataFrame
162
+ """
163
+ url = "https://www.jisilu.cn/data/qdii/qdii_list/A"
164
+ params = {
165
+ "___jsl": "LST___t=1728206439242",
166
+ "rp": "22",
167
+ }
168
+ data_json = make_request_with_retry_json(url, params=params)
169
+ temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
170
+ temp_df.rename(
171
+ columns={
172
+ "fund_id": "代码",
173
+ "fund_nm": "名称",
174
+ "price": "现价",
175
+ "increase_rt": "涨幅",
176
+ "volume": "成交",
177
+ "amount": "场内份额",
178
+ "amount_incr": "场内新增",
179
+ "fund_nav": "净值",
180
+ "nav_dt": "净值日期",
181
+ "estimate_value": "估值",
182
+ "discount_rt": "溢价率",
183
+ "index_nm": "相关标的",
184
+ "ref_increase_rt": "指数涨幅",
185
+ "apply_fee": "申购费",
186
+ "redeem_fee": "赎回费",
187
+ "mt_fee": "托管费",
188
+ "issuer_nm": "基金公司",
189
+ },
190
+ inplace=True,
191
+ )
192
+
193
+ temp_df = temp_df[
194
+ [
195
+ "代码",
196
+ "名称",
197
+ "现价",
198
+ "涨幅",
199
+ "成交",
200
+ "场内份额",
201
+ "场内新增",
202
+ "净值",
203
+ "净值日期",
204
+ "估值",
205
+ "溢价率",
206
+ "相关标的",
207
+ "指数涨幅",
208
+ "申购费",
209
+ "赎回费",
210
+ "托管费",
211
+ "基金公司",
212
+ ]
213
+ ]
214
+ temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
215
+ temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
216
+ temp_df["成交"] = pd.to_numeric(temp_df["成交"], errors="coerce")
217
+ temp_df["场内份额"] = pd.to_numeric(temp_df["场内份额"], errors="coerce")
218
+ temp_df["场内新增"] = pd.to_numeric(temp_df["场内新增"], errors="coerce")
219
+ temp_df["净值"] = pd.to_numeric(temp_df["净值"], errors="coerce")
220
+ temp_df["估值"] = pd.to_numeric(temp_df["估值"], errors="coerce")
221
+ temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
222
+ return temp_df
223
+
224
+
225
+ if __name__ == "__main__":
226
+ qdii_e_index_jsl_df = qdii_e_index_jsl()
227
+ print(qdii_e_index_jsl_df)
228
+
229
+ qdii_e_comm_jsl_df = qdii_e_comm_jsl()
230
+ print(qdii_e_comm_jsl_df)
231
+
232
+ qdii_a_index_jsl_df = qdii_a_index_jsl()
233
+ print(qdii_a_index_jsl_df)
akshare/request.py ADDED
@@ -0,0 +1,117 @@
1
+ import time
2
+
3
+ import requests
4
+ from requests.exceptions import RequestException
5
+
6
+ from akshare.exceptions import NetworkError, APIError, RateLimitError, DataParsingError
7
+ from akshare.utils.context import config
8
+
9
+
10
+ def make_request_with_retry_json(
11
+ url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
12
+ ):
13
+ """
14
+ 发送 HTTP GET 请求,支持重试机制和代理设置。
15
+
16
+ :param url: 请求的 URL
17
+ :param params: URL 参数 (可选)
18
+ :param headers: 请求头 (可选)
19
+ :param proxies: 代理设置 (可选)
20
+ :param max_retries: 最大重试次数
21
+ :param retry_delay: 初始重试延迟(秒)
22
+ :return: 解析后的 JSON 数据
23
+ """
24
+ if proxies is None:
25
+ proxies = config.proxies
26
+ for attempt in range(max_retries):
27
+ try:
28
+ response = requests.get(
29
+ url, params=params, headers=headers, proxies=proxies
30
+ )
31
+ if response.status_code == 200:
32
+ try:
33
+ data = response.json()
34
+ if not data:
35
+ raise DataParsingError("Empty response data")
36
+ return data
37
+ except ValueError:
38
+ raise DataParsingError("Failed to parse JSON response")
39
+ elif response.status_code == 429:
40
+ raise RateLimitError(
41
+ f"Rate limit exceeded. Status code: {response.status_code}"
42
+ )
43
+ else:
44
+ raise APIError(
45
+ f"API request failed. Status code: {response.status_code}"
46
+ )
47
+
48
+ except (RequestException, RateLimitError, APIError, DataParsingError) as e:
49
+ if attempt == max_retries - 1:
50
+ if isinstance(e, RateLimitError):
51
+ raise
52
+ elif isinstance(e, (APIError, DataParsingError)):
53
+ raise
54
+ else:
55
+ raise NetworkError(
56
+ f"Failed to connect after {max_retries} attempts: {str(e)}"
57
+ )
58
+
59
+ time.sleep(retry_delay)
60
+ retry_delay *= 2 # 指数退避策略
61
+
62
+ raise NetworkError(f"Failed to connect after {max_retries} attempts")
63
+
64
+
65
+ def make_request_with_retry_text(
66
+ url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
67
+ ):
68
+ """
69
+ 发送 HTTP GET 请求,支持重试机制和代理设置。
70
+
71
+ :param url: 请求的 URL
72
+ :param params: URL 参数 (可选)
73
+ :param headers: 请求头 (可选)
74
+ :param proxies: 代理设置 (可选)
75
+ :param max_retries: 最大重试次数
76
+ :param retry_delay: 初始重试延迟(秒)
77
+ :return: 解析后的 JSON 数据
78
+ """
79
+ if proxies is None:
80
+ proxies = config.proxies
81
+ for attempt in range(max_retries):
82
+ try:
83
+ response = requests.get(
84
+ url, params=params, headers=headers, proxies=proxies
85
+ )
86
+ if response.status_code == 200:
87
+ try:
88
+ data = response.text
89
+ if not data:
90
+ raise DataParsingError("Empty response data")
91
+ return data
92
+ except ValueError:
93
+ raise DataParsingError("Failed to parse JSON response")
94
+ elif response.status_code == 429:
95
+ raise RateLimitError(
96
+ f"Rate limit exceeded. Status code: {response.status_code}"
97
+ )
98
+ else:
99
+ raise APIError(
100
+ f"API request failed. Status code: {response.status_code}"
101
+ )
102
+
103
+ except (RequestException, RateLimitError, APIError, DataParsingError) as e:
104
+ if attempt == max_retries - 1:
105
+ if isinstance(e, RateLimitError):
106
+ raise
107
+ elif isinstance(e, (APIError, DataParsingError)):
108
+ raise
109
+ else:
110
+ raise NetworkError(
111
+ f"Failed to connect after {max_retries} attempts: {str(e)}"
112
+ )
113
+
114
+ time.sleep(retry_delay)
115
+ retry_delay *= 2 # 指数退避策略
116
+
117
+ raise NetworkError(f"Failed to connect after {max_retries} attempts")