mns-scheduler 1.0.8.7__py3-none-any.whl → 1.4.3.2__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 (156) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
  3. mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
  4. mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
  5. mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
  6. mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
  7. mns_scheduler/company_info/constant/company_constant_data.py +497 -0
  8. mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
  9. mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
  11. mns_scheduler/company_info/remark/__init__.py +7 -0
  12. mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
  13. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  14. mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
  15. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
  16. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
  17. mns_scheduler/concept/ths/detaill/__init__.py +0 -0
  18. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
  19. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
  20. mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
  21. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
  22. mns_scheduler/db/col_move_service.py +10 -7
  23. mns_scheduler/db/db_status.py +1 -1
  24. mns_scheduler/db/script/__init__.py +7 -0
  25. mns_scheduler/db/script/col_move_script.py +45 -0
  26. mns_scheduler/db/script/db_move/__init__.py +7 -0
  27. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  28. mns_scheduler/db/script/sync/__init__.py +7 -0
  29. mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
  30. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
  31. mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
  32. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  34. mns_scheduler/db/script/update/__init__.py +7 -0
  35. mns_scheduler/db/script/update/update_col_field.py +36 -0
  36. mns_scheduler/finance/__init__.py +1 -1
  37. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
  38. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
  39. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
  40. mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
  41. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  42. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  43. mns_scheduler/hk/__init__.py +1 -1
  44. mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
  45. mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
  46. mns_scheduler/industry/__init__.py +7 -0
  47. mns_scheduler/industry/ths/__init__.py +7 -0
  48. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  49. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  50. mns_scheduler/irm/__init__.py +1 -1
  51. mns_scheduler/irm/api/__init__.py +1 -1
  52. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  53. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  54. mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
  55. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  56. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
  57. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
  58. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  59. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
  60. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  61. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
  62. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
  63. mns_scheduler/k_line/common/__init__.py +7 -0
  64. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  65. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  66. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  67. mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
  68. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
  69. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  70. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  71. mns_scheduler/k_line/test/__init__.py +7 -0
  72. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
  73. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  74. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  75. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
  76. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  77. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
  78. mns_scheduler/lhb/__init__.py +1 -1
  79. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  80. mns_scheduler/open/__init__.py +1 -1
  81. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
  82. mns_scheduler/risk/__init__.py +1 -1
  83. mns_scheduler/risk/compliance/__init__.py +0 -0
  84. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
  85. mns_scheduler/risk/financial/__init__.py +0 -0
  86. mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
  87. mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
  88. mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
  89. mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
  90. mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
  91. mns_scheduler/risk/major_violations/__init__.py +0 -0
  92. mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
  93. mns_scheduler/risk/self/__init__.py +0 -0
  94. mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
  95. mns_scheduler/risk/test/__init__.py +7 -0
  96. mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
  97. mns_scheduler/risk/transactions/__init__.py +0 -0
  98. mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
  99. mns_scheduler/self_choose/__init__.py +7 -0
  100. mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
  101. mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
  102. mns_scheduler/trade/auto_login/__init__.py +7 -0
  103. mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
  104. mns_scheduler/trade/auto_sell_service_api.py +10 -8
  105. mns_scheduler/trade/balance/__init__.py +7 -0
  106. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  107. mns_scheduler/trade/sync_position_api.py +41 -8
  108. mns_scheduler/trade/task/__init__.py +7 -0
  109. mns_scheduler/trade/task/trader_task_service.py +65 -0
  110. mns_scheduler/trade/tfp/__init__.py +7 -0
  111. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  112. mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
  113. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
  114. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
  115. mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
  116. mns_scheduler/zt/script/__init__.py +1 -1
  117. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  118. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
  119. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  120. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
  121. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
  122. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
  123. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
  124. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  125. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  126. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  127. mns_scheduler/zz_task/data_sync_task.py +271 -121
  128. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
  129. mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
  130. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
  131. mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
  132. mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
  133. mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
  134. mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
  135. mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
  136. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  137. mns_scheduler/company_info/company_constant_data.py +0 -322
  138. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
  139. mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
  140. mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
  141. mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
  142. mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
  143. mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
  144. mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
  145. mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
  146. mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
  147. mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
  148. /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
  149. /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
  150. /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
  151. /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
  152. /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
  153. /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
  154. /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
  155. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  156. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,42 @@
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
+ import mns_scheduler.risk.financial.net_assets_check_api as net_assets_check_api
9
+ import mns_scheduler.risk.financial.annual_report_audit_check_api as annual_report_audit_check_api
10
+ import mns_scheduler.risk.financial.profit_income_check_api as profit_income_check_api
11
+
12
+
13
+ # 1.无保留意见/标准报告:报告没问题。(没有发现造假,但也不能保证为真)
14
+ #
15
+ # 2.带强调事项段的无保留意见:报告没问题,但是有亏损获对其可持续经营有重大疑虑(可能造假,至少是在粉饰报表)
16
+ #
17
+ # 3.保留意见报告:有问题,财务造假
18
+ #
19
+ # 4.否定意见报告:有很大问题
20
+ #
21
+ # 5.无法表示意见报告:不让查
22
+ #
23
+
24
+
25
+ #### 退市新规 ####
26
+ # 1 股价类:连续20个交易日估价低于1元
27
+ # 2 市值类: 主板小于5亿、创业板3亿
28
+ # 3 财务类: (1) 利润总额 净利润 扣非净利润三者最小值为负 且营业收入小于3亿 创业板营业收入小于1元
29
+ # (2) 资不抵债
30
+
31
+
32
+ # 财报审核
33
+ def financial_report_check(new_report_df, period_time, period, report_type):
34
+ # 年报审核
35
+ if period == 4:
36
+ # 年报审计意见
37
+ annual_report_audit_check_api.annual_report_audit_check(new_report_df, period_time)
38
+ # 年报收入利润check
39
+ profit_income_check_api.profit_income_check(new_report_df, period_time, report_type)
40
+
41
+ # 负债过高
42
+ net_assets_check_api.net_assets_check(report_type, new_report_df, period_time)
File without changes
@@ -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 requests
@@ -14,8 +14,10 @@ from loguru import logger
14
14
  import mns_common.constant.db_name_constant as db_name_constant
15
15
  from mns_common.db.MongodbUtil import MongodbUtil
16
16
  import mns_common.utils.data_frame_util as data_frame_util
17
+ from mns_common.constant.black_list_classify_enum import BlackClassify
17
18
 
18
19
  mongodb_util = MongodbUtil('27017')
20
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
19
21
 
20
22
 
21
23
  # 立案调查股票
@@ -61,8 +63,8 @@ def sync_all_investigate_stocks(page_size, search_key, begin_day, end_day):
61
63
 
62
64
 
63
65
  # 立案调查的股票
64
- def sync_new_high_risk_stocks():
65
- before_days = 30
66
+ def sync_register_and_investigate_stocks():
67
+ before_days = 60
66
68
  const_num = 30
67
69
  init_date = datetime.now()
68
70
  str_day = init_date.strftime('%Y-%m-%d')
@@ -77,9 +79,12 @@ def sync_new_high_risk_stocks():
77
79
  if data_frame_util.is_empty(new_high_risk_stocks_df):
78
80
  return None
79
81
  new_high_risk_stocks_df = new_high_risk_stocks_df.sort_values(by=['announcementTime'], ascending=False)
82
+ de_list_company_symbols = company_common_service_new_api.get_de_list_company()
80
83
  for high_risk_stocks_one in new_high_risk_stocks_df.itertuples():
81
84
  try:
82
85
  symbol = high_risk_stocks_one.secCode
86
+ if symbol in de_list_company_symbols:
87
+ continue
83
88
  announcement_id = high_risk_stocks_one.announcementId
84
89
 
85
90
  key_id = symbol + "_" + str(announcement_id)
@@ -109,13 +114,17 @@ def sync_new_high_risk_stocks():
109
114
  high_risk_stocks_one.announcementTitle,
110
115
  high_risk_stocks_one.announcementTitle,
111
116
  announce_url,
112
- black_list_service_api.REGISTER_INVESTIGATE)
117
+ BlackClassify.MAJOR_VIOLATIONS.up_level_code,
118
+ BlackClassify.MAJOR_VIOLATIONS.up_level_name,
119
+ BlackClassify.REGISTER_INVESTIGATE.level_code,
120
+ BlackClassify.REGISTER_INVESTIGATE.level_name,
121
+ )
113
122
  except Exception as e:
114
123
  logger.error("保存风险警示股票异常:{},{}", symbol, e)
115
124
 
116
125
 
117
126
  if __name__ == '__main__':
118
- sync_new_high_risk_stocks()
119
- result_df = sync_all_investigate_stocks(30, '立案', '2023-01-01', '2024-05-15')
120
- result_df = result_df.sort_values(by=['announcementTime'], ascending=False)
121
- print(result_df)
127
+ sync_register_and_investigate_stocks()
128
+ # result_df = sync_all_investigate_stocks(30, '立案', '2023-01-01', '2024-06-15')
129
+ # result_df = result_df.sort_values(by=['announcementTime'], ascending=False)
130
+ # print(result_df)
File without changes
@@ -2,19 +2,20 @@ 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
 
9
- import mns_common.api.ths.ths_stock_api as ths_stock_api
9
+ import mns_scheduler.concept.ths.detaill.ths_concept_detail_api as ths_concept_detail_api
10
10
  import mns_common.component.self_choose.black_list_service_api as black_list_service_api
11
11
  from datetime import datetime
12
12
  from loguru import logger
13
13
  import mns_common.utils.data_frame_util as data_frame_util
14
+ from mns_common.constant.black_list_classify_enum import BlackClassify
14
15
 
15
16
 
16
17
  def add_concept_to_lack_list(concept_code, reason):
17
- new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
18
+ new_concept_symbol_list = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
18
19
  if data_frame_util.is_empty(new_concept_symbol_list):
19
20
  return None
20
21
 
@@ -34,7 +35,12 @@ def add_concept_to_lack_list(concept_code, reason):
34
35
  reason,
35
36
  reason,
36
37
  '',
37
- black_list_service_api.SELF_SHIELD)
38
+ BlackClassify.SELF_SHIELD_OTHER.up_level_code,
39
+ BlackClassify.SELF_SHIELD_OTHER.up_level_name,
40
+ BlackClassify.SELF_SHIELD_OTHER.level_code,
41
+ BlackClassify.SELF_SHIELD_OTHER.level_name,
42
+
43
+ )
38
44
  except BaseException as e:
39
45
  logger.error("概念拉黑异常:{}", e)
40
46
 
@@ -0,0 +1,7 @@
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)
@@ -2,25 +2,21 @@ 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
 
9
-
10
9
  import mns_common.constant.db_name_constant as db_name_constant
11
-
10
+ import mns_scheduler.risk.financial_report_risk_check_api as financial_report_risk_check_api
12
11
  from mns_common.db.MongodbUtil import MongodbUtil
13
12
 
14
- import mns_scheduler.finance.financial_high_risk_stock_clean_service_api as financial_high_risk_stock_clean_service_api
15
-
16
-
17
13
  mongodb_util = MongodbUtil('27017')
18
14
 
19
15
 
20
16
  def fix_profit_black_list():
21
- period_time = "2023-12-31 00:00:00"
17
+ period_time = "2024-12-31 00:00:00"
22
18
  period = 4
23
- report_type_list = [db_name_constant.EM_STOCK_PROFIT, db_name_constant.EM_STOCK_ASSET_LIABILITY]
19
+ report_type_list = [db_name_constant.EM_STOCK_ASSET_LIABILITY, db_name_constant.EM_STOCK_PROFIT]
24
20
  for report_type in report_type_list:
25
21
  query = {'REPORT_DATE': period_time}
26
22
  em_stock_profit_df_list = mongodb_util.find_query_data(report_type, query)
@@ -28,8 +24,8 @@ def fix_profit_black_list():
28
24
  em_stock_one_df = em_stock_profit_df_list.loc[
29
25
  em_stock_profit_df_list['SECURITY_CODE'] == em_stock_one.SECURITY_CODE]
30
26
 
31
- financial_high_risk_stock_clean_service_api.financial_report_check(em_stock_one_df, period_time, period,
32
- report_type)
27
+ financial_report_risk_check_api.financial_report_check(em_stock_one_df, period_time, period,
28
+ report_type)
33
29
 
34
30
 
35
31
  if __name__ == '__main__':
File without changes
@@ -0,0 +1,183 @@
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
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
9
+ from datetime import datetime
10
+ import mns_common.component.self_choose.black_list_service_api as black_list_service_api
11
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
12
+ from loguru import logger
13
+ import mns_common.constant.db_name_constant as db_name_constant
14
+ from mns_common.db.MongodbUtil import MongodbUtil
15
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
16
+ from mns_common.constant.black_list_classify_enum import BlackClassify
17
+ import mns_common.component.common_service_fun_api as common_service_fun_api
18
+ import mns_common.utils.date_handle_util as date_handle_util
19
+ import mns_common.component.tfp.stock_tfp_api as stock_tfp_api
20
+
21
+ mongodb_util = MongodbUtil('27017')
22
+
23
+ # 主板 市值最小值 6亿 20个交易日低于5亿退市
24
+ MAIN_MARKET_MIN_MV = 600000000
25
+
26
+ # 创业 科创 北交所 市值最小值 4亿 20个交易日低于3亿退市
27
+ SUB_MARKET_MIN_MV = 400000000
28
+
29
+ # 最小面值 20个交易日低于1元退市
30
+ MIN_NOW_PRICE = 1.5
31
+
32
+ # 主板 120个交易日 参考600万 成交量低于500万股
33
+ MAIN_MARKET_MIN_VOLUME = 6000000
34
+
35
+ # 科创 创业 120个交易日 参考300万 成交量低于200万股
36
+ SUB_MARKET_MIN_VOLUME = 3000000
37
+
38
+ # 北交所 120个交易日 参考150万 成交量低于100万股
39
+ BJS_MARKET_MIN_VOLUME = 1500000
40
+
41
+
42
+ def transactions_check_task():
43
+ # 获取当前日期和时间
44
+ now = datetime.now()
45
+
46
+ # 格式化输出
47
+ now_day_str = now.strftime("%Y%m%d")
48
+
49
+ now_day_number = float(now_day_str)
50
+
51
+ real_time_quotes_now = em_stock_info_api.get_a_stock_info()
52
+ real_time_quotes_now['list_date'] = real_time_quotes_now['list_date'].fillna(19890604)
53
+ real_time_quotes_now = real_time_quotes_now.loc[real_time_quotes_now['list_date'] <= now_day_number]
54
+ real_time_quotes_now = common_service_fun_api.classify_symbol(real_time_quotes_now)
55
+ real_time_quotes_now = common_service_fun_api.exclude_ts_symbol(real_time_quotes_now)
56
+ # 排除交易金额为0的
57
+ real_time_quotes_now = common_service_fun_api.exclude_amount_zero_stock(real_time_quotes_now)
58
+
59
+ de_list_symbol = company_common_service_new_api.get_de_list_company()
60
+
61
+ real_time_quotes_now = real_time_quotes_now.loc[~(real_time_quotes_now['symbol'].isin(de_list_symbol))]
62
+
63
+ query = {"up_level_code": BlackClassify.TRANSACTIONS.level_code}
64
+ tag = mongodb_util.remove_data(query, db_name_constant.SELF_BLACK_STOCK)
65
+ success = tag.acknowledged
66
+ if success:
67
+
68
+ for stock_one in real_time_quotes_now.itertuples():
69
+ try:
70
+ total_mv_check(stock_one)
71
+ now_price_check(stock_one)
72
+ volume_check(stock_one)
73
+ except BaseException as e:
74
+ logger.error("交易风险校验异常:{},{}", e, stock_one.symbol)
75
+
76
+
77
+ # 总市值check
78
+ def total_mv_check(stock_one):
79
+ classification = stock_one.classification
80
+ total_mv = stock_one.total_mv
81
+ now_date = datetime.now()
82
+ str_day = now_date.strftime('%Y-%m-%d')
83
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
84
+ key_id = stock_one.symbol + "_" + BlackClassify.MV_RISK.level_code
85
+ tag = False
86
+ if classification in ['S', 'H'] and total_mv < MAIN_MARKET_MIN_MV:
87
+ tag = True
88
+ elif classification in ['K', 'C', "X"] and total_mv < SUB_MARKET_MIN_MV:
89
+ tag = True
90
+
91
+ if tag:
92
+ black_list_service_api.save_black_stock(
93
+ key_id,
94
+ stock_one.symbol,
95
+ stock_one.name,
96
+ str_day,
97
+ str_now_date,
98
+ BlackClassify.MV_RISK.level_name + ":" + str(
99
+ round(total_mv / common_service_fun_api.HUNDRED_MILLION, 2)) + "亿",
100
+ BlackClassify.MV_RISK.level_name + ":" + str(
101
+ round(total_mv / common_service_fun_api.HUNDRED_MILLION, 2)) + "亿",
102
+ "",
103
+ BlackClassify.MV_RISK.up_level_code,
104
+ BlackClassify.MV_RISK.up_level_name,
105
+ BlackClassify.MV_RISK.level_code,
106
+ BlackClassify.MV_RISK.level_name,
107
+ )
108
+
109
+
110
+ # 当前面值check
111
+ def now_price_check(stock_one):
112
+ now_price = stock_one.now_price
113
+ now_date = datetime.now()
114
+ str_day = now_date.strftime('%Y-%m-%d')
115
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
116
+
117
+ tfp_symbol_list = stock_tfp_api.get_stock_tfp_symbol_list_by_day(str_day)
118
+ if stock_one.symbol in tfp_symbol_list:
119
+ return
120
+
121
+ key_id = stock_one.symbol + "_" + BlackClassify.CLOSE_PRICE_RISK.level_code
122
+ if MIN_NOW_PRICE > now_price > 0:
123
+ black_list_service_api.save_black_stock(
124
+ key_id,
125
+ stock_one.symbol,
126
+ stock_one.name,
127
+ str_day,
128
+ str_now_date,
129
+ BlackClassify.CLOSE_PRICE_RISK.level_name + ":当前价格" + str(now_price),
130
+ BlackClassify.CLOSE_PRICE_RISK.level_name + ":当前价格" + str(now_price),
131
+ "",
132
+ BlackClassify.CLOSE_PRICE_RISK.up_level_code,
133
+ BlackClassify.CLOSE_PRICE_RISK.up_level_name,
134
+ BlackClassify.CLOSE_PRICE_RISK.level_code,
135
+ BlackClassify.CLOSE_PRICE_RISK.level_name,
136
+ )
137
+
138
+
139
+ #
140
+ def volume_check(stock_one):
141
+ now_date = datetime.now()
142
+ str_day = now_date.strftime('%Y-%m-%d')
143
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
144
+ trade_date_120 = trade_date_common_service_api.get_before_trade_date(str_day, 120)
145
+ query = {'date': {"$gte": date_handle_util.no_slash_date(trade_date_120)}, 'symbol': stock_one.symbol}
146
+ stock_qfq_daily_df = mongodb_util.find_query_data(db_name_constant.STOCK_QFQ_DAILY, query)
147
+ if stock_qfq_daily_df.shape[0] < 120:
148
+ return
149
+ # volume 单位是100股
150
+ sum_volume = sum(stock_qfq_daily_df['volume']) * 100
151
+ key_id = stock_one.symbol + "_" + BlackClassify.AMOUNT_RISK.level_code
152
+ tag = False
153
+ classification = stock_one.classification
154
+ if classification in ['S', 'H'] and sum_volume < MAIN_MARKET_MIN_VOLUME:
155
+ tag = True
156
+
157
+ elif classification in ['K', 'C'] and sum_volume < SUB_MARKET_MIN_VOLUME:
158
+ tag = True
159
+
160
+ elif classification in ['X'] and sum_volume < BJS_MARKET_MIN_VOLUME:
161
+ tag = True
162
+
163
+ if tag:
164
+ black_list_service_api.save_black_stock(
165
+ key_id,
166
+ stock_one.symbol,
167
+ stock_one.name,
168
+ str_day,
169
+ str_now_date,
170
+ BlackClassify.AMOUNT_RISK.level_name + ":120个交易日成交量:" + str(
171
+ round(sum_volume / common_service_fun_api.TEN_THOUSAND), 0) + "万股",
172
+ BlackClassify.AMOUNT_RISK.level_name + ":120个交易日成交量:" + str(
173
+ round(sum_volume / common_service_fun_api.TEN_THOUSAND), 0) + "万股",
174
+ "",
175
+ BlackClassify.AMOUNT_RISK.up_level_code,
176
+ BlackClassify.AMOUNT_RISK.up_level_name,
177
+ BlackClassify.AMOUNT_RISK.level_code,
178
+ BlackClassify.AMOUNT_RISK.level_name,
179
+ )
180
+
181
+
182
+ if __name__ == '__main__':
183
+ transactions_check_task()
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,158 @@
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
+ import mns_common.api.ths.self_choose.ths_self_choose_api as ths_self_choose_api
9
+ import mns_common.constant.db_name_constant as db_name_constant
10
+ from mns_common.db.MongodbUtil import MongodbUtil
11
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
12
+ import mns_common.component.common_service_fun_api as common_service_fun_api
13
+ from datetime import datetime
14
+ import mns_common.utils.data_frame_util as data_frame_util
15
+ import mns_common.constant.self_choose_constant as self_choose_constant
16
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
17
+
18
+ mongodb_util = MongodbUtil('27017')
19
+
20
+ # 固定的选择
21
+ # fixed_optional_list = ['USDCNH', 'XAUUSD',
22
+ # '881279',
23
+ # '886054', '881153', '881157', '881155',
24
+ # '885736', '881124', '886078',
25
+ # '881145', '886073', '881160', '885730',
26
+ # '886076', '883418', '881169', '885530',
27
+ # '510300', '512100',
28
+ # 'CN0Y',
29
+ # '1B0888',
30
+ # '1A0001',
31
+ # '399001',
32
+ # '399006',
33
+ # '1B0688',
34
+ # '899050',
35
+ # 'HSI',
36
+ # 'HS2083',
37
+ # ]
38
+
39
+ # 固定的选择
40
+ fixed_optional_list = ['899050', '881157']
41
+
42
+
43
+ def add_fixed_optional():
44
+ ths_cookie = cookie_info_service.get_ths_cookie()
45
+ for symbol in fixed_optional_list:
46
+ ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
47
+
48
+
49
+ def delete_all_self_choose_stocks():
50
+ ths_cookie = cookie_info_service.get_ths_cookie()
51
+ all_self_choose_stock_list = ths_self_choose_api.get_all_self_choose_stock_list(ths_cookie)
52
+ for stock_one in all_self_choose_stock_list.itertuples():
53
+ symbol = stock_one.code
54
+ ths_self_choose_api.del_stock_from_account(symbol, ths_cookie)
55
+
56
+
57
+ # 添加固定自选股票
58
+ def add_self_choose_symbol():
59
+ ths_cookie = cookie_info_service.get_ths_cookie()
60
+ # 固定自选
61
+ self_choose_symbol_df = mongodb_util.find_all_data(db_name_constant.SELF_CHOOSE_STOCK)
62
+ if data_frame_util.is_not_empty(self_choose_symbol_df):
63
+ self_choose_symbol_df = self_choose_symbol_df.sort_values(by=['str_now_date'], ascending=False)
64
+ for stock_one in self_choose_symbol_df.itertuples():
65
+ ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
66
+
67
+
68
+ # 添加今日选择股票
69
+ def add_today_choose_symbol():
70
+ ths_cookie = cookie_info_service.get_ths_cookie()
71
+ now_date = datetime.now()
72
+ str_day = now_date.strftime('%Y-%m-%d')
73
+ last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
74
+ last_trade_day_time = last_trade_day + " 15:00:00"
75
+ query = {'str_now_date': {"$gte": last_trade_day_time}, "valid": True}
76
+ self_choose_symbol_today_df = mongodb_util.find_query_data(db_name_constant.TODAY_SELF_CHOOSE_STOCK, query)
77
+ if data_frame_util.is_not_empty(self_choose_symbol_today_df):
78
+ self_choose_symbol_today_df = self_choose_symbol_today_df.sort_values(by=['str_now_date'], ascending=True)
79
+ for stock_one in self_choose_symbol_today_df.itertuples():
80
+ ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
81
+
82
+
83
+ # 添加同花顺概念
84
+ def add_self_choose_concept():
85
+ ths_cookie = cookie_info_service.get_ths_cookie()
86
+ query_plate = {'self_type': {
87
+ "$in": [self_choose_constant.SELF_CHOOSE_THS_CONCEPT,
88
+ self_choose_constant.SELF_CHOOSE_THS_INDUSTRY]}}
89
+ self_choose_plate_df = mongodb_util.find_query_data(db_name_constant.SELF_CHOOSE_PLATE, query_plate)
90
+ # 自选同花顺概念
91
+ if data_frame_util.is_not_empty(self_choose_plate_df):
92
+ self_choose_plate_df = self_choose_plate_df.sort_values(by=['str_now_date'], ascending=False)
93
+ for stock_one in self_choose_plate_df.itertuples():
94
+ ths_self_choose_api.add_stock_to_account(str(stock_one.self_code), ths_cookie)
95
+
96
+
97
+ # 添加最近交易股票
98
+ def add_trade_stocks():
99
+ now_date = datetime.now()
100
+ str_day = now_date.strftime('%Y-%m-%d')
101
+ last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
102
+ query = {"$and": [{"str_day": {"$gte": last_trade_day}}, {"str_day": {"$lte": str_day}}]}
103
+
104
+ position_stock_df = mongodb_util.find_query_data(db_name_constant.POSITION_STOCK, query)
105
+ if data_frame_util.is_not_empty(position_stock_df):
106
+ stock_list = set(position_stock_df['symbol'])
107
+ else:
108
+ stock_list = set([])
109
+ trade_stocks_df = mongodb_util.find_query_data(db_name_constant.BUY_STOCK_NAME, query)
110
+ if data_frame_util.is_not_empty(trade_stocks_df):
111
+ stock_list = stock_list.union(set(trade_stocks_df['symbol']))
112
+ ths_cookie = cookie_info_service.get_ths_cookie()
113
+ if len(stock_list) > 0:
114
+ for symbol in stock_list:
115
+ ths_self_choose_api.add_stock_to_account(symbol, ths_cookie)
116
+
117
+
118
+ # 添加连板到自选
119
+ def add_continue_boards_zt_stocks():
120
+ ths_cookie = cookie_info_service.get_ths_cookie()
121
+ now_date = datetime.now()
122
+ str_day = now_date.strftime('%Y-%m-%d')
123
+ if trade_date_common_service_api.is_trade_day(str_day):
124
+ query = {'str_day': str_day}
125
+ stock_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query)
126
+ if data_frame_util.is_empty(stock_zt_pool_df):
127
+ str_day = trade_date_common_service_api.get_before_trade_date(str_day, 2)
128
+ query = {'str_day': str_day}
129
+ stock_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query)
130
+ else:
131
+ str_day = trade_date_common_service_api.get_last_trade_day(str_day)
132
+ query = {'str_day': str_day}
133
+ stock_zt_pool_df = mongodb_util.find_query_data(db_name_constant.STOCK_ZT_POOL, query)
134
+ stock_zt_pool_df = stock_zt_pool_df.loc[stock_zt_pool_df['connected_boards_numbers'] >= 3]
135
+ stock_zt_pool_df = common_service_fun_api.exclude_st_symbol(stock_zt_pool_df)
136
+ stock_zt_pool_df = stock_zt_pool_df.sort_values(by=['connected_boards_numbers'], ascending=False)
137
+ for stock_one in stock_zt_pool_df.itertuples():
138
+ ths_self_choose_api.add_stock_to_account(stock_one.symbol, ths_cookie)
139
+
140
+
141
+ # 自选股操作 删除当天自选股 增加新的连板股票 添加固定选择自选
142
+ def self_choose_stock_handle():
143
+ delete_all_self_choose_stocks()
144
+ # 固定自选板块
145
+ add_fixed_optional()
146
+ # 添加同花顺概念
147
+ add_self_choose_concept()
148
+ # 连板股票
149
+ add_continue_boards_zt_stocks()
150
+ # 自己买入的股票
151
+ add_trade_stocks()
152
+ # 添加自选股票
153
+ add_self_choose_symbol()
154
+
155
+
156
+ if __name__ == '__main__':
157
+ # add_continue_boards_zt_stocks()
158
+ self_choose_stock_handle()
@@ -6,12 +6,12 @@ end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
 
9
- import mns_common.component.trade.trade_service_api as trade_service_api
9
+ import mns_common.component.deal.deal_service_api as deal_service_api
10
10
 
11
11
 
12
12
  ## 自动一键打新
13
13
  def auto_ipo_buy():
14
- trade_service_api.auto_ipo_buy()
14
+ deal_service_api.auto_ipo_buy('easy_trader')
15
15
 
16
16
 
17
17
  if __name__ == '__main__':
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,32 @@
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
+ import mns_common.component.deal.deal_service_api as deal_service_api
9
+ from mns_common.component.deal.terminal_enum import TerminalEnum
10
+ import time
11
+ from loguru import logger
12
+
13
+ # qmt 自动登录
14
+ def qmt_auto_login():
15
+ deal_service_api.auto_login(TerminalEnum.QMT.terminal_code)
16
+
17
+
18
+ # 同花顺自动登陆
19
+ def ths_auto_login():
20
+ deal_service_api.auto_login(TerminalEnum.EASY_TRADER.terminal_code)
21
+
22
+
23
+ def auto_login():
24
+ logger.info("打开ths下单程序")
25
+ ths_auto_login()
26
+ time.sleep(5)
27
+ logger.info("打开qmt下单程序")
28
+ qmt_auto_login()
29
+
30
+
31
+ if __name__ == '__main__':
32
+ auto_login()
@@ -2,7 +2,7 @@ import os
2
2
  import sys
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
 
@@ -11,11 +11,13 @@ import mns_common.constant.db_name_constant as db_name_constant
11
11
  import datetime
12
12
  import mns_common.component.cache.cache_service as cache_service
13
13
  from mns_common.db.MongodbUtil import MongodbUtil
14
- import mns_common.component.trade.trade_service_api as trade_service_api
14
+ import mns_common.component.deal.deal_service_api as deal_service_api
15
15
  from loguru import logger
16
16
  from mns_common.utils.async_fun import async_fun
17
+ import mns_common.component.price.trade_price_service_api as trade_price_service_api
17
18
 
18
19
  mongodb_util = MongodbUtil('27017')
20
+ from mns_common.constant.price_enum import PriceEnum
19
21
 
20
22
  AUTO_SELL_KEY = "AUTO_SELL_KEY"
21
23
 
@@ -51,11 +53,11 @@ def sell_stock_detail(realtime_quotes_now_position, position_stock_df, str_day,
51
53
  try:
52
54
 
53
55
  symbol = stock_one.symbol
54
- sell_price = trade_service_api.get_last_sell_price(symbol)
56
+ sell_price = trade_price_service_api.get_trade_price(symbol, PriceEnum.SEll_PRICE_LIMIT.price_code)
55
57
  position_stock_df_one = position_stock_df.loc[position_stock_df['symbol'] == symbol]
56
58
  available_position = list(position_stock_df_one['available_position'])[0]
57
59
  if sell_signal(stock_one, now_date, position_stock_df_one):
58
- sell_result = trade_service_api.order_sell(symbol, sell_price, available_position)
60
+ sell_result = deal_service_api.trade_sell(symbol, sell_price, available_position)
59
61
  if "message" in sell_result:
60
62
  result_msg = sell_result['message']
61
63
  if result_msg == 'success':
@@ -107,10 +109,10 @@ def update_position_status(symbol, sell_entrust_no, str_day):
107
109
  mongodb_util.update_many(update_query, new_values, db_name_constant.POSITION_STOCK)
108
110
 
109
111
 
110
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
112
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
111
113
 
112
114
  if __name__ == '__main__':
113
- sell_price_01 = trade_service_api.get_last_sell_price('002336')
115
+ sell_price_01 = trade_price_service_api.get_trade_price('002336',PriceEnum.SEll_PRICE_LIMIT.price_code)
114
116
  while True:
115
- real_time_quotes_now = east_money_stock_api.get_real_time_quotes_all_stocks()
116
- auto_sell_stock(real_time_quotes_now)
117
+ real_time_quotes_now = em_stock_info_api.get_a_stock_info()
118
+ auto_sell_stock(real_time_quotes_now)
@@ -0,0 +1,7 @@
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)