mns-scheduler 1.1.8.4__py3-none-any.whl → 1.4.5.7__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 (139) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/auto_da_ban/auto_da_ban_service.py +89 -0
  3. mns_scheduler/company_info/clean/__init__.py +1 -1
  4. mns_scheduler/company_info/clean/company_info_clean_api.py +62 -21
  5. mns_scheduler/company_info/common/company_common_query_service.py +45 -0
  6. mns_scheduler/company_info/constant/__init__.py +1 -1
  7. mns_scheduler/company_info/constant/company_constant_data.py +335 -224
  8. mns_scheduler/company_info/de_list_stock/__init__.py +1 -1
  9. mns_scheduler/company_info/de_list_stock/de_list_stock_service.py +1 -1
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +134 -0
  11. mns_scheduler/company_info/sync/company_info_set_service.py +208 -0
  12. mns_scheduler/company_info/sync/sync_company_info_task.py +203 -0
  13. mns_scheduler/company_info/task/company_announce_info_task.py +77 -0
  14. mns_scheduler/company_info/task/company_base_info_task.py +64 -0
  15. mns_scheduler/company_info/task/company_business_info_task.py +177 -0
  16. mns_scheduler/company_info/task/company_hold_info_task.py +66 -0
  17. mns_scheduler/company_info/task/company_industry_info_task.py +167 -0
  18. mns_scheduler/company_info/task/company_total_task.py +69 -0
  19. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  20. mns_scheduler/concept/clean/ths_concept_clean_api.py +20 -4
  21. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +23 -18
  22. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +4 -1
  23. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +7 -7
  24. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +9 -4
  25. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +2 -2
  26. mns_scheduler/db/col_move_service.py +3 -3
  27. mns_scheduler/db/script/__init__.py +1 -1
  28. mns_scheduler/db/script/col_move_script.py +1 -1
  29. mns_scheduler/db/script/db_move/__init__.py +7 -0
  30. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  31. mns_scheduler/db/script/sync/__init__.py +1 -1
  32. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +65 -4
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  34. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  35. mns_scheduler/db/script/update/__init__.py +7 -0
  36. mns_scheduler/db/script/update/update_col_field.py +36 -0
  37. mns_scheduler/finance/__init__.py +1 -1
  38. mns_scheduler/finance/em/__init__.py +7 -0
  39. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +2 -2
  40. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +27 -26
  41. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +3 -3
  42. mns_scheduler/finance/{sync_financial_report_service_api.py → sync_financial_report_service_task.py} +80 -27
  43. mns_scheduler/finance/xue_qiu/__init__.py +7 -0
  44. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  45. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  46. mns_scheduler/hk/__init__.py +1 -1
  47. mns_scheduler/hk/hk_company_info_sync_service_api.py +4 -4
  48. mns_scheduler/hk/hk_industry_info_sync_service_api.py +3 -5
  49. mns_scheduler/industry/__init__.py +7 -0
  50. mns_scheduler/industry/ths/__init__.py +7 -0
  51. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  52. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  53. mns_scheduler/irm/__init__.py +1 -1
  54. mns_scheduler/irm/api/__init__.py +1 -1
  55. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +8 -58
  56. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +15 -26
  57. mns_scheduler/irm/stock_irm_cninfo_service.py +43 -31
  58. mns_scheduler/irm/stock_question_id_service.py +169 -0
  59. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  60. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +52 -6
  61. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +7 -2
  62. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  63. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -15
  64. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  65. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +124 -26
  66. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +2 -2
  67. mns_scheduler/k_line/common/__init__.py +7 -0
  68. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  69. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  70. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  71. mns_scheduler/k_line/{sync → month_week_daily}/bfq_k_line_sync.py +14 -29
  72. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +11 -12
  73. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  74. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  75. mns_scheduler/k_line/test/__init__.py +1 -1
  76. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +14 -3
  77. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  78. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  79. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +1 -2
  80. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  81. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +5 -0
  82. mns_scheduler/lhb/__init__.py +1 -1
  83. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  84. mns_scheduler/open/__init__.py +1 -1
  85. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +2 -3
  86. mns_scheduler/risk/__init__.py +1 -1
  87. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +8 -2
  88. mns_scheduler/risk/financial/annual_report_audit_check_api.py +13 -3
  89. mns_scheduler/risk/financial/net_assets_check_api.py +21 -18
  90. mns_scheduler/risk/financial/profit_income_check_api.py +7 -2
  91. mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
  92. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
  93. mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
  94. mns_scheduler/risk/test/__init__.py +1 -1
  95. mns_scheduler/risk/test/fix_blask_list.py +4 -6
  96. mns_scheduler/risk/transactions/transactions_check_api.py +22 -4
  97. mns_scheduler/self_choose/__init__.py +1 -1
  98. mns_scheduler/self_choose/ths_self_choose_service.py +99 -43
  99. mns_scheduler/trade/auto_login/trader_auto_service.py +7 -4
  100. mns_scheduler/trade/auto_sell_service_api.py +4 -4
  101. mns_scheduler/trade/balance/__init__.py +7 -0
  102. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  103. mns_scheduler/trade/sync_position_api.py +39 -6
  104. mns_scheduler/trade/task/trader_task_service.py +38 -10
  105. mns_scheduler/trade/tfp/__init__.py +7 -0
  106. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  107. mns_scheduler/zb/stock_zb_pool_sync.py +1 -16
  108. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -2
  109. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +1 -1
  110. mns_scheduler/zt/script/__init__.py +1 -1
  111. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  112. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -2
  113. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  114. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +8 -7
  115. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +260 -83
  116. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +33 -90
  117. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +27 -13
  118. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  119. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  120. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  121. mns_scheduler/zz_task/data_sync_task.py +197 -103
  122. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/METADATA +1 -1
  123. mns_scheduler-1.4.5.7.dist-info/RECORD +176 -0
  124. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/WHEEL +1 -1
  125. mns_scheduler/2014-2015-test/2014_2015_chg_statistics.py +0 -87
  126. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  127. mns_scheduler/company_info/base/sync_company_base_info_api.py +0 -439
  128. mns_scheduler/company_info/base/sync_company_hold_info_api.py +0 -40
  129. mns_scheduler/company_info/remark/company_remark_info_sync.py +0 -46
  130. mns_scheduler/db/real_time_task_check.py +0 -84
  131. mns_scheduler/debt/kzz_bond_info_sync.py +0 -33
  132. mns_scheduler-1.1.8.4.dist-info/RECORD +0 -142
  133. /mns_scheduler/{2014-2015-test → auto_da_ban}/__init__.py +0 -0
  134. /mns_scheduler/company_info/{base → common}/__init__.py +0 -0
  135. /mns_scheduler/{big_deal → company_info/em_stock_info}/__init__.py +0 -0
  136. /mns_scheduler/company_info/{remark → sync}/__init__.py +0 -0
  137. /mns_scheduler/{debt → company_info/task}/__init__.py +0 -0
  138. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  139. {mns_scheduler-1.1.8.4.dist-info → mns_scheduler-1.4.5.7.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,6 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
@@ -2,7 +2,7 @@ import sys
2
2
  import os
3
3
 
4
4
  file_path = os.path.abspath(__file__)
5
- end = file_path.index('mns') + 16
5
+ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import pandas as pd
@@ -0,0 +1,134 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ from loguru import logger
11
+ from datetime import datetime
12
+ import mns_common.constant.extra_income_db_name as extra_income_db_name
13
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
14
+ import mns_common.api.em.real_time.east_money_stock_us_api as east_money_stock_us_api
15
+ import mns_common.api.em.real_time.east_money_debt_api as east_money_debt_api
16
+ import mns_common.api.em.real_time.east_money_etf_api as east_money_etf_api
17
+ import mns_common.api.em.real_time.east_money_stock_hk_api as east_money_stock_hk_api
18
+ import mns_common.api.em.real_time.east_money_stock_hk_gtt_api as east_money_stock_hk_gtt_api
19
+ import mns_common.api.em.real_time.east_money_stock_a_v2_api as east_money_stock_a_v2_api
20
+
21
+ mongodb_util = MongodbUtil('27017')
22
+
23
+
24
+ def sync_all_em_stock_info():
25
+ logger.info("同步东方财富a,etf,kzz,us,hk,信息开始")
26
+ # 同步东方财富A股股票信息
27
+ sync_stock_info()
28
+ # 同步东方财富A股可转债信息
29
+ sync_kzz_info()
30
+ # 同步东方财富A股ETF信息
31
+ sync_etf_info()
32
+ # 同步东方财富港股信息
33
+ sync_hk_stock_info()
34
+ # 同步东方财富港股通信息
35
+ sync_hk_ggt_stock_info()
36
+ # 同步东方财富美股信息
37
+ sync_us_stock_info()
38
+
39
+ logger.info("同步东方财富a,etf,kzz,us,hk,信息完成")
40
+
41
+
42
+ # 同步东方财富A股可转债信息
43
+ def sync_kzz_info():
44
+ now_date = datetime.now()
45
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
46
+ logger.error("同步东方财富可转债信息")
47
+ try:
48
+ em_kzz_info = east_money_debt_api.get_kzz_real_time_quotes(30, 6)
49
+ em_kzz_info['_id'] = em_kzz_info['symbol']
50
+ em_kzz_info['sync_time'] = str_now_date
51
+ mongodb_util.save_mongo(em_kzz_info, extra_income_db_name.EM_KZZ_INFO)
52
+ except BaseException as e:
53
+ logger.error("同步东方财富可转债信息异常:{}", e)
54
+
55
+
56
+ # 同步东方财富A股ETF信息
57
+ def sync_etf_info():
58
+ now_date = datetime.now()
59
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
60
+ logger.error("同步东方财富ETF信息")
61
+ try:
62
+ em_etf_info = east_money_etf_api.get_etf_real_time_quotes(30, 6)
63
+ em_etf_info['_id'] = em_etf_info['symbol']
64
+ em_etf_info['sync_time'] = str_now_date
65
+ mongodb_util.save_mongo(em_etf_info, extra_income_db_name.EM_ETF_INFO)
66
+ except BaseException as e:
67
+ logger.error("同步东方财富ETF信息异常:{}", e)
68
+
69
+
70
+ # 同步东方财富A股股票信息
71
+ def sync_stock_info():
72
+ now_date = datetime.now()
73
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
74
+ logger.error("同步东方财富股票信息")
75
+ try:
76
+ em_etf_info = east_money_stock_a_v2_api.get_stock_real_time_quotes(60)
77
+ em_etf_info['_id'] = em_etf_info['symbol']
78
+ em_etf_info['sync_time'] = str_now_date
79
+ mongodb_util.save_mongo(em_etf_info, extra_income_db_name.EM_A_STOCK_INFO)
80
+ except BaseException as e:
81
+ logger.error("同步东方财富ETF信息异常:{}", e)
82
+
83
+
84
+ # 同步东方财富港股信息
85
+ def sync_hk_stock_info():
86
+ now_date = datetime.now()
87
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
88
+ logger.error("同步东方财富港股信息")
89
+
90
+ em_cookie = cookie_info_service.get_em_cookie()
91
+
92
+ try:
93
+ em_hk_info = east_money_stock_hk_api.get_hk_real_time_quotes(30, em_cookie)
94
+ em_hk_info['_id'] = em_hk_info['symbol']
95
+ em_hk_info['sync_time'] = str_now_date
96
+ mongodb_util.save_mongo(em_hk_info, extra_income_db_name.EM_HK_STOCK_INFO)
97
+ except BaseException as e:
98
+ logger.error("同步东方财富ETF信息异常:{}", e)
99
+
100
+
101
+ # 同步东方财富港股通信息
102
+ def sync_hk_ggt_stock_info():
103
+ now_date = datetime.now()
104
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
105
+ logger.error("同步东方财富港股信息")
106
+ em_cookie = cookie_info_service.get_em_cookie()
107
+
108
+ try:
109
+ em_hk_gtt_info = east_money_stock_hk_gtt_api.get_ggt_real_time_quotes(em_cookie, 30, 6)
110
+ em_hk_gtt_info['_id'] = em_hk_gtt_info['symbol']
111
+ em_hk_gtt_info['sync_time'] = str_now_date
112
+ mongodb_util.save_mongo(em_hk_gtt_info, extra_income_db_name.EM_HK_GGT_STOCK_INFO)
113
+ except BaseException as e:
114
+ logger.error("同步东方财富ETF信息异常:{}", e)
115
+
116
+
117
+ # 同步东方财富美股信息 todo 增加稳定接口
118
+ def sync_us_stock_info():
119
+ now_date = datetime.now()
120
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
121
+ logger.error("同步东方财富美股信息")
122
+ em_cookie = cookie_info_service.get_em_cookie()
123
+ us_stock_info = east_money_stock_us_api.get_us_stock_real_time_quotes(em_cookie, None)
124
+ us_stock_info['_id'] = us_stock_info['symbol']
125
+ us_stock_info['sync_time'] = str_now_date
126
+ mongodb_util.save_mongo(us_stock_info, extra_income_db_name.EM_US_STOCK_INFO)
127
+
128
+
129
+ if __name__ == '__main__':
130
+ sync_stock_info()
131
+ # em_cookie = cookie_info_service.get_em_cookie()
132
+ # em_us_stock_info = east_money_stock_us_api.get_us_stock_real_time_quotes(em_cookie, None)
133
+ # em_us_stock_info['_id'] = em_us_stock_info['symbol']
134
+ # mongodb_util.save_mongo(em_us_stock_info, db_name_constant.EM_US_STOCK_INFO)
@@ -0,0 +1,208 @@
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
+ import mns_common.component.common_service_fun_api as common_service_fun_api
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ import mns_common.api.kpl.constant.kpl_constant as kpl_constant
12
+ import mns_common.constant.db_name_constant as db_name_constant
13
+ from functools import lru_cache
14
+ from loguru import logger
15
+
16
+ mongodb_util = MongodbUtil('27017')
17
+
18
+
19
+ def set_kpl_plate_info(company_one_df, company_one, kpl_real_time_quotes):
20
+ try:
21
+ if data_frame_util.is_not_empty(kpl_real_time_quotes):
22
+ kpl_real_time_quotes_one = kpl_real_time_quotes.loc[
23
+ kpl_real_time_quotes['symbol'] == company_one.symbol]
24
+
25
+ if data_frame_util.is_not_empty(kpl_real_time_quotes_one):
26
+ company_one_df['kpl_plate_name'] = list(kpl_real_time_quotes_one['plate_name_list'])[0]
27
+ company_one_df['kpl_most_relative_name'] = \
28
+ list(kpl_real_time_quotes_one['most_relative_name'])[
29
+ 0]
30
+ company_one_df = set_kpl_data(kpl_real_time_quotes_one, company_one_df, company_one)
31
+
32
+ if bool(1 - ("kpl_plate_name" in company_one_df.columns)) or bool(
33
+ 1 - ("kpl_most_relative_name" in company_one_df.columns)):
34
+ company_one_df['kpl_plate_name'] = ""
35
+ company_one_df['kpl_most_relative_name'] = ""
36
+ except BaseException as e:
37
+ logger.warning("设置开盘啦数据异常:{},{}", company_one.symbol, e)
38
+ return company_one_df
39
+
40
+ def set_kpl_data(kpl_real_time_quotes_one, company_one_df, company_one):
41
+ if data_frame_util.is_not_empty(kpl_real_time_quotes_one):
42
+ company_one_df['kpl_plate_name'] = list(kpl_real_time_quotes_one['plate_name_list'])[0]
43
+ company_one_df['kpl_most_relative_name'] = list(kpl_real_time_quotes_one['most_relative_name'])[
44
+ 0]
45
+ symbol = company_one.symbol
46
+
47
+ query = {'symbol': symbol, "index_class": kpl_constant.FIRST_INDEX}
48
+ kpl_best_choose_index_detail = mongodb_util.find_query_data('kpl_best_choose_index_detail', query)
49
+ if data_frame_util.is_not_empty(kpl_best_choose_index_detail):
50
+ kpl_best_choose_index_detail = kpl_best_choose_index_detail[[
51
+ "plate_code",
52
+ "plate_name",
53
+ "first_plate_code",
54
+ "first_plate_name",
55
+ "index_class"
56
+ ]]
57
+
58
+ # 去除空格
59
+ kpl_best_choose_index_detail['plate_name'] = kpl_best_choose_index_detail['plate_name'].str.replace(' ', '')
60
+ # 去除空格
61
+ kpl_best_choose_index_detail['first_plate_name'] = kpl_best_choose_index_detail[
62
+ 'first_plate_name'].str.replace(' ', '')
63
+
64
+ company_one_df.loc[:, 'kpl_plate_list_info'] = kpl_best_choose_index_detail.to_string(index=False)
65
+ return company_one_df
66
+
67
+
68
+ # 获取可转债信息
69
+ @lru_cache(maxsize=None)
70
+ def get_kzz_debt_info():
71
+ query = {}
72
+ kzz_debt_info_df = mongodb_util.find_query_data(db_name_constant.KZZ_DEBT_INFO, query)
73
+ kzz_debt_info_df = kzz_debt_info_df[[
74
+ 'symbol',
75
+ 'name',
76
+ 'stock_code',
77
+ 'apply_date',
78
+ 'list_date',
79
+ 'due_date'
80
+ ]]
81
+ return kzz_debt_info_df
82
+
83
+
84
+ def set_kzz_debt(company_one_df, symbol):
85
+ kzz_debt_info_df_all = get_kzz_debt_info()
86
+ kzz_debt_info_df = kzz_debt_info_df_all.loc[kzz_debt_info_df_all['stock_code'] == symbol]
87
+
88
+ if data_frame_util.is_not_empty(kzz_debt_info_df):
89
+ kzz_debt_info_df_list = kzz_debt_info_df.to_dict(orient='records')
90
+ company_one_df['kzz_debt_list'] = [kzz_debt_info_df_list]
91
+ return company_one_df
92
+
93
+
94
+ # 获取最近年报收入
95
+ def set_recent_year_income(symbol, company_one_df):
96
+ query = {'symbol': symbol, "REPORT_TYPE": "年报"}
97
+ em_stock_profit = mongodb_util.descend_query(query, db_name_constant.EM_STOCK_PROFIT, 'REPORT_DATE', 1)
98
+ if data_frame_util.is_not_empty(em_stock_profit):
99
+ company_one_df['operate_profit'] = list(em_stock_profit['OPERATE_PROFIT'])[0]
100
+ company_one_df['operate_date_name'] = list(em_stock_profit['REPORT_DATE_NAME'])[0]
101
+ total_operate_income = list(em_stock_profit['TOTAL_OPERATE_INCOME'])[0]
102
+ # 金融机构大多收入计入在这个字段中
103
+ if total_operate_income == 0:
104
+ total_operate_income = list(em_stock_profit['OPERATE_INCOME'])[0]
105
+
106
+ company_one_df['total_operate_income'] = total_operate_income
107
+ else:
108
+ company_one_df['operate_profit'] = 0
109
+ company_one_df['total_operate_income'] = 0
110
+ company_one_df['operate_date_name'] = '暂无年报'
111
+ company_one_df['operate_profit'] = round(
112
+ company_one_df['operate_profit'] / common_service_fun_api.HUNDRED_MILLION, 2)
113
+ company_one_df['total_operate_income'] = round(
114
+ company_one_df['total_operate_income'] / common_service_fun_api.HUNDRED_MILLION, 2)
115
+ return company_one_df
116
+
117
+
118
+ # 计算真实流通比例
119
+ def set_calculate_circulation_ratio(symbol, now_str_day, company_one_df):
120
+ query = {"symbol": symbol}
121
+ stock_gdfx_free_top_1 = mongodb_util.descend_query(query, 'stock_gdfx_free_top_10', "period", 1)
122
+ if stock_gdfx_free_top_1.shape[0] == 0:
123
+ mv_circulation_ratio = 1
124
+ qfii_number = 0
125
+ qfii_type = 'A股'
126
+ share_holder_sync_day = now_str_day
127
+ else:
128
+ period_time = list(stock_gdfx_free_top_1['period'])[0]
129
+
130
+ query_free = {'symbol': symbol, 'period': period_time}
131
+ stock_gdfx_free_top_10 = mongodb_util.find_query_data('stock_gdfx_free_top_10', query_free)
132
+
133
+ stock_gdfx_free_top_10['shares_number_str'] = stock_gdfx_free_top_10['shares_number'].astype(str)
134
+
135
+ stock_gdfx_free_top_10['id_key'] = stock_gdfx_free_top_10['symbol'] + '_' + stock_gdfx_free_top_10[
136
+ 'period'] + '_' + stock_gdfx_free_top_10.shares_number_str
137
+
138
+ stock_gdfx_free_top_10.drop_duplicates('id_key', keep='last', inplace=True)
139
+
140
+ # 排除香港结算公司 大于5%减持不用发公告 香港中央结算 HKSCC
141
+ stock_gdfx_free_top_10['is_hk'] = stock_gdfx_free_top_10['shareholder_name'].apply(
142
+ lambda shareholder_name: "HK" if shareholder_name.startswith('香港中央结算') or shareholder_name.startswith(
143
+ 'HKSCC') else "A")
144
+
145
+ # 持股大于5% 减持需要发公告
146
+ # 排除香港结算公司不发公共 小于5%减持不用发公告
147
+ # 香港中央结算 HKSCC
148
+ stock_free_top_greater_than_5 = stock_gdfx_free_top_10.loc[
149
+ (stock_gdfx_free_top_10['circulation_ratio'] >= 5) & (stock_gdfx_free_top_10['is_hk'] == 'A')]
150
+
151
+ stock_free_qfii = stock_gdfx_free_top_10.loc[stock_gdfx_free_top_10['shareholder_nature'] == 'QFII']
152
+
153
+ share_holder_sync_day = list(stock_gdfx_free_top_10['create_day'])[0]
154
+
155
+ # qfii 数量
156
+ qfii_number = stock_free_qfii.shape[0]
157
+ # qfii 类型
158
+ qfii_type = set_qfii_type(qfii_number, stock_free_qfii.copy())
159
+
160
+ circulation_ratio = sum(stock_free_top_greater_than_5['circulation_ratio'])
161
+ mv_circulation_ratio = round((100 - circulation_ratio) / 100, 2)
162
+ # 防止错误数据
163
+ if mv_circulation_ratio < 0:
164
+ mv_circulation_ratio = 1
165
+
166
+ company_one_df['mv_circulation_ratio'] = mv_circulation_ratio
167
+ company_one_df['qfii_type'] = qfii_type
168
+ company_one_df['qfii_number'] = qfii_number
169
+ company_one_df['share_holder_sync_day'] = share_holder_sync_day
170
+
171
+ return company_one_df
172
+
173
+
174
+ # 设置QFII持股
175
+ def set_qfii_type(qfii_number, stock_free_qfii):
176
+ if qfii_number > 0:
177
+ stock_free_qfii['new_change'] = stock_free_qfii['change']
178
+ stock_free_qfii.loc[stock_free_qfii['change_ratio'] == 0, 'new_change'] = 0
179
+ stock_free_qfii.loc[stock_free_qfii['change'] == '新进', 'new_change'] = \
180
+ stock_free_qfii['shares_number']
181
+ stock_free_qfii['new_change'] = stock_free_qfii['new_change'].astype(float)
182
+
183
+ stock_free_qfii_new_in = stock_free_qfii.loc[stock_free_qfii['change'] == '新进']
184
+ if data_frame_util.is_not_empty(stock_free_qfii_new_in):
185
+ qfii_type = 1
186
+ return qfii_type
187
+
188
+ stock_free_qfii_add = stock_free_qfii.loc[
189
+ (~stock_free_qfii['change'].isin(['不变', '新进'])) & (stock_free_qfii['new_change'] > 0)]
190
+
191
+ if data_frame_util.is_not_empty(stock_free_qfii_add):
192
+ qfii_type = 2
193
+ return qfii_type
194
+
195
+ stock_free_qfii_not_change = stock_free_qfii.loc[stock_free_qfii['change'] == '不变']
196
+
197
+ if data_frame_util.is_not_empty(stock_free_qfii_not_change):
198
+ qfii_type = 3
199
+ return qfii_type
200
+
201
+ stock_free_qfii_reduce = stock_free_qfii.loc[
202
+ (~stock_free_qfii['change'].isin(['不变', '新进'])) & (stock_free_qfii['new_change'] < 0)]
203
+
204
+ if data_frame_util.is_not_empty(stock_free_qfii_reduce):
205
+ qfii_type = 4
206
+ return qfii_type
207
+ else:
208
+ return 0
@@ -0,0 +1,203 @@
1
+ import os
2
+ import sys
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+
9
+ from datetime import datetime
10
+ import pandas as pd
11
+ from loguru import logger
12
+
13
+ import mns_common.component.common_service_fun_api as common_service_fun_api
14
+ import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
15
+ from mns_common.db.MongodbUtil import MongodbUtil
16
+ import mns_common.api.kpl.symbol.kpl_real_time_quotes_api as kpl_real_time_quotes_api
17
+ import mns_common.utils.data_frame_util as data_frame_util
18
+ import mns_common.component.k_line.common.k_line_common_service_api as k_line_common_service_api
19
+ import mns_common.constant.db_name_constant as db_name_constant
20
+ from mns_scheduler.company_info.common.company_common_query_service import get_company_info
21
+ import mns_scheduler.company_info.sync.company_info_set_service as company_info_set_service
22
+ import mns_scheduler.company_info.constant.company_constant_data as company_constant_data
23
+
24
+ mongodb_util = MongodbUtil('27017')
25
+ # 分页大小
26
+ MAX_PAGE_NUMBER = 500
27
+ import threading
28
+
29
+ # 定义一个全局锁,用于保护 result 变量的访问
30
+ result_lock = threading.Lock()
31
+ # 初始化 result 变量为一个空的 Pandas DataFrame
32
+ result = []
33
+
34
+
35
+ # 同步公司基本信息
36
+
37
+ def sync_company_base_info(symbol_list):
38
+ global result
39
+ result = []
40
+
41
+ east_money_stock_info = get_company_info()
42
+
43
+ east_money_stock_info = common_service_fun_api.total_mv_classification(east_money_stock_info)
44
+ east_money_stock_info = common_service_fun_api.classify_symbol(east_money_stock_info)
45
+ # 将日期数值转换为日期时间格式
46
+ east_money_stock_info['list_date_01'] = pd.to_datetime(east_money_stock_info['list_date'], format='%Y%m%d')
47
+ # 开盘啦实时数据
48
+ kpl_real_time_quotes = kpl_real_time_quotes_api.get_kpl_real_time_quotes()
49
+ if len(symbol_list) > 0:
50
+ east_money_stock_info = east_money_stock_info.loc[east_money_stock_info['symbol'].isin(symbol_list)]
51
+ count = east_money_stock_info.shape[0]
52
+ page_number = round(count / MAX_PAGE_NUMBER, 0) + 1
53
+ page_number = int(page_number)
54
+ threads = []
55
+ # 创建多个线程来获取数据
56
+ for page in range(page_number): # 0到100页
57
+ end_count = (page + 1) * MAX_PAGE_NUMBER
58
+ begin_count = page * MAX_PAGE_NUMBER
59
+ page_df = east_money_stock_info.iloc[begin_count:end_count]
60
+ thread = threading.Thread(target=single_thread_sync_company_info,
61
+ args=(page_df, kpl_real_time_quotes))
62
+ threads.append(thread)
63
+ thread.start()
64
+
65
+ # 等待所有线程完成
66
+ for thread in threads:
67
+ thread.join()
68
+
69
+ fail_df = east_money_stock_info.loc[east_money_stock_info['symbol'].isin(result)]
70
+ single_thread_sync_company_info(fail_df, kpl_real_time_quotes)
71
+
72
+
73
+ def single_thread_sync_company_info(east_money_stock_info,
74
+ kpl_real_time_quotes):
75
+ global result
76
+ fail_list = []
77
+ for company_one in east_money_stock_info.itertuples():
78
+ try:
79
+
80
+ company_one_df = east_money_stock_info.loc[east_money_stock_info['symbol'] == company_one.symbol]
81
+
82
+ company_one_df = company_one_df.rename(columns={
83
+ "industry": "em_industry",
84
+ "concept": "em_concept"
85
+ })
86
+ now_date = datetime.now()
87
+ str_day = now_date.strftime('%Y-%m-%d')
88
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
89
+
90
+ # 计算日期差值 距离现在上市时间
91
+ company_one_df['diff_days'] = (now_date - company_one.list_date_01).days
92
+ company_one_df = company_one_df[[
93
+ 'symbol',
94
+ 'name',
95
+ 'em_industry',
96
+ 'em_concept',
97
+ 'hk_stock_code',
98
+ 'hk_stock_name',
99
+ 'amount',
100
+ 'now_price',
101
+ 'total_share',
102
+ 'flow_share',
103
+ 'total_mv',
104
+ 'flow_mv',
105
+ 'area',
106
+ 'list_date',
107
+ 'diff_days',
108
+ 'pe_ttm',
109
+ 'pb',
110
+ 'ROE',
111
+ 'flow_mv_sp',
112
+ 'total_mv_sp',
113
+ 'flow_mv_level',
114
+ 'classification',
115
+ ]]
116
+
117
+ company_one_df['sync_date'] = str_now_date
118
+
119
+ # 行业信息
120
+ company_industry_info_df = mongodb_util.find_query_data(db_name_constant.COMPANY_INDUSTRY_INFO,
121
+ {"symbol": company_one.symbol})
122
+
123
+ if data_frame_util.is_empty(company_industry_info_df):
124
+ company_one_df['business_nature'] = '数据异常'
125
+ company_one_df['holder_controller_name'] = '数据异常'
126
+ company_one_df['holder_controller_rate'] = 0
127
+ company_one_df['final_controller_name'] = '数据异常'
128
+ company_one_df['final_controller_rate'] = 0
129
+ company_one_df['actual_controller_name'] = '数据异常'
130
+ company_one_df['actual_controller_rate'] = 0
131
+ company_one_df['base_business'] = ''
132
+ company_one_df['intro'] = ''
133
+ company_one_df['address'] = ''
134
+ company_one_df['market_id'] = ''
135
+ company_one_df['main_business_list'] = [[] for _ in range(len(company_one_df))]
136
+ company_one_df['most_profitable_business'] = ''
137
+ company_one_df['most_profitable_business_rate'] = '0'
138
+ company_one_df['most_profitable_business_profit'] = 0
139
+ company_one_df['first_industry_code'] = '0'
140
+ company_one_df['second_industry_code'] = '0'
141
+ company_one_df['third_industry_code'] = '0'
142
+ company_one_df['first_sw_industry'] = '数据异常'
143
+ company_one_df['second_sw_industry'] = '数据异常'
144
+ company_one_df['third_sw_industry'] = '数据异常'
145
+ company_one_df['industry'] = '数据异常'
146
+ else:
147
+
148
+ del company_industry_info_df['_id']
149
+ del company_industry_info_df['name']
150
+ # 申万二级行业 作业行业
151
+ company_industry_info_df['industry'] = company_industry_info_df['second_sw_industry']
152
+
153
+ company_industry_info_df = company_industry_info_df.set_index(['symbol'], drop=True)
154
+ company_one_df = company_one_df.set_index(['symbol'], drop=False)
155
+ company_one_df = pd.merge(company_one_df, company_industry_info_df, how='outer',
156
+ left_index=True, right_index=True)
157
+
158
+ # 设置流通比例和外资持股
159
+ company_one_df = company_info_set_service.set_calculate_circulation_ratio(company_one.symbol, str_day,
160
+ company_one_df)
161
+
162
+ # 获取同花顺最新概念
163
+ company_one_df = ths_concept_common_service_api.set_ths_concept(company_one.symbol, company_one_df)
164
+ # 修改行业
165
+ fix_symbol_industry_df = company_constant_data.get_fix_symbol_industry()
166
+ if company_one.symbol in list(fix_symbol_industry_df['symbol']):
167
+ # fix sw_industry
168
+ company_one_df = company_constant_data.fix_symbol_industry(company_one_df,
169
+ company_one.symbol)
170
+
171
+ # 交易天数
172
+ deal_days = k_line_common_service_api.get_deal_days(str_day, company_one.symbol)
173
+ company_one_df['deal_days'] = deal_days
174
+
175
+ # 设置财务年报信息
176
+ company_one_df = company_info_set_service.set_recent_year_income(company_one.symbol, company_one_df)
177
+ # 设置开盘信息
178
+ company_one_df['kpl_plate_list_info'] = '-'
179
+ company_one_df['kpl_plate_name'] = '-'
180
+ company_one_df['kpl_most_relative_name'] = '-'
181
+ company_one_df = company_info_set_service.set_kpl_plate_info(company_one_df, company_one,
182
+ kpl_real_time_quotes)
183
+ # 设置可转债 信息
184
+ company_one_df['kzz_debt_list'] = [[] for _ in range(len(company_one_df))]
185
+ company_one_df = company_info_set_service.set_kzz_debt(company_one_df, company_one.symbol)
186
+
187
+ company_one_df['_id'] = company_one_df['symbol']
188
+
189
+ company_one_df = company_constant_data.filed_sort(company_one_df)
190
+ mongodb_util.save_mongo(company_one_df.copy(), db_name_constant.COMPANY_INFO_TEMP)
191
+ logger.info("同步公司信息完成:{}", company_one.symbol + '-' + company_one.name)
192
+ except BaseException as e:
193
+ fail_list.append(company_one.symbol)
194
+ logger.error("同步公司信息发生异常:{},{}", company_one.symbol, e)
195
+ with result_lock:
196
+ # 使用锁来保护 result 变量的访问,将每页的数据添加到结果中
197
+ result = fail_list
198
+
199
+
200
+ if __name__ == '__main__':
201
+
202
+ sync_company_base_info(['688795'])
203
+ # sync_company_base_info([])
@@ -0,0 +1,77 @@
1
+ import sys
2
+ import os
3
+ import time
4
+
5
+ file_path = os.path.abspath(__file__)
6
+ end = file_path.index('mns') + 16
7
+ project_path = file_path[0:end]
8
+ sys.path.append(project_path)
9
+ import sys
10
+ import os
11
+
12
+ file_path = os.path.abspath(__file__)
13
+ end = file_path.index('mns') + 17
14
+ project_path = file_path[0:end]
15
+ sys.path.append(project_path)
16
+ import mns_common.api.ths.company.ths_company_announce_api as ths_company_announce_api
17
+ from loguru import logger
18
+ from mns_common.db.MongodbUtil import MongodbUtil
19
+ import mns_common.constant.db_name_constant as db_name_constant
20
+ from mns_scheduler.company_info.common.company_common_query_service import get_company_info
21
+ import mns_common.component.common_service_fun_api as common_service_fun_api
22
+
23
+ mongodb_util = MongodbUtil('27017')
24
+
25
+
26
+ # 同步最新公告
27
+ # eq-f1001 业绩预告 eq-f1002 重大事项 eq-f1003 股份变动公告
28
+
29
+ def sync_company_announce_task(symbol_list):
30
+ page_size = 100
31
+ announce_type_list = ['all', 'eq-f1003', 'eq-f1001', 'eq-f1002']
32
+ for announce_type_one in announce_type_list:
33
+ try:
34
+ get_company_announce(announce_type_one, page_size, symbol_list)
35
+ except BaseException as e:
36
+ logger.error("更新公告出现异常:{}", e)
37
+
38
+
39
+ def get_company_announce(announce_type, page_size, symbol_list):
40
+ all_company_info_df = get_company_info()
41
+
42
+ if len(symbol_list) > 0:
43
+ all_company_info_df = all_company_info_df.loc[(all_company_info_df['symbol'].isin(symbol_list))]
44
+ all_company_info_df = common_service_fun_api.classify_symbol(all_company_info_df)
45
+
46
+ for stock_one in all_company_info_df.itertuples():
47
+ try:
48
+ symbol = stock_one.symbol
49
+ classification = stock_one.classification
50
+ if classification in ['H', 'K']:
51
+ market_id = '17'
52
+ elif classification in ['S', 'C']:
53
+ market_id = '33'
54
+ elif classification in ['X']:
55
+ market_id = '151'
56
+ # 公告应该不多 只更新一页的数据 页码设置100已经是最大
57
+ page_number = 1
58
+ try:
59
+ ths_company_announce_result = ths_company_announce_api.get_company_announce_info(symbol, market_id,
60
+ announce_type,
61
+ page_size,
62
+ page_number)
63
+ except BaseException as e:
64
+ logger.error("更新公告出现异常:{}.{}", e, symbol)
65
+ continue
66
+ ths_company_announce_result['type'] = announce_type
67
+ ths_company_announce_result['symbol'] = symbol
68
+ ths_company_announce_result['_id'] = ths_company_announce_result['guid'] + '_' + \
69
+ ths_company_announce_result['seq'] + "_" + announce_type
70
+ mongodb_util.save_mongo(ths_company_announce_result, db_name_constant.COMPANY_ANNOUNCE_INFO)
71
+ time.sleep(1)
72
+ except BaseException as e:
73
+ logger.error("更新公告出现异常:{}", e)
74
+
75
+
76
+ if __name__ == '__main__':
77
+ sync_company_announce_task([])