mns-scheduler 1.0.4.8__py3-none-any.whl → 1.0.5.1__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.
- mns_scheduler/company_info/company_constant_data.py +1 -102
- mns_scheduler/company_info/company_info_sync_api.py +6 -4
- mns_scheduler/company_info/de_list_stock_service.py +47 -0
- mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py +57 -2
- mns_scheduler/finance/em_financial_profit_sync_service_api.py +7 -0
- mns_scheduler/finance/finance_common_api.py +26 -1
- mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +54 -20
- mns_scheduler/finance/sync_financial_report_service_api.py +18 -32
- mns_scheduler/finance/test/__init__.py +7 -0
- mns_scheduler/finance/test/fix_blask_list.py +36 -0
- mns_scheduler/hk/__init__.py +7 -0
- mns_scheduler/hk/hk_company_info_sync_service_api.py +59 -0
- mns_scheduler/risk/register_and_investigate_stock_sync_api.py +4 -1
- mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py +1 -1
- mns_scheduler/zt/today_high_chg_pool_sync_api.py +1 -1
- mns_scheduler/zz_task/data_sync_task.py +4 -1
- {mns_scheduler-1.0.4.8.dist-info → mns_scheduler-1.0.5.1.dist-info}/METADATA +1 -1
- {mns_scheduler-1.0.4.8.dist-info → mns_scheduler-1.0.5.1.dist-info}/RECORD +20 -15
- {mns_scheduler-1.0.4.8.dist-info → mns_scheduler-1.0.5.1.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.0.4.8.dist-info → mns_scheduler-1.0.5.1.dist-info}/top_level.txt +0 -0
|
@@ -11,108 +11,6 @@ import mns_common.utils.data_frame_util as data_frame_util
|
|
|
11
11
|
|
|
12
12
|
mongodb_util = MongodbUtil('27017')
|
|
13
13
|
|
|
14
|
-
# 退市股票
|
|
15
|
-
de_listed_stock_list = [
|
|
16
|
-
"002018",
|
|
17
|
-
"600240",
|
|
18
|
-
"000033",
|
|
19
|
-
"000405",
|
|
20
|
-
"000406",
|
|
21
|
-
"000418",
|
|
22
|
-
"000508",
|
|
23
|
-
"000535",
|
|
24
|
-
"000542",
|
|
25
|
-
"000549",
|
|
26
|
-
"000569",
|
|
27
|
-
"000583",
|
|
28
|
-
"000594",
|
|
29
|
-
"000618",
|
|
30
|
-
"000621",
|
|
31
|
-
"000660",
|
|
32
|
-
"000675",
|
|
33
|
-
"000689",
|
|
34
|
-
"000699",
|
|
35
|
-
"000730",
|
|
36
|
-
"000748",
|
|
37
|
-
"000763",
|
|
38
|
-
"000765",
|
|
39
|
-
"000769",
|
|
40
|
-
"000787",
|
|
41
|
-
"000805",
|
|
42
|
-
"000817",
|
|
43
|
-
"000827",
|
|
44
|
-
"000866",
|
|
45
|
-
"000916",
|
|
46
|
-
"000939",
|
|
47
|
-
"000956",
|
|
48
|
-
"002477",
|
|
49
|
-
"300028",
|
|
50
|
-
"300090",
|
|
51
|
-
"300104",
|
|
52
|
-
"300156",
|
|
53
|
-
"300431",
|
|
54
|
-
"600001",
|
|
55
|
-
"600002",
|
|
56
|
-
"600003",
|
|
57
|
-
"600005",
|
|
58
|
-
"600065",
|
|
59
|
-
"600069",
|
|
60
|
-
"600087",
|
|
61
|
-
"600092",
|
|
62
|
-
"600102",
|
|
63
|
-
"600181",
|
|
64
|
-
"600205",
|
|
65
|
-
"600263",
|
|
66
|
-
"600270",
|
|
67
|
-
"600286",
|
|
68
|
-
"600296",
|
|
69
|
-
"600317",
|
|
70
|
-
"600357",
|
|
71
|
-
"600401",
|
|
72
|
-
"600472",
|
|
73
|
-
"600553",
|
|
74
|
-
"600591",
|
|
75
|
-
"600625",
|
|
76
|
-
"600627",
|
|
77
|
-
"600631",
|
|
78
|
-
"600632",
|
|
79
|
-
"600646",
|
|
80
|
-
"600670",
|
|
81
|
-
"600672",
|
|
82
|
-
"600680",
|
|
83
|
-
"600752",
|
|
84
|
-
"600772",
|
|
85
|
-
"600786",
|
|
86
|
-
"600788",
|
|
87
|
-
"600799",
|
|
88
|
-
"600813",
|
|
89
|
-
"600832",
|
|
90
|
-
"600849",
|
|
91
|
-
"600852",
|
|
92
|
-
"600899",
|
|
93
|
-
"600991",
|
|
94
|
-
"601558"
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
# 需要修改行业的股票
|
|
98
|
-
fix_symbol_list = [
|
|
99
|
-
'688507',
|
|
100
|
-
'301387',
|
|
101
|
-
'688480',
|
|
102
|
-
'301112',
|
|
103
|
-
'603260',
|
|
104
|
-
'300559',
|
|
105
|
-
'300836',
|
|
106
|
-
'300293',
|
|
107
|
-
'688630',
|
|
108
|
-
'001309',
|
|
109
|
-
'600338',
|
|
110
|
-
'000032',
|
|
111
|
-
'300042',
|
|
112
|
-
'300295',
|
|
113
|
-
'300483'
|
|
114
|
-
]
|
|
115
|
-
|
|
116
14
|
|
|
117
15
|
def get_fix_symbol_industry():
|
|
118
16
|
return pd.DataFrame([['688480', '赛恩斯', '760103', '环境治理'],
|
|
@@ -131,6 +29,7 @@ def get_fix_symbol_industry():
|
|
|
131
29
|
['300295', '三六五网', '430300', '物业管理'],
|
|
132
30
|
['300947', '德必集团', '430300', '物业管理'],
|
|
133
31
|
['300483', '首华燃气', '410301', '燃气Ⅲ'],
|
|
32
|
+
['300215', '电科院', '410110', '电能综合服务'],
|
|
134
33
|
],
|
|
135
34
|
columns=['symbol', 'name', 'new_industry_code', 'new_industry'])
|
|
136
35
|
|
|
@@ -186,6 +186,7 @@ def fix_company_industry(symbol):
|
|
|
186
186
|
sub_stock = ths_stock_api.ths_stock_concept('885598')
|
|
187
187
|
sub_stock_symbol_list = list(sub_stock['symbol'])
|
|
188
188
|
except BaseException as e:
|
|
189
|
+
logger.error("出现异常:{},{}", symbol, e)
|
|
189
190
|
query = {'concept_code': 885598}
|
|
190
191
|
ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
|
|
191
192
|
sub_stock_symbol_list = list(ths_stock_concept_detail['symbol'])
|
|
@@ -197,7 +198,7 @@ def fix_company_industry(symbol):
|
|
|
197
198
|
company_info.dropna(subset=['_id'], axis=0, inplace=True)
|
|
198
199
|
mongodb_util.save_mongo(company_info, 'company_info')
|
|
199
200
|
except BaseException as e:
|
|
200
|
-
logger.error("出现异常:{}", symbol)
|
|
201
|
+
logger.error("出现异常:{},{}", symbol, e)
|
|
201
202
|
|
|
202
203
|
return company_info
|
|
203
204
|
|
|
@@ -207,8 +208,9 @@ def sync_company_base_info(symbol_list):
|
|
|
207
208
|
result = []
|
|
208
209
|
create_index()
|
|
209
210
|
east_money_stock_info = get_east_money_stock_info()
|
|
211
|
+
de_listed_stock_list = company_common_service_api.get_de_list_company()
|
|
210
212
|
east_money_stock_info = east_money_stock_info.loc[~(
|
|
211
|
-
east_money_stock_info['symbol'].isin(
|
|
213
|
+
east_money_stock_info['symbol'].isin(de_listed_stock_list))]
|
|
212
214
|
east_money_stock_info = common_service_fun_api.exclude_ts_symbol(east_money_stock_info)
|
|
213
215
|
east_money_stock_info = east_money_stock_info.loc[~((east_money_stock_info['industry'] == '-')
|
|
214
216
|
& (east_money_stock_info['now_price'] == 0))]
|
|
@@ -296,8 +298,8 @@ def single_thread_sync_company_info(east_money_stock_info,
|
|
|
296
298
|
now_date = datetime.now()
|
|
297
299
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
298
300
|
company_info_type['sync_date'] = str_now_date
|
|
299
|
-
|
|
300
|
-
if company_one.symbol in
|
|
301
|
+
fix_symbol_industry_df = company_constant_data_api.get_fix_symbol_industry()
|
|
302
|
+
if company_one.symbol in list(fix_symbol_industry_df['symbol']):
|
|
301
303
|
# fix sw_industry
|
|
302
304
|
company_info_type = company_constant_data_api.fix_symbol_industry(company_info_type, company_one.symbol)
|
|
303
305
|
|
|
@@ -0,0 +1,47 @@
|
|
|
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 pandas as pd
|
|
9
|
+
import akshare as ak
|
|
10
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
11
|
+
|
|
12
|
+
mongodb_util = MongodbUtil('27017')
|
|
13
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# 同步退市股票
|
|
17
|
+
def sync_de_list_stock():
|
|
18
|
+
sh_de_list_df = ak.stock_info_sh_delist(symbol="全部")
|
|
19
|
+
sh_de_list_df = sh_de_list_df.rename(columns={"公司代码": "symbol",
|
|
20
|
+
"公司简称": "name",
|
|
21
|
+
"上市日期": "list_date",
|
|
22
|
+
"暂停上市日期": "de_list_date"
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
sz_de_list_df = ak.stock_info_sz_delist(symbol="终止上市公司")
|
|
26
|
+
sz_de_list_df = sz_de_list_df.rename(columns={"证券代码": "symbol",
|
|
27
|
+
"证券简称": "name",
|
|
28
|
+
"上市日期": "list_date",
|
|
29
|
+
"终止上市日期": "de_list_date"
|
|
30
|
+
})
|
|
31
|
+
all_de_list_df = pd.concat([sz_de_list_df, sh_de_list_df])
|
|
32
|
+
all_de_list_df['_id'] = all_de_list_df['symbol']
|
|
33
|
+
all_de_list_df['list_date'] = all_de_list_df['list_date'].astype(str)
|
|
34
|
+
all_de_list_df['de_list_date'] = all_de_list_df['de_list_date'].astype(str)
|
|
35
|
+
mongodb_util.save_mongo(all_de_list_df, db_name_constant.DE_LIST_STOCK)
|
|
36
|
+
remove_black_list(all_de_list_df)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# 移除黑名单
|
|
40
|
+
def remove_black_list(all_de_list_df):
|
|
41
|
+
symbol_list = list(all_de_list_df['symbol'])
|
|
42
|
+
remove_query = {'symbol': {"$in": symbol_list}}
|
|
43
|
+
mongodb_util.remove_data(remove_query, db_name_constant.SELF_BLACK_STOCK)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == '__main__':
|
|
47
|
+
sync_de_list_stock()
|
|
@@ -9,6 +9,7 @@ import akshare as ak
|
|
|
9
9
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
10
10
|
import mns_scheduler.finance.finance_common_api as finance_common_api
|
|
11
11
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
|
+
|
|
12
13
|
mongodb_util = MongodbUtil('27017')
|
|
13
14
|
from loguru import logger
|
|
14
15
|
import mns_common.utils.data_frame_util as data_frame_util
|
|
@@ -345,10 +346,11 @@ def get_em_asset_liability_api(symbol):
|
|
|
345
346
|
try:
|
|
346
347
|
stock_balance_sheet_by_report_em_df = ak.stock_balance_sheet_by_report_em(sec_code)
|
|
347
348
|
except Exception as e:
|
|
348
|
-
logger.error("
|
|
349
|
+
logger.error("同步资产表异常:{},{}", symbol, e)
|
|
349
350
|
return None
|
|
350
351
|
if data_frame_util.is_empty(stock_balance_sheet_by_report_em_df):
|
|
351
352
|
return None
|
|
353
|
+
stock_balance_sheet_by_report_em_df = check_columns(stock_balance_sheet_by_report_em_df)
|
|
352
354
|
stock_balance_sheet_by_report_em_df = stock_balance_sheet_by_report_em_df[[
|
|
353
355
|
'SECUCODE',
|
|
354
356
|
'SECURITY_CODE',
|
|
@@ -426,7 +428,60 @@ def get_em_asset_liability_api(symbol):
|
|
|
426
428
|
if data_frame_util.is_empty(new_asset_df):
|
|
427
429
|
return None
|
|
428
430
|
new_asset_df.fillna(0, inplace=True)
|
|
429
|
-
|
|
431
|
+
return new_asset_df
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
def check_columns(new_asset_df):
|
|
435
|
+
if 'CONTRACT_LIAB' not in new_asset_df.columns:
|
|
436
|
+
new_asset_df['CONTRACT_LIAB'] = 0
|
|
437
|
+
|
|
438
|
+
if 'DEVELOP_EXPENSE' not in new_asset_df.columns:
|
|
439
|
+
new_asset_df['DEVELOP_EXPENSE'] = 0
|
|
440
|
+
|
|
441
|
+
if 'INVENTORY' not in new_asset_df.columns:
|
|
442
|
+
new_asset_df['INVENTORY'] = 0
|
|
443
|
+
|
|
444
|
+
if 'NONCURRENT_LIAB_1YEAR' not in new_asset_df.columns:
|
|
445
|
+
new_asset_df['NONCURRENT_LIAB_1YEAR'] = 0
|
|
446
|
+
|
|
447
|
+
if 'NOTE_ACCOUNTS_PAYABLE' not in new_asset_df.columns:
|
|
448
|
+
new_asset_df['NOTE_ACCOUNTS_PAYABLE'] = 0
|
|
449
|
+
|
|
450
|
+
if 'NOTE_ACCOUNTS_RECE' not in new_asset_df.columns:
|
|
451
|
+
new_asset_df['NOTE_ACCOUNTS_RECE'] = 0
|
|
452
|
+
|
|
453
|
+
if 'OTHER_CURRENT_ASSET' not in new_asset_df.columns:
|
|
454
|
+
new_asset_df['OTHER_CURRENT_ASSET'] = 0
|
|
455
|
+
|
|
456
|
+
if 'OTHER_CURRENT_LIAB' not in new_asset_df.columns:
|
|
457
|
+
new_asset_df['OTHER_CURRENT_LIAB'] = 0
|
|
458
|
+
|
|
459
|
+
if 'OTHER_NONCURRENT_ASSET' not in new_asset_df.columns:
|
|
460
|
+
new_asset_df['OTHER_NONCURRENT_ASSET'] = 0
|
|
461
|
+
if 'OTHER_NONCURRENT_FINASSET' not in new_asset_df.columns:
|
|
462
|
+
new_asset_df['OTHER_NONCURRENT_FINASSET'] = 0
|
|
463
|
+
if 'PREPAYMENT' not in new_asset_df.columns:
|
|
464
|
+
new_asset_df['PREPAYMENT'] = 0
|
|
465
|
+
if 'TOTAL_CURRENT_ASSETS' not in new_asset_df.columns:
|
|
466
|
+
new_asset_df['TOTAL_CURRENT_ASSETS'] = 0
|
|
467
|
+
if 'TOTAL_CURRENT_LIAB' not in new_asset_df.columns:
|
|
468
|
+
new_asset_df['TOTAL_CURRENT_LIAB'] = 0
|
|
469
|
+
if 'TOTAL_NONCURRENT_ASSETS' not in new_asset_df.columns:
|
|
470
|
+
new_asset_df['TOTAL_NONCURRENT_ASSETS'] = 0
|
|
471
|
+
if 'TOTAL_NONCURRENT_LIAB' not in new_asset_df.columns:
|
|
472
|
+
new_asset_df['TOTAL_NONCURRENT_LIAB'] = 0
|
|
473
|
+
if 'TOTAL_OTHER_PAYABLE' not in new_asset_df.columns:
|
|
474
|
+
new_asset_df['TOTAL_OTHER_PAYABLE'] = 0
|
|
475
|
+
if 'TOTAL_OTHER_RECE' not in new_asset_df.columns:
|
|
476
|
+
new_asset_df['TOTAL_OTHER_RECE'] = 0
|
|
477
|
+
if 'ACCOUNTS_RECE' not in new_asset_df.columns:
|
|
478
|
+
new_asset_df['ACCOUNTS_RECE'] = 0
|
|
479
|
+
|
|
480
|
+
if 'LOAN_ADVANCE' not in new_asset_df.columns:
|
|
481
|
+
new_asset_df['LOAN_ADVANCE'] = 0
|
|
482
|
+
if 'MONETARYFUNDS' not in new_asset_df.columns:
|
|
483
|
+
new_asset_df['MONETARYFUNDS'] = 0
|
|
484
|
+
return new_asset_df
|
|
430
485
|
|
|
431
486
|
|
|
432
487
|
if __name__ == '__main__':
|
|
@@ -326,6 +326,13 @@ def check_columns(profit_df):
|
|
|
326
326
|
profit_df['FE_INTEREST_INCOME'] = 0
|
|
327
327
|
if 'CREDIT_IMPAIRMENT_INCOME' not in profit_df.columns:
|
|
328
328
|
profit_df['CREDIT_IMPAIRMENT_INCOME'] = 0
|
|
329
|
+
if 'ACCOUNTS_RECE' not in profit_df.columns:
|
|
330
|
+
profit_df['ACCOUNTS_RECE'] = 0
|
|
331
|
+
|
|
332
|
+
if 'LOAN_ADVANCE' not in profit_df.columns:
|
|
333
|
+
profit_df['LOAN_ADVANCE'] = 0
|
|
334
|
+
if 'MONETARYFUNDS' not in profit_df.columns:
|
|
335
|
+
profit_df['MONETARYFUNDS'] = 0
|
|
329
336
|
return profit_df
|
|
330
337
|
|
|
331
338
|
|
|
@@ -9,7 +9,8 @@ sys.path.append(project_path)
|
|
|
9
9
|
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
10
10
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
11
11
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
|
-
|
|
12
|
+
import mns_common.api.em.east_money_stock_api as east_money_stock_api
|
|
13
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
13
14
|
mongodb_util = MongodbUtil('27017')
|
|
14
15
|
|
|
15
16
|
|
|
@@ -33,3 +34,27 @@ def find_profit_report(period_time):
|
|
|
33
34
|
def find_asset_liability_report(period_time):
|
|
34
35
|
query = {"REPORT_DATE": period_time}
|
|
35
36
|
return mongodb_util.find_query_data(db_name_constant.EM_STOCK_ASSET_LIABILITY, query)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# 查出未报告的股票
|
|
41
|
+
def find_un_report_symbol(period_time, report_name):
|
|
42
|
+
real_time_quotes_df = east_money_stock_api.get_real_time_quotes_all_stocks()
|
|
43
|
+
real_time_quotes_df = real_time_quotes_df.loc[~(real_time_quotes_df['name'].str.contains('退'))]
|
|
44
|
+
real_time_quotes_df.dropna(subset=['list_date'], axis=0, inplace=True)
|
|
45
|
+
|
|
46
|
+
de_list_stock_df = mongodb_util.find_all_data(db_name_constant.DE_LIST_STOCK)
|
|
47
|
+
real_time_quotes_df = real_time_quotes_df.loc[
|
|
48
|
+
~(real_time_quotes_df['symbol'].isin(list(de_list_stock_df['symbol'])))]
|
|
49
|
+
|
|
50
|
+
if report_name == db_name_constant.EM_STOCK_ASSET_LIABILITY:
|
|
51
|
+
had_asset_df = find_asset_liability_report(period_time)
|
|
52
|
+
if data_frame_util.is_not_empty(had_asset_df):
|
|
53
|
+
real_time_quotes_df = real_time_quotes_df.loc[
|
|
54
|
+
~(real_time_quotes_df['symbol'].isin(list(had_asset_df['SECURITY_CODE'])))]
|
|
55
|
+
if report_name == db_name_constant.EM_STOCK_PROFIT:
|
|
56
|
+
had_profit_df = find_profit_report(period_time)
|
|
57
|
+
if data_frame_util.is_not_empty(had_profit_df):
|
|
58
|
+
real_time_quotes_df = real_time_quotes_df.loc[
|
|
59
|
+
~(real_time_quotes_df['symbol'].isin(list(had_profit_df['SECURITY_CODE'])))]
|
|
60
|
+
return real_time_quotes_df
|
|
@@ -15,16 +15,32 @@ import mns_common.component.trade_date.trade_date_common_service_api as trade_da
|
|
|
15
15
|
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
16
16
|
import pandas as pd
|
|
17
17
|
|
|
18
|
+
# 1.无保留意见/标准报告:报告没问题。(没有发现造假,但也不能保证为真)
|
|
19
|
+
#
|
|
20
|
+
# 2.带强调事项段的无保留意见:报告没问题,但是有亏损获对其可持续经营有重大疑虑(可能造假,至少是在粉饰报表)
|
|
21
|
+
#
|
|
22
|
+
# 3.保留意见报告:有问题,财务造假
|
|
23
|
+
#
|
|
24
|
+
# 4.否定意见报告:有很大问题
|
|
25
|
+
#
|
|
26
|
+
# 5.无法表示意见报告:不让查
|
|
27
|
+
#
|
|
28
|
+
|
|
18
29
|
mongodb_util = MongodbUtil('27017')
|
|
19
30
|
# 审核标准意见
|
|
20
31
|
OPINION_TYPE = "标准无保留意见"
|
|
21
32
|
|
|
22
|
-
# 利润为负的时候最小营业收入 主板
|
|
23
|
-
MIN_INCOME_MAIN =
|
|
24
|
-
# 利润为负的时候最小营业收入 科创 创业
|
|
25
|
-
MIN_INCOME_SUB =
|
|
33
|
+
# 利润为负的时候最小营业收入 主板 3.2亿
|
|
34
|
+
MIN_INCOME_MAIN = 320000000
|
|
35
|
+
# 利润为负的时候最小营业收入 科创 创业 1.2亿
|
|
36
|
+
MIN_INCOME_SUB = 120000000
|
|
26
37
|
# 最大负债比
|
|
27
38
|
MAX_LIABILITY_RATIO = 90
|
|
39
|
+
# 负载超过90%时候最小净资产
|
|
40
|
+
MIN_NET_ASSET = 1000000000
|
|
41
|
+
# 排除校验负债比的行业
|
|
42
|
+
EXCLUDE_INDUSTRY = ['保险', '银行', '证券']
|
|
43
|
+
|
|
28
44
|
# 最迟出报告的天数
|
|
29
45
|
LATE_REPORT_DAYS = 3
|
|
30
46
|
|
|
@@ -54,18 +70,19 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
54
70
|
now_date = datetime.now()
|
|
55
71
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
56
72
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
57
|
-
|
|
73
|
+
|
|
58
74
|
# 年报有问题
|
|
59
75
|
if opinion_type != OPINION_TYPE:
|
|
76
|
+
id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT
|
|
60
77
|
black_list_service_api.save_black_stock(id_key,
|
|
61
78
|
symbol,
|
|
62
79
|
name,
|
|
63
80
|
str_day,
|
|
64
81
|
str_now_date,
|
|
65
|
-
'
|
|
82
|
+
'年报审计有问题:' + "[" + str(opinion_type) + "]",
|
|
66
83
|
'年报审计有问题',
|
|
67
84
|
'',
|
|
68
|
-
black_list_service_api.
|
|
85
|
+
black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT)
|
|
69
86
|
|
|
70
87
|
if report_type == db_name_constant.EM_STOCK_PROFIT:
|
|
71
88
|
# 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
|
|
@@ -83,8 +100,11 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
83
100
|
deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
|
|
84
101
|
# 营业总收入
|
|
85
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]
|
|
86
106
|
|
|
87
|
-
|
|
107
|
+
# 最小利润收入
|
|
88
108
|
min_profit = min(total_profit, net_profit, operate_profit,
|
|
89
109
|
continued_profit, parent_profit, deduct_parent_profit)
|
|
90
110
|
if min_profit < 0:
|
|
@@ -92,16 +112,21 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
92
112
|
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
93
113
|
if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
|
|
94
114
|
| (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
|
|
95
|
-
id_key = symbol + "_" + period_time
|
|
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
|
+
|
|
96
119
|
black_list_service_api.save_black_stock(id_key,
|
|
97
120
|
symbol,
|
|
98
121
|
name,
|
|
99
122
|
str_day,
|
|
100
123
|
str_now_date,
|
|
101
|
-
'
|
|
102
|
-
|
|
124
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
125
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
126
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
127
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
103
128
|
'',
|
|
104
|
-
black_list_service_api.
|
|
129
|
+
black_list_service_api.FINANCIAL_PROBLEM_PROFIT)
|
|
105
130
|
|
|
106
131
|
|
|
107
132
|
# 负债比校验
|
|
@@ -111,13 +136,20 @@ def liability_ratio_check(report_type, new_report_df, period_time):
|
|
|
111
136
|
new_report_one_df = new_report_df.iloc[0:1]
|
|
112
137
|
# 负债比
|
|
113
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)
|
|
114
142
|
|
|
115
143
|
symbol = list(new_report_one_df['SECURITY_CODE'])[0]
|
|
116
144
|
name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
|
|
117
145
|
now_date = datetime.now()
|
|
118
146
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
119
147
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
120
|
-
id_key = symbol + "_" + period_time
|
|
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
|
|
121
153
|
|
|
122
154
|
if liability_ratio >= MAX_LIABILITY_RATIO:
|
|
123
155
|
black_list_service_api.save_black_stock(id_key,
|
|
@@ -125,10 +157,12 @@ def liability_ratio_check(report_type, new_report_df, period_time):
|
|
|
125
157
|
name,
|
|
126
158
|
str_day,
|
|
127
159
|
str_now_date,
|
|
128
|
-
'
|
|
129
|
-
|
|
160
|
+
'负债过高:' + "[" + str(
|
|
161
|
+
liability_ratio) + "]" + "," + "净资产:" + str(round(
|
|
162
|
+
net_asset / common_service_fun_api.HUNDRED_MILLION, 0)) + "亿",
|
|
163
|
+
'负债过高:' + "[" + str(liability_ratio) + "]",
|
|
130
164
|
'',
|
|
131
|
-
black_list_service_api.
|
|
165
|
+
black_list_service_api.FINANCIAL_PROBLEM_DEBT)
|
|
132
166
|
|
|
133
167
|
|
|
134
168
|
# 未出财报
|
|
@@ -145,11 +179,11 @@ def un_report_check(sync_time, now_year, period, period_time):
|
|
|
145
179
|
elif period == 3:
|
|
146
180
|
last_report_day = str(now_year) + "-10-01"
|
|
147
181
|
max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
|
|
148
|
-
if max_report_day
|
|
182
|
+
if max_report_day >= sync_time:
|
|
149
183
|
|
|
150
184
|
for un_asset_one in un_report_df.itertuples():
|
|
151
185
|
symbol = un_asset_one.symbol
|
|
152
|
-
id_key = symbol + "_" + period_time
|
|
186
|
+
id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT
|
|
153
187
|
name = un_asset_one.name
|
|
154
188
|
now_date = datetime.now()
|
|
155
189
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
@@ -163,6 +197,6 @@ def un_report_check(sync_time, now_year, period, period_time):
|
|
|
163
197
|
'未出财报',
|
|
164
198
|
'未出财报',
|
|
165
199
|
'',
|
|
166
|
-
black_list_service_api.
|
|
200
|
+
black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT)
|
|
167
201
|
except Exception as e:
|
|
168
|
-
logger.error("
|
|
202
|
+
logger.error("更新未出报告异常:{},{},{}", symbol, period_time, e)
|
|
@@ -6,8 +6,7 @@ end = file_path.index('mns') + 16
|
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
from datetime import datetime
|
|
9
|
-
|
|
10
|
-
import mns_scheduler.finance.finance_common_api as finance_common_api
|
|
9
|
+
|
|
11
10
|
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
11
|
import mns_scheduler.finance.em_financial_profit_sync_service_api as em_financial_profit_sync_service_api
|
|
13
12
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
@@ -16,6 +15,7 @@ import \
|
|
|
16
15
|
mns_scheduler.finance.em_financial_asset_liability_sync_service_api as em_financial_asset_liability_sync_service_api
|
|
17
16
|
import mns_scheduler.finance.financial_high_risk_stock_clean_service_api as financial_high_risk_stock_clean_service_api
|
|
18
17
|
import mns_common.utils.data_frame_util as data_frame_util
|
|
18
|
+
import mns_scheduler.finance.finance_common_api as finance_common_api
|
|
19
19
|
|
|
20
20
|
mongodb_util = MongodbUtil('27017')
|
|
21
21
|
|
|
@@ -36,35 +36,36 @@ def sync_financial_report():
|
|
|
36
36
|
if 1 <= now_month <= 5:
|
|
37
37
|
period = 4
|
|
38
38
|
period_time = str(now_year - 1) + "-12-31 00:00:00"
|
|
39
|
-
sync_profit_report(period_time, sync_time, period
|
|
40
|
-
sync_asset_liability_report(period_time, sync_time, period
|
|
39
|
+
sync_profit_report(period_time, sync_time, period)
|
|
40
|
+
sync_asset_liability_report(period_time, sync_time, period)
|
|
41
41
|
|
|
42
42
|
# 一季报
|
|
43
43
|
elif now_month == 5:
|
|
44
44
|
period = 1
|
|
45
45
|
period_time = str(now_year) + "-03-31 00:00:00"
|
|
46
|
-
sync_profit_report(period_time, sync_time, period
|
|
47
|
-
sync_asset_liability_report(period_time, sync_time, period
|
|
46
|
+
sync_profit_report(period_time, sync_time, period)
|
|
47
|
+
sync_asset_liability_report(period_time, sync_time, period)
|
|
48
48
|
|
|
49
49
|
# 二季报
|
|
50
50
|
elif 7 <= now_month <= 8:
|
|
51
51
|
period = 2
|
|
52
52
|
period_time = str(now_year) + "-06-30 00:00:00"
|
|
53
|
-
sync_profit_report(period_time, sync_time, period
|
|
54
|
-
sync_asset_liability_report(period_time, sync_time, period
|
|
53
|
+
sync_profit_report(period_time, sync_time, period)
|
|
54
|
+
sync_asset_liability_report(period_time, sync_time, period)
|
|
55
55
|
# 三季报
|
|
56
56
|
elif now_month == 10:
|
|
57
57
|
period = 3
|
|
58
58
|
period_time = str(now_year) + "-09-30 00:00:00"
|
|
59
|
-
sync_profit_report(period_time, sync_time, period
|
|
60
|
-
sync_asset_liability_report(period_time, sync_time, period
|
|
59
|
+
sync_profit_report(period_time, sync_time, period)
|
|
60
|
+
sync_asset_liability_report(period_time, sync_time, period)
|
|
61
61
|
# 未出报告check
|
|
62
62
|
financial_high_risk_stock_clean_service_api.un_report_check(sync_time, now_year, period, period_time)
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
# 同步资产表
|
|
66
|
-
def sync_asset_liability_report(period_time, sync_time, period
|
|
67
|
-
un_report_asset_df = find_un_report_symbol(period_time,
|
|
66
|
+
def sync_asset_liability_report(period_time, sync_time, period):
|
|
67
|
+
un_report_asset_df = finance_common_api.find_un_report_symbol(period_time,
|
|
68
|
+
db_name_constant.EM_STOCK_ASSET_LIABILITY)
|
|
68
69
|
for un_report_asset_one in un_report_asset_df.itertuples():
|
|
69
70
|
try:
|
|
70
71
|
symbol = un_report_asset_one.symbol
|
|
@@ -84,19 +85,20 @@ def sync_asset_liability_report(period_time, sync_time, period, now_year):
|
|
|
84
85
|
db_name_constant.EM_STOCK_ASSET_LIABILITY)
|
|
85
86
|
|
|
86
87
|
except Exception as e:
|
|
87
|
-
logger.error("
|
|
88
|
+
logger.error("同步资产表异常:{},{},{}", symbol, period_time, e)
|
|
88
89
|
|
|
89
90
|
|
|
90
91
|
# 同步利润表
|
|
91
|
-
def sync_profit_report(period_time, sync_time, period
|
|
92
|
-
un_report_profit_df = find_un_report_symbol(period_time, db_name_constant.EM_STOCK_PROFIT)
|
|
92
|
+
def sync_profit_report(period_time, sync_time, period):
|
|
93
|
+
un_report_profit_df = finance_common_api.find_un_report_symbol(period_time, db_name_constant.EM_STOCK_PROFIT)
|
|
93
94
|
for un_report_profit_one in un_report_profit_df.itertuples():
|
|
94
95
|
try:
|
|
95
96
|
symbol = un_report_profit_one.symbol
|
|
96
97
|
new_profit_df = em_financial_profit_sync_service_api.get_em_profit_api(symbol)
|
|
97
|
-
new_profit_df['sync_time'] = sync_time
|
|
98
98
|
if data_frame_util.is_empty(new_profit_df):
|
|
99
99
|
continue
|
|
100
|
+
new_profit_df['sync_time'] = sync_time
|
|
101
|
+
|
|
100
102
|
new_profit_df['symbol'] = symbol
|
|
101
103
|
mongodb_util.insert_mongo(new_profit_df, db_name_constant.EM_STOCK_PROFIT)
|
|
102
104
|
|
|
@@ -107,21 +109,5 @@ def sync_profit_report(period_time, sync_time, period, now_year):
|
|
|
107
109
|
logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
|
|
108
110
|
|
|
109
111
|
|
|
110
|
-
# 查出未报告的股票
|
|
111
|
-
def find_un_report_symbol(period_time, report_name):
|
|
112
|
-
real_time_quotes_df = east_money_stock_api.get_real_time_quotes_all_stocks()
|
|
113
|
-
if report_name == db_name_constant.EM_STOCK_ASSET_LIABILITY:
|
|
114
|
-
had_asset_df = finance_common_api.find_asset_liability_report(period_time)
|
|
115
|
-
if data_frame_util.is_not_empty(had_asset_df):
|
|
116
|
-
real_time_quotes_df = real_time_quotes_df.loc[
|
|
117
|
-
~(real_time_quotes_df['symbol'].isin(list(had_asset_df['SECURITY_CODE'])))]
|
|
118
|
-
if report_name == db_name_constant.EM_STOCK_PROFIT:
|
|
119
|
-
had_profit_df = finance_common_api.find_profit_report(period_time)
|
|
120
|
-
if data_frame_util.is_not_empty(had_profit_df):
|
|
121
|
-
real_time_quotes_df = real_time_quotes_df.loc[
|
|
122
|
-
~(real_time_quotes_df['symbol'].isin(list(had_profit_df['SECURITY_CODE'])))]
|
|
123
|
-
return real_time_quotes_df
|
|
124
|
-
|
|
125
|
-
|
|
126
112
|
if __name__ == '__main__':
|
|
127
113
|
sync_financial_report()
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
|
|
10
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
11
|
+
|
|
12
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
13
|
+
|
|
14
|
+
import mns_scheduler.finance.financial_high_risk_stock_clean_service_api as financial_high_risk_stock_clean_service_api
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
mongodb_util = MongodbUtil('27017')
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def fix_profit_black_list():
|
|
21
|
+
period_time = "2023-12-31 00:00:00"
|
|
22
|
+
period = 4
|
|
23
|
+
report_type_list = [db_name_constant.EM_STOCK_PROFIT, db_name_constant.EM_STOCK_ASSET_LIABILITY]
|
|
24
|
+
for report_type in report_type_list:
|
|
25
|
+
query = {'REPORT_DATE': period_time}
|
|
26
|
+
em_stock_profit_df_list = mongodb_util.find_query_data(report_type, query)
|
|
27
|
+
for em_stock_one in em_stock_profit_df_list.itertuples():
|
|
28
|
+
em_stock_one_df = em_stock_profit_df_list.loc[
|
|
29
|
+
em_stock_profit_df_list['SECURITY_CODE'] == em_stock_one.SECURITY_CODE]
|
|
30
|
+
|
|
31
|
+
financial_high_risk_stock_clean_service_api.financial_report_check(em_stock_one_df, period_time, period,
|
|
32
|
+
report_type)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == '__main__':
|
|
36
|
+
fix_profit_black_list()
|
|
@@ -0,0 +1,59 @@
|
|
|
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.api.em.east_money_stock_hk_api as east_money_stock_hk_api
|
|
9
|
+
import akshare as ak
|
|
10
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
11
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
12
|
+
|
|
13
|
+
mongodb_util = MongodbUtil('27017')
|
|
14
|
+
COOKIE = 'qgqp_b_id=1e0d79428176ed54bef8434efdc0e8c3; mtp=1; ct=QVRY_s8Tiag1WfK2tSW2n03qpsX-PD8aH_rIjKVooawX8K33UVnpIofK088lD1lguWlE_OEIpQwn3PJWFPhHvSvyvYr4Zka3l4vxtZfH1Uikjtyy9z1H4Swo0rQzMKXncVzBXiOo5TjE-Dy9fcoG3ZF7UVdQ35jp_cFwzOlpK5Y; ut=FobyicMgeV51lVMr4ZJXvn-72bp0oeSOvtzifFY_U7kBFtR6og4Usd-VtBM5XBBvHq0lvd9xXkvpIqWro9EDKmv6cbKOQGyawUSMcKVP57isZCaM7lWQ6jWXajvTfvV4mIR-W_MZNK8VY0lL9W4qNMniJ6PBn_gkJsSAJCadmsyI9cxmjx--gR4m54pdF_nie_y4iWHys83cmWR2R7Bt1KKqB25OmkfCQTJJqIf7QsqangVGMUHwMC39Z9QhrfCFHKVNrlqS503O6b9GitQnXtvUdJhCmomu; pi=4253366368931142%3Bp4253366368931142%3B%E8%82%A1%E5%8F%8B9x56I87727%3BYNigLZRW%2FzMdGgVDOJbwReDWnTPHl51dB0gQLiwaCf1XY98mlJYx6eJbsoYr5Nie%2BX1L%2BzaMsec99KkX%2BT29Ds1arfST7sIBXxjUQ3dp11IPUnXy64PaBFRTHzMRWnCFJvvhc%2FAI41rXSGXolC8YMxI%2BvyPS%2BuErwgOVjC5vvsIiKeO7TLyKkhqqQJPX%2F7RWC5Sf3QLh%3Bdwjn4Xho10%2FKjqOgTWs%2FJF4%2FkdKzeuBwM8sz9aLvJovejAkCAyGMyGYA6AE67Xk2Ki7x8zdfBifF2DG%2Fvf2%2BXAYN8ZVISSEWTIXh32Z5MxEacK4JBTkqyiD93e1vFBOFQ82BqaiVmntUq0V6FrTUHGeh1gG5Sg%3D%3D; uidal=4253366368931142%e8%82%a1%e5%8f%8b9x56I87727; sid=170711377; vtpst=|; quote_lt=1; websitepoptg_api_time=1715777390466; emshistory=%5B%22%E8%BD%AC%E5%80%BA%E6%A0%87%22%2C%22%E8%BD%AC%E5%80%BA%E6%A0%87%E7%9A%84%22%5D; st_si=00364513876913; st_asi=delete; HAList=ty-116-00700-%u817E%u8BAF%u63A7%u80A1%2Cty-1-688695-%u4E2D%u521B%u80A1%u4EFD%2Cty-1-600849-%u4E0A%u836F%u8F6C%u6362%2Cty-1-603361-%u6D59%u6C5F%u56FD%u7965%2Cty-1-603555-ST%u8D35%u4EBA%2Cty-0-000627-%u5929%u8302%u96C6%u56E2%2Cty-0-002470-%u91D1%u6B63%u5927%2Cty-0-832876-%u6167%u4E3A%u667A%u80FD%2Cty-0-300059-%u4E1C%u65B9%u8D22%u5BCC%2Cty-107-CWB-%u53EF%u8F6C%u503AETF-SPDR; st_pvi=26930719093675; st_sp=2024-04-28%2017%3A27%3A05; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=23; st_psi=20240517111108288-113200301321-2767127768'
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_hk_ggt_component():
|
|
18
|
+
stock_hk_ggt_components_em_df = ak.stock_hk_ggt_components_em()
|
|
19
|
+
stock_hk_ggt_components_em_df = stock_hk_ggt_components_em_df.rename(columns={
|
|
20
|
+
"序号": "index",
|
|
21
|
+
"代码": "symbol",
|
|
22
|
+
"名称": "name"
|
|
23
|
+
})
|
|
24
|
+
return stock_hk_ggt_components_em_df
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# https://quote.eastmoney.com/center/gridlist.html#hk_stocks
|
|
28
|
+
def sync_hk_company_info():
|
|
29
|
+
hk_real_time_df = east_money_stock_hk_api.hk_real_time_quotes(COOKIE)
|
|
30
|
+
|
|
31
|
+
hk_real_time_df = hk_real_time_df[[
|
|
32
|
+
"symbol",
|
|
33
|
+
"name",
|
|
34
|
+
"chg",
|
|
35
|
+
"total_mv",
|
|
36
|
+
"flow_mv",
|
|
37
|
+
"list_date",
|
|
38
|
+
"industry",
|
|
39
|
+
"amount",
|
|
40
|
+
"now_price"
|
|
41
|
+
]]
|
|
42
|
+
# 排除基金
|
|
43
|
+
hk_real_time_df = hk_real_time_df.loc[hk_real_time_df['total_mv'] != '-']
|
|
44
|
+
|
|
45
|
+
stock_hk_ggt_components_em_df = get_hk_ggt_component()
|
|
46
|
+
stock_hk_ggt_components_symbol_list = list(stock_hk_ggt_components_em_df['symbol'])
|
|
47
|
+
hk_real_time_df['hk_ggt'] = False
|
|
48
|
+
hk_real_time_df.loc[hk_real_time_df['symbol'].isin(stock_hk_ggt_components_symbol_list), 'hk_ggt'] = True
|
|
49
|
+
hk_real_time_df.loc[hk_real_time_df['industry'] == '-', 'industry'] = '其他'
|
|
50
|
+
|
|
51
|
+
hk_real_time_df['_id'] = hk_real_time_df['symbol']
|
|
52
|
+
|
|
53
|
+
hk_real_time_df.fillna(0, inplace=True)
|
|
54
|
+
|
|
55
|
+
mongodb_util.save_mongo(hk_real_time_df, db_name_constant.COMPANY_INFO_HK)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if __name__ == '__main__':
|
|
59
|
+
sync_hk_company_info()
|
|
@@ -70,7 +70,10 @@ def sync_new_high_risk_stocks():
|
|
|
70
70
|
begin_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_day), -before_days)
|
|
71
71
|
begin_day = begin_date.strftime('%Y-%m-%d')
|
|
72
72
|
search_key = '立案'
|
|
73
|
-
|
|
73
|
+
|
|
74
|
+
end_date = date_handle_util.add_date_day(date_handle_util.no_slash_date(str_day), 1)
|
|
75
|
+
end_day = end_date.strftime('%Y-%m-%d')
|
|
76
|
+
new_high_risk_stocks_df = sync_all_investigate_stocks(const_num, search_key, begin_day, end_day)
|
|
74
77
|
if data_frame_util.is_empty(new_high_risk_stocks_df):
|
|
75
78
|
return None
|
|
76
79
|
new_high_risk_stocks_df = new_high_risk_stocks_df.sort_values(by=['announcementTime'], ascending=False)
|
|
@@ -337,7 +337,7 @@ def fix_miss_data(str_end):
|
|
|
337
337
|
|
|
338
338
|
|
|
339
339
|
if __name__ == '__main__':
|
|
340
|
-
sync_all_kc_zt_data('2024-05-
|
|
340
|
+
sync_all_kc_zt_data('2024-05-17', None)
|
|
341
341
|
# sync_all_kc_zt_data('2023-08-16')
|
|
342
342
|
# sync_all_kc_zt_data('2023-07-07')
|
|
343
343
|
# realtime_quotes_now_zt_new_kc_open_sync()
|
|
@@ -466,7 +466,7 @@ def stock_qfq_daily_high_chg_pool(str_day):
|
|
|
466
466
|
|
|
467
467
|
|
|
468
468
|
if __name__ == '__main__':
|
|
469
|
-
sync_one_day_zt_info('
|
|
469
|
+
sync_one_day_zt_info('2024-05-17')
|
|
470
470
|
|
|
471
471
|
# sync_date = date_handle_util.add_date_day('20221022', 0)
|
|
472
472
|
# now_date = datetime.now()
|
|
@@ -40,6 +40,7 @@ import mns_scheduler.kpl.selection.index.sync_best_choose_his_index as sync_best
|
|
|
40
40
|
import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
|
|
41
41
|
import mns_scheduler.trade.sync_position_api as sync_position_api
|
|
42
42
|
import mns_scheduler.concept.clean.kpl_concept_clean_api as kpl_concept_clean_api
|
|
43
|
+
import mns_scheduler.company_info.de_list_stock_service as de_list_stock_service
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
# 同步交易日期任务完成
|
|
@@ -281,6 +282,8 @@ def update_ths_concept_choose_null_reason():
|
|
|
281
282
|
def update_company_base_info():
|
|
282
283
|
company_info_sync_api.sync_company_base_info(None)
|
|
283
284
|
company_info_sync_api.fix_company_industry(None)
|
|
285
|
+
# 退市股票同步
|
|
286
|
+
de_list_stock_service.sync_de_list_stock()
|
|
284
287
|
logger.info('同步公司基本信息任务完成')
|
|
285
288
|
|
|
286
289
|
|
|
@@ -392,7 +395,7 @@ blockingScheduler.add_job(sync_kpl_best_his_quotes, 'cron', hour='18,22', minute
|
|
|
392
395
|
blockingScheduler.add_job(sync_position, 'cron', hour='0,08', minute='10')
|
|
393
396
|
|
|
394
397
|
# 同步被立案调查的股票
|
|
395
|
-
blockingScheduler.add_job(sync_new_high_risk_stocks, 'cron', hour='0,09', minute='20')
|
|
398
|
+
blockingScheduler.add_job(sync_new_high_risk_stocks, 'cron', hour='0,09,12,16', minute='20')
|
|
396
399
|
|
|
397
400
|
print('定时任务启动成功')
|
|
398
401
|
blockingScheduler.start()
|
|
@@ -11,8 +11,9 @@ mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py,sha256=boKtgOIXIsRny5n1keZm
|
|
|
11
11
|
mns_scheduler/big_deal/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
12
12
|
mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=wezGJWFRnKYBaPP9PVXLqMbHENOXgvJtw3HSGCSlX5c,4555
|
|
13
13
|
mns_scheduler/company_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
14
|
-
mns_scheduler/company_info/company_constant_data.py,sha256=
|
|
15
|
-
mns_scheduler/company_info/company_info_sync_api.py,sha256
|
|
14
|
+
mns_scheduler/company_info/company_constant_data.py,sha256=g1SSGgNT5QsS-zUNW_zrXD3pZXgSkyjsFLZgWeh7daU,14306
|
|
15
|
+
mns_scheduler/company_info/company_info_sync_api.py,sha256=-98TaiwfaeWromVQtJKlaDSA4bM5I5jdOKt9hLfNFEw,20539
|
|
16
|
+
mns_scheduler/company_info/de_list_stock_service.py,sha256=GCp6hlvO-SuH1oIpEsYZwEnGUOa6fXb2D7CqAUYXKQA,1993
|
|
16
17
|
mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
17
18
|
mns_scheduler/concept/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
18
19
|
mns_scheduler/concept/clean/kpl_concept_clean_api.py,sha256=xxIIgrXLI6xLf10t4unJa7aMB_QeKeki1HJVeXsntkY,4512
|
|
@@ -33,11 +34,15 @@ mns_scheduler/db/db_status.py,sha256=K1jtYIGZzDV6knpoJLLnXEhN3tyziJp_zY2gSfguHCA
|
|
|
33
34
|
mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
34
35
|
mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
|
|
35
36
|
mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
36
|
-
mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=
|
|
37
|
-
mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=
|
|
38
|
-
mns_scheduler/finance/finance_common_api.py,sha256=
|
|
39
|
-
mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py,sha256=
|
|
40
|
-
mns_scheduler/finance/sync_financial_report_service_api.py,sha256=
|
|
37
|
+
mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py,sha256=yr257AZ6PU4BoXzgVw8seGjmfEJd5bniaXO6FOONr1k,19437
|
|
38
|
+
mns_scheduler/finance/em_financial_profit_sync_service_api.py,sha256=7gnrn6OyMU4sxrvXXgzrj-EP914KwRpJW76XgKuWO0Q,14145
|
|
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
|
|
42
|
+
mns_scheduler/finance/test/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
43
|
+
mns_scheduler/finance/test/fix_blask_list.py,sha256=sXmNcnfnjKHBylc27ysCCb9G4HYlFDAxOY4eHDnkIGE,1304
|
|
44
|
+
mns_scheduler/hk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
45
|
+
mns_scheduler/hk/hk_company_info_sync_service_api.py,sha256=JEfIl_up36b1UpDxfPhosP6_i2Lo17Ma_GHLytoMjWI,3661
|
|
41
46
|
mns_scheduler/k_line/__init__.py,sha256=ffZXFCLFdIwOsbxnw__u1MbQYh9yz7Bs8UMP6VF0X2M,161
|
|
42
47
|
mns_scheduler/k_line/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
43
48
|
mns_scheduler/k_line/clean/k_line_info_clean_impl.py,sha256=3NPu-bkBw5ARW2yoMAmf_-au6vxQdSjzGlT-l4dqV4w,21833
|
|
@@ -57,7 +62,7 @@ mns_scheduler/real_time/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy
|
|
|
57
62
|
mns_scheduler/real_time/realtime_quotes_now_create_db_index.py,sha256=qQCjcsG3WYgn3zemS45Ms0AHtbkCwlSVPPCntxVvK8Q,1066
|
|
58
63
|
mns_scheduler/real_time/realtime_quotes_now_sync.py,sha256=XIz454cysRO-xfdgsEw3glR0LgTxFdZoCNONd4O7EgM,9165
|
|
59
64
|
mns_scheduler/risk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
60
|
-
mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=
|
|
65
|
+
mns_scheduler/risk/register_and_investigate_stock_sync_api.py,sha256=pjVGZbSWQn6obobaJxsXQK7jeRrNQJ6kcwStQEj9R18,5086
|
|
61
66
|
mns_scheduler/trade/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
62
67
|
mns_scheduler/trade/auto_ipo_buy_api.py,sha256=QXNzFJGNGveVUcXBh0RRJb_HV7abbLYXRljezPJf9ZM,377
|
|
63
68
|
mns_scheduler/trade/auto_sell_service_api.py,sha256=HaauZeOsuLNBrowXT8IKaSgWLR2Huott6mg_AoLhpUY,4423
|
|
@@ -66,14 +71,14 @@ mns_scheduler/zb/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,
|
|
|
66
71
|
mns_scheduler/zb/stock_zb_pool_sync.py,sha256=ky3CNDzpjB6C_frCf4YGNXdidnUo-uUUKsJpY62P4Bk,1936
|
|
67
72
|
mns_scheduler/zt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
68
73
|
mns_scheduler/zt/export_open_data_to_excel.py,sha256=haOSmh-aXnScp58u0mLE_QvcWIIuRfwxgmyF-XQMk_U,4015
|
|
69
|
-
mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py,sha256=
|
|
70
|
-
mns_scheduler/zt/today_high_chg_pool_sync_api.py,sha256=
|
|
74
|
+
mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py,sha256=yh_Ik-l2q11Ji4OU_24_invNDmd-JuqqbTvZqx4N8K4,17272
|
|
75
|
+
mns_scheduler/zt/today_high_chg_pool_sync_api.py,sha256=KfEp2Mu8dZKB8DBai4m0UpZwgkiYpKfg_pdmWSECZwo,21283
|
|
71
76
|
mns_scheduler/zt/zt_five_boards_sync_api.py,sha256=HfjPHKD99fU9c37kSenEX2_qNvFAjQGgy8ERuacSxwk,10916
|
|
72
77
|
mns_scheduler/zt/zt_pool_sync_api.py,sha256=RrVAbU1u-HTqXF9BSwNlzIxMHrUgjNaLpDKFgXC1XuY,7604
|
|
73
78
|
mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
74
|
-
mns_scheduler/zz_task/data_sync_task.py,sha256=
|
|
79
|
+
mns_scheduler/zz_task/data_sync_task.py,sha256=ftMN3POBxSRz9qPh4BjLJB-3VU3yVlZxZxOLD-l2lIU,16262
|
|
75
80
|
mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=DN3bq2XCDZC-PHlbD2NTog48bR44EruIEc2QVGKg7Tk,932
|
|
76
|
-
mns_scheduler-1.0.
|
|
77
|
-
mns_scheduler-1.0.
|
|
78
|
-
mns_scheduler-1.0.
|
|
79
|
-
mns_scheduler-1.0.
|
|
81
|
+
mns_scheduler-1.0.5.1.dist-info/METADATA,sha256=zP_ZAZ1QotD3_f8XV5ki2-NtQjiAW7HTox9i6JXSLPs,64
|
|
82
|
+
mns_scheduler-1.0.5.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
83
|
+
mns_scheduler-1.0.5.1.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
|
|
84
|
+
mns_scheduler-1.0.5.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|