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.
- mns_scheduler/__init__.py +1 -3
- mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
- mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
- mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
- mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
- mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
- mns_scheduler/company_info/constant/company_constant_data.py +497 -0
- mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
- mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
- mns_scheduler/company_info/remark/__init__.py +7 -0
- mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
- mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
- mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
- mns_scheduler/concept/ths/detaill/__init__.py +0 -0
- mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
- mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
- mns_scheduler/db/col_move_service.py +10 -7
- mns_scheduler/db/db_status.py +1 -1
- mns_scheduler/db/script/__init__.py +7 -0
- mns_scheduler/db/script/col_move_script.py +45 -0
- mns_scheduler/db/script/db_move/__init__.py +7 -0
- mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
- mns_scheduler/db/script/sync/__init__.py +7 -0
- mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
- mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
- mns_scheduler/db/script/update/__init__.py +7 -0
- mns_scheduler/db/script/update/update_col_field.py +36 -0
- mns_scheduler/finance/__init__.py +1 -1
- mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
- mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
- mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
- mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
- mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
- mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
- mns_scheduler/hk/__init__.py +1 -1
- mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
- mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
- mns_scheduler/industry/__init__.py +7 -0
- mns_scheduler/industry/ths/__init__.py +7 -0
- mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
- mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
- mns_scheduler/irm/__init__.py +1 -1
- mns_scheduler/irm/api/__init__.py +1 -1
- mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
- mns_scheduler/k_line/clean/daily/__init__.py +1 -1
- mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
- mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
- mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
- mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
- mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
- mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
- mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
- mns_scheduler/k_line/common/__init__.py +7 -0
- mns_scheduler/k_line/common/k_line_common_api.py +188 -0
- mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
- mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
- mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
- mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
- mns_scheduler/k_line/sync_status/__init__.py +7 -0
- mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
- mns_scheduler/k_line/test/__init__.py +7 -0
- mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
- mns_scheduler/k_line/year_quarter/__init__.py +7 -0
- mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
- mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
- mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
- mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
- mns_scheduler/lhb/__init__.py +1 -1
- mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
- mns_scheduler/open/__init__.py +1 -1
- mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
- mns_scheduler/risk/__init__.py +1 -1
- mns_scheduler/risk/compliance/__init__.py +0 -0
- mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
- mns_scheduler/risk/financial/__init__.py +0 -0
- mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
- mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
- mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
- mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
- mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
- mns_scheduler/risk/major_violations/__init__.py +0 -0
- mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
- mns_scheduler/risk/self/__init__.py +0 -0
- mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
- mns_scheduler/risk/test/__init__.py +7 -0
- mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
- mns_scheduler/risk/transactions/__init__.py +0 -0
- mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
- mns_scheduler/self_choose/__init__.py +7 -0
- mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
- mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
- mns_scheduler/trade/auto_login/__init__.py +7 -0
- mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
- mns_scheduler/trade/auto_sell_service_api.py +10 -8
- mns_scheduler/trade/balance/__init__.py +7 -0
- mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
- mns_scheduler/trade/sync_position_api.py +41 -8
- mns_scheduler/trade/task/__init__.py +7 -0
- mns_scheduler/trade/task/trader_task_service.py +65 -0
- mns_scheduler/trade/tfp/__init__.py +7 -0
- mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
- mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
- mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
- mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
- mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
- mns_scheduler/zt/script/__init__.py +1 -1
- mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
- mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
- mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
- mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
- mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
- mns_scheduler/zz_task/compensation/__init__.py +0 -0
- mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
- mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
- mns_scheduler/zz_task/data_sync_task.py +271 -121
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
- mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
- mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
- mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
- mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
- mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
- mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
- mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
- mns_scheduler/company_info/company_constant_data.py +0 -322
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
- mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
- mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
- mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
- mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
- mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
- mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
- mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
- mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
- mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
- /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
- /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
- /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
- /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
- /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
- /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
- /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
- /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
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 loguru import logger
|
|
10
|
+
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
11
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
12
|
+
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
13
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
14
|
+
import mns_common.api.xueqiu.xue_qiu_k_line_api as xue_qiu_k_line_api
|
|
15
|
+
import mns_common.component.cookie.cookie_info_service as cookie_info_service
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
18
|
+
|
|
19
|
+
mongodb_util = MongodbUtil('27017')
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def sync_year_k_line():
|
|
23
|
+
timestamp = str(int(datetime.now().timestamp() * 1000))
|
|
24
|
+
|
|
25
|
+
col_name = db_name_constant.STOCK_QFQ_YEAR
|
|
26
|
+
real_time_quotes_all_stocks_df = em_stock_info_api.get_a_stock_info()
|
|
27
|
+
real_time_quotes_all_stocks_df = common_service_fun_api.classify_symbol(real_time_quotes_all_stocks_df)
|
|
28
|
+
real_time_quotes_all_stocks_df = common_service_fun_api.add_pre_prefix(real_time_quotes_all_stocks_df)
|
|
29
|
+
for stock_one in real_time_quotes_all_stocks_df.itertuples():
|
|
30
|
+
symbol = stock_one.symbol
|
|
31
|
+
try:
|
|
32
|
+
symbol_prefix = stock_one.symbol_prefix
|
|
33
|
+
|
|
34
|
+
year_k_line_df_copy = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_prefix, 'year',
|
|
35
|
+
cookie_info_service.get_xue_qiu_cookie(),
|
|
36
|
+
timestamp,
|
|
37
|
+
'before')
|
|
38
|
+
if data_frame_util.is_empty(year_k_line_df_copy):
|
|
39
|
+
logger.warning("返回数据为空:{}", symbol)
|
|
40
|
+
continue
|
|
41
|
+
|
|
42
|
+
year_k_line_df = year_k_line_df_copy.copy()
|
|
43
|
+
year_k_line_df = year_k_line_df[[
|
|
44
|
+
'volume',
|
|
45
|
+
'open',
|
|
46
|
+
'high',
|
|
47
|
+
'low',
|
|
48
|
+
'close',
|
|
49
|
+
'chg',
|
|
50
|
+
'percent',
|
|
51
|
+
'turnoverrate',
|
|
52
|
+
'amount',
|
|
53
|
+
'str_day'
|
|
54
|
+
]]
|
|
55
|
+
year_k_line_df['year'] = year_k_line_df['str_day'].str[:4]
|
|
56
|
+
|
|
57
|
+
year_k_line_df["open_to_high_pct"] = (
|
|
58
|
+
(year_k_line_df["high"] - year_k_line_df["open"]) / year_k_line_df["open"] * 100).round(2)
|
|
59
|
+
|
|
60
|
+
year_k_line_df["low_to_high_pct"] = (
|
|
61
|
+
(year_k_line_df["high"] - year_k_line_df["low"]) / year_k_line_df["low"] * 100).round(2)
|
|
62
|
+
year_k_line_df = year_k_line_df.rename(columns={
|
|
63
|
+
"percent": "chg",
|
|
64
|
+
"chg": "chg_price",
|
|
65
|
+
"turnoverrate": "exchange"
|
|
66
|
+
})
|
|
67
|
+
year_k_line_df['symbol'] = symbol
|
|
68
|
+
year_k_line_df['_id'] = symbol + '_' + year_k_line_df['year']
|
|
69
|
+
mongodb_util.save_mongo(year_k_line_df, col_name)
|
|
70
|
+
logger.info("同步年线数据完成:{},{}", symbol, stock_one.name)
|
|
71
|
+
except BaseException as e:
|
|
72
|
+
logger.error("同步年线数据异常:{},{}", symbol, e)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
if __name__ == '__main__':
|
|
76
|
+
sync_year_k_line()
|
|
@@ -3,10 +3,8 @@ import os
|
|
|
3
3
|
|
|
4
4
|
import mns_common.api.kpl.selection.kpl_selection_plate_api as selection_plate_api
|
|
5
5
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
6
|
-
from loguru import logger
|
|
7
6
|
from datetime import datetime
|
|
8
7
|
import mns_common.utils.data_frame_util as data_frame_util
|
|
9
|
-
import pandas as pd
|
|
10
8
|
|
|
11
9
|
file_path = os.path.abspath(__file__)
|
|
12
10
|
end = file_path.index('mns') + 17
|
|
@@ -121,6 +119,10 @@ def save_one_plate_detail_data(plate_code, plate_name, index_class, first_plate_
|
|
|
121
119
|
new_df['create_day'] = str_day
|
|
122
120
|
new_df['create_time'] = str_now_date
|
|
123
121
|
new_df = new_df[choose_field]
|
|
122
|
+
new_df['grade'] = 1
|
|
123
|
+
new_df['remark'] = ''
|
|
124
|
+
new_df['remark_flag'] = ''
|
|
125
|
+
new_df['long'] = ''
|
|
124
126
|
mongodb_util.insert_mongo(new_df, 'kpl_best_choose_index_detail')
|
|
125
127
|
|
|
126
128
|
# 保存到当日新增概念列表
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
10
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
11
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
12
|
+
import mns_common.api.kpl.common.kpl_common_api as kpl_common_api
|
|
13
|
+
from loguru import logger
|
|
14
|
+
from datetime import datetime, timedelta
|
|
15
|
+
import pandas as pd
|
|
16
|
+
|
|
17
|
+
mongodb_util = MongodbUtil('27017')
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# 更新所有概念入选原因
|
|
21
|
+
def update_all_kpl_symbol_choose_reason():
|
|
22
|
+
kpl_best_choose_index_df = mongodb_util.find_query_data(db_name_constant.KPL_BEST_CHOOSE_INDEX, {})
|
|
23
|
+
for concept_one in kpl_best_choose_index_df.itertuples():
|
|
24
|
+
try:
|
|
25
|
+
concept_code = concept_one.plate_code
|
|
26
|
+
kpl_best_choose_index_detail_df = mongodb_util.find_query_data(
|
|
27
|
+
db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL, {"plate_code": concept_code})
|
|
28
|
+
if data_frame_util.is_not_empty(kpl_best_choose_index_detail_df):
|
|
29
|
+
kpl_symbol_list = list(kpl_best_choose_index_detail_df['symbol'])
|
|
30
|
+
symbol_str = ','.join(kpl_symbol_list)
|
|
31
|
+
choose_reason_df = kpl_common_api.get_kpl_concept_choose_reason(concept_code, symbol_str)
|
|
32
|
+
if data_frame_util.is_not_empty(choose_reason_df):
|
|
33
|
+
for choose_reason_one in choose_reason_df.itertuples():
|
|
34
|
+
symbol = choose_reason_one.symbol
|
|
35
|
+
try:
|
|
36
|
+
|
|
37
|
+
choose_reason = choose_reason_one.choose_reason
|
|
38
|
+
update_query = {'symbol': symbol, 'plate_code': concept_code}
|
|
39
|
+
new_values = {"$set": {"long": choose_reason}}
|
|
40
|
+
mongodb_util.update_many(update_query, new_values,
|
|
41
|
+
db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL)
|
|
42
|
+
except BaseException as e:
|
|
43
|
+
logger.error("更新开票啦入选原因异常:{},{},{}", symbol, concept_code, e)
|
|
44
|
+
logger.info("更新开票啦入选原因完成:{},{}", concept_one.plate_code, concept_one.plate_name)
|
|
45
|
+
except BaseException as e:
|
|
46
|
+
logger.error("更新开票啦入选原因异常:{},{},{}", concept_one.plate_code, concept_one.plate_name, e)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# 更新入选概念原因
|
|
50
|
+
def update_symbol_new_concept_reason(plate_code, kpl_symbol_list):
|
|
51
|
+
symbol_str = ','.join(kpl_symbol_list)
|
|
52
|
+
choose_reason_df = kpl_common_api.get_kpl_concept_choose_reason(plate_code, symbol_str)
|
|
53
|
+
if data_frame_util.is_not_empty(choose_reason_df):
|
|
54
|
+
choose_reason_df = choose_reason_df[choose_reason_df['choose_reason'] != '']
|
|
55
|
+
if data_frame_util.is_empty(choose_reason_df):
|
|
56
|
+
return
|
|
57
|
+
for choose_reason_one in choose_reason_df.itertuples():
|
|
58
|
+
symbol = choose_reason_one.symbol
|
|
59
|
+
try:
|
|
60
|
+
|
|
61
|
+
choose_reason = choose_reason_one.choose_reason
|
|
62
|
+
update_query = {'symbol': symbol, 'plate_code': plate_code}
|
|
63
|
+
new_values = {"$set": {"long": choose_reason}}
|
|
64
|
+
mongodb_util.update_many(update_query, new_values,
|
|
65
|
+
db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL)
|
|
66
|
+
# 更新今日新增概念列表 入选原因
|
|
67
|
+
mongodb_util.update_many(update_query, new_values,
|
|
68
|
+
db_name_constant.TODAY_NEW_CONCEPT_LIST)
|
|
69
|
+
except BaseException as e:
|
|
70
|
+
logger.error("更新开票啦入选原因异常:{},{},{}", symbol, plate_code, e)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def update_null_choose_reason():
|
|
74
|
+
# 获取当前日期时间
|
|
75
|
+
now = datetime.now()
|
|
76
|
+
|
|
77
|
+
# 计算前15天的日期时间
|
|
78
|
+
days_ago_15 = now - timedelta(days=30)
|
|
79
|
+
|
|
80
|
+
# 按指定格式输出
|
|
81
|
+
formatted_date = days_ago_15.strftime("%Y-%m-%d %H:%M:%S")
|
|
82
|
+
query = {"create_time": {"$gte": formatted_date}, '$or': [{"long": {"$exists": False}}, {"long": ''}]}
|
|
83
|
+
null_choose_reason_detail_df = mongodb_util.find_query_data(db_name_constant.KPL_BEST_CHOOSE_INDEX_DETAIL, query)
|
|
84
|
+
if data_frame_util.is_not_empty(null_choose_reason_detail_df):
|
|
85
|
+
grouped_null_reason_df = null_choose_reason_detail_df.groupby('plate_code')
|
|
86
|
+
grouped_null_reason_list = grouped_null_reason_df.size()
|
|
87
|
+
group_null_reason = pd.DataFrame(grouped_null_reason_list, columns=['number'])
|
|
88
|
+
group_null_reason['plate_code'] = group_null_reason.index
|
|
89
|
+
group_null_reason = group_null_reason.sort_values(by=['number'], ascending=False)
|
|
90
|
+
for null_reason_one in group_null_reason.itertuples():
|
|
91
|
+
plate_code = null_reason_one.plate_code
|
|
92
|
+
try:
|
|
93
|
+
|
|
94
|
+
null_reason_one_plate_df = null_choose_reason_detail_df.loc[
|
|
95
|
+
null_choose_reason_detail_df['plate_code'] == plate_code]
|
|
96
|
+
kpl_symbol_list = list(null_reason_one_plate_df['symbol'])
|
|
97
|
+
update_symbol_new_concept_reason(plate_code, kpl_symbol_list)
|
|
98
|
+
logger.info("更新开票啦入选原因完成:{},{}", null_reason_one.plate_code,
|
|
99
|
+
list(null_reason_one_plate_df['plate_name'])[0])
|
|
100
|
+
except BaseException as e:
|
|
101
|
+
logger.error("更新kpl入选原因异常:{},{}", null_reason_one.plate_code, e)
|
|
102
|
+
|
|
103
|
+
return formatted_date
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
if __name__ == '__main__':
|
|
107
|
+
update_null_choose_reason()
|
|
108
|
+
# update_all_kpl_symbol_choose_reason()
|
|
@@ -10,6 +10,7 @@ import mns_scheduler.kpl.selection.symbol.sync_best_choose_symbol as sync_best_c
|
|
|
10
10
|
import threading
|
|
11
11
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
12
|
import mns_common.api.kpl.constant.kpl_constant as kpl_constant
|
|
13
|
+
import mns_scheduler.kpl.selection.symbol.sync_kpl_concept_symbol_choose_reason_api as sync_kpl_concept_symbol_choose_reason_api
|
|
13
14
|
|
|
14
15
|
file_path = os.path.abspath(__file__)
|
|
15
16
|
end = file_path.index('mns') + 17
|
|
@@ -22,7 +23,7 @@ mongodb_util = MongodbUtil('27017')
|
|
|
22
23
|
MAX_PAGE_NUMBER = 10
|
|
23
24
|
|
|
24
25
|
|
|
25
|
-
#
|
|
26
|
+
# 同步开盘啦精选概念股票组成
|
|
26
27
|
def sync_best_choose_symbol_detail(first_index_df, page_number):
|
|
27
28
|
for stock_one in first_index_df.itertuples():
|
|
28
29
|
try:
|
|
@@ -76,13 +77,17 @@ def sync_all_plate_info():
|
|
|
76
77
|
# 更新一级和二级之间的关联关系
|
|
77
78
|
# 找出新增精选指数
|
|
78
79
|
sync_best_choose_first_index.sync_best_choose_index()
|
|
79
|
-
logger.info("
|
|
80
|
+
logger.info("同步开盘啦精选概念指数完成")
|
|
80
81
|
# 同步精选概念股票组成
|
|
81
82
|
multi_thread_sync_kpl_best_choose_detail()
|
|
82
|
-
logger.info("
|
|
83
|
-
#
|
|
83
|
+
logger.info("同步开盘啦精选概念股票组成完成")
|
|
84
|
+
# 更新开盘啦空名字名称
|
|
84
85
|
update_null_name()
|
|
85
|
-
logger.info("
|
|
86
|
+
logger.info("更新开盘啦空名字名称")
|
|
87
|
+
|
|
88
|
+
# 更新开盘啦入选原因
|
|
89
|
+
sync_kpl_concept_symbol_choose_reason_api.update_null_choose_reason()
|
|
90
|
+
logger.info("更新开盘啦入选原因")
|
|
86
91
|
|
|
87
92
|
|
|
88
93
|
# 更新一二级关系
|
|
@@ -181,8 +186,8 @@ def update_null_name():
|
|
|
181
186
|
|
|
182
187
|
|
|
183
188
|
if __name__ == '__main__':
|
|
184
|
-
update_null_name()
|
|
185
|
-
update_best_choose_plate_relation()
|
|
189
|
+
# update_null_name()
|
|
190
|
+
# update_best_choose_plate_relation()
|
|
186
191
|
|
|
187
192
|
# 同步第一和第二级别精选指数
|
|
188
193
|
sync_all_plate_info()
|
mns_scheduler/lhb/__init__.py
CHANGED
mns_scheduler/open/__init__.py
CHANGED
|
@@ -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') +
|
|
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,9 +11,8 @@ from loguru import logger
|
|
|
11
11
|
from datetime import time
|
|
12
12
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
13
13
|
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
14
|
-
import mns_common.component.company.
|
|
14
|
+
import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
|
|
15
15
|
import mns_common.component.data.data_init_api as data_init_api
|
|
16
|
-
import pandas as pd
|
|
17
16
|
import mns_common.utils.db_util as db_util
|
|
18
17
|
|
|
19
18
|
mongodb_util = MongodbUtil('27017')
|
|
@@ -51,12 +50,13 @@ def sync_one_day_open_data(str_day):
|
|
|
51
50
|
|
|
52
51
|
|
|
53
52
|
def handle_init_real_time_quotes_data(real_time_quotes_now, str_now_date, number):
|
|
53
|
+
# fix industry
|
|
54
|
+
real_time_quotes_now = company_common_service_new_api.amend_ths_industry(real_time_quotes_now.copy())
|
|
54
55
|
# exclude b symbol
|
|
55
56
|
real_time_quotes_now = common_service_fun_api.exclude_b_symbol(real_time_quotes_now.copy())
|
|
56
57
|
# classification symbol
|
|
57
58
|
real_time_quotes_now = common_service_fun_api.classify_symbol(real_time_quotes_now.copy())
|
|
58
|
-
|
|
59
|
-
real_time_quotes_now = fix_industry_data(real_time_quotes_now.copy())
|
|
59
|
+
|
|
60
60
|
# calculate parameter
|
|
61
61
|
real_time_quotes_now = data_init_api.calculate_parameter_factor(real_time_quotes_now.copy())
|
|
62
62
|
|
|
@@ -66,21 +66,5 @@ def handle_init_real_time_quotes_data(real_time_quotes_now, str_now_date, number
|
|
|
66
66
|
return real_time_quotes_now
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
# fix 错杀数据 有成交量的数据
|
|
70
|
-
def fix_industry_data(real_time_quotes_now):
|
|
71
|
-
# fix industry
|
|
72
|
-
real_time_quotes_now_r = company_common_service_api.amendment_industry(real_time_quotes_now.copy())
|
|
73
|
-
|
|
74
|
-
symbol_list = list(real_time_quotes_now_r['symbol'])
|
|
75
|
-
|
|
76
|
-
na_real_now = real_time_quotes_now.loc[
|
|
77
|
-
~(real_time_quotes_now['symbol'].isin(symbol_list))]
|
|
78
|
-
|
|
79
|
-
na_real_now = na_real_now.loc[na_real_now['amount'] != 0]
|
|
80
|
-
|
|
81
|
-
real_time_quotes_now_result = pd.concat([real_time_quotes_now_r, na_real_now], axis=0)
|
|
82
|
-
return real_time_quotes_now_result
|
|
83
|
-
|
|
84
|
-
|
|
85
69
|
if __name__ == '__main__':
|
|
86
|
-
sync_one_day_open_data('
|
|
70
|
+
sync_one_day_open_data('2025-03-21')
|
mns_scheduler/risk/__init__.py
CHANGED
|
File without changes
|
|
@@ -0,0 +1,71 @@
|
|
|
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.em.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
|
+
month = sync_time[5:7]
|
|
25
|
+
day = sync_time[8:10]
|
|
26
|
+
day = int(day)
|
|
27
|
+
month = int(month)
|
|
28
|
+
if (month < 4) or (month == 4 and day < 20):
|
|
29
|
+
return None
|
|
30
|
+
last_report_day = str(now_year) + "-05-01"
|
|
31
|
+
elif period == 2:
|
|
32
|
+
last_report_day = str(now_year) + "-07-01"
|
|
33
|
+
elif period == 3:
|
|
34
|
+
last_report_day = str(now_year) + "-10-01"
|
|
35
|
+
max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
|
|
36
|
+
all_company_info = company_common_service_api.get_company_info_industry_list_date()
|
|
37
|
+
if max_report_day >= sync_time:
|
|
38
|
+
|
|
39
|
+
for un_asset_one in un_report_df.itertuples():
|
|
40
|
+
symbol = un_asset_one.symbol
|
|
41
|
+
company_info_one = all_company_info.loc[all_company_info['_id'] == symbol]
|
|
42
|
+
list_date = list(company_info_one['list_date'])[0]
|
|
43
|
+
list_date = str(list_date)
|
|
44
|
+
list_date_time = date_handle_util.add_date_day(list_date[0:8], 0)
|
|
45
|
+
list_date_str = list_date_time.strftime('%Y-%m-%d')
|
|
46
|
+
if max_report_day < list_date_str:
|
|
47
|
+
continue
|
|
48
|
+
id_key = symbol + "_" + period_time + "_" + BlackClassify.UNDISCLOSED_REPORT.level_code
|
|
49
|
+
name = un_asset_one.name
|
|
50
|
+
now_date = datetime.now()
|
|
51
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
52
|
+
try:
|
|
53
|
+
|
|
54
|
+
black_list_service_api.save_black_stock(id_key,
|
|
55
|
+
symbol,
|
|
56
|
+
name,
|
|
57
|
+
str_day,
|
|
58
|
+
sync_time,
|
|
59
|
+
'未披露财务报告',
|
|
60
|
+
'未披露财务报告',
|
|
61
|
+
'',
|
|
62
|
+
BlackClassify.UNDISCLOSED_REPORT.up_level_code,
|
|
63
|
+
BlackClassify.UNDISCLOSED_REPORT.up_level_name,
|
|
64
|
+
BlackClassify.UNDISCLOSED_REPORT.level_code,
|
|
65
|
+
BlackClassify.UNDISCLOSED_REPORT.level_name)
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.error("更新未出报告异常:{},{},{}", symbol, period_time, e)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if __name__ == '__main__':
|
|
71
|
+
un_disclosed_report_check('2025-04-29', 2025, 4, '2024-12-31 00:00:00')
|
|
File without changes
|
|
@@ -0,0 +1,54 @@
|
|
|
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.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
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
13
|
+
|
|
14
|
+
# 年报审计意见check
|
|
15
|
+
mongodb_util = MongodbUtil('27017')
|
|
16
|
+
# 审核标准意见
|
|
17
|
+
OPINION_TYPE = "标准无保留意见"
|
|
18
|
+
# 新上市不check
|
|
19
|
+
NEW_STOCK = 365
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def annual_report_audit_check(new_report_df, period_time):
|
|
23
|
+
new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
|
|
24
|
+
# 审核意见
|
|
25
|
+
opinion_type = list(new_report_one_df['OPINION_TYPE'])[0]
|
|
26
|
+
symbol = list(new_report_one_df['SECURITY_CODE'])[0]
|
|
27
|
+
name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
|
|
28
|
+
notice_date = list(new_report_one_df['NOTICE_DATE'])[0]
|
|
29
|
+
now_date = datetime.now()
|
|
30
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
31
|
+
query = {'symbol': symbol, 'level_code': BlackClassify.AUDIT_PROBLEM.level_code}
|
|
32
|
+
mongodb_util.remove_data(query, db_name_constant.SELF_BLACK_STOCK)
|
|
33
|
+
# 年报有问题
|
|
34
|
+
if opinion_type != OPINION_TYPE:
|
|
35
|
+
query_company = {'_id': symbol}
|
|
36
|
+
company_info = mongodb_util.find_query_data(db_name_constant.COMPANY_INFO, query_company)
|
|
37
|
+
diff_days = list(company_info['diff_days'])[0]
|
|
38
|
+
if diff_days < NEW_STOCK:
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
id_key = symbol + "_" + period_time + "_" + BlackClassify.AUDIT_PROBLEM.level_code
|
|
42
|
+
|
|
43
|
+
black_list_service_api.save_black_stock(id_key,
|
|
44
|
+
symbol,
|
|
45
|
+
name,
|
|
46
|
+
str_day,
|
|
47
|
+
notice_date,
|
|
48
|
+
'年报审计有问题:' + "[" + str(opinion_type) + "]",
|
|
49
|
+
'年报审计有问题',
|
|
50
|
+
'',
|
|
51
|
+
BlackClassify.AUDIT_PROBLEM.up_level_code,
|
|
52
|
+
BlackClassify.AUDIT_PROBLEM.up_level_name,
|
|
53
|
+
BlackClassify.AUDIT_PROBLEM.level_code,
|
|
54
|
+
BlackClassify.AUDIT_PROBLEM.level_name)
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
# 最小净资产1.5亿
|
|
12
|
+
MIN_NET_ASSET = 150000000
|
|
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 = round(
|
|
24
|
+
list(new_report_one_df['TOTAL_LIABILITIES'])[0] * 100 / list(new_report_one_df['TOTAL_ASSETS'])[0],
|
|
25
|
+
2)
|
|
26
|
+
# 净资产
|
|
27
|
+
net_asset = round(list(new_report_one_df['TOTAL_ASSETS'])[0] - list(new_report_one_df['TOTAL_LIABILITIES'])[0],
|
|
28
|
+
2)
|
|
29
|
+
|
|
30
|
+
symbol = list(new_report_one_df['SECURITY_CODE'])[0]
|
|
31
|
+
name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
|
|
32
|
+
now_date = datetime.now()
|
|
33
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
34
|
+
id_key = symbol + "_" + period_time + "_" + BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code
|
|
35
|
+
notice_date = list(new_report_one_df['NOTICE_DATE'])[0]
|
|
36
|
+
query_company = {'_id': symbol, 'industry': {'$in': EXCLUDE_INDUSTRY}}
|
|
37
|
+
query = {'symbol': symbol, 'level_code': BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code}
|
|
38
|
+
mongodb_util.remove_data(query, db_name_constant.SELF_BLACK_STOCK)
|
|
39
|
+
|
|
40
|
+
if mongodb_util.exist_data_query(db_name_constant.COMPANY_INFO, query_company):
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
if liability_ratio >= MAX_LIABILITY_RATIO and net_asset < MIN_NET_ASSET:
|
|
44
|
+
|
|
45
|
+
black_list_service_api.save_black_stock(id_key,
|
|
46
|
+
symbol,
|
|
47
|
+
name,
|
|
48
|
+
str_day,
|
|
49
|
+
notice_date,
|
|
50
|
+
'负债过高:' + "[" + "负债比:" + str(
|
|
51
|
+
liability_ratio) + "]" + "," + "净资产:"
|
|
52
|
+
+ str(round(net_asset / common_service_fun_api.HUNDRED_MILLION,
|
|
53
|
+
0)) + "亿",
|
|
54
|
+
'负债过高:' + "[" + str(liability_ratio) + "]",
|
|
55
|
+
'',
|
|
56
|
+
BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_code,
|
|
57
|
+
BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_name,
|
|
58
|
+
BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code,
|
|
59
|
+
BlackClassify.FINANCIAL_PROBLEM_DEBT.level_name)
|
|
60
|
+
# if net_asset < MIN_NET_ASSET:
|
|
61
|
+
# black_list_service_api.save_black_stock(id_key,
|
|
62
|
+
# symbol,
|
|
63
|
+
# name,
|
|
64
|
+
# str_day,
|
|
65
|
+
# notice_date,
|
|
66
|
+
# '净资产低:' + "[" + "负债比:" + str(
|
|
67
|
+
# liability_ratio) + "]" + "," + "净资产:"
|
|
68
|
+
# + str(round(net_asset / common_service_fun_api.HUNDRED_MILLION,
|
|
69
|
+
# 0)) + "亿",
|
|
70
|
+
# '净资产低:' + "[" + str(liability_ratio) + "]",
|
|
71
|
+
# '',
|
|
72
|
+
# BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_code,
|
|
73
|
+
# BlackClassify.FINANCIAL_PROBLEM_DEBT.up_level_name,
|
|
74
|
+
# BlackClassify.FINANCIAL_PROBLEM_DEBT.level_code,
|
|
75
|
+
# BlackClassify.FINANCIAL_PROBLEM_DEBT.level_name)
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
9
|
+
|
|
10
|
+
mongodb_util = MongodbUtil('27017')
|
|
11
|
+
file_path = os.path.abspath(__file__)
|
|
12
|
+
end = file_path.index('mns') + 17
|
|
13
|
+
project_path = file_path[0:end]
|
|
14
|
+
sys.path.append(project_path)
|
|
15
|
+
|
|
16
|
+
# 利润为负的时候最小营业收入 主板 3.2亿
|
|
17
|
+
MIN_INCOME_MAIN = 320000000
|
|
18
|
+
# 利润为负的时候最小营业收入 科创 创业 1.2亿
|
|
19
|
+
MIN_INCOME_SUB = 120000000
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# 营收利润check
|
|
23
|
+
|
|
24
|
+
def profit_income_check(new_report_df, period_time, report_type):
|
|
25
|
+
new_report_one_df = new_report_df.loc[new_report_df['REPORT_DATE'] == period_time]
|
|
26
|
+
symbol = list(new_report_one_df['SECURITY_CODE'])[0]
|
|
27
|
+
name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
|
|
28
|
+
now_date = datetime.now()
|
|
29
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
30
|
+
notice_date = list(new_report_one_df['NOTICE_DATE'])[0]
|
|
31
|
+
if report_type == db_name_constant.EM_STOCK_PROFIT:
|
|
32
|
+
# 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
|
|
33
|
+
# 利润总额
|
|
34
|
+
total_profit = list(new_report_one_df['TOTAL_PROFIT'])[0]
|
|
35
|
+
# 净利润
|
|
36
|
+
net_profit = list(new_report_one_df['NETPROFIT'])[0]
|
|
37
|
+
# 营业利润
|
|
38
|
+
operate_profit = list(new_report_one_df['OPERATE_PROFIT'])[0]
|
|
39
|
+
# 持续经营净利润
|
|
40
|
+
continued_profit = list(new_report_one_df['CONTINUED_NETPROFIT'])[0]
|
|
41
|
+
# 归属于母公司股东的净利润
|
|
42
|
+
parent_profit = list(new_report_one_df['PARENT_NETPROFIT'])[0]
|
|
43
|
+
# 扣除非经常性损益后的净利润
|
|
44
|
+
deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
|
|
45
|
+
# 营业总收入
|
|
46
|
+
total_operate_income = list(new_report_one_df['TOTAL_OPERATE_INCOME'])[0]
|
|
47
|
+
if total_operate_income == 0:
|
|
48
|
+
# 营业收入
|
|
49
|
+
total_operate_income = list(new_report_one_df['OPERATE_INCOME'])[0]
|
|
50
|
+
|
|
51
|
+
# 最小利润收入
|
|
52
|
+
min_profit = min(total_profit, net_profit, operate_profit,
|
|
53
|
+
continued_profit, parent_profit, deduct_parent_profit)
|
|
54
|
+
|
|
55
|
+
query = {'symbol': symbol, 'level_code': BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_code}
|
|
56
|
+
mongodb_util.remove_data(query, db_name_constant.SELF_BLACK_STOCK)
|
|
57
|
+
|
|
58
|
+
if min_profit < 0:
|
|
59
|
+
|
|
60
|
+
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
61
|
+
if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
|
|
62
|
+
| (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
|
|
63
|
+
id_key = symbol + "_" + period_time + "_" + BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_code
|
|
64
|
+
min_profit = round(min_profit / common_service_fun_api.TEN_THOUSAND, 1)
|
|
65
|
+
total_operate_income = round(total_operate_income / common_service_fun_api.HUNDRED_MILLION, 1)
|
|
66
|
+
|
|
67
|
+
black_list_service_api.save_black_stock(id_key,
|
|
68
|
+
symbol,
|
|
69
|
+
name,
|
|
70
|
+
str_day,
|
|
71
|
+
notice_date,
|
|
72
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
73
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
74
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
75
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
76
|
+
'',
|
|
77
|
+
BlackClassify.FINANCIAL_PROBLEM_PROFIT.up_level_code,
|
|
78
|
+
BlackClassify.FINANCIAL_PROBLEM_PROFIT.up_level_name,
|
|
79
|
+
BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_code,
|
|
80
|
+
BlackClassify.FINANCIAL_PROBLEM_PROFIT.level_name)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 股权质押风险
|