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
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/3/26 17:30
4
+ Date: 2025/2/15 22:00
5
5
  Desc: 东方财富-ETF行情
6
6
  https://quote.eastmoney.com/sh513500.html
7
7
  """
@@ -11,6 +11,8 @@ from functools import lru_cache
11
11
  import pandas as pd
12
12
  import requests
13
13
 
14
+ from akshare.utils.func import fetch_paginated_data
15
+
14
16
 
15
17
  @lru_cache()
16
18
  def _fund_etf_code_id_map_em() -> dict:
@@ -23,7 +25,7 @@ def _fund_etf_code_id_map_em() -> dict:
23
25
  url = "https://88.push2.eastmoney.com/api/qt/clist/get"
24
26
  params = {
25
27
  "pn": "1",
26
- "pz": "5000",
28
+ "pz": "100",
27
29
  "po": "1",
28
30
  "np": "1",
29
31
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
@@ -32,12 +34,9 @@ def _fund_etf_code_id_map_em() -> dict:
32
34
  "wbp2u": "|0|0|0|web",
33
35
  "fid": "f3",
34
36
  "fs": "b:MK0021,b:MK0022,b:MK0023,b:MK0024",
35
- "fields": "f12,f13",
36
- "_": "1672806290972",
37
+ "fields": "f3,f12,f13",
37
38
  }
38
- r = requests.get(url, timeout=15, params=params)
39
- data_json = r.json()
40
- temp_df = pd.DataFrame(data_json["data"]["diff"])
39
+ temp_df = fetch_paginated_data(url, params)
41
40
  temp_dict = dict(zip(temp_df["f12"], temp_df["f13"]))
42
41
  return temp_dict
43
42
 
@@ -52,15 +51,15 @@ def fund_etf_spot_em() -> pd.DataFrame:
52
51
  url = "https://88.push2.eastmoney.com/api/qt/clist/get"
53
52
  params = {
54
53
  "pn": "1",
55
- "pz": "5000",
54
+ "pz": "100",
56
55
  "po": "1",
57
56
  "np": "1",
58
57
  "ut": "bd1d9ddb04089700cf9c27f6f7426281",
59
58
  "fltt": "2",
60
59
  "invt": "2",
61
60
  "wbp2u": "|0|0|0|web",
62
- "fid": "f3",
63
- "fs": "b:MK0021,b:MK0022,b:MK0023,b:MK0024",
61
+ "fid": "f12",
62
+ "fs": "b:MK0021,b:MK0022,b:MK0023,b:MK0024,b:MK0827",
64
63
  "fields": (
65
64
  "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,"
66
65
  "f12,f13,f14,f15,f16,f17,f18,f20,f21,"
@@ -69,11 +68,8 @@ def fund_etf_spot_em() -> pd.DataFrame:
69
68
  "f72,f75,f78,f81,f84,f87,f115,f124,f128,"
70
69
  "f136,f152,f184,f297,f402,f441"
71
70
  ),
72
- "_": "1672806290972",
73
71
  }
74
- r = requests.get(url, timeout=15, params=params)
75
- data_json = r.json()
76
- temp_df = pd.DataFrame(data_json["data"]["diff"])
72
+ temp_df = fetch_paginated_data(url, params)
77
73
  temp_df.rename(
78
74
  columns={
79
75
  "f12": "代码",
@@ -218,9 +214,23 @@ def fund_etf_spot_em() -> pd.DataFrame:
218
214
  .dt.tz_localize("UTC")
219
215
  .dt.tz_convert("Asia/Shanghai")
220
216
  )
221
-
222
217
  return temp_df
223
218
 
219
+ def get_market_id(symbol: str)-> int:
220
+ """
221
+ 东方财富-ETF市场标识判断
222
+ :param symbol: ETF 代码
223
+ :type symbol: str
224
+ :return: ETF 代码和市场标识(1:上证 0:深证)
225
+ :rtype: int
226
+ """
227
+ if symbol.startswith(('0', '1', '3', '2', '5', '6')):
228
+ if symbol.startswith(('5', '6')):
229
+ return 1
230
+ else:
231
+ return 0
232
+ else:
233
+ return 1
224
234
 
225
235
  def fund_etf_hist_em(
226
236
  symbol: str = "159707",
@@ -245,7 +255,7 @@ def fund_etf_hist_em(
245
255
  :return: 每日行情
246
256
  :rtype: pandas.DataFrame
247
257
  """
248
- code_id_dict = _fund_etf_code_id_map_em()
258
+ # code_id_dict = _fund_etf_code_id_map_em()
249
259
  adjust_dict = {"qfq": "1", "hfq": "2", "": "0"}
250
260
  period_dict = {"daily": "101", "weekly": "102", "monthly": "103"}
251
261
  url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
@@ -257,10 +267,10 @@ def fund_etf_hist_em(
257
267
  "fqt": adjust_dict[adjust],
258
268
  "beg": start_date,
259
269
  "end": end_date,
260
- "_": "1623766962675",
261
270
  }
262
271
  try:
263
- market_id = code_id_dict[symbol]
272
+ # market_id = code_id_dict[symbol]
273
+ market_id = get_market_id(symbol)
264
274
  params.update({"secid": f"{market_id}.{symbol}"})
265
275
  r = requests.get(url, timeout=15, params=params)
266
276
  data_json = r.json()
@@ -328,17 +338,18 @@ def fund_etf_hist_min_em(
328
338
  :return: 每日分时行情
329
339
  :rtype: pandas.DataFrame
330
340
  """
331
- code_id_dict = _fund_etf_code_id_map_em()
341
+ #code_id_dict = _fund_etf_code_id_map_em()
332
342
  # 商品期货类 ETF
333
- code_id_dict.update(
334
- {
335
- "159980": "0",
336
- "159981": "0",
337
- "159985": "0",
338
- "511090": "1",
339
- "511220": "1",
340
- }
341
- )
343
+ # code_id_dict.update(
344
+ # {
345
+ # "159980": "0",
346
+ # "159981": "0",
347
+ # "159985": "0",
348
+ # "511090": "1",
349
+ # "511220": "1",
350
+ # "511380": "1",
351
+ # }
352
+ # )
342
353
  adjust_map = {
343
354
  "": "0",
344
355
  "qfq": "1",
@@ -352,8 +363,7 @@ def fund_etf_hist_min_em(
352
363
  "ut": "7eea3edcaed734bea9cbfc24409ed989",
353
364
  "ndays": "5",
354
365
  "iscr": "0",
355
- "secid": f"{code_id_dict[symbol]}.{symbol}",
356
- "_": "1623766962675",
366
+ "secid": f"{get_market_id(symbol)}.{symbol}",
357
367
  }
358
368
  r = requests.get(url, timeout=15, params=params)
359
369
  data_json = r.json()
@@ -390,10 +400,9 @@ def fund_etf_hist_min_em(
390
400
  "ut": "7eea3edcaed734bea9cbfc24409ed989",
391
401
  "klt": period,
392
402
  "fqt": adjust_map[adjust],
393
- "secid": f"{code_id_dict[symbol]}.{symbol}",
403
+ "secid": f"{get_market_id(symbol)}.{symbol}",
394
404
  "beg": "0",
395
405
  "end": "20500000",
396
- "_": "1630930917857",
397
406
  }
398
407
  r = requests.get(url, timeout=15, params=params)
399
408
  data_json = r.json()
@@ -477,10 +486,10 @@ if __name__ == "__main__":
477
486
  print(fund_etf_hist_em_df)
478
487
 
479
488
  fund_etf_hist_min_em_df = fund_etf_hist_min_em(
480
- symbol="511220",
489
+ symbol="511380",
481
490
  period="1",
482
491
  adjust="",
483
- start_date="2024-03-20 09:30:00",
484
- end_date="2024-03-20 17:40:00",
492
+ start_date="2025-03-10 09:30:00",
493
+ end_date="2025-03-10 17:40:00",
485
494
  )
486
495
  print(fund_etf_hist_min_em_df)
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/2/15 17:33
4
+ Date: 2025/11/10 15:30
5
5
  Desc: 新浪财经-基金行情
6
- http://vip.stock.finance.sina.com.cn/fund_center/index.html#jjhqetf
6
+ https://vip.stock.finance.sina.com.cn/fund_center/index.html#jjhqetf
7
7
  """
8
8
 
9
9
  import pandas as pd
10
- import requests
11
10
  import py_mini_racer
11
+ import requests
12
12
 
13
13
  from akshare.stock.cons import hk_js_decode
14
14
  from akshare.utils import demjson
@@ -28,10 +28,13 @@ def fund_etf_category_sina(symbol: str = "LOF基金") -> pd.DataFrame:
28
28
  "ETF基金": "etf_hq_fund",
29
29
  "LOF基金": "lof_hq_fund",
30
30
  }
31
- url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/jsonp.php/IO.XSRV2.CallbackList['da_yPT46_Ll7K6WD']/Market_Center.getHQNodeDataSimple"
31
+ url = (
32
+ "https://vip.stock.finance.sina.com.cn/quotes_service/api/jsonp.php/"
33
+ "IO.XSRV2.CallbackList['da_yPT46_Ll7K6WD']/Market_Center.getHQNodeDataSimple"
34
+ )
32
35
  params = {
33
36
  "page": "1",
34
- "num": "1000",
37
+ "num": "5000",
35
38
  "sort": "symbol",
36
39
  "asc": "0",
37
40
  "node": fund_map[symbol],
@@ -39,7 +42,7 @@ def fund_etf_category_sina(symbol: str = "LOF基金") -> pd.DataFrame:
39
42
  }
40
43
  r = requests.get(url, params=params)
41
44
  data_text = r.text
42
- data_json = demjson.decode(data_text[data_text.find("([") + 1 : -2])
45
+ data_json = demjson.decode(data_text[data_text.find("([") + 1: -2])
43
46
  temp_df = pd.DataFrame(data_json)
44
47
  if symbol == "封闭式基金":
45
48
  temp_df.columns = [
@@ -96,21 +99,21 @@ def fund_etf_category_sina(symbol: str = "LOF基金") -> pd.DataFrame:
96
99
  "成交额",
97
100
  ]
98
101
  ]
99
- temp_df["最新价"] = pd.to_numeric(temp_df["最新价"])
100
- temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"])
101
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"])
102
- temp_df["买入"] = pd.to_numeric(temp_df["买入"])
103
- temp_df["卖出"] = pd.to_numeric(temp_df["卖出"])
104
- temp_df["昨收"] = pd.to_numeric(temp_df["昨收"])
105
- temp_df["今开"] = pd.to_numeric(temp_df["今开"])
106
- temp_df["最高"] = pd.to_numeric(temp_df["最高"])
107
- temp_df["最低"] = pd.to_numeric(temp_df["最低"])
108
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
109
- temp_df["成交额"] = pd.to_numeric(temp_df["成交额"])
102
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
103
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
104
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
105
+ temp_df["买入"] = pd.to_numeric(temp_df["买入"], errors="coerce")
106
+ temp_df["卖出"] = pd.to_numeric(temp_df["卖出"], errors="coerce")
107
+ temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
108
+ temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce")
109
+ temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
110
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
111
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
112
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
110
113
  return temp_df
111
114
 
112
115
 
113
- def fund_etf_hist_sina(symbol: str = "sz159996") -> pd.DataFrame:
116
+ def fund_etf_hist_sina(symbol: str = "sh510050") -> pd.DataFrame:
114
117
  """
115
118
  新浪财经-基金-ETF 基金-日行情数据
116
119
  https://finance.sina.com.cn/fund/quotes/159996/bc.shtml
@@ -119,7 +122,7 @@ def fund_etf_hist_sina(symbol: str = "sz159996") -> pd.DataFrame:
119
122
  :return: 日行情数据
120
123
  :rtype: pandas.DataFrame
121
124
  """
122
- url = f"https://finance.sina.com.cn/realstock/company/{symbol}/hisdata/klc_kl.js"
125
+ url = f"https://finance.sina.com.cn/realstock/company/{symbol}/hisdata_klc2/klc_kl.js"
123
126
  r = requests.get(url)
124
127
  js_code = py_mini_racer.MiniRacer()
125
128
  js_code.eval(hk_js_decode)
@@ -129,15 +132,60 @@ def fund_etf_hist_sina(symbol: str = "sz159996") -> pd.DataFrame:
129
132
  temp_df = pd.DataFrame(dict_list)
130
133
  if temp_df.empty: # 处理获取数据为空的问题
131
134
  return pd.DataFrame()
132
- temp_df["date"] = pd.to_datetime(temp_df["date"]).dt.date
133
- temp_df["open"] = pd.to_numeric(temp_df["open"])
134
- temp_df["high"] = pd.to_numeric(temp_df["high"])
135
- temp_df["low"] = pd.to_numeric(temp_df["low"])
136
- temp_df["close"] = pd.to_numeric(temp_df["close"])
137
- temp_df["volume"] = pd.to_numeric(temp_df["volume"])
135
+ temp_df["date"] = pd.to_datetime(temp_df["date"], errors="coerce").dt.tz_localize(
136
+ None
137
+ )
138
+ temp_df["open"] = pd.to_numeric(temp_df["open"], errors="coerce")
139
+ temp_df["high"] = pd.to_numeric(temp_df["high"], errors="coerce")
140
+ temp_df["low"] = pd.to_numeric(temp_df["low"], errors="coerce")
141
+ temp_df["close"] = pd.to_numeric(temp_df["close"], errors="coerce")
142
+ temp_df["volume"] = pd.to_numeric(temp_df["volume"], errors="coerce")
143
+
144
+ # 转换日期列为日期类型
145
+ temp_df["date"] = temp_df["date"].dt.date
146
+ temp_df = temp_df.sort_values(by="date", ascending=True)
138
147
  return temp_df
139
148
 
140
149
 
150
+ def fund_etf_dividend_sina(symbol: str = "sh510050") -> pd.DataFrame:
151
+ """
152
+ 新浪财经-基金-ETF 基金-累计分红
153
+ https://finance.sina.com.cn/fund/quotes/510050/bc.shtml
154
+ :param symbol: 基金名称, 可以通过 ak.fund_etf_category_sina() 函数获取
155
+ :type symbol: str
156
+ :return: 累计分红
157
+ :rtype: pandas.DataFrame
158
+ """
159
+ # 构建复权数据URL
160
+ factor_url = f"https://finance.sina.com.cn/realstock/company/{symbol}/hfq.js"
161
+ r = requests.get(factor_url)
162
+ text = r.text
163
+ if text.startswith("var"):
164
+ json_str = text.split("=")[1].strip().rsplit("}", maxsplit=1)[0].strip()
165
+ data = eval(json_str + "}") # 这里使用eval而不是json.loads因为数据格式特殊
166
+
167
+ if isinstance(data, dict) and "data" in data:
168
+ df = pd.DataFrame(data["data"])
169
+ # 重命名列
170
+ df.columns = ["date", "f", "s", "u"] if len(df.columns) == 4 else df.columns
171
+ # 移除1900-01-01的数据
172
+ df = df[df["date"] != "1900-01-01"]
173
+ # 转换日期
174
+ df["date"] = pd.to_datetime(df["date"])
175
+ # 转换数值类型
176
+ df[["f", "s", "u"]] = df[["f", "s", "u"]].astype(float)
177
+ # 按日期排序
178
+ df = df.sort_values(by="date", ascending=True, ignore_index=True)
179
+ temp_df = df[["date", "u"]].copy()
180
+ temp_df.columns = ["日期", "累计分红"]
181
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
182
+ return temp_df
183
+ else:
184
+ return pd.DataFrame()
185
+ else:
186
+ return pd.DataFrame()
187
+
188
+
141
189
  if __name__ == "__main__":
142
190
  fund_etf_category_sina_df = fund_etf_category_sina(symbol="封闭式基金")
143
191
  print(fund_etf_category_sina_df)
@@ -151,5 +199,5 @@ if __name__ == "__main__":
151
199
  fund_etf_hist_sina_df = fund_etf_hist_sina(symbol="sh510050")
152
200
  print(fund_etf_hist_sina_df)
153
201
 
154
- fund_etf_hist_sina_df = fund_etf_hist_sina(symbol="sh510300")
155
- print(fund_etf_hist_sina_df)
202
+ fund_etf_dividend_sina_df = fund_etf_dividend_sina(symbol="sh510050")
203
+ print(fund_etf_dividend_sina_df)
@@ -16,6 +16,8 @@ def fund_etf_spot_ths(date: str = "") -> pd.DataFrame:
16
16
  """
17
17
  同花顺理财-基金数据-每日净值-ETF-实时行情
18
18
  https://fund.10jqka.com.cn/datacenter/jz/kfs/etf/
19
+ :param date: 查询日期
20
+ :type date: str
19
21
  :return: ETF 实时行情
20
22
  :rtype: pandas.DataFrame
21
23
  """
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding:utf-8 -*-
3
+ """
4
+ Date: 2025/12/22 17:00
5
+ Desc: 天天基金-基金档案
6
+ https://fundf10.eastmoney.com/jjfl_015641.html
7
+ """
8
+ import re
9
+ from io import StringIO
10
+
11
+ import pandas as pd
12
+ import requests
13
+ from bs4 import BeautifulSoup
14
+
15
+
16
+ def fund_fee_em(symbol: str = "015641", indicator: str = "认购费率") -> pd.DataFrame:
17
+ """
18
+ 天天基金-基金档案-购买信息
19
+ https://fundf10.eastmoney.com/jjfl_015641.html
20
+ :param symbol: 基金代码
21
+ :type symbol: str
22
+ :param indicator: choice of {"交易状态", "申购与赎回金额", "交易确认日", "运作费用", "认购费率", "申购费率", "赎回费率"}
23
+ :type indicator: str
24
+ :return: 交易规则
25
+ :rtype: pandas.DataFrame
26
+ """
27
+ url = f"https://fundf10.eastmoney.com/jjfl_{symbol}.html"
28
+ r = requests.get(url)
29
+ # 使用BeautifulSoup解析HTML
30
+ soup = BeautifulSoup(r.text, "html.parser")
31
+ # 创建一个字典,将标题文本映射到对应的表格
32
+ tables_dict = {}
33
+ # 找到所有具有class="t"的h4标签
34
+ title_elements = soup.find_all(name="h4", class_="t")
35
+ for title_elem in title_elements:
36
+ # 获取标题文本
37
+ title_text = title_elem.get_text(strip=True)
38
+ title_text = re.sub(r'\s+', ' ', title_text).strip()
39
+
40
+ # 获取标题后面的表格
41
+ if title_text == "申购与赎回金额":
42
+ next_table = title_elem.find_all_next("table")[0]
43
+ next_next_table = title_elem.find_all_next("table")[1]
44
+ table_html = str(next_table)
45
+ next_table_html = str(next_next_table)
46
+ df_1 = pd.read_html(StringIO(table_html))[0]
47
+ df_2 = pd.read_html(StringIO(next_table_html))[0]
48
+ df = pd.concat(objs=[df_1, df_2], ignore_index=True)
49
+ tables_dict[title_text] = df
50
+ continue
51
+ else:
52
+ next_table = title_elem.find_next("table")
53
+
54
+ if next_table:
55
+ try:
56
+ # 将表格转换为HTML字符串,然后使用pd.read_html读取
57
+ table_html = str(next_table)
58
+ df = pd.read_html(StringIO(table_html))[0]
59
+ tables_dict[title_text] = df
60
+ except Exception as e:
61
+ continue
62
+
63
+ if indicator == "交易状态":
64
+ temp_df = tables_dict[indicator]
65
+ elif indicator == "申购与赎回金额":
66
+ temp_df = tables_dict[indicator]
67
+ elif indicator == "交易确认日":
68
+ temp_df = tables_dict[indicator]
69
+ elif indicator == "运作费用":
70
+ temp_df = tables_dict[indicator]
71
+ elif indicator == "认购费率(前端)":
72
+ temp_df = tables_dict[indicator]
73
+ temp_df["原费率"] = temp_df["原费率|天天基金优惠费率"].str.split(
74
+ "|", expand=True
75
+ )[0]
76
+ temp_df["天天基金优惠费率"] = temp_df["原费率|天天基金优惠费率"].str.split(
77
+ "|", expand=True
78
+ )[1]
79
+ del temp_df["原费率|天天基金优惠费率"]
80
+ temp_df.loc[3, "天天基金优惠费率"] = temp_df.loc[3, "原费率"]
81
+ temp_df["原费率"] = temp_df["原费率"].str.strip()
82
+ temp_df["天天基金优惠费率"] = temp_df["天天基金优惠费率"].str.strip()
83
+ elif indicator == "申购费率(前端)":
84
+ temp_df = tables_dict[indicator]
85
+ if temp_df[
86
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
87
+ ].str.split("|", expand=True).shape == (1, 1):
88
+ temp_df["原费率"] = temp_df[
89
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
90
+ ].str.split("|", expand=True)[0]
91
+ temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
92
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
93
+ ].str.split("|", expand=True)[0]
94
+ temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
95
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
96
+ ].str.split("|", expand=True)[0]
97
+ del temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"]
98
+ elif temp_df[
99
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
100
+ ].str.split("|", expand=True).shape == (3, 3):
101
+ temp_df["原费率"] = temp_df[
102
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
103
+ ].str.split("|", expand=True)[0]
104
+ temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
105
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
106
+ ].str.split("|", expand=True)[1]
107
+ temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
108
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
109
+ ].str.split("|", expand=True)[2]
110
+ temp_df.loc[2, "天天基金优惠费率-银行卡购买"] = temp_df.loc[2, "原费率"]
111
+ temp_df.loc[2, "天天基金优惠费率-活期宝购买"] = temp_df.loc[2, "原费率"]
112
+ del temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"]
113
+ else:
114
+ temp_df["原费率"] = temp_df[
115
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
116
+ ].str.split("|", expand=True)[0]
117
+ temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
118
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
119
+ ].str.split("|", expand=True)[1]
120
+ temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
121
+ "原费率|天天基金优惠费率 银行卡购买|活期宝购买"
122
+ ].str.split("|", expand=True)[2]
123
+ del temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"]
124
+ temp_df.loc[3, "天天基金优惠费率-银行卡购买"] = temp_df.loc[3, "原费率"]
125
+ temp_df.loc[3, "天天基金优惠费率-活期宝购买"] = temp_df.loc[3, "原费率"]
126
+ temp_df["原费率"] = temp_df["原费率"].str.strip()
127
+ temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
128
+ "天天基金优惠费率-银行卡购买"
129
+ ].str.strip()
130
+ temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
131
+ "天天基金优惠费率-活期宝购买"
132
+ ].str.strip()
133
+ elif indicator == "赎回费率":
134
+ temp_df = tables_dict[indicator]
135
+ else:
136
+ temp_df = pd.DataFrame([])
137
+ return temp_df
138
+
139
+
140
+ if __name__ == "__main__":
141
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易状态")
142
+ print(fund_fee_em_df)
143
+
144
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购与赎回金额")
145
+ print(fund_fee_em_df)
146
+
147
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易确认日")
148
+ print(fund_fee_em_df)
149
+
150
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="运作费用")
151
+ print(fund_fee_em_df)
152
+
153
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="认购费率(前端)")
154
+ print(fund_fee_em_df)
155
+
156
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购费率(前端)")
157
+ print(fund_fee_em_df)
158
+
159
+ fund_fee_em_df = fund_fee_em(symbol="019005", indicator="赎回费率")
160
+ print(fund_fee_em_df)
161
+
162
+ fund_fee_em_df = fund_fee_em(symbol="022364", indicator="申购费率(前端)")
163
+ print(fund_fee_em_df)
164
+
165
+ fund_fee_em_df = fund_fee_em(symbol="022365", indicator="申购费率(前端)")
166
+ print(fund_fee_em_df)
167
+
168
+ fund_fee_em_df = fund_fee_em(symbol="006030", indicator="申购费率(前端)")
169
+ print(fund_fee_em_df)
170
+
171
+ fund_fee_em_df = fund_fee_em(symbol="016243", indicator="申购费率(前端)")
172
+ print(fund_fee_em_df)