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,328 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding:utf-8 -*-
3
+ """
4
+ Date: 2025/3/27 14:20
5
+ Desc: 同花顺-板块-概念板块
6
+ https://q.10jqka.com.cn/thshy/
7
+ """
8
+
9
+ from typing import Dict
10
+ from datetime import datetime
11
+ from functools import lru_cache
12
+ from io import StringIO
13
+
14
+ import pandas as pd
15
+ import requests
16
+ from bs4 import BeautifulSoup
17
+ import py_mini_racer
18
+
19
+ from akshare.datasets import get_ths_js
20
+ from akshare.utils import demjson
21
+ from akshare.utils.tqdm import get_tqdm
22
+
23
+
24
+ def _get_file_content_ths(file: str = "ths.js") -> str:
25
+ """
26
+ 获取 JS 文件的内容
27
+ :param file: JS 文件名
28
+ :type file: str
29
+ :return: 文件内容
30
+ :rtype: str
31
+ """
32
+ setting_file_path = get_ths_js(file)
33
+ with open(setting_file_path, encoding="utf-8") as f:
34
+ file_data = f.read()
35
+ return file_data
36
+
37
+
38
+ @lru_cache()
39
+ def _get_stock_board_concept_name_ths() -> dict:
40
+ """
41
+ 获取同花顺概念板块代码和名称字典
42
+ :return: 获取同花顺概念板块代码和名称字典
43
+ :rtype: dict
44
+ """
45
+ js_code = py_mini_racer.MiniRacer()
46
+ js_content = _get_file_content_ths("ths.js")
47
+ js_code.eval(js_content)
48
+ v_code = js_code.call("v")
49
+ headers = {
50
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
51
+ "Chrome/89.0.4389.90 Safari/537.36",
52
+ "Cookie": f"v={v_code}",
53
+ }
54
+ url = "https://q.10jqka.com.cn/gn/detail/code/307822/"
55
+ r = requests.get(url, headers=headers)
56
+ soup = BeautifulSoup(r.text, features="lxml")
57
+ code_list = [
58
+ item["href"].split("/")[-2]
59
+ for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
60
+ ]
61
+ name_list = [
62
+ item.text
63
+ for item in soup.find(name="div", attrs={"class": "cate_inner"}).find_all("a")
64
+ ]
65
+ name_code_map = dict(zip(name_list, code_list))
66
+ temp_dict = __stock_board_concept_summary_ths()
67
+ name_code_map.update(temp_dict)
68
+ return name_code_map
69
+
70
+
71
+ def stock_board_concept_name_ths() -> pd.DataFrame:
72
+ """
73
+ 同花顺-板块-概念板块-概念
74
+ http://q.10jqka.com.cn/thshy/
75
+ :return: 所有概念板块的名称和链接
76
+ :rtype: pandas.DataFrame
77
+ """
78
+ code_name_ths_map = _get_stock_board_concept_name_ths()
79
+ temp_df = pd.DataFrame.from_dict(code_name_ths_map, orient="index")
80
+ temp_df.reset_index(inplace=True)
81
+ temp_df.columns = ["name", "code"]
82
+ temp_df = temp_df[
83
+ [
84
+ "name",
85
+ "code",
86
+ ]
87
+ ]
88
+ return temp_df
89
+
90
+
91
+ def stock_board_concept_info_ths(symbol: str = "阿里巴巴概念") -> pd.DataFrame:
92
+ """
93
+ 同花顺-板块-概念板块-板块简介
94
+ http://q.10jqka.com.cn/gn/detail/code/301558/
95
+ :param symbol: 板块简介
96
+ :type symbol: str
97
+ :return: 板块简介
98
+ :rtype: pandas.DataFrame
99
+ """
100
+ stock_board_ths_map_df = stock_board_concept_name_ths()
101
+ symbol_code = stock_board_ths_map_df[stock_board_ths_map_df["name"] == symbol][
102
+ "code"
103
+ ].values[0]
104
+ url = f"http://q.10jqka.com.cn/gn/detail/code/{symbol_code}/"
105
+ headers = {
106
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
107
+ "Chrome/89.0.4389.90 Safari/537.36",
108
+ }
109
+ r = requests.get(url, headers=headers)
110
+ soup = BeautifulSoup(r.text, features="lxml")
111
+ name_list = [
112
+ item.text.strip()
113
+ for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dt")
114
+ ]
115
+ value_list = [
116
+ item.text.strip().replace("\n", "/")
117
+ for item in soup.find(name="div", attrs={"class": "board-infos"}).find_all("dd")
118
+ ]
119
+ temp_df = pd.DataFrame([name_list, value_list]).T
120
+ temp_df.columns = ["项目", "值"]
121
+ return temp_df
122
+
123
+
124
+ def stock_board_concept_index_ths(
125
+ symbol: str = "阿里巴巴概念",
126
+ start_date: str = "20200101",
127
+ end_date: str = "20250228",
128
+ ) -> pd.DataFrame:
129
+ """
130
+ 同花顺-板块-概念板块-指数数据
131
+ https://q.10jqka.com.cn/gn/detail/code/301558/
132
+ :param start_date: 开始时间
133
+ :type start_date: str
134
+ :param end_date: 结束时间
135
+ :type end_date: str
136
+ :param symbol: 指数数据
137
+ :type symbol: str
138
+ :return: 指数数据
139
+ :rtype: pandas.DataFrame
140
+ """
141
+ js_code = py_mini_racer.MiniRacer()
142
+ js_content = _get_file_content_ths("ths.js")
143
+ js_code.eval(js_content)
144
+ v_code = js_code.call("v")
145
+
146
+ code_map = _get_stock_board_concept_name_ths()
147
+ symbol_code = code_map[symbol]
148
+ headers = {
149
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
150
+ "Chrome/89.0.4389.90 Safari/537.36",
151
+ }
152
+ url = f"https://q.10jqka.com.cn/gn/detail/code/{symbol_code}"
153
+ r = requests.get(url=url, headers=headers)
154
+ soup = BeautifulSoup(r.text, features="lxml")
155
+ inner_code = soup.find(name="input", attrs={"id": "clid"})["value"]
156
+ big_df = pd.DataFrame()
157
+ current_year = datetime.now().year
158
+ begin_year = int(start_date[:4])
159
+ tqdm = get_tqdm()
160
+ for year in tqdm(range(begin_year, current_year + 1), leave=False):
161
+ url = f"https://d.10jqka.com.cn/v4/line/bk_{inner_code}/01/{year}.js"
162
+ headers = {
163
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
164
+ "Chrome/89.0.4389.90 Safari/537.36",
165
+ "Referer": "http://q.10jqka.com.cn",
166
+ "Host": "d.10jqka.com.cn",
167
+ "Cookie": f"v={v_code}",
168
+ }
169
+ r = requests.get(url, headers=headers)
170
+ data_text = r.text
171
+
172
+ try:
173
+ demjson.decode(data_text[data_text.find("{") : -1])
174
+ except: # noqa: E722
175
+ continue
176
+ temp_df = demjson.decode(data_text[data_text.find("{") : -1])
177
+ temp_df = pd.DataFrame(temp_df["data"].split(";"))
178
+ temp_df = temp_df.iloc[:, 0].str.split(",", expand=True)
179
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
180
+
181
+ if len(big_df.columns) == 11:
182
+ big_df.columns = [
183
+ "日期",
184
+ "开盘价",
185
+ "最高价",
186
+ "最低价",
187
+ "收盘价",
188
+ "成交量",
189
+ "成交额",
190
+ "_",
191
+ "_",
192
+ "_",
193
+ "_",
194
+ ]
195
+ else:
196
+ big_df.columns = [
197
+ "日期",
198
+ "开盘价",
199
+ "最高价",
200
+ "最低价",
201
+ "收盘价",
202
+ "成交量",
203
+ "成交额",
204
+ "_",
205
+ "_",
206
+ "_",
207
+ "_",
208
+ "_",
209
+ ]
210
+ big_df = big_df[
211
+ [
212
+ "日期",
213
+ "开盘价",
214
+ "最高价",
215
+ "最低价",
216
+ "收盘价",
217
+ "成交量",
218
+ "成交额",
219
+ ]
220
+ ]
221
+ big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
222
+ big_df.index = pd.to_datetime(big_df["日期"], errors="coerce")
223
+ big_df = big_df[start_date:end_date]
224
+ big_df.reset_index(drop=True, inplace=True)
225
+ big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
226
+ big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
227
+ big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
228
+ big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
229
+ big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
230
+ big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
231
+ return big_df
232
+
233
+
234
+ @lru_cache()
235
+ def __stock_board_concept_summary_ths() -> Dict:
236
+ """
237
+ 同花顺-数据中心-概念板块-概念时间表-辅助函数
238
+ https://q.10jqka.com.cn/gn/
239
+ :return: 概念时间表
240
+ :rtype: dict
241
+ """
242
+ js_code = py_mini_racer.MiniRacer()
243
+ js_content = _get_file_content_ths("ths.js")
244
+ js_code.eval(js_content)
245
+ v_code = js_code.call("v")
246
+ headers = {
247
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
248
+ "Chrome/89.0.4389.90 Safari/537.36",
249
+ "Cookie": f"v={v_code}",
250
+ }
251
+ url = "http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
252
+ r = requests.get(url, headers=headers)
253
+ soup = BeautifulSoup(r.text, features="lxml")
254
+ page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
255
+ big_dict = dict()
256
+ tqdm = get_tqdm()
257
+ for page in tqdm(range(1, int(page_num) + 1), leave=False):
258
+ url = f"http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
259
+ r = requests.get(url, headers=headers)
260
+ try:
261
+ soup = BeautifulSoup(r.text, features="lxml")
262
+ temp_dict = {
263
+ item.get_text(): item["href"].rsplit("/")[-2]
264
+ for item in soup.find_all(name="a")
265
+ if "detail" in item["href"]
266
+ }
267
+ big_dict.update(temp_dict)
268
+ except ValueError:
269
+ break
270
+ return big_dict
271
+
272
+
273
+ def stock_board_concept_summary_ths() -> pd.DataFrame:
274
+ """
275
+ 同花顺-数据中心-概念板块-概念时间表
276
+ https://q.10jqka.com.cn/gn/
277
+ :return: 概念时间表
278
+ :rtype: pandas.DataFrame
279
+ """
280
+ js_code = py_mini_racer.MiniRacer()
281
+ js_content = _get_file_content_ths("ths.js")
282
+ js_code.eval(js_content)
283
+ v_code = js_code.call("v")
284
+ headers = {
285
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
286
+ "Chrome/89.0.4389.90 Safari/537.36",
287
+ "Cookie": f"v={v_code}",
288
+ }
289
+ url = "http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/1/ajax/1/"
290
+ r = requests.get(url, headers=headers)
291
+ soup = BeautifulSoup(r.text, features="lxml")
292
+ page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
293
+ big_df = pd.DataFrame()
294
+ tqdm = get_tqdm()
295
+ for page in tqdm(range(1, int(page_num) + 1), leave=False):
296
+ url = f"http://q.10jqka.com.cn/gn/index/field/addtime/order/desc/page/{page}/ajax/1/"
297
+ r = requests.get(url, headers=headers)
298
+ try:
299
+ temp_df = pd.read_html(StringIO(r.text))[0]
300
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
301
+ except ValueError:
302
+ break
303
+ big_df["日期"] = pd.to_datetime(big_df["日期"], errors="coerce").dt.date
304
+ big_df["成分股数量"] = pd.to_numeric(big_df["成分股数量"], errors="coerce")
305
+ return big_df
306
+
307
+
308
+ if __name__ == "__main__":
309
+ stock_board_concept_name_ths_df = stock_board_concept_name_ths()
310
+ print(stock_board_concept_name_ths_df)
311
+
312
+ stock_board_concept_info_ths_df = stock_board_concept_info_ths(
313
+ symbol="阿里巴巴概念"
314
+ )
315
+ print(stock_board_concept_info_ths_df)
316
+
317
+ stock_board_concept_index_ths_df = stock_board_concept_index_ths(
318
+ symbol="DeepSeek概念", start_date="20200101", end_date="20250321"
319
+ )
320
+ print(stock_board_concept_index_ths_df)
321
+
322
+ stock_board_concept_summary_ths_df = stock_board_concept_summary_ths()
323
+ print(stock_board_concept_summary_ths_df)
324
+
325
+ for stock in stock_board_concept_name_ths_df["name"]:
326
+ print(stock)
327
+ stock_board_industry_index_ths_df = stock_board_concept_index_ths(symbol=stock)
328
+ print(stock_board_industry_index_ths_df)
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/7/21 18:20
4
+ Date: 2025/2/28 13:20
5
5
  Desc: 同花顺-板块-同花顺行业
6
6
  https://q.10jqka.com.cn/thshy/
7
7
  """
@@ -29,7 +29,7 @@ def _get_file_content_ths(file: str = "ths.js") -> str:
29
29
  :rtype: str
30
30
  """
31
31
  setting_file_path = get_ths_js(file)
32
- with open(setting_file_path) as f:
32
+ with open(setting_file_path, encoding="utf-8") as f:
33
33
  file_data = f.read()
34
34
  return file_data
35
35
 
@@ -219,6 +219,58 @@ def stock_board_industry_index_ths(
219
219
  return big_df
220
220
 
221
221
 
222
+ def stock_xgsr_ths() -> pd.DataFrame:
223
+ """
224
+ 同花顺-数据中心-新股数据-新股上市首日
225
+ https://data.10jqka.com.cn/ipo/xgsr/
226
+ :return: 新股上市首日
227
+ :rtype: pandas.DataFrame
228
+ """
229
+ js_code = py_mini_racer.MiniRacer()
230
+ js_content = _get_file_content_ths("ths.js")
231
+ js_code.eval(js_content)
232
+ v_code = js_code.call("v")
233
+ headers = {
234
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
235
+ "Chrome/89.0.4389.90 Safari/537.36",
236
+ "Cookie": f"v={v_code}",
237
+ "hexin-v": v_code,
238
+ }
239
+ url = "https://data.10jqka.com.cn/ipo/xgsr/field/SSRQ/order/desc/page/1/ajax/1/free/1/"
240
+ r = requests.get(url, headers=headers)
241
+ soup = BeautifulSoup(r.text, features="lxml")
242
+ page_num = soup.find(name="span", attrs={"class": "page_info"}).text.split("/")[1]
243
+ big_df = pd.DataFrame()
244
+ tqdm = get_tqdm()
245
+ for page in tqdm(range(1, int(page_num) + 1), leave=False):
246
+ url = f"https://data.10jqka.com.cn/ipo/xgsr/field/SSRQ/order/desc/page/{page}/ajax/1/free/1/"
247
+ v_code = js_code.call("v")
248
+ headers = {
249
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
250
+ "Chrome/89.0.4389.90 Safari/537.36",
251
+ "Cookie": f"v={v_code}",
252
+ "hexin-v": v_code,
253
+ }
254
+ r = requests.get(url, headers=headers)
255
+ temp_df = pd.read_html(StringIO(r.text))[0]
256
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
257
+
258
+ big_df.rename(columns={"发行价(元)": "发行价"}, inplace=True)
259
+ big_df["序号"] = pd.to_numeric(big_df["序号"], errors="coerce")
260
+ big_df["股票代码"] = big_df["股票代码"].astype(str).str.zfill(6)
261
+ big_df["发行价"] = pd.to_numeric(big_df["发行价"], errors="coerce")
262
+ big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
263
+ big_df["首日开盘价"] = pd.to_numeric(big_df["首日开盘价"], errors="coerce")
264
+ big_df["首日收盘价"] = pd.to_numeric(big_df["首日收盘价"], errors="coerce")
265
+ big_df["首日最高价"] = pd.to_numeric(big_df["首日最高价"], errors="coerce")
266
+ big_df["首日最低价"] = pd.to_numeric(big_df["首日最低价"], errors="coerce")
267
+ big_df["首日涨跌幅"] = (
268
+ pd.to_numeric(big_df["首日涨跌幅"].str.strip("%"), errors="coerce") / 100
269
+ )
270
+ big_df["上市日期"] = pd.to_datetime(big_df["上市日期"], errors="coerce").dt.date
271
+ return big_df
272
+
273
+
222
274
  def stock_ipo_benefit_ths() -> pd.DataFrame:
223
275
  """
224
276
  同花顺-数据中心-新股数据-IPO受益股
@@ -350,5 +402,8 @@ if __name__ == "__main__":
350
402
  stock_board_industry_index_ths_df = stock_board_industry_index_ths(symbol=stock)
351
403
  print(stock_board_industry_index_ths_df)
352
404
 
405
+ stock_xgsr_ths_df = stock_xgsr_ths()
406
+ print(stock_xgsr_ths_df)
407
+
353
408
  stock_ipo_benefit_ths_df = stock_ipo_benefit_ths()
354
409
  print(stock_ipo_benefit_ths_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/4/5 22:05
4
+ Date: 2025/9/20 18:05
5
5
  Desc: 乐估乐股-底部研究-巴菲特指标
6
6
  https://legulegu.com/stockdata/marketcap-gdp
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -24,7 +25,7 @@ def stock_buffett_index_lg() -> pd.DataFrame:
24
25
  r = requests.get(
25
26
  url,
26
27
  params=params,
27
- **get_cookie_csrf(url="https://legulegu.com/stockdata/marketcap-gdp")
28
+ **get_cookie_csrf(url="https://legulegu.com/stockdata/marketcap-gdp"),
28
29
  )
29
30
  data_json = r.json()
30
31
  temp_df = pd.DataFrame(data_json["data"])
@@ -49,12 +50,13 @@ def stock_buffett_index_lg() -> pd.DataFrame:
49
50
  "总历史分位数",
50
51
  ]
51
52
  ]
52
- temp_df["日期"] = pd.to_datetime(temp_df["日期"], unit="ms").dt.date
53
- temp_df['收盘价'] = pd.to_numeric(temp_df['收盘价'], errors="coerce")
54
- temp_df['总市值'] = pd.to_numeric(temp_df['总市值'], errors="coerce")
55
- temp_df['GDP'] = pd.to_numeric(temp_df['GDP'], errors="coerce")
56
- temp_df['近十年分位数'] = pd.to_numeric(temp_df['近十年分位数'], errors="coerce")
57
- temp_df['总历史分位数'] = pd.to_numeric(temp_df['总历史分位数'], errors="coerce")
53
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], unit="ms")
54
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"] + pd.Timedelta(hours=8)).dt.date
55
+ temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
56
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
57
+ temp_df["GDP"] = pd.to_numeric(temp_df["GDP"], errors="coerce")
58
+ temp_df["近十年分位数"] = pd.to_numeric(temp_df["近十年分位数"], errors="coerce")
59
+ temp_df["总历史分位数"] = pd.to_numeric(temp_df["总历史分位数"], errors="coerce")
58
60
  return temp_df
59
61
 
60
62
 
@@ -5,6 +5,7 @@ Date: 2022/7/13 16:16
5
5
  Desc: 新浪财经-股票-行业分类
6
6
  http://vip.stock.finance.sina.com.cn/mkt/
7
7
  """
8
+
8
9
  import math
9
10
 
10
11
  import pandas as pd
@@ -30,9 +31,7 @@ def stock_classify_board() -> dict:
30
31
  for item in data_json[1][0][1]
31
32
  ] # 沪深股市
32
33
  for num, class_name in enumerate(class_name_list):
33
- temp_df = pd.DataFrame(
34
- [item for item in data_json[1][0][1][num][1:][0]]
35
- )
34
+ temp_df = pd.DataFrame([item for item in data_json[1][0][1][num][1:][0]])
36
35
  if temp_df.shape[1] == 5:
37
36
  temp_df.columns = ["name", "_", "code", "_", "_"]
38
37
  temp_df = temp_df[["name", "code"]]
@@ -57,9 +56,7 @@ def stock_classify_sina(symbol: str = "热门概念") -> pd.DataFrame:
57
56
  """
58
57
  stock_classify_board_dict = stock_classify_board()
59
58
  data_df = pd.DataFrame()
60
- for num in tqdm(
61
- range(len(stock_classify_board_dict[symbol]["code"])), leave=False
62
- ):
59
+ for num in tqdm(range(len(stock_classify_board_dict[symbol]["code"])), leave=False):
63
60
  url = "http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeStockCount"
64
61
  params = {"node": stock_classify_board_dict[symbol]["code"][num]}
65
62
  r = requests.get(url, params=params)