mns-scheduler 1.0.4.8__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.

Files changed (89) hide show
  1. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/PKG-INFO +1 -1
  2. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_constant_data.py +1 -102
  3. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/company_info_sync_api.py +6 -4
  4. mns-scheduler-1.0.5.1/mns_scheduler/company_info/de_list_stock_service.py +47 -0
  5. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py +57 -2
  6. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/em_financial_profit_sync_service_api.py +7 -0
  7. mns-scheduler-1.0.5.1/mns_scheduler/finance/finance_common_api.py +60 -0
  8. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +54 -20
  9. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/sync_financial_report_service_api.py +18 -32
  10. mns-scheduler-1.0.5.1/mns_scheduler/finance/test/fix_blask_list.py +36 -0
  11. mns-scheduler-1.0.5.1/mns_scheduler/hk/__init__.py +7 -0
  12. mns-scheduler-1.0.5.1/mns_scheduler/hk/hk_company_info_sync_service_api.py +59 -0
  13. mns-scheduler-1.0.5.1/mns_scheduler/risk/__init__.py +7 -0
  14. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/risk/register_and_investigate_stock_sync_api.py +4 -1
  15. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/realtime_quotes_now_zt_kc_sync.py +1 -1
  16. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/today_high_chg_pool_sync_api.py +1 -1
  17. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/data_sync_task.py +4 -1
  18. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/PKG-INFO +1 -1
  19. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/SOURCES.txt +5 -0
  20. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/setup.py +1 -1
  21. mns-scheduler-1.0.4.8/mns_scheduler/finance/finance_common_api.py +0 -35
  22. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/README.md +0 -0
  23. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/__init__.py +0 -0
  24. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/__init__.py +0 -0
  25. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/app/__init__.py +0 -0
  26. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -0
  27. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/__init__.py +0 -0
  28. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -0
  29. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -0
  30. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -0
  31. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/wen_cai/__init__.py +0 -0
  32. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -0
  33. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/big_deal/__init__.py +0 -0
  34. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/big_deal/ths_big_deal_sync.py +0 -0
  35. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/company_info/__init__.py +0 -0
  36. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/__init__.py +0 -0
  37. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/__init__.py +0 -0
  38. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/kpl_concept_clean_api.py +0 -0
  39. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/clean/ths_concept_clean_api.py +0 -0
  40. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/__init__.py +0 -0
  41. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/__init__.py +0 -0
  42. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +0 -0
  43. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +0 -0
  44. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/__init__.py +0 -0
  45. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -0
  46. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -0
  47. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/__init__.py +0 -0
  48. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +0 -0
  49. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +0 -0
  50. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/db/__init__.py +0 -0
  51. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/db/col_move_service.py +0 -0
  52. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/db/db_status.py +0 -0
  53. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/dt/__init__.py +0 -0
  54. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/dt/stock_dt_pool_sync.py +0 -0
  55. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/finance/__init__.py +0 -0
  56. {mns-scheduler-1.0.4.8/mns_scheduler/risk → mns-scheduler-1.0.5.1/mns_scheduler/finance/test}/__init__.py +0 -0
  57. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/__init__.py +0 -0
  58. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/__init__.py +0 -0
  59. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/k_line_info_clean_impl.py +0 -0
  60. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/clean/k_line_info_clean_service.py +0 -0
  61. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/sync/__init__.py +0 -0
  62. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/k_line/sync/daily_week_month_line_sync.py +0 -0
  63. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/__init__.py +0 -0
  64. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/__init__.py +0 -0
  65. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/__init__.py +0 -0
  66. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/sync_best_choose_his_index.py +0 -0
  67. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/index/sync_best_choose_index.py +0 -0
  68. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/symbol/__init__.py +0 -0
  69. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +0 -0
  70. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/total/__init__.py +0 -0
  71. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +0 -0
  72. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/__init__.py +0 -0
  73. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -0
  74. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -0
  75. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/__init__.py +0 -0
  76. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/auto_ipo_buy_api.py +0 -0
  77. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/auto_sell_service_api.py +0 -0
  78. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/trade/sync_position_api.py +0 -0
  79. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zb/__init__.py +0 -0
  80. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zb/stock_zb_pool_sync.py +0 -0
  81. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/__init__.py +0 -0
  82. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/export_open_data_to_excel.py +0 -0
  83. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/zt_five_boards_sync_api.py +0 -0
  84. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zt/zt_pool_sync_api.py +0 -0
  85. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/__init__.py +0 -0
  86. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -0
  87. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/dependency_links.txt +0 -0
  88. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/mns_scheduler.egg-info/top_level.txt +0 -0
  89. {mns-scheduler-1.0.4.8 → mns-scheduler-1.0.5.1}/setup.cfg +0 -0
@@ -1,3 +1,3 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.0.4.8
3
+ Version: 1.0.5.1
@@ -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(company_constant_data_api.de_listed_stock_list))]
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 company_constant_data_api.fix_symbol_list:
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("同步利润表异常:{},{}", symbol, e)
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
- mongodb_util.insert_mongo(new_asset_df, db_name_constant.EM_STOCK_ASSET_LIABILITY)
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
 
@@ -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
@@ -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 = 350000000
24
- # 利润为负的时候最小营业收入 科创 创业
25
- MIN_INCOME_SUB = 150000000
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
- id_key = symbol + "_" + period_time
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.FINANCIAL_PROBLEM)
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.FINANCIAL_PROBLEM)
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.FINANCIAL_PROBLEM)
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 > sync_time:
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.FINANCIAL_PROBLEM)
200
+ black_list_service_api.FINANCIAL_PROBLEM_NOT_REPORT)
167
201
  except Exception as e:
168
- logger.error("同步利润表异常:{},{},{}", symbol, period_time, e)
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
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
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, now_year)
40
- sync_asset_liability_report(period_time, sync_time, period, now_year)
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, now_year)
47
- sync_asset_liability_report(period_time, sync_time, period, now_year)
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, now_year)
54
- sync_asset_liability_report(period_time, sync_time, period, now_year)
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, now_year)
60
- sync_asset_liability_report(period_time, sync_time, period, now_year)
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, now_year):
67
- un_report_asset_df = find_un_report_symbol(period_time, db_name_constant.EM_STOCK_ASSET_LIABILITY)
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("同步利润表异常:{},{},{}", symbol, period_time, e)
88
+ logger.error("同步资产表异常:{},{},{}", symbol, period_time, e)
88
89
 
89
90
 
90
91
  # 同步利润表
91
- def sync_profit_report(period_time, sync_time, period, now_year):
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,7 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
@@ -0,0 +1,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()
@@ -0,0 +1,7 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
@@ -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
- new_high_risk_stocks_df = sync_all_investigate_stocks(const_num, search_key, begin_day, str_day)
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-10', None)
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('2022-06-28')
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()
@@ -1,3 +1,3 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.0.4.8
3
+ Version: 1.0.5.1
@@ -19,6 +19,7 @@ mns_scheduler/big_deal/ths_big_deal_sync.py
19
19
  mns_scheduler/company_info/__init__.py
20
20
  mns_scheduler/company_info/company_constant_data.py
21
21
  mns_scheduler/company_info/company_info_sync_api.py
22
+ mns_scheduler/company_info/de_list_stock_service.py
22
23
  mns_scheduler/concept/__init__.py
23
24
  mns_scheduler/concept/clean/__init__.py
24
25
  mns_scheduler/concept/clean/kpl_concept_clean_api.py
@@ -44,6 +45,10 @@ mns_scheduler/finance/em_financial_profit_sync_service_api.py
44
45
  mns_scheduler/finance/finance_common_api.py
45
46
  mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py
46
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
47
52
  mns_scheduler/k_line/__init__.py
48
53
  mns_scheduler/k_line/clean/__init__.py
49
54
  mns_scheduler/k_line/clean/k_line_info_clean_impl.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='mns-scheduler',
5
- version='1.0.4.8',
5
+ version='1.0.5.1',
6
6
  packages=find_packages(),
7
7
  install_requires=[], # 如果有依赖项,可以在这里列出
8
8
  )
@@ -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)