mns-scheduler 1.0.8.7__py3-none-any.whl → 1.0.9.0__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.

Potentially problematic release.


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

Files changed (25) hide show
  1. mns_scheduler/finance/sync_financial_report_service_api.py +5 -5
  2. mns_scheduler/finance/test/fix_blask_list.py +3 -5
  3. mns_scheduler/k_line/clean/k_line_info_clean_task.py +0 -16
  4. mns_scheduler/k_line/test/__init__.py +7 -0
  5. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +28 -0
  6. mns_scheduler/risk/compliance/__init__.py +0 -0
  7. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +65 -0
  8. mns_scheduler/risk/financial/__init__.py +0 -0
  9. mns_scheduler/risk/financial/annual_report_audit_check_api.py +43 -0
  10. mns_scheduler/risk/financial/net_assets_check_api.py +54 -0
  11. mns_scheduler/risk/financial/profit_income_check_api.py +75 -0
  12. mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
  13. mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
  14. mns_scheduler/risk/major_violations/__init__.py +0 -0
  15. mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +10 -6
  16. mns_scheduler/risk/self/__init__.py +0 -0
  17. mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +7 -1
  18. mns_scheduler/risk/transactions/__init__.py +0 -0
  19. mns_scheduler/zz_task/data_sync_task.py +6 -5
  20. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.0.9.0.dist-info}/METADATA +1 -1
  21. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.0.9.0.dist-info}/RECORD +23 -12
  22. mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
  23. mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
  24. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.0.9.0.dist-info}/WHEEL +0 -0
  25. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.0.9.0.dist-info}/top_level.txt +0 -0
@@ -13,10 +13,10 @@ from mns_common.db.MongodbUtil import MongodbUtil
13
13
  from loguru import logger
14
14
  import \
15
15
  mns_scheduler.finance.em_financial_asset_liability_sync_service_api as em_financial_asset_liability_sync_service_api
16
- import mns_scheduler.finance.financial_high_risk_stock_clean_service_api as financial_high_risk_stock_clean_service_api
16
+ import mns_scheduler.risk.financial_report_risk_check_api as financial_report_risk_check_api
17
17
  import mns_common.utils.data_frame_util as data_frame_util
18
18
  import mns_scheduler.finance.finance_common_api as finance_common_api
19
-
19
+ import mns_scheduler.risk.compliance.undisclosed_annual_report_api as undisclosed_annual_report_api
20
20
  mongodb_util = MongodbUtil('27017')
21
21
 
22
22
 
@@ -59,7 +59,7 @@ def sync_financial_report():
59
59
  sync_profit_report(period_time, sync_time, period)
60
60
  sync_asset_liability_report(period_time, sync_time, period)
61
61
  # 未出报告check
62
- financial_high_risk_stock_clean_service_api.un_report_check(sync_time, now_year, period, period_time)
62
+ undisclosed_annual_report_api.un_disclosed_report_check(sync_time, now_year, period, period_time)
63
63
 
64
64
 
65
65
  # 同步资产表
@@ -81,7 +81,7 @@ def sync_asset_liability_report(period_time, sync_time, period):
81
81
  mongodb_util.insert_mongo(new_asset_df, db_name_constant.EM_STOCK_ASSET_LIABILITY)
82
82
 
83
83
  # 年报审核
84
- financial_high_risk_stock_clean_service_api.financial_report_check(new_asset_df, period_time, period,
84
+ financial_report_risk_check_api.financial_report_check(new_asset_df, period_time, period,
85
85
  db_name_constant.EM_STOCK_ASSET_LIABILITY)
86
86
 
87
87
  except Exception as e:
@@ -103,7 +103,7 @@ def sync_profit_report(period_time, sync_time, period):
103
103
  mongodb_util.insert_mongo(new_profit_df, db_name_constant.EM_STOCK_PROFIT)
104
104
 
105
105
  # 年报审核
106
- financial_high_risk_stock_clean_service_api.financial_report_check(new_profit_df, period_time,
106
+ financial_report_risk_check_api.financial_report_check(new_profit_df, period_time,
107
107
  period, db_name_constant.EM_STOCK_PROFIT)
108
108
  except Exception as e:
109
109
  logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
@@ -6,13 +6,11 @@ end = file_path.index('mns') + 16
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
 
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
-
13
+ import mns_scheduler.risk.financial_report_risk_check_api as financial_report_risk_check_api
16
14
 
17
15
  mongodb_util = MongodbUtil('27017')
18
16
 
@@ -28,8 +26,8 @@ def fix_profit_black_list():
28
26
  em_stock_one_df = em_stock_profit_df_list.loc[
29
27
  em_stock_profit_df_list['SECURITY_CODE'] == em_stock_one.SECURITY_CODE]
30
28
 
31
- financial_high_risk_stock_clean_service_api.financial_report_check(em_stock_one_df, period_time, period,
32
- report_type)
29
+ financial_report_risk_check_api.financial_report_check(em_stock_one_df, period_time, period,
30
+ report_type)
33
31
 
34
32
 
35
33
  if __name__ == '__main__':
@@ -176,19 +176,3 @@ def create_k_line_index():
176
176
  mongodb_util.create_index('k_line_info', [("str_day", 1), ("symbol", 1)])
177
177
 
178
178
 
179
- def clean_history_data():
180
- query = {"$and": [{"trade_date": {"$gte": '2023-11-06'}}, {"trade_date": {"$lte": '2023-11-16'}}]}
181
- trade_date_list_df = mongodb_util.find_query_data('trade_date_list', query)
182
- trade_date_list_df = trade_date_list_df.sort_values(by=['trade_date'], ascending=False)
183
- for trade_data_one in trade_date_list_df.itertuples():
184
- try:
185
- sync_k_line_info_task(trade_data_one.trade_date)
186
- logger.info("清洗数据到:{}", trade_data_one.trade_date)
187
- except BaseException as e:
188
- logger.error("发生异常:{},{}", trade_data_one.trade_date, e)
189
-
190
-
191
- if __name__ == '__main__':
192
- sync_k_line_info("2024-06-03", None)
193
- # clean_history_data()
194
- # sync_k_line_info("2023-12-22")
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,28 @@
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
+ from mns_common.db.MongodbUtil import MongodbUtil
9
+ from loguru import logger
10
+ import mns_scheduler.k_line.clean.k_line_info_clean_task as k_line_info_clean_task
11
+
12
+ mongodb_util = MongodbUtil('27017')
13
+
14
+
15
+ def clean_history_data():
16
+ query = {"$and": [{"trade_date": {"$gte": '2023-11-06'}}, {"trade_date": {"$lte": '2024-05-29'}}]}
17
+ trade_date_list_df = mongodb_util.find_query_data('trade_date_list', query)
18
+ trade_date_list_df = trade_date_list_df.sort_values(by=['trade_date'], ascending=False)
19
+ for trade_data_one in trade_date_list_df.itertuples():
20
+ try:
21
+ k_line_info_clean_task.sync_k_line_info_task(trade_data_one.trade_date)
22
+ logger.info("清洗数据到:{}", trade_data_one.trade_date)
23
+ except BaseException as e:
24
+ logger.error("发生异常:{},{}", trade_data_one.trade_date, e)
25
+
26
+
27
+ if __name__ == '__main__':
28
+ clean_history_data()
File without changes
@@ -0,0 +1,65 @@
1
+ from datetime import datetime
2
+ import mns_common.component.self_choose.black_list_service_api as black_list_service_api
3
+ import mns_scheduler.finance.finance_common_api as finance_common_api
4
+ from loguru import logger
5
+ import mns_common.constant.db_name_constant as db_name_constant
6
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
7
+ import pandas as pd
8
+ from mns_common.constant.black_list_classify_enum import BlackClassify
9
+ import mns_common.component.company.company_common_service_api as company_common_service_api
10
+ import mns_common.utils.date_handle_util as date_handle_util
11
+
12
+ # 最迟出报告的交易天数
13
+ LATE_REPORT_DAYS = 3
14
+
15
+
16
+ # 未出财报检查
17
+ def un_disclosed_report_check(sync_time, now_year, period, period_time):
18
+ un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
19
+ db_name_constant.EM_STOCK_ASSET_LIABILITY)
20
+ un_report_profit_df = finance_common_api.find_un_report_symbol(period_time,
21
+ db_name_constant.EM_STOCK_PROFIT)
22
+ un_report_df = pd.concat([un_report_asset_df, un_report_profit_df])
23
+ if period == 4 or period == 1:
24
+ last_report_day = str(now_year) + "-05-01"
25
+ elif period == 2:
26
+ last_report_day = str(now_year) + "-07-01"
27
+ elif period == 3:
28
+ last_report_day = str(now_year) + "-10-01"
29
+ max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
30
+ all_company_info = company_common_service_api.get_company_info_industry_list_date()
31
+ if max_report_day >= sync_time:
32
+
33
+ for un_asset_one in un_report_df.itertuples():
34
+ symbol = un_asset_one.symbol
35
+ company_info_one = all_company_info.loc[all_company_info['_id'] == symbol]
36
+ list_date = list(company_info_one['list_date'])[0]
37
+ list_date = str(list_date)
38
+ list_date_time = date_handle_util.add_date_day(list_date[0:8], 0)
39
+ list_date_str = list_date_time.strftime('%Y-%m-%d')
40
+ if max_report_day < list_date_str:
41
+ continue
42
+ id_key = symbol + "_" + period_time + "_" + BlackClassify.UNDISCLOSED_REPORT.level_code
43
+ name = un_asset_one.name
44
+ now_date = datetime.now()
45
+ str_day = now_date.strftime('%Y-%m-%d')
46
+ try:
47
+
48
+ black_list_service_api.save_black_stock(id_key,
49
+ symbol,
50
+ name,
51
+ str_day,
52
+ sync_time,
53
+ '未披露财务报告',
54
+ '未披露财务报告',
55
+ '',
56
+ BlackClassify.UNDISCLOSED_REPORT.up_level_code,
57
+ BlackClassify.UNDISCLOSED_REPORT.up_level_name,
58
+ BlackClassify.UNDISCLOSED_REPORT.level_code,
59
+ BlackClassify.UNDISCLOSED_REPORT.level_name)
60
+ except Exception as e:
61
+ logger.error("更新未出报告异常:{},{},{}", symbol, period_time, e)
62
+
63
+
64
+ if __name__ == '__main__':
65
+ un_disclosed_report_check('2024-04-20', 2024, 4, '2023-12-31 00:00:00')
File without changes
@@ -0,0 +1,43 @@
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.self_choose.black_list_service_api as black_list_service_api
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ from datetime import datetime
11
+ from mns_common.constant.black_list_classify_enum import BlackClassify
12
+
13
+ # 年报审计意见check
14
+ mongodb_util = MongodbUtil('27017')
15
+ # 审核标准意见
16
+ OPINION_TYPE = "标准无保留意见"
17
+
18
+
19
+ def annual_report_audit_check(new_report_df, period_time):
20
+ new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
21
+ # 审核意见
22
+ opinion_type = list(new_report_one_df['OPINION_TYPE'])[0]
23
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
24
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
25
+ now_date = datetime.now()
26
+ str_day = now_date.strftime('%Y-%m-%d')
27
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
28
+
29
+ # 年报有问题
30
+ if opinion_type != OPINION_TYPE:
31
+ id_key = symbol + "_" + period_time + "_" + BlackClassify.AUDIT_PROBLEM.level_code
32
+ black_list_service_api.save_black_stock(id_key,
33
+ symbol,
34
+ name,
35
+ str_day,
36
+ str_now_date,
37
+ '年报审计有问题:' + "[" + str(opinion_type) + "]",
38
+ '年报审计有问题',
39
+ '',
40
+ BlackClassify.AUDIT_PROBLEM.up_level_code,
41
+ BlackClassify.AUDIT_PROBLEM.up_level_name,
42
+ BlackClassify.AUDIT_PROBLEM.level_code,
43
+ BlackClassify.AUDIT_PROBLEM.level_name)
@@ -0,0 +1,54 @@
1
+ from datetime import datetime
2
+ import mns_common.component.self_choose.black_list_service_api as black_list_service_api
3
+ import mns_common.constant.db_name_constant as db_name_constant
4
+ from mns_common.db.MongodbUtil import MongodbUtil
5
+ import mns_common.component.common_service_fun_api as common_service_fun_api
6
+ from mns_common.constant.black_list_classify_enum import BlackClassify
7
+
8
+ mongodb_util = MongodbUtil('27017')
9
+ # 最大负债比
10
+ MAX_LIABILITY_RATIO = 90
11
+ # 负载超过90%时候最小净资产
12
+ MIN_NET_ASSET = 1000000000
13
+ # 排除校验负债比的行业
14
+ EXCLUDE_INDUSTRY = ['保险', '银行', '证券']
15
+
16
+
17
+ # 负债比校验| 净资产check
18
+ def net_assets_check(report_type, new_report_df, period_time):
19
+ if report_type == db_name_constant.EM_STOCK_ASSET_LIABILITY:
20
+ new_report_df = new_report_df.sort_values(by=['REPORT_DATE'], ascending=False)
21
+ new_report_one_df = new_report_df.iloc[0:1]
22
+ # 负债比
23
+ liability_ratio = list(new_report_one_df['liability_ratio'])[0]
24
+ # 净资产
25
+ net_asset = round(list(new_report_one_df['TOTAL_ASSETS'])[0] - list(new_report_one_df['TOTAL_LIABILITIES'])[0],
26
+ 2)
27
+
28
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
29
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
30
+ now_date = datetime.now()
31
+ str_day = now_date.strftime('%Y-%m-%d')
32
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
33
+ id_key = symbol + "_" + period_time + "_" + BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code
34
+
35
+ query_company = {'_id': symbol, 'industry': {'$in': EXCLUDE_INDUSTRY}}
36
+ if mongodb_util.exist_data_query(db_name_constant.COMPANY_INFO, query_company):
37
+ return None
38
+
39
+ if liability_ratio >= MAX_LIABILITY_RATIO:
40
+ black_list_service_api.save_black_stock(id_key,
41
+ symbol,
42
+ name,
43
+ str_day,
44
+ str_now_date,
45
+ '负债过高:' + "[" + str(
46
+ liability_ratio) + "]" + "," + "净资产:"
47
+ + str(round(net_asset / common_service_fun_api.HUNDRED_MILLION,
48
+ 0)) + "亿",
49
+ '负债过高:' + "[" + str(liability_ratio) + "]",
50
+ '',
51
+ BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_code,
52
+ BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_name,
53
+ BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code,
54
+ BlackClassify.FINANCIAL_PROBLEM_DEBT.level_name)
@@ -0,0 +1,75 @@
1
+ import sys
2
+ import os
3
+ from datetime import datetime
4
+ import mns_common.constant.db_name_constant as db_name_constant
5
+ import mns_common.component.self_choose.black_list_service_api as black_list_service_api
6
+ import mns_common.component.common_service_fun_api as common_service_fun_api
7
+ from mns_common.constant.black_list_classify_enum import BlackClassify
8
+
9
+ file_path = os.path.abspath(__file__)
10
+ end = file_path.index('mns') + 16
11
+ project_path = file_path[0:end]
12
+ sys.path.append(project_path)
13
+
14
+ # 利润为负的时候最小营业收入 主板 3.2亿
15
+ MIN_INCOME_MAIN = 320000000
16
+ # 利润为负的时候最小营业收入 科创 创业 1.2亿
17
+ MIN_INCOME_SUB = 120000000
18
+
19
+
20
+ # 营收利润check
21
+
22
+ def profit_income_check(new_report_df, period_time, report_type):
23
+ new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
24
+ symbol = list(new_report_one_df['SECURITY_CODE'])[0]
25
+ name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
26
+ now_date = datetime.now()
27
+ str_day = now_date.strftime('%Y-%m-%d')
28
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
29
+
30
+ if report_type == db_name_constant.EM_STOCK_PROFIT:
31
+ # 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
32
+ # 利润总额
33
+ total_profit = list(new_report_one_df['TOTAL_PROFIT'])[0]
34
+ # 净利润
35
+ net_profit = list(new_report_one_df['NETPROFIT'])[0]
36
+ # 营业利润
37
+ operate_profit = list(new_report_one_df['OPERATE_PROFIT'])[0]
38
+ # 持续经营净利润
39
+ continued_profit = list(new_report_one_df['CONTINUED_NETPROFIT'])[0]
40
+ # 归属于母公司股东的净利润
41
+ parent_profit = list(new_report_one_df['PARENT_NETPROFIT'])[0]
42
+ # 扣除非经常性损益后的净利润
43
+ deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
44
+ # 营业总收入
45
+ total_operate_income = list(new_report_one_df['TOTAL_OPERATE_INCOME'])[0]
46
+ if total_operate_income == 0:
47
+ # 营业收入
48
+ total_operate_income = list(new_report_one_df['OPERATE_INCOME'])[0]
49
+
50
+ # 最小利润收入
51
+ min_profit = min(total_profit, net_profit, operate_profit,
52
+ continued_profit, parent_profit, deduct_parent_profit)
53
+ if min_profit < 0:
54
+
55
+ classification = common_service_fun_api.classify_symbol_one(symbol)
56
+ if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
57
+ | (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
58
+ id_key = symbol + "_" + period_time + "_" + BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_code
59
+ min_profit = round(min_profit / common_service_fun_api.TEN_THOUSAND, 1)
60
+ total_operate_income = round(total_operate_income / common_service_fun_api.HUNDRED_MILLION, 1)
61
+
62
+ black_list_service_api.save_black_stock(id_key,
63
+ symbol,
64
+ name,
65
+ str_day,
66
+ str_now_date,
67
+ '年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
68
+ total_operate_income) + '[' + '亿元]--' + '触发退市风险',
69
+ '年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
70
+ total_operate_income) + '[' + '亿元]--' + '触发退市风险',
71
+ '',
72
+ BlackClassify.FINANCIAL_PROBLEM_PROFIT.up_level_code,
73
+ BlackClassify.FINANCIAL_PROBLEM_PROFIT.up_level_name,
74
+ BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_code,
75
+ BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_name)
@@ -0,0 +1 @@
1
+ # 股权质押风险
@@ -0,0 +1,42 @@
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_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
@@ -14,7 +14,7 @@ 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
-
17
+ from mns_common.constant.black_list_classify_enum import BlackClassify
18
18
  mongodb_util = MongodbUtil('27017')
19
19
 
20
20
 
@@ -62,7 +62,7 @@ def sync_all_investigate_stocks(page_size, search_key, begin_day, end_day):
62
62
 
63
63
  # 立案调查的股票
64
64
  def sync_new_high_risk_stocks():
65
- before_days = 30
65
+ before_days = 500
66
66
  const_num = 30
67
67
  init_date = datetime.now()
68
68
  str_day = init_date.strftime('%Y-%m-%d')
@@ -109,13 +109,17 @@ def sync_new_high_risk_stocks():
109
109
  high_risk_stocks_one.announcementTitle,
110
110
  high_risk_stocks_one.announcementTitle,
111
111
  announce_url,
112
- black_list_service_api.REGISTER_INVESTIGATE)
112
+ BlackClassify.MAJOR_VIOLATIONS.up_level_code,
113
+ BlackClassify.MAJOR_VIOLATIONS.up_level_name,
114
+ BlackClassify.REGISTER_INVESTIGATE.level_code,
115
+ BlackClassify.REGISTER_INVESTIGATE.level_name,
116
+ )
113
117
  except Exception as e:
114
118
  logger.error("保存风险警示股票异常:{},{}", symbol, e)
115
119
 
116
120
 
117
121
  if __name__ == '__main__':
118
122
  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)
123
+ # result_df = sync_all_investigate_stocks(30, '立案', '2023-01-01', '2024-06-15')
124
+ # result_df = result_df.sort_values(by=['announcementTime'], ascending=False)
125
+ # print(result_df)
File without changes
@@ -11,6 +11,7 @@ import mns_common.component.self_choose.black_list_service_api as black_list_ser
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):
@@ -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
 
File without changes
@@ -6,7 +6,8 @@ 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_scheduler.risk.register_and_investigate_stock_sync_api as register_and_investigate_stock_sync_api
9
+ import mns_scheduler.risk.major_violations.register_and_investigate_stock_sync_api \
10
+ as register_and_investigate_stock_sync_api
10
11
  from loguru import logger
11
12
  from apscheduler.schedulers.blocking import BlockingScheduler
12
13
  from datetime import datetime
@@ -44,7 +45,7 @@ import mns_scheduler.irm.stock_irm_cninfo_service as stock_irm_cninfo_service
44
45
  import mns_scheduler.open.sync_one_day_open_data_to_db_service as sync_one_day_open_data_to_db_service
45
46
  import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_pool_service
46
47
  import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
47
- import mns_scheduler.risk.wei_pan_stock_api as wei_pan_stock_api
48
+ import mns_scheduler.risk.self.wei_pan_stock_api as wei_pan_stock_api
48
49
 
49
50
 
50
51
  # 同步交易日期任务完成
@@ -97,7 +98,7 @@ def col_data_move():
97
98
  logger.info('当天实时数据备份:{}', str_day)
98
99
  if trade_date_common_service_api.is_trade_day(str_day):
99
100
  mac_address = ip_util.get_mac_address()
100
- if mac_address is not None and mac_address == ip_util.MAC_ADDRESS_CD:
101
+ if mac_address is not None and mac_address == ip_util.WINDOWS_MAC_ADDRESS_CD:
101
102
  col_move_service.sync_col_move(str_day)
102
103
  else:
103
104
  # 删除最早一天数据
@@ -159,7 +160,7 @@ def sync_toady_stock_zt_pool():
159
160
  # 同步高涨幅实时行情
160
161
  sync_high_chg_real_time_quotes_service.sync_high_chg_real_time_quotes(str_day)
161
162
  # 同步高涨幅列表
162
- sync_high_chg_pool_service.sync_stock_high_chg_pool_list(str_day,None)
163
+ sync_high_chg_pool_service.sync_stock_high_chg_pool_list(str_day, None)
163
164
 
164
165
 
165
166
  # 计算下一个交易日k线数据
@@ -426,4 +427,4 @@ print('定时任务启动成功')
426
427
  blockingScheduler.start()
427
428
  #
428
429
  # if __name__ == '__main__':
429
- # sync_kpl_best_his_quotes()
430
+ # col_data_move()
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.0.8.7
3
+ Version: 1.0.9.0
4
4
 
@@ -37,10 +37,9 @@ mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1t
37
37
  mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=yr257AZ6PU4BoXzgVw8seGjmfEJd5bniaXO6FOONr1k,19437
38
38
  mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=7gnrn6OyMU4sxrvXXgzrj-EP914KwRpJW76XgKuWO0Q,14145
39
39
  mns_scheduler/finance/finance_common_api.py,sha256=e72-c6xcFaS4Z9wq9Yx2_HZ7PdStMeP6s4O61yeTKmc,2471
40
- mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py,sha256=sPc_APiq--67wBnpLI-6Kgm0Z1j463196oxBn9AFRbE,10561
41
- mns_scheduler/finance/sync_financial_report_service_api.py,sha256=5e8VdvT52YpJTBlk-H-EDboc5hacmF9osvfkumgZElI,5042
40
+ mns_scheduler/finance/sync_financial_report_service_api.py,sha256=YSSVt5R1EqYbW8C3JH4ng2iq7UkQynAMA1ye6G4iecw,5086
42
41
  mns_scheduler/finance/test/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
43
- mns_scheduler/finance/test/fix_blask_list.py,sha256=sXmNcnfnjKHBylc27ysCCb9G4HYlFDAxOY4eHDnkIGE,1304
42
+ mns_scheduler/finance/test/fix_blask_list.py,sha256=jjLhhIWH1L4CgNp2jQ_HAHbC3wVgeX1TzhqC--_D2MI,1249
44
43
  mns_scheduler/hk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
45
44
  mns_scheduler/hk/hk_company_info_sync_service_api.py,sha256=JEfIl_up36b1UpDxfPhosP6_i2Lo17Ma_GHLytoMjWI,3661
46
45
  mns_scheduler/irm/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
@@ -51,7 +50,7 @@ mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py,sha256=6iZpdQ1pARchL3kV-oEVPD
51
50
  mns_scheduler/k_line/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
52
51
  mns_scheduler/k_line/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
53
52
  mns_scheduler/k_line/clean/k_line_info_clean_impl.py,sha256=2GgRc9Nb9wXMueoZhl9egYzjQP_NPhBCvj-XYcTlG9w,1238
54
- mns_scheduler/k_line/clean/k_line_info_clean_task.py,sha256=Ds99VApJ9azVq1hhva0YU6G5h5e39CD1TDh7uz5DGvc,8384
53
+ mns_scheduler/k_line/clean/k_line_info_clean_task.py,sha256=rDwat65phnuresxqMs9f88tIDwxVok3OyN12qtgnvJw,7615
55
54
  mns_scheduler/k_line/clean/daily/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
56
55
  mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py,sha256=DD6cfz8BCBiaWA3unsasK23r39RvH7BhqR6kUNJX67M,18257
57
56
  mns_scheduler/k_line/clean/daily/daily_k_line_service.py,sha256=-nOU2yDC2bjOs8dfUG3n_qZ15C6yWrGfpktrPHwG4s4,6132
@@ -62,6 +61,8 @@ mns_scheduler/k_line/hot_stocks/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4I
62
61
  mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py,sha256=whm-pYhAd_7OKurIw2cteBwWse5vVXS88lcrTbbcSaE,2628
63
62
  mns_scheduler/k_line/sync/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
64
63
  mns_scheduler/k_line/sync/daily_week_month_line_sync.py,sha256=RxbShBJk0yo_uoNT3FvRmp8l0zUhiCi5sJaQdIbgU54,5704
64
+ mns_scheduler/k_line/test/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
65
+ mns_scheduler/k_line/test/k_line_info_clean_his_data.py,sha256=sOQF0g5ux1jUh9h3CfhDhlC2dzTtWBlcN04mlhsAVBU,1078
65
66
  mns_scheduler/kpl/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
66
67
  mns_scheduler/kpl/selection/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
67
68
  mns_scheduler/kpl/selection/index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
@@ -79,9 +80,19 @@ mns_scheduler/real_time/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy
79
80
  mns_scheduler/real_time/realtime_quotes_now_create_db_index.py,sha256=qQCjcsG3WYgn3zemS45Ms0AHtbkCwlSVPPCntxVvK8Q,1066
80
81
  mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=tXZUU9SLwM80YQv473i-uVw1w_lClTMFaO-uo4jERTI,9669
81
82
  mns_scheduler/risk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
82
- mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=pjVGZbSWQn6obobaJxsXQK7jeRrNQJ6kcwStQEj9R18,5086
83
- mns_scheduler/risk/stock_equity_mortgage_sync_api.py,sha256=MNj4kZ3VxxDwzFQjx-NuAGmOKcGnTaQIzGswdP_3pWc,871
84
- mns_scheduler/risk/wei_pan_stock_api.py,sha256=fIRW_qWxP7k_EoMpGAo2-2byQmCclMcssySAO9AKkU8,1560
83
+ mns_scheduler/risk/financial_report_risk_check_api.py,sha256=BPkMZ7aINfOFPswIV115kFUhyt0j7dLyA755QEDl-So,1648
84
+ mns_scheduler/risk/compliance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ mns_scheduler/risk/compliance/undisclosed_annual_report_api.py,sha256=4kY6mgDsZ-zd6W8E3awURwgP3Y71rNqwDkWTAFw8hZk,3676
86
+ mns_scheduler/risk/financial/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
+ mns_scheduler/risk/financial/annual_report_audit_check_api.py,sha256=SEU5N7y6JwlKTY0gGEw43Rq9nANCACaNVrV0ltpfknY,2065
88
+ mns_scheduler/risk/financial/net_assets_check_api.py,sha256=6o0DdsisVRY9LFLh22zjLyEIQrJ4PvfkeVtTIA43ICo,3091
89
+ mns_scheduler/risk/financial/profit_income_check_api.py,sha256=wdWxFK8TfEEbPYW__XbL41FzcBgOW79BP_z_Ulp9UUM,4300
90
+ mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py,sha256=SQ7dieSCOf1z42Wi1zDEii3poAT5wfyBrV43dXkAaaw,22
91
+ mns_scheduler/risk/major_violations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py,sha256=TcvYKPZzsyQMRi51EfJwH4Ph-aD8cY_Tn8nnTIxvun4,5386
93
+ mns_scheduler/risk/self/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ mns_scheduler/risk/self/wei_pan_stock_api.py,sha256=PRaFmdnQ7763ngEYAcBkQ7FGP9CJENJZnLfO7bAn1c0,1846
95
+ mns_scheduler/risk/transactions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
96
  mns_scheduler/trade/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
86
97
  mns_scheduler/trade/auto_ipo_buy_api.py,sha256=QXNzFJGNGveVUcXBh0RRJb_HV7abbLYXRljezPJf9ZM,377
87
98
  mns_scheduler/trade/auto_sell_service_api.py,sha256=HaauZeOsuLNBrowXT8IKaSgWLR2Huott6mg_AoLhpUY,4423
@@ -104,9 +115,9 @@ mns_scheduler/zt/script/sync_high_chg_pool_his_data.py,sha256=R0syG5gcXRlLxswbBl
104
115
  mns_scheduler/zt/zt_pool/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
105
116
  mns_scheduler/zt/zt_pool/zt_pool_sync_api.py,sha256=Uca9fcnxIiz5Pfe1Ot_IgRu7zA7KqM7wtOHkMKF2kSo,7604
106
117
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
107
- mns_scheduler/zz_task/data_sync_task.py,sha256=eTmGOpzb29rzkQ4M6Ng6hqbz3C76IS7gJ4KHseb8_E8,17593
118
+ mns_scheduler/zz_task/data_sync_task.py,sha256=1iXh3fHv4l9zDBrXTo8UDHrL-Uqv3anmMlAKQp_XkDo,17620
108
119
  mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=DN3bq2XCDZC-PHlbD2NTog48bR44EruIEc2QVGKg7Tk,932
109
- mns_scheduler-1.0.8.7.dist-info/METADATA,sha256=HqMr_oAcDD0QuQG2EAmDEXJ0q2rvkS6bx4dCQPH14PU,64
110
- mns_scheduler-1.0.8.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
111
- mns_scheduler-1.0.8.7.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
112
- mns_scheduler-1.0.8.7.dist-info/RECORD,,
120
+ mns_scheduler-1.0.9.0.dist-info/METADATA,sha256=JDBtl_UmGxcgFGXb31yhWdIQ8XuzpSCEYTYZOewCmTM,64
121
+ mns_scheduler-1.0.9.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
122
+ mns_scheduler-1.0.9.0.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
123
+ mns_scheduler-1.0.9.0.dist-info/RECORD,,
@@ -1,202 +0,0 @@
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
- from datetime import datetime
9
- import mns_common.component.self_choose.black_list_service_api as black_list_service_api
10
- import mns_scheduler.finance.finance_common_api as finance_common_api
11
- from loguru import logger
12
- import mns_common.constant.db_name_constant as db_name_constant
13
- from mns_common.db.MongodbUtil import MongodbUtil
14
- import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
15
- import mns_common.component.common_service_fun_api as common_service_fun_api
16
- import pandas as pd
17
-
18
- # 1.无保留意见/标准报告:报告没问题。(没有发现造假,但也不能保证为真)
19
- #
20
- # 2.带强调事项段的无保留意见:报告没问题,但是有亏损获对其可持续经营有重大疑虑(可能造假,至少是在粉饰报表)
21
- #
22
- # 3.保留意见报告:有问题,财务造假
23
- #
24
- # 4.否定意见报告:有很大问题
25
- #
26
- # 5.无法表示意见报告:不让查
27
- #
28
-
29
- mongodb_util = MongodbUtil('27017')
30
- # 审核标准意见
31
- OPINION_TYPE = "标准无保留意见"
32
-
33
- # 利润为负的时候最小营业收入 主板 3.2亿
34
- MIN_INCOME_MAIN = 320000000
35
- # 利润为负的时候最小营业收入 科创 创业 1.2亿
36
- MIN_INCOME_SUB = 120000000
37
- # 最大负债比
38
- MAX_LIABILITY_RATIO = 90
39
- # 负载超过90%时候最小净资产
40
- MIN_NET_ASSET = 1000000000
41
- # 排除校验负债比的行业
42
- EXCLUDE_INDUSTRY = ['保险', '银行', '证券']
43
-
44
- # 最迟出报告的天数
45
- LATE_REPORT_DAYS = 3
46
-
47
-
48
- #### 退市新规 ####
49
- # 1 股价类:连续20个交易日估价低于1元
50
- # 2 市值类: 主板小于5亿、创业板3亿
51
- # 3 财务类: (1) 利润总额 净利润 扣非净利润三者最小值为负 且营业收入小于3亿 创业板营业收入小于1元
52
- # (2) 资不抵债
53
-
54
- # 财报审核
55
- def financial_report_check(new_report_df, period_time, period, report_type):
56
- if period == 4:
57
- # 年报异常审核
58
- year_report_exception_check(new_report_df, period_time, report_type)
59
- # 负债过高
60
- liability_ratio_check(report_type, new_report_df, period_time)
61
-
62
-
63
- # 年报审核异常
64
- def year_report_exception_check(new_report_df, period_time, report_type):
65
- new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
66
- # 审核意见
67
- opinion_type = list(new_report_one_df['OPINION_TYPE'])[0]
68
- symbol = list(new_report_one_df['SECURITY_CODE'])[0]
69
- name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
70
- now_date = datetime.now()
71
- str_day = now_date.strftime('%Y-%m-%d')
72
- str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
73
-
74
- # 年报有问题
75
- if opinion_type != OPINION_TYPE:
76
- id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT
77
- black_list_service_api.save_black_stock(id_key,
78
- symbol,
79
- name,
80
- str_day,
81
- str_now_date,
82
- '年报审计有问题:' + "[" + str(opinion_type) + "]",
83
- '年报审计有问题',
84
- '',
85
- black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT)
86
-
87
- if report_type == db_name_constant.EM_STOCK_PROFIT:
88
- # 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
89
- # 利润总额
90
- total_profit = list(new_report_one_df['TOTAL_PROFIT'])[0]
91
- # 净利润
92
- net_profit = list(new_report_one_df['NETPROFIT'])[0]
93
- # 营业利润
94
- operate_profit = list(new_report_one_df['OPERATE_PROFIT'])[0]
95
- # 持续经营净利润
96
- continued_profit = list(new_report_one_df['CONTINUED_NETPROFIT'])[0]
97
- # 归属于母公司股东的净利润
98
- parent_profit = list(new_report_one_df['PARENT_NETPROFIT'])[0]
99
- # 扣除非经常性损益后的净利润
100
- deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
101
- # 营业总收入
102
- total_operate_income = list(new_report_one_df['TOTAL_OPERATE_INCOME'])[0]
103
- if total_operate_income == 0:
104
- # 营业收入
105
- total_operate_income = list(new_report_one_df['OPERATE_INCOME'])[0]
106
-
107
- # 最小利润收入
108
- min_profit = min(total_profit, net_profit, operate_profit,
109
- continued_profit, parent_profit, deduct_parent_profit)
110
- if min_profit < 0:
111
-
112
- classification = common_service_fun_api.classify_symbol_one(symbol)
113
- if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
114
- | (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
115
- id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_PROFIT
116
- min_profit = round(min_profit / common_service_fun_api.TEN_THOUSAND, 1)
117
- total_operate_income = round(total_operate_income / common_service_fun_api.HUNDRED_MILLION, 1)
118
-
119
- black_list_service_api.save_black_stock(id_key,
120
- symbol,
121
- name,
122
- str_day,
123
- str_now_date,
124
- '年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
125
- total_operate_income) + '[' + '亿元]--' + '触发退市风险',
126
- '年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
127
- total_operate_income) + '[' + '亿元]--' + '触发退市风险',
128
- '',
129
- black_list_service_api.FINANCIAL_PROBLEM_PROFIT)
130
-
131
-
132
- # 负债比校验
133
- def liability_ratio_check(report_type, new_report_df, period_time):
134
- if report_type == db_name_constant.EM_STOCK_ASSET_LIABILITY:
135
- new_report_df = new_report_df.sort_values(by=['REPORT_DATE'], ascending=False)
136
- new_report_one_df = new_report_df.iloc[0:1]
137
- # 负债比
138
- liability_ratio = list(new_report_one_df['liability_ratio'])[0]
139
- # 净资产
140
- net_asset = round(list(new_report_one_df['TOTAL_ASSETS'])[0] - list(new_report_one_df['TOTAL_LIABILITIES'])[0],
141
- 2)
142
-
143
- symbol = list(new_report_one_df['SECURITY_CODE'])[0]
144
- name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
145
- now_date = datetime.now()
146
- str_day = now_date.strftime('%Y-%m-%d')
147
- str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
148
- id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_DEBT
149
-
150
- query_company = {'_id': symbol, 'industry': {'$in': EXCLUDE_INDUSTRY}}
151
- if mongodb_util.exist_data_query(db_name_constant.COMPANY_INFO, query_company):
152
- return None
153
-
154
- if liability_ratio >= MAX_LIABILITY_RATIO:
155
- black_list_service_api.save_black_stock(id_key,
156
- symbol,
157
- name,
158
- str_day,
159
- str_now_date,
160
- '负债过高:' + "[" + str(
161
- liability_ratio) + "]" + "," + "净资产:" + str(round(
162
- net_asset / common_service_fun_api.HUNDRED_MILLION, 0)) + "亿",
163
- '负债过高:' + "[" + str(liability_ratio) + "]",
164
- '',
165
- black_list_service_api.FINANCIAL_PROBLEM_DEBT)
166
-
167
-
168
- # 未出财报
169
- def un_report_check(sync_time, now_year, period, period_time):
170
- un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
171
- db_name_constant.EM_STOCK_ASSET_LIABILITY)
172
- un_report_profit_df = finance_common_api.find_un_report_symbol(period_time,
173
- db_name_constant.EM_STOCK_PROFIT)
174
- un_report_df = pd.concat([un_report_asset_df, un_report_profit_df])
175
- if period == 4 or period == 1:
176
- last_report_day = str(now_year) + "-05-01"
177
- elif period == 2:
178
- last_report_day = str(now_year) + "-07-01"
179
- elif period == 3:
180
- last_report_day = str(now_year) + "-10-01"
181
- max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
182
- if max_report_day >= sync_time:
183
-
184
- for un_asset_one in un_report_df.itertuples():
185
- symbol = un_asset_one.symbol
186
- id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT
187
- name = un_asset_one.name
188
- now_date = datetime.now()
189
- str_day = now_date.strftime('%Y-%m-%d')
190
- try:
191
-
192
- black_list_service_api.save_black_stock(id_key,
193
- symbol,
194
- name,
195
- str_day,
196
- sync_time,
197
- '未出财报',
198
- '未出财报',
199
- '',
200
- black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT)
201
- except Exception as e:
202
- logger.error("更新未出报告异常:{},{},{}", symbol, period_time, e)
@@ -1,32 +0,0 @@
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
- # 股权质押 https://data.eastmoney.com/gpzy/pledgeRatio.aspx
10
-
11
- import requests
12
-
13
-
14
- def get_equity_mortgage():
15
- url = (
16
- 'https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery1123018114616341595302_1715993497168&sortColumns=PLEDGE_RATIO&sortTypes=-1'
17
- '&pageSize=50000'
18
- '&pageNumber=1'
19
- '&reportName=RPT_CSDC_LIST&columns=ALL&quoteColumns=&source=WEB'
20
- '&client=WEB'
21
- '&filter=(TRADE_DATE%3D%272024-05-17%27)')
22
-
23
- headers = {
24
- "Content-Type": "application/json"
25
- }
26
- r = requests.post(url, headers=headers)
27
- data_json = r.json()
28
- print(data_json)
29
-
30
-
31
- if __name__ == '__main__':
32
- get_equity_mortgage()