akshare 1.14.49__py3-none-any.whl → 1.17.99__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.
Files changed (343) hide show
  1. akshare/__init__.py +595 -129
  2. akshare/air/air_hebei.py +77 -54
  3. akshare/air/air_zhenqi.py +0 -4
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/article/cons.py +1 -0
  8. akshare/article/epu_index.py +4 -3
  9. akshare/article/ff_factor.py +19 -8
  10. akshare/article/fred_md.py +4 -1
  11. akshare/article/risk_rv.py +3 -8
  12. akshare/bank/bank_cbirc_2020.py +11 -11
  13. akshare/bank/cons.py +7 -6
  14. akshare/bond/bond_buy_back_em.py +228 -0
  15. akshare/bond/bond_cb_sina.py +1 -0
  16. akshare/bond/bond_cb_ths.py +17 -9
  17. akshare/bond/bond_cbond.py +19 -14
  18. akshare/bond/bond_china.py +38 -39
  19. akshare/bond/bond_china_money.py +1 -1
  20. akshare/bond/bond_convert.py +10 -9
  21. akshare/bond/bond_em.py +37 -17
  22. akshare/bond/bond_summary.py +38 -37
  23. akshare/bond/bond_zh_cov.py +31 -40
  24. akshare/bond/bond_zh_sina.py +4 -0
  25. akshare/bond/cons.py +14 -11
  26. akshare/cal/__init__.py +0 -0
  27. akshare/cal/rv.py +170 -0
  28. akshare/cost/cost_living.py +7 -5
  29. akshare/crypto/__init__.py +1 -1
  30. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  31. akshare/crypto/crypto_hold.py +4 -2
  32. akshare/currency/currency.py +1 -0
  33. akshare/currency/currency_china_bank_sina.py +11 -6
  34. akshare/data/__init__.py +1 -1
  35. akshare/data/cninfo.js +1 -1
  36. akshare/datasets.py +10 -21
  37. akshare/economic/cons.py +10 -3
  38. akshare/economic/macro_australia.py +74 -69
  39. akshare/economic/macro_bank.py +95 -653
  40. akshare/economic/macro_canada.py +92 -81
  41. akshare/economic/macro_china.py +97 -105
  42. akshare/economic/macro_china_hk.py +0 -1
  43. akshare/economic/macro_euro.py +103 -56
  44. akshare/economic/macro_finance_ths.py +7 -5
  45. akshare/economic/macro_germany.py +1 -1
  46. akshare/economic/macro_japan.py +0 -1
  47. akshare/economic/macro_other.py +1 -6
  48. akshare/economic/macro_swiss.py +2 -3
  49. akshare/economic/macro_uk.py +1 -1
  50. akshare/economic/macro_usa.py +7 -9
  51. akshare/economic/marco_cnbs.py +11 -6
  52. akshare/energy/energy_carbon.py +0 -1
  53. akshare/energy/energy_oil_em.py +1 -2
  54. akshare/event/cons.py +1 -0
  55. akshare/exceptions.py +43 -0
  56. akshare/file_fold/calendar.json +245 -2
  57. akshare/forex/__init__.py +0 -0
  58. akshare/forex/cons.py +192 -0
  59. akshare/forex/forex_em.py +149 -0
  60. akshare/fortune/fortune_500.py +1 -37
  61. akshare/fortune/fortune_bloomberg.py +6 -3
  62. akshare/fortune/fortune_forbes_500.py +3 -6
  63. akshare/fortune/fortune_hurun.py +2 -1
  64. akshare/fortune/fortune_xincaifu_500.py +17 -14
  65. akshare/fund/fund_announcement_em.py +145 -0
  66. akshare/fund/fund_aum_em.py +49 -35
  67. akshare/fund/fund_em.py +251 -220
  68. akshare/fund/fund_etf_em.py +44 -35
  69. akshare/fund/fund_etf_sina.py +75 -27
  70. akshare/fund/fund_etf_ths.py +2 -0
  71. akshare/fund/fund_fee_em.py +172 -0
  72. akshare/fund/fund_fhsp_em.py +42 -32
  73. akshare/fund/fund_init_em.py +8 -5
  74. akshare/fund/fund_lof_em.py +12 -19
  75. akshare/fund/fund_manager.py +25 -11
  76. akshare/fund/fund_overview_em.py +42 -0
  77. akshare/fund/fund_portfolio_em.py +23 -21
  78. akshare/fund/fund_position_lg.py +19 -8
  79. akshare/fund/fund_rank_em.py +2 -5
  80. akshare/fund/fund_rating.py +33 -12
  81. akshare/fund/fund_scale_em.py +24 -13
  82. akshare/fund/fund_scale_sina.py +20 -10
  83. akshare/fund/fund_xq.py +3 -2
  84. akshare/futures/cons.py +135 -39
  85. akshare/futures/cot.py +55 -56
  86. akshare/futures/futures_basis.py +49 -11
  87. akshare/futures/futures_comex_em.py +1 -0
  88. akshare/futures/futures_comm_ctp.py +1 -1
  89. akshare/futures/futures_contract_detail.py +59 -9
  90. akshare/futures/futures_daily_bar.py +66 -59
  91. akshare/futures/futures_foreign.py +14 -8
  92. akshare/futures/futures_hf_em.py +215 -61
  93. akshare/futures/futures_hist_em.py +191 -0
  94. akshare/futures/futures_hq_sina.py +5 -3
  95. akshare/futures/futures_index_ccidx.py +24 -82
  96. akshare/futures/futures_inventory_99.py +70 -272
  97. akshare/futures/futures_inventory_em.py +14 -11
  98. akshare/futures/futures_news_shmet.py +2 -2
  99. akshare/futures/futures_roll_yield.py +11 -24
  100. akshare/futures/futures_rule.py +7 -3
  101. akshare/futures/futures_rule_em.py +38 -0
  102. akshare/futures/futures_settlement_price_sgx.py +21 -6
  103. akshare/futures/futures_stock_js.py +0 -1
  104. akshare/futures/futures_to_spot.py +5 -6
  105. akshare/futures/futures_warehouse_receipt.py +48 -47
  106. akshare/futures/futures_zh_sina.py +3 -3
  107. akshare/futures/receipt.py +298 -165
  108. akshare/futures/requests_fun.py +16 -3
  109. akshare/futures/symbol_var.py +32 -13
  110. akshare/futures_derivative/cons.py +100 -103
  111. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  112. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  113. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  114. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  115. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  116. akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
  117. akshare/futures_derivative/futures_cot_sina.py +8 -6
  118. akshare/futures_derivative/futures_index_sina.py +25 -13
  119. akshare/fx/cons.py +12 -7
  120. akshare/fx/fx_c_swap_cm.py +62 -0
  121. akshare/fx/fx_quote.py +3 -2
  122. akshare/fx/fx_quote_baidu.py +2 -1
  123. akshare/hf/__init__.py +1 -1
  124. akshare/hf/hf_sp500.py +8 -7
  125. akshare/index/cons.py +132 -28
  126. akshare/index/index_cni.py +7 -7
  127. akshare/index/index_cons.py +2 -2
  128. akshare/index/index_csindex.py +68 -0
  129. akshare/index/index_cx.py +20 -20
  130. akshare/index/index_drewry.py +17 -16
  131. akshare/index/index_eri.py +1 -0
  132. akshare/index/index_global_em.py +167 -0
  133. akshare/index/index_global_sina.py +82 -0
  134. akshare/index/index_kq_fz.py +17 -14
  135. akshare/index/index_kq_ss.py +1 -0
  136. akshare/index/index_option_qvix.py +351 -16
  137. akshare/index/index_research_sw.py +21 -21
  138. akshare/index/index_spot.py +9 -5
  139. akshare/index/index_stock_hk.py +5 -9
  140. akshare/index/index_stock_zh.py +111 -24
  141. akshare/index/index_stock_zh_csindex.py +3 -367
  142. akshare/index/index_sugar.py +18 -4
  143. akshare/index/index_sw.py +10 -2
  144. akshare/index/index_yw.py +53 -75
  145. akshare/index/index_zh_em.py +15 -82
  146. akshare/interest_rate/interbank_rate_em.py +0 -1
  147. akshare/movie/jm.js +0 -1
  148. akshare/news/__init__.py +1 -1
  149. akshare/news/news_baidu.py +395 -222
  150. akshare/news/news_stock.py +49 -16
  151. akshare/option/cons.py +2 -2
  152. akshare/option/option_commodity.py +341 -220
  153. akshare/option/option_commodity_sina.py +22 -26
  154. akshare/option/option_contract_info_ctp.py +63 -0
  155. akshare/option/option_current_sse.py +61 -0
  156. akshare/option/option_current_szse.py +84 -0
  157. akshare/option/option_czce.py +37 -9
  158. akshare/option/option_daily_stats_sse_szse.py +0 -1
  159. akshare/option/option_em.py +4 -8
  160. akshare/option/option_finance.py +60 -12
  161. akshare/option/option_finance_sina.py +7 -7
  162. akshare/option/option_lhb_em.py +0 -1
  163. akshare/option/option_margin.py +62 -0
  164. akshare/option/option_premium_analysis_em.py +58 -53
  165. akshare/option/option_risk_analysis_em.py +11 -8
  166. akshare/option/option_risk_indicator_sse.py +3 -4
  167. akshare/option/option_value_analysis_em.py +62 -55
  168. akshare/other/__init__.py +1 -1
  169. akshare/pro/__init__.py +0 -1
  170. akshare/pro/client.py +6 -4
  171. akshare/pro/cons.py +3 -2
  172. akshare/pro/data_pro.py +6 -5
  173. akshare/qdii/__init__.py +0 -0
  174. akshare/qdii/qdii_jsl.py +233 -0
  175. akshare/qhkc/__init__.py +1 -6
  176. akshare/qhkc/qhkc_api.py +64 -22
  177. akshare/qhkc_web/__init__.py +1 -6
  178. akshare/qhkc_web/qhkc_fund.py +10 -6
  179. akshare/qhkc_web/qhkc_index.py +28 -14
  180. akshare/qhkc_web/qhkc_tool.py +62 -59
  181. akshare/rate/__init__.py +1 -1
  182. akshare/rate/repo_rate.py +36 -32
  183. akshare/reits/__init__.py +1 -1
  184. akshare/reits/reits_basic.py +149 -13
  185. akshare/request.py +117 -0
  186. akshare/spot/__init__.py +1 -1
  187. akshare/spot/spot_hog_soozhu.py +165 -3
  188. akshare/spot/spot_sge.py +70 -9
  189. akshare/stock/cons.py +60 -23
  190. akshare/stock/stock_allotment_cninfo.py +8 -8
  191. akshare/stock/stock_ask_bid_em.py +3 -78
  192. akshare/stock/stock_board_concept_em.py +160 -35
  193. akshare/stock/stock_board_industry_em.py +163 -70
  194. akshare/stock/stock_dividend_cninfo.py +31 -17
  195. akshare/stock/stock_dzjy_em.py +347 -260
  196. akshare/stock/stock_fund_em.py +72 -64
  197. akshare/stock/stock_fund_hold.py +1 -2
  198. akshare/stock/stock_gsrl_em.py +1 -0
  199. akshare/stock/stock_hk_comparison_em.py +175 -0
  200. akshare/stock/stock_hk_famous.py +4 -5
  201. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  202. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  203. akshare/stock/stock_hk_sina.py +84 -36
  204. akshare/stock/stock_hold_control_cninfo.py +82 -0
  205. akshare/stock/stock_hold_control_em.py +0 -2
  206. akshare/stock/stock_hot_rank_em.py +4 -1
  207. akshare/stock/stock_hot_search_baidu.py +32 -19
  208. akshare/stock/stock_hot_up_em.py +4 -1
  209. akshare/stock/stock_hsgt_em.py +155 -0
  210. akshare/stock/stock_industry.py +1 -0
  211. akshare/stock/stock_industry_cninfo.py +1 -2
  212. akshare/stock/stock_info.py +6 -4
  213. akshare/stock/stock_info_em.py +17 -11
  214. akshare/stock/stock_intraday_em.py +4 -78
  215. akshare/stock/stock_intraday_sina.py +2 -2
  216. akshare/stock/stock_news_cx.py +39 -0
  217. akshare/stock/stock_profile_cninfo.py +7 -7
  218. akshare/stock/stock_profile_em.py +302 -0
  219. akshare/stock/stock_rank_forecast.py +6 -5
  220. akshare/stock/stock_repurchase_em.py +7 -2
  221. akshare/stock/stock_share_changes_cninfo.py +7 -5
  222. akshare/stock/stock_share_hold.py +24 -20
  223. akshare/stock/stock_stop.py +6 -6
  224. akshare/stock/stock_summary.py +153 -417
  225. akshare/stock/stock_us_famous.py +5 -6
  226. akshare/stock/stock_us_js.py +3 -2
  227. akshare/stock/stock_us_pink.py +38 -27
  228. akshare/stock/stock_us_sina.py +7 -3
  229. akshare/stock/stock_weibo_nlp.py +18 -20
  230. akshare/stock/stock_xq.py +24 -22
  231. akshare/stock/stock_zh_a_sina.py +8 -5
  232. akshare/stock/stock_zh_a_special.py +240 -243
  233. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  234. akshare/stock/stock_zh_ah_tx.py +23 -26
  235. akshare/stock/stock_zh_b_sina.py +2 -2
  236. akshare/stock/stock_zh_comparison_em.py +250 -0
  237. akshare/stock/stock_zh_kcb_sina.py +67 -64
  238. akshare/stock_a/__init__.py +0 -0
  239. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  240. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  241. akshare/stock_a/stock_zh_a_spot.py +212 -0
  242. akshare/stock_feature/cons.py +1 -0
  243. akshare/stock_feature/stock_a_indicator.py +9 -54
  244. akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
  245. akshare/stock_feature/stock_account_em.py +0 -1
  246. akshare/stock_feature/stock_all_pb.py +2 -1
  247. akshare/stock_feature/stock_analyst_em.py +36 -30
  248. akshare/stock_feature/stock_board_concept_ths.py +328 -0
  249. akshare/stock_feature/stock_board_industry_ths.py +57 -2
  250. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  251. akshare/stock_feature/stock_classify_sina.py +3 -6
  252. akshare/stock_feature/stock_comment_em.py +81 -144
  253. akshare/stock_feature/stock_congestion_lg.py +2 -1
  254. akshare/stock_feature/stock_cyq_em.py +5 -11
  255. akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
  256. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  257. akshare/stock_feature/stock_ebs_lg.py +5 -4
  258. akshare/stock_feature/stock_esg_sina.py +29 -7
  259. akshare/stock_feature/stock_fhps_em.py +2 -1
  260. akshare/stock_feature/stock_fhps_ths.py +15 -7
  261. akshare/stock_feature/stock_fund_flow.py +30 -22
  262. akshare/stock_feature/stock_gddh_em.py +19 -11
  263. akshare/stock_feature/stock_gdfx_em.py +226 -113
  264. akshare/stock_feature/stock_gdhs.py +75 -50
  265. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  266. akshare/stock_feature/stock_gpzy_em.py +78 -46
  267. akshare/stock_feature/stock_gxl_lg.py +3 -2
  268. akshare/stock_feature/stock_hist_em.py +137 -234
  269. akshare/stock_feature/stock_hist_tx.py +13 -10
  270. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  271. akshare/stock_feature/stock_hot_xq.py +4 -6
  272. akshare/stock_feature/stock_hsgt_em.py +269 -97
  273. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  274. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  275. akshare/stock_feature/stock_info.py +7 -80
  276. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  277. akshare/stock_feature/stock_jgdy_em.py +43 -40
  278. akshare/stock_feature/stock_lhb_em.py +119 -3
  279. akshare/stock_feature/stock_margin_em.py +0 -1
  280. akshare/stock_feature/stock_margin_sse.py +0 -2
  281. akshare/stock_feature/stock_pankou_em.py +71 -35
  282. akshare/stock_feature/stock_qsjy_em.py +13 -4
  283. akshare/stock_feature/stock_report_em.py +151 -7
  284. akshare/stock_feature/stock_research_report_em.py +55 -20
  285. akshare/stock_feature/stock_sy_em.py +20 -15
  286. akshare/stock_feature/stock_technology_ths.py +122 -77
  287. akshare/stock_feature/stock_tfp_em.py +2 -1
  288. akshare/stock_feature/stock_three_report_em.py +21 -5
  289. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  290. akshare/stock_feature/stock_value_em.py +83 -0
  291. akshare/stock_feature/stock_yjbb_em.py +58 -32
  292. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  293. akshare/stock_feature/stock_yjyg_em.py +1 -1
  294. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  295. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  296. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  297. akshare/stock_feature/stock_ztb_em.py +39 -24
  298. akshare/stock_fundamental/__init__.py +1 -1
  299. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  300. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  301. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
  302. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  303. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  304. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  305. akshare/stock_fundamental/stock_hold.py +26 -17
  306. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  307. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  308. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  309. akshare/stock_fundamental/stock_notice.py +12 -3
  310. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  311. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  312. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  313. akshare/stock_fundamental/stock_recommend.py +20 -4
  314. akshare/stock_fundamental/stock_zygc.py +5 -62
  315. akshare/utils/context.py +43 -0
  316. akshare/utils/demjson.py +2009 -1338
  317. akshare/utils/func.py +49 -2
  318. akshare/utils/multi_decrypt.py +53 -0
  319. akshare/utils/token_process.py +6 -5
  320. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
  321. akshare-1.17.99.dist-info/RECORD +409 -0
  322. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  323. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  324. tests/test_func.py +3 -5
  325. akshare/bond/bond_futures.py +0 -50
  326. akshare/bond/bond_investing.py +0 -139
  327. akshare/crypto/crypto_hist_investing.py +0 -249
  328. akshare/fund/fund_announcement.py +0 -56
  329. akshare/futures/futures_international.py +0 -170
  330. akshare/futures/futures_news_baidu.py +0 -54
  331. akshare/futures/inventory_data.py +0 -100
  332. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  333. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  334. akshare/futures_derivative/futures_index_volatility_nh.py +0 -53
  335. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  336. akshare/index/index_fear_greed_funddb.py +0 -78
  337. akshare/index/index_investing.py +0 -232
  338. akshare/sport/__init__.py +0 -6
  339. akshare/sport/sport_olympic.py +0 -27
  340. akshare/stock_feature/stock_wencai.py +0 -104
  341. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  342. akshare-1.14.49.dist-info/RECORD +0 -387
  343. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding:utf-8 -*-
3
+ """
4
+ Date: 2025/6/23 15:00
5
+ Desc: 东方财富网-行情中心-外汇市场-所有汇率
6
+ https://quote.eastmoney.com/center/gridlist.html#forex_all
7
+ """
8
+
9
+ import pandas as pd
10
+ import requests
11
+
12
+ from akshare.forex.cons import symbol_market_map
13
+ from akshare.utils.func import fetch_paginated_data
14
+
15
+
16
+ def forex_spot_em() -> pd.DataFrame:
17
+ """
18
+ 东方财富网-行情中心-外汇市场-所有汇率-实时行情数据
19
+ https://quote.eastmoney.com/center/gridlist.html#forex_all
20
+ :return: 实时行情数据
21
+ :rtype: pandas.DataFrame
22
+ """
23
+ url = "https://push2.eastmoney.com/api/qt/clist/get"
24
+ params = {
25
+ "np": "1",
26
+ "fltt": "2",
27
+ "invt": "2",
28
+ "fs": "m:119,m:120,m:133",
29
+ "fields": "f12,f13,f14,f1,f2,f4,f3,f152,f17,f18,f15,f16",
30
+ "fid": "f3",
31
+ "pn": "1",
32
+ "pz": "100",
33
+ "po": "1",
34
+ "dect": "1",
35
+ "wbp2u": "|0|0|0|web",
36
+ }
37
+ temp_df = fetch_paginated_data(url, params)
38
+ temp_df.rename(
39
+ columns={
40
+ "index": "序号",
41
+ "f12": "代码",
42
+ "f14": "名称",
43
+ "f17": "今开",
44
+ "f4": "涨跌额",
45
+ "f3": "涨跌幅",
46
+ "f2": "最新价",
47
+ "f15": "最高",
48
+ "f16": "最低",
49
+ "f18": "昨收",
50
+ },
51
+ inplace=True,
52
+ )
53
+ temp_df = temp_df[
54
+ [
55
+ "序号",
56
+ "代码",
57
+ "名称",
58
+ "最新价",
59
+ "涨跌额",
60
+ "涨跌幅",
61
+ "今开",
62
+ "最高",
63
+ "最低",
64
+ "昨收",
65
+ ]
66
+ ]
67
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
68
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
69
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
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")
74
+ return temp_df
75
+
76
+
77
+ def forex_hist_em(symbol: str = "USDCNH") -> pd.DataFrame:
78
+ """
79
+ 东方财富网-行情中心-外汇市场-所有汇率-历史行情数据
80
+ https://quote.eastmoney.com/cnyrate/EURCNYC.html
81
+ :param symbol: 品种代码;可以通过 ak.forex_spot_em() 来获取所有可获取历史行情数据的品种代码
82
+ :type symbol: str
83
+ :return: 历史行情数据
84
+ :rtype: pandas.DataFrame
85
+ """
86
+ url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
87
+ market_code = symbol_market_map[symbol]
88
+ params = {
89
+ "secid": f"{market_code}.{symbol}",
90
+ "klt": "101",
91
+ "fqt": "1",
92
+ "lmt": "50000",
93
+ "end": "20500000",
94
+ "iscca": "1",
95
+ "fields1": "f1,f2,f3,f4,f5,f6,f7,f8",
96
+ "fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64",
97
+ "ut": "f057cbcbce2a86e2866ab8877db1d059",
98
+ "forcect": 1,
99
+ }
100
+ r = requests.get(url, params=params)
101
+ data_json = r.json()
102
+ temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["klines"]])
103
+ temp_df["code"] = data_json["data"]["code"]
104
+ temp_df["name"] = data_json["data"]["name"]
105
+ temp_df.columns = [
106
+ "日期",
107
+ "今开",
108
+ "最新价",
109
+ "最高",
110
+ "最低",
111
+ "-",
112
+ "-",
113
+ "振幅",
114
+ "-",
115
+ "-",
116
+ "-",
117
+ "-",
118
+ "-",
119
+ "-",
120
+ "代码",
121
+ "名称",
122
+ ]
123
+ temp_df = temp_df[
124
+ [
125
+ "日期",
126
+ "代码",
127
+ "名称",
128
+ "今开",
129
+ "最新价",
130
+ "最高",
131
+ "最低",
132
+ "振幅",
133
+ ]
134
+ ]
135
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
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")
139
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
140
+ temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
141
+ return temp_df
142
+
143
+
144
+ if __name__ == "__main__":
145
+ forex_spot_em_df = forex_spot_em()
146
+ print(forex_spot_em_df)
147
+
148
+ forex_hist_em_df = forex_hist_em(symbol="USDCNH")
149
+ print(forex_hist_em_df)
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/11 17:22
4
+ Date: 2024/8/4 17:22
5
5
  Desc: 历年世界 500 强榜单数据
6
6
  https://www.fortunechina.com/fortune500/index.htm
7
7
  特殊情况说明:
8
8
  2010年由于网页端没有公布公司所属的国家, 故 2010 年数据没有国家这列
9
9
  """
10
10
 
11
- import json
12
11
  from functools import lru_cache
13
12
  from io import StringIO
14
13
 
@@ -69,42 +68,7 @@ def fortune_rank(year: str = "2015") -> pd.DataFrame:
69
68
  return df
70
69
 
71
70
 
72
- def fortune_rank_eng(year: str = "2023") -> pd.DataFrame:
73
- """
74
- 注意你的网速
75
- https://fortune.com/ranking/global500/
76
- https://fortune.com/global500/2012/search/
77
- :param year: "1995"
78
- :type year: str
79
- :return: 历年排名
80
- :rtype: pandas.DataFrame
81
- """
82
- url = f"https://fortune.com/ranking/global500/{year}/search/"
83
- r = requests.get(url)
84
- soup = BeautifulSoup(r.text, features="lxml")
85
- code = json.loads(
86
- soup.find(name="script", attrs={"type": "application/ld+json"}).string
87
- )["identifier"]
88
- url = "https://content.fortune.com/wp-json/irving/v1/data/franchise-search-results"
89
- params = {
90
- "list_id": code,
91
- "token": "Zm9ydHVuZTpCcHNyZmtNZCN5SndjWkkhNHFqMndEOTM=",
92
- }
93
- r = requests.get(url, params=params)
94
- big_df = pd.DataFrame()
95
- for i in range(len(r.json()[1]["items"][0]["fields"])):
96
- temp_df = pd.DataFrame([item["fields"][i] for item in r.json()[1]["items"]])
97
- big_df[temp_df["key"].values[0]] = temp_df["value"]
98
- big_df["rank"] = big_df["rank"].astype(int)
99
- big_df.sort_values(by="rank", inplace=True)
100
- big_df.reset_index(drop=True, inplace=True)
101
- return big_df
102
-
103
-
104
71
  if __name__ == "__main__":
105
- fortune_rank_eng_df = fortune_rank_eng(year="2022")
106
- print(fortune_rank_eng_df)
107
-
108
72
  fortune_rank_df = fortune_rank(year="2023") # 2010 不一样
109
73
  print(fortune_rank_df)
110
74
 
@@ -5,6 +5,7 @@ Date: 2022/4/10 18:24
5
5
  Desc: 彭博亿万富豪指数
6
6
  https://www.bloomberg.com/billionaires/
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
  from bs4 import BeautifulSoup
@@ -34,8 +35,8 @@ def index_bloomberg_billionaires_hist(year: str = "2021") -> pd.DataFrame:
34
35
  for dic_key in dic_keys:
35
36
  dic[dic_key] = []
36
37
 
37
- for l in trs:
38
- item = l.findAll("td")
38
+ for ll in trs:
39
+ item = ll.findAll("td")
39
40
  for i in range(len(item)):
40
41
  v = item[i].text
41
42
  if i == 0 and not v.isdigit():
@@ -110,5 +111,7 @@ if __name__ == "__main__":
110
111
  index_bloomberg_billionaires_df = index_bloomberg_billionaires()
111
112
  print(index_bloomberg_billionaires_df)
112
113
 
113
- index_bloomberg_billionaires_hist_df = index_bloomberg_billionaires_hist(year="2021")
114
+ index_bloomberg_billionaires_hist_df = index_bloomberg_billionaires_hist(
115
+ year="2021"
116
+ )
114
117
  print(index_bloomberg_billionaires_hist_df)
@@ -5,6 +5,7 @@ Date: 2022/1/26 15:10
5
5
  Desc: 福布斯中国-榜单
6
6
  https://www.forbeschina.com/lists
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
  from bs4 import BeautifulSoup
@@ -24,8 +25,7 @@ def forbes_rank(symbol: str = "2021福布斯中国创投人100") -> pd.DataFrame
24
25
  r = requests.get(url, verify=False)
25
26
  soup = BeautifulSoup(r.text, "lxml")
26
27
  need_list = [
27
- item.find_all("a")
28
- for item in soup.find_all("div", attrs={"class": "col-sm-4"})
28
+ item.find_all("a") for item in soup.find_all("div", attrs={"class": "col-sm-4"})
29
29
  ]
30
30
  all_list = []
31
31
  for item in need_list:
@@ -33,10 +33,7 @@ def forbes_rank(symbol: str = "2021福布斯中国创投人100") -> pd.DataFrame
33
33
  name_url_dict = dict(
34
34
  zip(
35
35
  [item.text.strip() for item in all_list],
36
- [
37
- "https://www.forbeschina.com" + item["href"]
38
- for item in all_list
39
- ],
36
+ ["https://www.forbeschina.com" + item["href"] for item in all_list],
40
37
  )
41
38
  )
42
39
  r = requests.get(name_url_dict[symbol], verify=False)
@@ -5,6 +5,7 @@ Date: 2023/12/22 20:00
5
5
  Desc: 胡润排行榜
6
6
  https://www.hurun.net/
7
7
  """
8
+
8
9
  import warnings
9
10
 
10
11
  import pandas as pd
@@ -76,7 +77,7 @@ def hurun_rank(indicator: str = "胡润百富榜", year: str = "2023") -> pd.Dat
76
77
  temp_df = pd.DataFrame(data_json["rows"])
77
78
  offset = offset + 20
78
79
  big_df = pd.concat([big_df, temp_df], ignore_index=True)
79
- except requests.exceptions.JSONDecodeError as e:
80
+ except requests.exceptions.JSONDecodeError:
80
81
  offset = offset + 40
81
82
  continue
82
83
  big_df.rename(
@@ -5,6 +5,7 @@ Date: 2022/10/30 21:12
5
5
  Desc: 新财富 500 人富豪榜
6
6
  http://www.xcf.cn/zhuanti/ztzz/hdzt1/500frb/index.html
7
7
  """
8
+
8
9
  import json
9
10
 
10
11
  import pandas as pd
@@ -32,26 +33,28 @@ def xincaifu_rank(year: str = "2022") -> pd.DataFrame:
32
33
  "year": year,
33
34
  "pageNo": "1",
34
35
  "from": "jsonp",
35
- "_": "1604722171732",
36
36
  }
37
37
  r = requests.get(url, params=params)
38
38
  data_text = r.text
39
39
  data_json = json.loads(data_text[data_text.find("{") : -1])
40
40
  temp_df = pd.DataFrame(data_json["data"]["rows"])
41
41
  temp_df.columns
42
- temp_df.rename(columns={
43
- 'assets': "财富",
44
- 'year': "年份",
45
- 'sex': "性别",
46
- 'name': "姓名",
47
- 'rank': "排名",
48
- 'company': "主要公司",
49
- 'industry': "相关行业",
50
- 'id': "-",
51
- 'addr': "公司总部",
52
- 'rankLst': "-",
53
- 'age': "年龄",
54
- }, inplace=True)
42
+ temp_df.rename(
43
+ columns={
44
+ "assets": "财富",
45
+ "year": "年份",
46
+ "sex": "性别",
47
+ "name": "姓名",
48
+ "rank": "排名",
49
+ "company": "主要公司",
50
+ "industry": "相关行业",
51
+ "id": "-",
52
+ "addr": "公司总部",
53
+ "rankLst": "-",
54
+ "age": "年龄",
55
+ },
56
+ inplace=True,
57
+ )
55
58
  temp_df = temp_df[
56
59
  [
57
60
  "排名",
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding:utf-8 -*-
3
+ """
4
+ Date: 2025/9/20 17:40
5
+ Desc: 东方财富网站-天天基金网-基金档案-基金公告
6
+ https://fundf10.eastmoney.com/jjgg_000001.html
7
+ """
8
+
9
+ import time
10
+
11
+ import pandas as pd
12
+ import requests
13
+
14
+
15
+ def fund_announcement_dividend_em(symbol: str = "000001") -> pd.DataFrame:
16
+ """
17
+ 东方财富网站-天天基金网-基金档案-基金公告-分红配送
18
+ https://fundf10.eastmoney.com/jjgg_000001_2.html
19
+ :param symbol: 基金代码; 可以通过调用 ak.fund_name_em() 接口获取
20
+ :type symbol: str
21
+ :return: 分红配送-公告列表
22
+ :rtype: pandas.DataFrame
23
+ """
24
+ url = "http://api.fund.eastmoney.com/f10/JJGG"
25
+ headers = {
26
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
27
+ "Chrome/80.0.3987.149 Safari/537.36",
28
+ "Referer": f"http://fundf10.eastmoney.com/jjgg_{symbol}_2.html",
29
+ }
30
+ params = {
31
+ "fundcode": symbol,
32
+ "pageIndex": "1",
33
+ "pageSize": "1000",
34
+ "type": "2",
35
+ "_": round(time.time() * 1000),
36
+ }
37
+ r = requests.get(url, params=params, headers=headers)
38
+ data_json = r.json()
39
+ temp_df = pd.DataFrame(data_json["Data"])
40
+ temp_df.columns = [
41
+ "基金代码",
42
+ "公告标题",
43
+ "基金名称",
44
+ "_",
45
+ "_",
46
+ "公告日期",
47
+ "_",
48
+ "报告ID",
49
+ ]
50
+ temp_df = temp_df[["基金代码", "公告标题", "基金名称", "公告日期", "报告ID"]]
51
+ temp_df.sort_values(by=["公告日期"], inplace=True, ignore_index=True)
52
+ temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
53
+ return temp_df
54
+
55
+
56
+ def fund_announcement_report_em(symbol: str = "000001") -> pd.DataFrame:
57
+ """
58
+ 东方财富网站-天天基金网-基金档案-基金公告-定期报告
59
+ https://fundf10.eastmoney.com/jjgg_000001_3.html
60
+ :param symbol: 基金代码; 可以通过调用 ak.fund_name_em() 接口获取
61
+ :type symbol: str
62
+ :return: 定期报告-公告列表
63
+ :rtype: pandas.DataFrame
64
+ """
65
+ url = "http://api.fund.eastmoney.com/f10/JJGG"
66
+ headers = {
67
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
68
+ "Chrome/80.0.3987.149 Safari/537.36",
69
+ "Referer": f"http://fundf10.eastmoney.com/jjgg_{symbol}_3.html",
70
+ }
71
+ params = {
72
+ "fundcode": symbol,
73
+ "pageIndex": "1",
74
+ "pageSize": "1000",
75
+ "type": "3",
76
+ "_": round(time.time() * 1000),
77
+ }
78
+ r = requests.get(url, params=params, headers=headers)
79
+ data_json = r.json()
80
+ temp_df = pd.DataFrame(data_json["Data"])
81
+ temp_df.columns = [
82
+ "基金代码",
83
+ "公告标题",
84
+ "基金名称",
85
+ "_",
86
+ "_",
87
+ "公告日期",
88
+ "_",
89
+ "报告ID",
90
+ ]
91
+ temp_df = temp_df[["基金代码", "公告标题", "基金名称", "公告日期", "报告ID"]]
92
+ temp_df.sort_values(by=["公告日期"], inplace=True, ignore_index=True)
93
+ temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
94
+ return temp_df
95
+
96
+
97
+ def fund_announcement_personnel_em(symbol: str = "000001") -> pd.DataFrame:
98
+ """
99
+ 东方财富网站-天天基金网-基金档案-基金公告-人事调整
100
+ https://fundf10.eastmoney.com/jjgg_000001_4.html
101
+ :param symbol: 基金代码; 可以通过调用 ak.fund_name_em() 接口获取
102
+ :type symbol: str
103
+ :return: 人事调整-公告列表
104
+ :rtype: pandas.DataFrame
105
+ """
106
+ url = "http://api.fund.eastmoney.com/f10/JJGG"
107
+ headers = {
108
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
109
+ "Referer": f"http://fundf10.eastmoney.com/jjgg_{symbol}_4.html",
110
+ }
111
+ params = {
112
+ "fundcode": symbol,
113
+ "pageIndex": "1",
114
+ "pageSize": "1000",
115
+ "type": "4",
116
+ "_": round(time.time() * 1000),
117
+ }
118
+ r = requests.get(url, params=params, headers=headers)
119
+ data_json = r.json()
120
+ temp_df = pd.DataFrame(data_json["Data"])
121
+ temp_df.columns = [
122
+ "基金代码",
123
+ "公告标题",
124
+ "基金名称",
125
+ "_",
126
+ "_",
127
+ "公告日期",
128
+ "_",
129
+ "报告ID",
130
+ ]
131
+ temp_df = temp_df[["基金代码", "公告标题", "基金名称", "公告日期", "报告ID"]]
132
+ temp_df.sort_values(by=["公告日期"], inplace=True, ignore_index=True)
133
+ temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
134
+ return temp_df
135
+
136
+
137
+ if __name__ == "__main__":
138
+ fund_announcement_dividend_em_df = fund_announcement_dividend_em(symbol="000001")
139
+ print(fund_announcement_dividend_em_df)
140
+
141
+ fund_announcement_report_em_df = fund_announcement_report_em(symbol="000001")
142
+ print(fund_announcement_report_em_df)
143
+
144
+ fund_announcement_personnel_em_df = fund_announcement_personnel_em(symbol="000001")
145
+ print(fund_announcement_personnel_em_df)
@@ -4,6 +4,7 @@
4
4
  Date: 2023/11/11 16:30
5
5
  Desc: 东方财富-基金
6
6
  """
7
+
7
8
  from io import StringIO
8
9
 
9
10
  import pandas as pd
@@ -17,22 +18,27 @@ def fund_aum_em() -> pd.DataFrame:
17
18
  :return: 基金公司排名列表
18
19
  :rtype: pandas.DataFrame
19
20
  """
20
- url = 'https://fund.eastmoney.com/Company/home/gspmlist'
21
- params = {
22
- 'fundType': '0'
23
- }
21
+ url = "https://fund.eastmoney.com/Company/home/gspmlist"
22
+ params = {"fundType": "0"}
24
23
  r = requests.get(url, params=params)
25
24
  temp_df = pd.read_html(StringIO(r.text))[0]
26
- del temp_df['相关链接']
27
- del temp_df['天相评级']
28
- temp_df.columns = ['序号', '基金公司', '成立时间', '全部管理规模', '全部基金数', '全部经理数']
29
- expanded_df = temp_df['全部管理规模'].str.split(' ', expand=True)
30
- temp_df['全部管理规模'] = expanded_df.iloc[:, 0].str.replace(",", "")
31
- temp_df['更新日期'] = expanded_df.iloc[:, 1]
32
- temp_df['全部管理规模'] = pd.to_numeric(temp_df['全部管理规模'], errors="coerce")
33
- temp_df['全部基金数'] = pd.to_numeric(temp_df['全部基金数'], errors="coerce")
34
- temp_df['全部经理数'] = pd.to_numeric(temp_df['全部经理数'], errors="coerce")
35
- temp_df['成立时间'] = pd.to_datetime(temp_df['成立时间'], errors="coerce").dt.date
25
+ del temp_df["相关链接"]
26
+ del temp_df["天相评级"]
27
+ temp_df.columns = [
28
+ "序号",
29
+ "基金公司",
30
+ "成立时间",
31
+ "全部管理规模",
32
+ "全部基金数",
33
+ "全部经理数",
34
+ ]
35
+ expanded_df = temp_df["全部管理规模"].str.split(" ", expand=True)
36
+ temp_df["全部管理规模"] = expanded_df.iloc[:, 0].str.replace(",", "")
37
+ temp_df["更新日期"] = expanded_df.iloc[:, 1]
38
+ temp_df["全部管理规模"] = pd.to_numeric(temp_df["全部管理规模"], errors="coerce")
39
+ temp_df["全部基金数"] = pd.to_numeric(temp_df["全部基金数"], errors="coerce")
40
+ temp_df["全部经理数"] = pd.to_numeric(temp_df["全部经理数"], errors="coerce")
41
+ temp_df["成立时间"] = pd.to_datetime(temp_df["成立时间"], errors="coerce").dt.date
36
42
  return temp_df
37
43
 
38
44
 
@@ -43,17 +49,15 @@ def fund_aum_trend_em() -> pd.DataFrame:
43
49
  :return: 基金市场管理规模走势图
44
50
  :rtype: pandas.DataFrame
45
51
  """
46
- url = 'https://fund.eastmoney.com/Company/home/GetFundTotalScaleForChart'
47
- payload = {
48
- 'fundType': '0'
49
- }
52
+ url = "https://fund.eastmoney.com/Company/home/GetFundTotalScaleForChart"
53
+ payload = {"fundType": "0"}
50
54
  r = requests.get(url, data=payload)
51
55
  data_json = r.json()
52
56
  temp_df = pd.DataFrame()
53
- temp_df['date'] = data_json['x']
54
- temp_df['value'] = data_json['y']
55
- temp_df['date'] = pd.to_datetime(temp_df['date'], errors="coerce").dt.date
56
- temp_df['value'] = pd.to_numeric(temp_df['value'], errors="coerce")
57
+ temp_df["date"] = data_json["x"]
58
+ temp_df["value"] = data_json["y"]
59
+ temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.date
60
+ temp_df["value"] = pd.to_numeric(temp_df["value"], errors="coerce")
57
61
  return temp_df
58
62
 
59
63
 
@@ -61,27 +65,37 @@ def fund_aum_hist_em(year: str = "2023") -> pd.DataFrame:
61
65
  """
62
66
  东方财富-基金-基金公司历年管理规模排行列表
63
67
  https://fund.eastmoney.com/Company/lsgm.html
68
+ :param year: query year
69
+ :type year: str
64
70
  :return: 基金公司历年管理规模排行列表
65
71
  :rtype: pandas.DataFrame
66
72
  """
67
- url = 'https://fund.eastmoney.com/Company/home/HistoryScaleTable'
68
- params = {
69
- 'year': year
70
- }
73
+ url = "https://fund.eastmoney.com/Company/home/HistoryScaleTable"
74
+ params = {"year": year}
71
75
  r = requests.get(url, params=params)
72
76
  temp_df = pd.read_html(StringIO(r.text))[0]
73
- temp_df.columns = ['序号', '基金公司', '总规模', '股票型', '混合型', '债券型', '指数型', 'QDII', '货币型']
74
- temp_df['总规模'] = pd.to_numeric(temp_df['总规模'], errors="coerce")
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['QDII'] = pd.to_numeric(temp_df['QDII'], errors="coerce")
80
- temp_df['货币型'] = pd.to_numeric(temp_df['货币型'], errors="coerce")
77
+ temp_df.columns = [
78
+ "序号",
79
+ "基金公司",
80
+ "总规模",
81
+ "股票型",
82
+ "混合型",
83
+ "债券型",
84
+ "指数型",
85
+ "QDII",
86
+ "货币型",
87
+ ]
88
+ temp_df["总规模"] = pd.to_numeric(temp_df["总规模"], errors="coerce")
89
+ temp_df["股票型"] = pd.to_numeric(temp_df["股票型"], errors="coerce")
90
+ temp_df["混合型"] = pd.to_numeric(temp_df["混合型"], errors="coerce")
91
+ temp_df["债券型"] = pd.to_numeric(temp_df["债券型"], errors="coerce")
92
+ temp_df["指数型"] = pd.to_numeric(temp_df["指数型"], errors="coerce")
93
+ temp_df["QDII"] = pd.to_numeric(temp_df["QDII"], errors="coerce")
94
+ temp_df["货币型"] = pd.to_numeric(temp_df["货币型"], errors="coerce")
81
95
  return temp_df
82
96
 
83
97
 
84
- if __name__ == '__main__':
98
+ if __name__ == "__main__":
85
99
  fund_aum_em_df = fund_aum_em()
86
100
  print(fund_aum_em_df)
87
101