mns-common 1.3.2.6__tar.gz → 1.3.2.7__tar.gz

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

Potentially problematic release.


This version of mns-common might be problematic. Click here for more details.

Files changed (148) hide show
  1. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/PKG-INFO +1 -1
  2. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/em/east_money_debt_api.py +61 -9
  3. mns_common-1.3.2.7/mns_common/api/em/east_money_etf_api.py +361 -0
  4. mns_common-1.3.2.6/mns_common/api/em/east_money_stock_api_develop.py → mns_common-1.3.2.7/mns_common/api/em/east_money_stock_api.py +79 -77
  5. mns_common-1.3.2.7/mns_common/api/em/east_money_stock_hk_api.py +220 -0
  6. mns_common-1.3.2.7/mns_common/api/em/east_money_stock_us_api.py +219 -0
  7. mns_common-1.3.2.6/mns_common/api/em/east_money_stock_hk_api.py → mns_common-1.3.2.7/mns_common/api/em/east_money_stock_v2_api.py +112 -54
  8. {mns_common-1.3.2.6/mns_common/api/em → mns_common-1.3.2.7/mns_common/constant}/east_money_stock_api.py +0 -22
  9. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common.egg-info/PKG-INFO +1 -1
  10. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common.egg-info/SOURCES.txt +2 -2
  11. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/setup.py +1 -1
  12. mns_common-1.3.2.6/mns_common/api/em/east_money_etf_api.py +0 -310
  13. mns_common-1.3.2.6/mns_common/api/em/east_money_stock_v2_api.py +0 -274
  14. mns_common-1.3.2.6/mns_common/api/em/self_choose/__init__.py +0 -27
  15. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/README.md +0 -0
  16. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/__init__.py +0 -0
  17. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/__init__.py +0 -0
  18. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/__init__.py +0 -0
  19. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/k_line_api.py +0 -0
  20. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/stock_bid_ask_api.py +0 -0
  21. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/stock_dt_pool.py +0 -0
  22. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/stock_zb_pool.py +0 -0
  23. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/stock_zt_pool_api.py +0 -0
  24. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/akshare/yjyg_sync_api.py +0 -0
  25. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/em/__init__.py +0 -0
  26. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/em/east_money_stock_gdfx_free_top_10_api.py +0 -0
  27. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/em/em_concept_index_api.py +0 -0
  28. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/hk/__init__.py +0 -0
  29. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/hk/ths_hk_company_info_api.py +0 -0
  30. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/k_line/__init__.py +0 -0
  31. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/k_line/stock_k_line_data_api.py +0 -0
  32. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/k_line/stock_minute_data_api.py +0 -0
  33. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/__init__.py +0 -0
  34. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/common/__init__.py +0 -0
  35. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/common/kpl_common_api.py +0 -0
  36. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/common/kpl_common_field_constant.py +0 -0
  37. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/concept/__init__.py +0 -0
  38. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/concept/kpl_concept_api.py +0 -0
  39. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/constant/__init__.py +0 -0
  40. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/constant/kpl_constant.py +0 -0
  41. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/industry/__init__.py +0 -0
  42. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/industry/kpl_industry_api.py +0 -0
  43. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/selection/__init__.py +0 -0
  44. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/selection/kpl_selection_plate_api.py +0 -0
  45. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/symbol/__init__.py +0 -0
  46. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/symbol/kpl_real_time_quotes_api.py +0 -0
  47. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/symbol/kpl_symbol_common_field_constant.py +0 -0
  48. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/kpl/symbol/symbol_his_quotes_api.py +0 -0
  49. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/msg/__init__.py +0 -0
  50. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/msg/push_msg_api.py +0 -0
  51. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/qmt/__init__.py +0 -0
  52. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/qmt/qmt_minunte_tick_data.py +0 -0
  53. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/__init__.py +0 -0
  54. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/big_deal/__init__.py +0 -0
  55. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/big_deal/ths_big_deal_api.py +0 -0
  56. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/company/__init__.py +0 -0
  57. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/company/ths_company_announce_api.py +0 -0
  58. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/company/ths_company_info_api.py +0 -0
  59. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/__init__.py +0 -0
  60. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/app/__init__.py +0 -0
  61. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/app/ths_concept_detail_app.py +0 -0
  62. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/app/ths_concept_index_app.py +0 -0
  63. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/web/__init__.py +0 -0
  64. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/web/ths_common_js_api.py +0 -0
  65. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/web/ths_company_info_web.py +0 -0
  66. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/web/ths_concept_detail_web.py +0 -0
  67. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/concept/web/ths_concept_index_web.py +0 -0
  68. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/self_choose/__init__.py +0 -0
  69. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/self_choose/ths_self_choose_api.py +0 -0
  70. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/wen_cai/__init__.py +0 -0
  71. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/wen_cai/ths_wen_cai_api.py +0 -0
  72. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/zt/__init__.py +0 -0
  73. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/zt/ths_stock_zt_pool_api.py +0 -0
  74. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/ths/zt/ths_stock_zt_pool_v2_api.py +0 -0
  75. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/us/__init__.py +0 -0
  76. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/api/us/ths_us_company_info_api.py +0 -0
  77. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/__init__.py +0 -0
  78. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/cache/__init__.py +0 -0
  79. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/cache/cache_service.py +0 -0
  80. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/classify/__init__.py +0 -0
  81. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/classify/symbol_classify_api.py +0 -0
  82. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/classify/symbol_classify_param.py +0 -0
  83. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/common_service_fun_api.py +0 -0
  84. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/company/__init__.py +0 -0
  85. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/company/company_common_service_api.py +0 -0
  86. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/company/company_common_service_new_api.py +0 -0
  87. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/concept/__init__.py +0 -0
  88. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/concept/kpl_concept_common_service_api.py +0 -0
  89. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/concept/ths_concept_common_service_api.py +0 -0
  90. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/cookie/__init__.py +0 -0
  91. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/cookie/cookie_info_service.py +0 -0
  92. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/data/__init__.py +0 -0
  93. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/data/data_init_api.py +0 -0
  94. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/deal/__init__.py +0 -0
  95. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/deal/deal_service_api.py +0 -0
  96. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/deal/terminal_enum.py +0 -0
  97. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/hk/__init__.py +0 -0
  98. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/hk/company_hk_service_api.py +0 -0
  99. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/industry/__init__.py +0 -0
  100. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/industry/ths_industry_index_api.py +0 -0
  101. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/__init__.py +0 -0
  102. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/clean/__init__.py +0 -0
  103. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/clean/k_line_param.py +0 -0
  104. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/clean/sh_small_normal_zt_k_line_check_api.py +0 -0
  105. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/common/__init__.py +0 -0
  106. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/common/k_line_common_service_api.py +0 -0
  107. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/patterns/__init__.py +0 -0
  108. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/patterns/k_line_patterns_service_api.py +0 -0
  109. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/k_line/patterns/pattern_Enum.py +0 -0
  110. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/price/__init__.py +0 -0
  111. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/price/trade_price_service_api.py +0 -0
  112. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/qmt/__init__.py +0 -0
  113. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/qmt/qmt_buy_service.py +0 -0
  114. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/real_time/__init__.py +0 -0
  115. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/real_time/real_time_common_service_api.py +0 -0
  116. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/redis_msg/__init__.py +0 -0
  117. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/redis_msg/redis_msg_publish_service.py +0 -0
  118. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/self_choose/__init__.py +0 -0
  119. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/self_choose/black_list_service_api.py +0 -0
  120. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/self_choose/self_choose_service_api.py +0 -0
  121. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/tfp/__init__.py +0 -0
  122. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/tfp/stock_tfp_api.py +0 -0
  123. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/trade_date/__init__.py +0 -0
  124. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/trade_date/trade_date_common_service_api.py +0 -0
  125. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/zt/__init__.py +0 -0
  126. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/component/zt/zt_common_service_api.py +0 -0
  127. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/__init__.py +0 -0
  128. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/black_list_classify_enum.py +0 -0
  129. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/db_name_constant.py +0 -0
  130. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/price_enum.py +0 -0
  131. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/redis_msg_constant.py +0 -0
  132. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/constant/self_choose_constant.py +0 -0
  133. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/db/MongodbUtil.py +0 -0
  134. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/db/MongodbUtilLocal.py +0 -0
  135. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/db/__init__.py +0 -0
  136. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/db/v2/MongodbUtilV2.py +0 -0
  137. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/db/v2/__init__.py +0 -0
  138. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/__init__.py +0 -0
  139. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/async_fun.py +0 -0
  140. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/cmd_util.py +0 -0
  141. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/data_frame_util.py +0 -0
  142. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/date_handle_util.py +0 -0
  143. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/db_util.py +0 -0
  144. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/file_util.py +0 -0
  145. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common/utils/ip_util.py +0 -0
  146. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common.egg-info/dependency_links.txt +0 -0
  147. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/mns_common.egg-info/top_level.txt +0 -0
  148. {mns_common-1.3.2.6 → mns_common-1.3.2.7}/setup.cfg +0 -0
@@ -1,3 +1,3 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns_common
3
- Version: 1.3.2.6
3
+ Version: 1.3.2.7
@@ -8,7 +8,7 @@ file_path = os.path.abspath(__file__)
8
8
  end = file_path.index('mns') + 14
9
9
  project_path = file_path[0:end]
10
10
  sys.path.append(project_path)
11
-
11
+ from concurrent.futures import ThreadPoolExecutor
12
12
  import pandas as pd
13
13
  from loguru import logger
14
14
  import json
@@ -17,6 +17,13 @@ import time
17
17
  import akshare as ak
18
18
  import numpy as np
19
19
 
20
+ # 最大返回条数
21
+ max_number = 600
22
+ # 最小返回条数
23
+ min_number = 500
24
+ # 分页条数
25
+ page_number = 200
26
+
20
27
 
21
28
  # fields_02 = "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70,f71,f72,f73,f74,f75,f76,f77,f78,f79,f80,f81,f82,f83,f84,f85,f86,f87,f88,f89,f90,f91,f92,f93,f94,f95,f96,f97,f98,f99,f100,f101,f102,f103,f104,f105,f106,f107,f108" \
22
29
  # ",f109,f110,f111,f112,f113,f114,f115,f116,f117,f118,f119,f120,f121,f122,f123,f124,f125,f126,f127,f128,f129,f130,f131,f132,f133,f134,f135,f136,f137,f138,f139,f140,f141,f142,f143,f144,f145,f146,f147,f148,f149,f150,f151,f152,f153,f154,f155,f156,f157,f158,f159,f160,f161,f162,f163,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f184,f185,f186,f187,f188,f189,f190,f191,f192,f193,f194,f195,f196,f197,f198,f199,f200" \
@@ -29,13 +36,13 @@ import numpy as np
29
36
  # =8a086bfc3570bdde64a6a1c585cccb35&fltt=1&invt=1&fs=m:0+e:11,m:1+e:11,m:1+e:11+s:4194304,
30
37
  # m:0+e:11+s:8388608&dpt=zqsc.zpg&fields=f1,f2,f3,f4,f5,f6,f8,f10,f12,f13,f14,f18,f22,f152,
31
38
  # f237&wbp2u=|0|0|0|wap&fid=f3&po=1&pz=2000&_=1718163189870
32
- def all_debt_ticker_data(fields) -> pd.DataFrame:
39
+ def get_debt_page_data(fields, pn) -> pd.DataFrame:
33
40
  current_timestamp = str(int(round(time.time() * 1000, 0)))
34
41
  url = "https://push2.eastmoney.com/api/qt/clist/get"
35
42
 
36
43
  params = {
37
44
  "cb": "jQuery34103608466964799838_" + current_timestamp,
38
- "pn": 1,
45
+ "pn": str(pn),
39
46
  "np": 3,
40
47
  "ut": "8a086bfc3570bdde64a6a1c585cccb35",
41
48
  "fltt": 1,
@@ -58,16 +65,58 @@ def all_debt_ticker_data(fields) -> pd.DataFrame:
58
65
  data_json = json.loads(data_json)
59
66
  if data_json is None:
60
67
  return pd.DataFrame()
61
- return pd.DataFrame(data_json)
68
+ else:
69
+ return pd.DataFrame(data_json)
62
70
  except Exception as e:
63
- logger.error("获取股票列表,实时行情异常:{}", e)
64
- return None
71
+ logger.error("获取可转债列表,实时行情异常:{}", e)
72
+ return pd.DataFrame()
73
+
74
+
75
+ def all_debt_ticker_data(fields) -> pd.DataFrame:
76
+ """
77
+ 使用多线程获取所有债券数据
78
+ """
79
+ # 计算总页数,假设总共有1000条数据,每页200条
80
+
81
+ per_page = page_number
82
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
83
+
84
+ # 创建线程池
85
+ with ThreadPoolExecutor(max_workers=3) as executor:
86
+ # 提交任务,获取每页数据
87
+ futures = [executor.submit(get_debt_page_data, fields, pn)
88
+ for pn in range(1, total_pages + 1)]
89
+
90
+ # 收集结果
91
+ results = []
92
+ for future in futures:
93
+ result = future.result()
94
+ if not result.empty:
95
+ results.append(result)
96
+
97
+ # 合并所有页面的数据
98
+ if results:
99
+ return pd.concat(results, ignore_index=True)
100
+ else:
101
+ return pd.DataFrame()
65
102
 
66
103
 
67
104
  def get_debt_real_time_quotes():
68
105
  fields = ("f352,f2,f3,f5,f6,f8,f10,f11,f22,f12,f14,f15,f16,f17,f18,f20,f21,f26,f33,f34,f35,f62,f66,f69,f72,f184,"
69
106
  "f211,f212,f232,f233,f234")
70
- temp_df = all_debt_ticker_data(fields)
107
+ # 获取第一页数据
108
+ page_one_df = get_debt_page_data(fields, 1)
109
+ # 数据接口正常返回5600以上的数量
110
+ if page_one_df.shape[0] > min_number:
111
+ page_one_df = rename_real_time_quotes_df(page_one_df)
112
+ return page_one_df
113
+ else:
114
+ page_df = all_debt_ticker_data(fields)
115
+ page_df = rename_real_time_quotes_df(page_df)
116
+ return page_df
117
+
118
+
119
+ def rename_real_time_quotes_df(temp_df):
71
120
  temp_df = temp_df.rename(columns={
72
121
  "f2": "now_price",
73
122
  "f3": "chg",
@@ -233,5 +282,8 @@ def get_kzz_bond_info():
233
282
 
234
283
 
235
284
  if __name__ == '__main__':
236
- print(get_debt_real_time_quotes())
237
- get_kzz_bond_info()
285
+ info_df = get_kzz_bond_info()
286
+ print(info_df)
287
+ while True:
288
+ df = get_debt_real_time_quotes()
289
+ logger.info(df)
@@ -0,0 +1,361 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ from concurrent.futures import ThreadPoolExecutor
10
+ import pandas as pd
11
+ from loguru import logger
12
+ import requests
13
+ import time
14
+ import numpy as np
15
+
16
+ # 最大返回条数
17
+ max_number = 1200
18
+ # 最小返回条数
19
+ min_number = 1000
20
+ # 分页条数
21
+ page_number = 200
22
+
23
+
24
+ def get_fund_etf_page_df(pn) -> pd.DataFrame:
25
+ """
26
+ 东方财富-ETF 实时行情
27
+ https://quote.eastmoney.com/center/gridlist.html#fund_etf
28
+ :return: ETF 实时行情
29
+ :rtype: pandas.DataFrame
30
+ """
31
+ current_timestamp = str(int(round(time.time() * 1000, 0)))
32
+ url = "https://88.push2.eastmoney.com/api/qt/clist/get"
33
+ params = {
34
+ "pn": str(pn),
35
+ "pz": "5000",
36
+ "po": "1",
37
+ "np": "3",
38
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
39
+ "fltt": "2",
40
+ "invt": "2",
41
+ "wbp2u": "|0|0|0|web",
42
+ "fid": "f3",
43
+ "fs": "b:MK0021,b:MK0022,b:MK0023,b:MK0024",
44
+ "fields": (
45
+ "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,"
46
+ "f12,f13,f14,f15,f16,f17,f18,f20,f21,"
47
+ "f23,f24,f25,f26,f22,f11,f30,f31,f32,f33,"
48
+ "f34,f35,f38,f62,f63,f64,f65,f66,f69,"
49
+ "f72,f75,f78,f81,f84,f87,f115,f124,f128,"
50
+ "f136,f152,f184,f297,f402,f441"
51
+ ),
52
+ "_": str(current_timestamp),
53
+ }
54
+ try:
55
+ r = requests.get(url, timeout=15, params=params)
56
+ data_json = r.json()
57
+ temp_df = pd.DataFrame(data_json["data"]["diff"])
58
+ temp_df.rename(
59
+ columns={
60
+ "f26": "上市时间",
61
+ "f12": "代码",
62
+ "f14": "名称",
63
+ "f2": "最新价",
64
+ "f4": "涨跌额",
65
+ "f3": "涨跌幅",
66
+ "f5": "成交量",
67
+ "f6": "成交额",
68
+ "f7": "振幅",
69
+ "f17": "开盘价",
70
+ "f15": "最高价",
71
+ "f16": "最低价",
72
+ "f18": "昨收",
73
+ "f8": "换手率",
74
+ "f10": "量比",
75
+ "f30": "现手",
76
+ "f31": "买一",
77
+ "f32": "卖一",
78
+ "f33": "委比",
79
+ "f34": "外盘",
80
+ "f35": "内盘",
81
+ "f62": "主力净流入-净额",
82
+ "f184": "主力净流入-净占比",
83
+ "f66": "超大单净流入-净额",
84
+ "f69": "超大单净流入-净占比",
85
+ "f72": "大单净流入-净额",
86
+ "f75": "大单净流入-净占比",
87
+ "f78": "中单净流入-净额",
88
+ "f81": "中单净流入-净占比",
89
+ "f84": "小单净流入-净额",
90
+ "f87": "小单净流入-净占比",
91
+ "f38": "最新份额",
92
+ "f21": "流通市值",
93
+ "f20": "总市值",
94
+ "f402": "基金折价率",
95
+ "f441": "IOPV实时估值",
96
+ "f297": "数据日期",
97
+ "f124": "更新时间",
98
+ "f13": "market"
99
+ },
100
+ inplace=True,
101
+ )
102
+ temp_df = temp_df[
103
+ [
104
+ "代码",
105
+ "名称",
106
+ "最新价",
107
+ "IOPV实时估值",
108
+ "基金折价率",
109
+ "涨跌额",
110
+ "涨跌幅",
111
+ "成交量",
112
+ "成交额",
113
+ "开盘价",
114
+ "最高价",
115
+ "最低价",
116
+ "昨收",
117
+ "振幅",
118
+ "换手率",
119
+ "量比",
120
+ "委比",
121
+ "外盘",
122
+ "内盘",
123
+ "主力净流入-净额",
124
+ "主力净流入-净占比",
125
+ "超大单净流入-净额",
126
+ "超大单净流入-净占比",
127
+ "大单净流入-净额",
128
+ "大单净流入-净占比",
129
+ "中单净流入-净额",
130
+ "中单净流入-净占比",
131
+ "小单净流入-净额",
132
+ "小单净流入-净占比",
133
+ "现手",
134
+ "买一",
135
+ "卖一",
136
+ "最新份额",
137
+ "流通市值",
138
+ "总市值",
139
+ "数据日期",
140
+ "更新时间",
141
+ "market",
142
+ "上市时间"
143
+ ]
144
+ ]
145
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
146
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
147
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
148
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
149
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
150
+ temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
151
+ temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
152
+ temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
153
+ temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
154
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
155
+ temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
156
+ temp_df["委比"] = pd.to_numeric(temp_df["委比"], errors="coerce")
157
+ temp_df["外盘"] = pd.to_numeric(temp_df["外盘"], errors="coerce")
158
+ temp_df["内盘"] = pd.to_numeric(temp_df["内盘"], errors="coerce")
159
+ temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
160
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
161
+ temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
162
+ temp_df["现手"] = pd.to_numeric(temp_df["现手"], errors="coerce")
163
+ temp_df["买一"] = pd.to_numeric(temp_df["买一"], errors="coerce")
164
+ temp_df["卖一"] = pd.to_numeric(temp_df["卖一"], errors="coerce")
165
+ temp_df["最新份额"] = pd.to_numeric(temp_df["最新份额"], errors="coerce")
166
+ temp_df["IOPV实时估值"] = pd.to_numeric(temp_df["IOPV实时估值"], errors="coerce")
167
+ temp_df["基金折价率"] = pd.to_numeric(temp_df["基金折价率"], errors="coerce")
168
+ temp_df["主力净流入-净额"] = pd.to_numeric(
169
+ temp_df["主力净流入-净额"], errors="coerce"
170
+ )
171
+ temp_df["主力净流入-净占比"] = pd.to_numeric(
172
+ temp_df["主力净流入-净占比"], errors="coerce"
173
+ )
174
+ temp_df["超大单净流入-净额"] = pd.to_numeric(
175
+ temp_df["超大单净流入-净额"], errors="coerce"
176
+ )
177
+ temp_df["超大单净流入-净占比"] = pd.to_numeric(
178
+ temp_df["超大单净流入-净占比"], errors="coerce"
179
+ )
180
+ temp_df["大单净流入-净额"] = pd.to_numeric(
181
+ temp_df["大单净流入-净额"], errors="coerce"
182
+ )
183
+ temp_df["大单净流入-净占比"] = pd.to_numeric(
184
+ temp_df["大单净流入-净占比"], errors="coerce"
185
+ )
186
+ temp_df["中单净流入-净额"] = pd.to_numeric(
187
+ temp_df["中单净流入-净额"], errors="coerce"
188
+ )
189
+ temp_df["中单净流入-净占比"] = pd.to_numeric(
190
+ temp_df["中单净流入-净占比"], errors="coerce"
191
+ )
192
+ temp_df["小单净流入-净额"] = pd.to_numeric(
193
+ temp_df["小单净流入-净额"], errors="coerce"
194
+ )
195
+ temp_df["小单净流入-净占比"] = pd.to_numeric(
196
+ temp_df["小单净流入-净占比"], errors="coerce"
197
+ )
198
+ temp_df["数据日期"] = pd.to_datetime(
199
+ temp_df["数据日期"], format="%Y%m%d", errors="coerce"
200
+ )
201
+ temp_df["更新时间"] = (
202
+ pd.to_datetime(temp_df["更新时间"], unit="s", errors="coerce")
203
+ .dt.tz_localize("UTC")
204
+ .dt.tz_convert("Asia/Shanghai")
205
+ )
206
+
207
+ return temp_df
208
+ except Exception as e:
209
+ logger.error("获取ETF列表,实时行情异常:{}", e)
210
+ return pd.DataFrame()
211
+
212
+
213
+ def thread_pool_executor():
214
+ """
215
+ 使用多线程获取所有ETF数据
216
+ """
217
+ # 计算总页数,假设总共有1000条数据,每页200条
218
+
219
+ per_page = page_number
220
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
221
+
222
+ # 创建线程池
223
+ with ThreadPoolExecutor(max_workers=3) as executor:
224
+ # 提交任务,获取每页数据
225
+ futures = [executor.submit(get_fund_etf_page_df, pn)
226
+ for pn in range(1, total_pages + 1)]
227
+
228
+ # 收集结果
229
+ results = []
230
+ for future in futures:
231
+ result = future.result()
232
+ if not result.empty:
233
+ results.append(result)
234
+
235
+ # 合并所有页面的数据
236
+ if results:
237
+ return pd.concat(results, ignore_index=True)
238
+ else:
239
+ return pd.DataFrame()
240
+
241
+
242
+ def rename_etf(fund_etf_spot_em_df):
243
+ fund_etf_spot_em_df = fund_etf_spot_em_df.rename(columns={
244
+ "上市时间": "list_date",
245
+ "最新价": "now_price",
246
+ "涨跌幅": "chg",
247
+ "基金折价率": "fund_discount_rate",
248
+ "振幅": "pct_chg",
249
+ "涨跌额": "range",
250
+ "成交额": "amount",
251
+ "成交量": "volume",
252
+ "换手率": "exchange",
253
+ "量比": "quantity_ratio",
254
+ "代码": "symbol",
255
+ "名称": "name",
256
+ "最高价": "high",
257
+ "最低价": "low",
258
+ "开盘价": "open",
259
+ "昨收": "yesterday_price",
260
+ "总市值": "total_mv",
261
+ "流通市值": "flow_mv",
262
+ "委比": "wei_bi",
263
+ "外盘": "outer_disk",
264
+ "内盘": "inner_disk",
265
+ "主力净流入-净额": "today_main_net_inflow",
266
+ "超大单净流入-净额": "super_large_order_net_inflow",
267
+ "超大单净流入-净占比": "super_large_order_net_inflow_ratio",
268
+ "大单净流入-净额": "large_order_net_inflow",
269
+ # "f78": "medium_order_net_inflow",
270
+ # "f84": "small_order_net_inflow",
271
+ # "f103": "concept",
272
+ "主力净流入-净占比": "today_main_net_inflow_ratio",
273
+ "买一": "buy_1_num",
274
+ "卖一": "sell_1_num",
275
+ "最新份额": "latest_share",
276
+ "数据日期": "data_time",
277
+ "更新时间": "update_time"
278
+ })
279
+
280
+ fund_etf_spot_em_df = fund_etf_spot_em_df[[
281
+ "now_price",
282
+ "chg",
283
+ "fund_discount_rate",
284
+ "pct_chg",
285
+ "range",
286
+ "amount",
287
+ "volume",
288
+ "exchange",
289
+ "quantity_ratio",
290
+ "symbol",
291
+ "name",
292
+ "high",
293
+ "low",
294
+ "open",
295
+ "yesterday_price",
296
+ "total_mv",
297
+ "flow_mv",
298
+ "wei_bi",
299
+ "outer_disk",
300
+ "inner_disk",
301
+ "today_main_net_inflow",
302
+ "super_large_order_net_inflow",
303
+ "super_large_order_net_inflow_ratio",
304
+ "large_order_net_inflow",
305
+ "today_main_net_inflow_ratio",
306
+ "buy_1_num",
307
+ "sell_1_num",
308
+ "latest_share",
309
+ "data_time",
310
+ "update_time",
311
+ "market",
312
+ 'list_date'
313
+ ]]
314
+
315
+ fund_etf_spot_em_df['disk_ratio'] = round(
316
+ (fund_etf_spot_em_df['outer_disk'] - fund_etf_spot_em_df['inner_disk']) / fund_etf_spot_em_df['inner_disk'], 2)
317
+
318
+ fund_etf_spot_em_df.loc[:, 'reference_main_inflow'] = round(
319
+ (fund_etf_spot_em_df['flow_mv'] * (1 / 1000)), 2)
320
+
321
+ fund_etf_spot_em_df.loc[:, 'main_inflow_multiple'] = round(
322
+ (fund_etf_spot_em_df['today_main_net_inflow'] / fund_etf_spot_em_df['reference_main_inflow']), 2)
323
+
324
+ fund_etf_spot_em_df.loc[:, 'super_main_inflow_multiple'] = round(
325
+ (fund_etf_spot_em_df['super_large_order_net_inflow'] / fund_etf_spot_em_df['reference_main_inflow']), 2)
326
+ fund_etf_spot_em_df['large_inflow_multiple'] = round(
327
+ (fund_etf_spot_em_df['large_order_net_inflow'] / fund_etf_spot_em_df['reference_main_inflow']), 2)
328
+
329
+ fund_etf_spot_em_df['disk_diff_amount'] = round(
330
+ (fund_etf_spot_em_df['outer_disk'] - fund_etf_spot_em_df['inner_disk']) * fund_etf_spot_em_df[
331
+ "now_price"] * 100,
332
+ 2)
333
+
334
+ fund_etf_spot_em_df['disk_diff_amount_exchange'] = round(
335
+ (fund_etf_spot_em_df['disk_diff_amount'] / fund_etf_spot_em_df['reference_main_inflow']), 2)
336
+ fund_etf_spot_em_df.loc[:, 'sum_main_inflow_disk'] = fund_etf_spot_em_df['main_inflow_multiple'] + \
337
+ fund_etf_spot_em_df['disk_diff_amount_exchange']
338
+ fund_etf_spot_em_df = fund_etf_spot_em_df.fillna(0)
339
+
340
+ fund_etf_spot_em_df.replace([np.inf, -np.inf], 0, inplace=True)
341
+ return fund_etf_spot_em_df
342
+
343
+
344
+ def get_etf_real_time_quotes():
345
+ # 获取第一页数据
346
+ page_one_df = get_fund_etf_page_df(1)
347
+ # 数据接口正常返回5600以上的数量
348
+ if page_one_df.shape[0] > min_number:
349
+ page_one_df = rename_etf(page_one_df)
350
+ return page_one_df
351
+ else:
352
+ page_df = thread_pool_executor()
353
+ page_df = rename_etf(page_df)
354
+ return page_df
355
+
356
+
357
+ if __name__ == '__main__':
358
+ fund_etf_df = get_etf_real_time_quotes()
359
+ fund_etf_df = fund_etf_df.sort_values(by=['amount'], ascending=False)
360
+ fund_etf_df = fund_etf_df.fillna(0)
361
+ print(fund_etf_df)