mns-scheduler 1.0.4.9__tar.gz → 1.0.5.1__tar.gz
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-1.0.4.9 → mns-scheduler-1.0.5.1}/PKG-INFO +1 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_constant_data.py +1 -102
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_info_sync_api.py +6 -4
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/de_list_stock_service.py +8 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py +57 -2
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/em_financial_profit_sync_service_api.py +7 -2
- mns-scheduler-1.0.5.1/mns_scheduler/finance/finance_common_api.py +60 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +40 -16
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/sync_financial_report_service_api.py +18 -38
- mns-scheduler-1.0.5.1/mns_scheduler/finance/test/fix_blask_list.py +36 -0
- mns-scheduler-1.0.5.1/mns_scheduler/hk/__init__.py +7 -0
- mns-scheduler-1.0.5.1/mns_scheduler/hk/hk_company_info_sync_service_api.py +59 -0
- mns-scheduler-1.0.5.1/mns_scheduler/risk/__init__.py +7 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/risk/register_and_investigate_stock_sync_api.py +4 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py +1 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/today_high_chg_pool_sync_api.py +1 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/data_sync_task.py +1 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/PKG-INFO +1 -1
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/SOURCES.txt +4 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/setup.py +1 -1
- mns-scheduler-1.0.4.9/mns_scheduler/finance/finance_common_api.py +0 -35
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/README.md +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/app/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/wen_cai/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/big_deal/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/big_deal/ths_big_deal_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/kpl_concept_clean_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/ths_concept_clean_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/db/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/db/col_move_service.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/db/db_status.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/dt/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/dt/stock_dt_pool_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/__init__.py +0 -0
- {mns-scheduler-1.0.4.9/mns_scheduler/risk → mns-scheduler-1.0.5.1/mns_scheduler/finance/test}/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/k_line_info_clean_impl.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/k_line_info_clean_service.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/sync/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/sync/daily_week_month_line_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/sync_best_choose_index.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/symbol/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/total/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/auto_ipo_buy_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/auto_sell_service_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/sync_position_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zb/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zb/stock_zb_pool_sync.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/export_open_data_to_excel.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/zt_five_boards_sync_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/zt_pool_sync_api.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/__init__.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/dependency_links.txt +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/top_level.txt +0 -0
- {mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/setup.cfg +0 -0
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_constant_data.py
RENAMED
|
@@ -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
|
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_info_sync_api.py
RENAMED
|
@@ -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
|
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/de_list_stock_service.py
RENAMED
|
@@ -33,6 +33,14 @@ def sync_de_list_stock():
|
|
|
33
33
|
all_de_list_df['list_date'] = all_de_list_df['list_date'].astype(str)
|
|
34
34
|
all_de_list_df['de_list_date'] = all_de_list_df['de_list_date'].astype(str)
|
|
35
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)
|
|
36
44
|
|
|
37
45
|
|
|
38
46
|
if __name__ == '__main__':
|
|
@@ -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,8 +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 '
|
|
330
|
-
|
|
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
|
|
331
336
|
return profit_df
|
|
332
337
|
|
|
333
338
|
|
|
@@ -0,0 +1,60 @@
|
|
|
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.component.common_service_fun_api as common_service_fun_api
|
|
10
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
11
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
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
|
|
14
|
+
mongodb_util = MongodbUtil('27017')
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_sec_code(symbol):
|
|
18
|
+
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
19
|
+
if classification in ['K', 'H']:
|
|
20
|
+
return 'SH' + symbol
|
|
21
|
+
elif classification in ['C', 'S']:
|
|
22
|
+
return 'SZ' + symbol
|
|
23
|
+
else:
|
|
24
|
+
return 'BJ' + symbol
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# 查询利润表数据
|
|
28
|
+
def find_profit_report(period_time):
|
|
29
|
+
query = {"REPORT_DATE": period_time}
|
|
30
|
+
return mongodb_util.find_query_data(db_name_constant.EM_STOCK_PROFIT, query)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# 查询资产表
|
|
34
|
+
def find_asset_liability_report(period_time):
|
|
35
|
+
query = {"REPORT_DATE": period_time}
|
|
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
|
|
@@ -14,6 +14,7 @@ from mns_common.db.MongodbUtil import MongodbUtil
|
|
|
14
14
|
import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
|
|
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.无保留意见/标准报告:报告没问题。(没有发现造假,但也不能保证为真)
|
|
18
19
|
#
|
|
19
20
|
# 2.带强调事项段的无保留意见:报告没问题,但是有亏损获对其可持续经营有重大疑虑(可能造假,至少是在粉饰报表)
|
|
@@ -35,6 +36,11 @@ MIN_INCOME_MAIN = 320000000
|
|
|
35
36
|
MIN_INCOME_SUB = 120000000
|
|
36
37
|
# 最大负债比
|
|
37
38
|
MAX_LIABILITY_RATIO = 90
|
|
39
|
+
# 负载超过90%时候最小净资产
|
|
40
|
+
MIN_NET_ASSET = 1000000000
|
|
41
|
+
# 排除校验负债比的行业
|
|
42
|
+
EXCLUDE_INDUSTRY = ['保险', '银行', '证券']
|
|
43
|
+
|
|
38
44
|
# 最迟出报告的天数
|
|
39
45
|
LATE_REPORT_DAYS = 3
|
|
40
46
|
|
|
@@ -64,18 +70,19 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
64
70
|
now_date = datetime.now()
|
|
65
71
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
66
72
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
67
|
-
|
|
73
|
+
|
|
68
74
|
# 年报有问题
|
|
69
75
|
if opinion_type != OPINION_TYPE:
|
|
76
|
+
id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT
|
|
70
77
|
black_list_service_api.save_black_stock(id_key,
|
|
71
78
|
symbol,
|
|
72
79
|
name,
|
|
73
80
|
str_day,
|
|
74
81
|
str_now_date,
|
|
75
|
-
'年报审计有问题:'+"["+opinion_type+"]",
|
|
82
|
+
'年报审计有问题:' + "[" + str(opinion_type) + "]",
|
|
76
83
|
'年报审计有问题',
|
|
77
84
|
'',
|
|
78
|
-
black_list_service_api.
|
|
85
|
+
black_list_service_api.FINANCIAL_PROBLEM_ANNUAL_REPORT)
|
|
79
86
|
|
|
80
87
|
if report_type == db_name_constant.EM_STOCK_PROFIT:
|
|
81
88
|
# 利润总额 净利润 扣除非经常性损益后的净利润 三者最小为负
|
|
@@ -93,8 +100,11 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
93
100
|
deduct_parent_profit = list(new_report_one_df['DEDUCT_PARENT_NETPROFIT'])[0]
|
|
94
101
|
# 营业总收入
|
|
95
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]
|
|
96
106
|
|
|
97
|
-
|
|
107
|
+
# 最小利润收入
|
|
98
108
|
min_profit = min(total_profit, net_profit, operate_profit,
|
|
99
109
|
continued_profit, parent_profit, deduct_parent_profit)
|
|
100
110
|
if min_profit < 0:
|
|
@@ -102,16 +112,21 @@ def year_report_exception_check(new_report_df, period_time, report_type):
|
|
|
102
112
|
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
103
113
|
if ((classification in ['S', 'H'] and total_operate_income < MIN_INCOME_MAIN)
|
|
104
114
|
| (classification in ['K', 'C'] and total_operate_income < MIN_INCOME_SUB)):
|
|
105
|
-
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
|
+
|
|
106
119
|
black_list_service_api.save_black_stock(id_key,
|
|
107
120
|
symbol,
|
|
108
121
|
name,
|
|
109
122
|
str_day,
|
|
110
123
|
str_now_date,
|
|
111
|
-
'
|
|
112
|
-
|
|
124
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
125
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
126
|
+
'年报:利润:' + '[' + str(min_profit) + '万]' + '收入:' + str(
|
|
127
|
+
total_operate_income) + '[' + '亿元]--' + '触发退市风险',
|
|
113
128
|
'',
|
|
114
|
-
black_list_service_api.
|
|
129
|
+
black_list_service_api.FINANCIAL_PROBLEM_PROFIT)
|
|
115
130
|
|
|
116
131
|
|
|
117
132
|
# 负债比校验
|
|
@@ -121,13 +136,20 @@ def liability_ratio_check(report_type, new_report_df, period_time):
|
|
|
121
136
|
new_report_one_df = new_report_df.iloc[0:1]
|
|
122
137
|
# 负债比
|
|
123
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)
|
|
124
142
|
|
|
125
143
|
symbol = list(new_report_one_df['SECURITY_CODE'])[0]
|
|
126
144
|
name = list(new_report_one_df['SECURITY_NAME_ABBR'])[0]
|
|
127
145
|
now_date = datetime.now()
|
|
128
146
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
129
147
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
130
|
-
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
|
|
131
153
|
|
|
132
154
|
if liability_ratio >= MAX_LIABILITY_RATIO:
|
|
133
155
|
black_list_service_api.save_black_stock(id_key,
|
|
@@ -135,10 +157,12 @@ def liability_ratio_check(report_type, new_report_df, period_time):
|
|
|
135
157
|
name,
|
|
136
158
|
str_day,
|
|
137
159
|
str_now_date,
|
|
138
|
-
'
|
|
139
|
-
|
|
160
|
+
'负债过高:' + "[" + str(
|
|
161
|
+
liability_ratio) + "]" + "," + "净资产:" + str(round(
|
|
162
|
+
net_asset / common_service_fun_api.HUNDRED_MILLION, 0)) + "亿",
|
|
163
|
+
'负债过高:' + "[" + str(liability_ratio) + "]",
|
|
140
164
|
'',
|
|
141
|
-
black_list_service_api.
|
|
165
|
+
black_list_service_api.FINANCIAL_PROBLEM_DEBT)
|
|
142
166
|
|
|
143
167
|
|
|
144
168
|
# 未出财报
|
|
@@ -155,11 +179,11 @@ def un_report_check(sync_time, now_year, period, period_time):
|
|
|
155
179
|
elif period == 3:
|
|
156
180
|
last_report_day = str(now_year) + "-10-01"
|
|
157
181
|
max_report_day = trade_date_common_service_api.get_before_trade_date(last_report_day, LATE_REPORT_DAYS)
|
|
158
|
-
if max_report_day
|
|
182
|
+
if max_report_day >= sync_time:
|
|
159
183
|
|
|
160
184
|
for un_asset_one in un_report_df.itertuples():
|
|
161
185
|
symbol = un_asset_one.symbol
|
|
162
|
-
id_key = symbol + "_" + period_time
|
|
186
|
+
id_key = symbol + "_" + period_time + "_" + black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT
|
|
163
187
|
name = un_asset_one.name
|
|
164
188
|
now_date = datetime.now()
|
|
165
189
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
@@ -173,6 +197,6 @@ def un_report_check(sync_time, now_year, period, period_time):
|
|
|
173
197
|
'未出财报',
|
|
174
198
|
'未出财报',
|
|
175
199
|
'',
|
|
176
|
-
black_list_service_api.
|
|
200
|
+
black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT)
|
|
177
201
|
except Exception as e:
|
|
178
|
-
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,27 +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
|
-
real_time_quotes_df = real_time_quotes_df.loc[~(real_time_quotes_df['name'].str.contains('退'))]
|
|
114
|
-
|
|
115
|
-
de_list_stock_df = mongodb_util.find_all_data(db_name_constant.DE_LIST_STOCK)
|
|
116
|
-
real_time_quotes_df = real_time_quotes_df.loc[
|
|
117
|
-
~(real_time_quotes_df['symbol'].isin(list(de_list_stock_df['symbol'])))]
|
|
118
|
-
|
|
119
|
-
if report_name == db_name_constant.EM_STOCK_ASSET_LIABILITY:
|
|
120
|
-
had_asset_df = finance_common_api.find_asset_liability_report(period_time)
|
|
121
|
-
if data_frame_util.is_not_empty(had_asset_df):
|
|
122
|
-
real_time_quotes_df = real_time_quotes_df.loc[
|
|
123
|
-
~(real_time_quotes_df['symbol'].isin(list(had_asset_df['SECURITY_CODE'])))]
|
|
124
|
-
if report_name == db_name_constant.EM_STOCK_PROFIT:
|
|
125
|
-
had_profit_df = finance_common_api.find_profit_report(period_time)
|
|
126
|
-
if data_frame_util.is_not_empty(had_profit_df):
|
|
127
|
-
real_time_quotes_df = real_time_quotes_df.loc[
|
|
128
|
-
~(real_time_quotes_df['symbol'].isin(list(had_profit_df['SECURITY_CODE'])))]
|
|
129
|
-
return real_time_quotes_df
|
|
130
|
-
|
|
131
|
-
|
|
132
112
|
if __name__ == '__main__':
|
|
133
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)
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py
RENAMED
|
@@ -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()
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/today_high_chg_pool_sync_api.py
RENAMED
|
@@ -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()
|
|
@@ -395,7 +395,7 @@ blockingScheduler.add_job(sync_kpl_best_his_quotes, 'cron', hour='18,22', minute
|
|
|
395
395
|
blockingScheduler.add_job(sync_position, 'cron', hour='0,08', minute='10')
|
|
396
396
|
|
|
397
397
|
# 同步被立案调查的股票
|
|
398
|
-
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')
|
|
399
399
|
|
|
400
400
|
print('定时任务启动成功')
|
|
401
401
|
blockingScheduler.start()
|
|
@@ -45,6 +45,10 @@ mns_scheduler/finance/em_financial_profit_sync_service_api.py
|
|
|
45
45
|
mns_scheduler/finance/finance_common_api.py
|
|
46
46
|
mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py
|
|
47
47
|
mns_scheduler/finance/sync_financial_report_service_api.py
|
|
48
|
+
mns_scheduler/finance/test/__init__.py
|
|
49
|
+
mns_scheduler/finance/test/fix_blask_list.py
|
|
50
|
+
mns_scheduler/hk/__init__.py
|
|
51
|
+
mns_scheduler/hk/hk_company_info_sync_service_api.py
|
|
48
52
|
mns_scheduler/k_line/__init__.py
|
|
49
53
|
mns_scheduler/k_line/clean/__init__.py
|
|
50
54
|
mns_scheduler/k_line/clean/k_line_info_clean_impl.py
|
|
@@ -1,35 +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
|
-
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
10
|
-
from mns_common.db.MongodbUtil import MongodbUtil
|
|
11
|
-
import mns_common.constant.db_name_constant as db_name_constant
|
|
12
|
-
|
|
13
|
-
mongodb_util = MongodbUtil('27017')
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def get_sec_code(symbol):
|
|
17
|
-
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
18
|
-
if classification in ['K', 'H']:
|
|
19
|
-
return 'SH' + symbol
|
|
20
|
-
elif classification in ['C', 'S']:
|
|
21
|
-
return 'SZ' + symbol
|
|
22
|
-
else:
|
|
23
|
-
return 'BJ' + symbol
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
# 查询利润表数据
|
|
27
|
-
def find_profit_report(period_time):
|
|
28
|
-
query = {"REPORT_DATE": period_time}
|
|
29
|
-
return mongodb_util.find_query_data(db_name_constant.EM_STOCK_PROFIT, query)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# 查询资产表
|
|
33
|
-
def find_asset_liability_report(period_time):
|
|
34
|
-
query = {"REPORT_DATE": period_time}
|
|
35
|
-
return mongodb_util.find_query_data(db_name_constant.EM_STOCK_ASSET_LIABILITY, query)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/app/ths_new_concept_sync_app.py
RENAMED
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_his_sync.py
RENAMED
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_sync_web.py
RENAMED
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/kpl_concept_clean_api.py
RENAMED
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/ths_concept_clean_api.py
RENAMED
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/k_line_info_clean_impl.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/symbol/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/total/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/realtime_quotes_now_sync.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/auto_sell_service_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/export_open_data_to_excel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mns-scheduler-1.0.4.9 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/sync_realtime_quotes_task.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|