mns-scheduler 1.0.8.7__py3-none-any.whl → 1.4.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mns_scheduler/__init__.py +1 -3
- mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
- mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
- mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
- mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
- mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
- mns_scheduler/company_info/constant/company_constant_data.py +497 -0
- mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
- mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
- mns_scheduler/company_info/remark/__init__.py +7 -0
- mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
- mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
- mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
- mns_scheduler/concept/ths/detaill/__init__.py +0 -0
- mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
- mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
- mns_scheduler/db/col_move_service.py +10 -7
- mns_scheduler/db/db_status.py +1 -1
- mns_scheduler/db/script/__init__.py +7 -0
- mns_scheduler/db/script/col_move_script.py +45 -0
- mns_scheduler/db/script/db_move/__init__.py +7 -0
- mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
- mns_scheduler/db/script/sync/__init__.py +7 -0
- mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
- mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
- mns_scheduler/db/script/update/__init__.py +7 -0
- mns_scheduler/db/script/update/update_col_field.py +36 -0
- mns_scheduler/finance/__init__.py +1 -1
- mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
- mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
- mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
- mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
- mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
- mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
- mns_scheduler/hk/__init__.py +1 -1
- mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
- mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
- mns_scheduler/industry/__init__.py +7 -0
- mns_scheduler/industry/ths/__init__.py +7 -0
- mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
- mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
- mns_scheduler/irm/__init__.py +1 -1
- mns_scheduler/irm/api/__init__.py +1 -1
- mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
- mns_scheduler/k_line/clean/daily/__init__.py +1 -1
- mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
- mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
- mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
- mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
- mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
- mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
- mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
- mns_scheduler/k_line/common/__init__.py +7 -0
- mns_scheduler/k_line/common/k_line_common_api.py +188 -0
- mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
- mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
- mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
- mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
- mns_scheduler/k_line/sync_status/__init__.py +7 -0
- mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
- mns_scheduler/k_line/test/__init__.py +7 -0
- mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
- mns_scheduler/k_line/year_quarter/__init__.py +7 -0
- mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
- mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
- mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
- mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
- mns_scheduler/lhb/__init__.py +1 -1
- mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
- mns_scheduler/open/__init__.py +1 -1
- mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
- mns_scheduler/risk/__init__.py +1 -1
- mns_scheduler/risk/compliance/__init__.py +0 -0
- mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
- mns_scheduler/risk/financial/__init__.py +0 -0
- mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
- mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
- mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
- mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
- mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
- mns_scheduler/risk/major_violations/__init__.py +0 -0
- mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
- mns_scheduler/risk/self/__init__.py +0 -0
- mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
- mns_scheduler/risk/test/__init__.py +7 -0
- mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
- mns_scheduler/risk/transactions/__init__.py +0 -0
- mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
- mns_scheduler/self_choose/__init__.py +7 -0
- mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
- mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
- mns_scheduler/trade/auto_login/__init__.py +7 -0
- mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
- mns_scheduler/trade/auto_sell_service_api.py +10 -8
- mns_scheduler/trade/balance/__init__.py +7 -0
- mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
- mns_scheduler/trade/sync_position_api.py +41 -8
- mns_scheduler/trade/task/__init__.py +7 -0
- mns_scheduler/trade/task/trader_task_service.py +65 -0
- mns_scheduler/trade/tfp/__init__.py +7 -0
- mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
- mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
- mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
- mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
- mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
- mns_scheduler/zt/script/__init__.py +1 -1
- mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
- mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
- mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
- mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
- mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
- mns_scheduler/zz_task/compensation/__init__.py +0 -0
- mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
- mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
- mns_scheduler/zz_task/data_sync_task.py +271 -121
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
- mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
- mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
- mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
- mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
- mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
- mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
- mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
- mns_scheduler/company_info/company_constant_data.py +0 -322
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
- mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
- mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
- mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
- mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
- mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
- mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
- mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
- mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
- mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
- /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
- /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
- /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
- /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
- /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
- /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
- /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
- /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
|
@@ -2,46 +2,101 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
file_path = os.path.abspath(__file__)
|
|
5
|
-
end = file_path.index('mns') +
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
|
|
9
9
|
# 每月最大交易天数
|
|
10
10
|
MAX_TRADE_DAYS_PER_MONTH = 23
|
|
11
11
|
# 每周最大交易天数
|
|
12
|
-
|
|
12
|
+
MAX_TRADE_DAYS_PER_WEEK = 5
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def
|
|
16
|
-
|
|
15
|
+
def handle_month_line(k_line_info, stock_qfq_daily, deal_days):
|
|
16
|
+
# 上市2-23天
|
|
17
|
+
if 1 < deal_days <= MAX_TRADE_DAYS_PER_MONTH:
|
|
17
18
|
month_01 = round(sum(stock_qfq_daily['chg']), 2)
|
|
18
19
|
k_line_info['sum_month'] = month_01
|
|
19
20
|
k_line_info['month_num'] = 1
|
|
20
21
|
k_line_info['month01'] = month_01
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
k_line_info['month01_date'] = list(stock_qfq_daily.iloc[0:1]['date'])[0]
|
|
23
|
+
# 上市23-23*2天
|
|
24
|
+
elif (deal_days > MAX_TRADE_DAYS_PER_MONTH) \
|
|
25
|
+
and (deal_days <= MAX_TRADE_DAYS_PER_MONTH * 2):
|
|
23
26
|
stock_qfq_daily_month_01 = stock_qfq_daily.iloc[0:MAX_TRADE_DAYS_PER_MONTH]
|
|
24
27
|
month_01 = round(sum(stock_qfq_daily_month_01['chg']), 2)
|
|
25
|
-
|
|
28
|
+
k_line_length = stock_qfq_daily.shape[0]
|
|
29
|
+
stock_qfq_daily_month_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_MONTH: k_line_length]
|
|
26
30
|
month_02 = round(sum(stock_qfq_daily_month_02['chg']), 2)
|
|
27
31
|
k_line_info['sum_month'] = round(month_01 + month_02, 2)
|
|
28
32
|
k_line_info['month_num'] = 2
|
|
29
33
|
k_line_info['month01'] = month_01
|
|
30
|
-
k_line_info['
|
|
31
|
-
|
|
34
|
+
k_line_info['month02'] = month_02
|
|
35
|
+
k_line_info['month01_date'] = list(stock_qfq_daily_month_01.iloc[0:1]['date'])[0]
|
|
36
|
+
if k_line_length != MAX_TRADE_DAYS_PER_MONTH:
|
|
37
|
+
k_line_info['month02_date'] = list(stock_qfq_daily_month_02.iloc[0:1]['date'])[0]
|
|
38
|
+
else:
|
|
39
|
+
k_line_info['month02_date'] = '19890729'
|
|
40
|
+
elif deal_days > MAX_TRADE_DAYS_PER_MONTH * 2:
|
|
32
41
|
stock_qfq_daily_month_01 = stock_qfq_daily.iloc[0:MAX_TRADE_DAYS_PER_MONTH]
|
|
33
42
|
month_01 = round(sum(stock_qfq_daily_month_01['chg']), 2)
|
|
34
|
-
stock_qfq_daily_month_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_MONTH
|
|
43
|
+
stock_qfq_daily_month_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_MONTH:MAX_TRADE_DAYS_PER_MONTH * 2]
|
|
35
44
|
month_02 = round(sum(stock_qfq_daily_month_02['chg']), 2)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
week_sum = round(sum(stock_qfq_daily_week_sum['chg']), 2)
|
|
40
|
-
|
|
45
|
+
k_line_info['month01_date'] = list(stock_qfq_daily_month_01.iloc[0:1]['date'])[0]
|
|
46
|
+
k_line_info['month02_date'] = list(stock_qfq_daily_month_02.iloc[0:1]['date'])[0]
|
|
41
47
|
k_line_info['sum_month'] = round(month_01 + month_02, 2)
|
|
42
48
|
k_line_info['month_num'] = 2
|
|
43
49
|
k_line_info['month01'] = month_01
|
|
44
|
-
k_line_info['
|
|
50
|
+
k_line_info['month02'] = month_02
|
|
51
|
+
|
|
52
|
+
return k_line_info
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def handle_week_line(k_line_info, stock_qfq_daily, deal_days):
|
|
56
|
+
if 1 < deal_days <= MAX_TRADE_DAYS_PER_WEEK:
|
|
57
|
+
week_01 = round(sum(stock_qfq_daily['chg']), 2)
|
|
58
|
+
k_line_info['sum_week'] = week_01
|
|
59
|
+
k_line_info['week_num'] = 1
|
|
60
|
+
k_line_info['week01'] = week_01
|
|
61
|
+
k_line_info['week_last_day'] = list(stock_qfq_daily.iloc[0:1]['date'])[0]
|
|
62
|
+
elif MAX_TRADE_DAYS_PER_WEEK < deal_days <= MAX_TRADE_DAYS_PER_WEEK * 2:
|
|
63
|
+
stock_qfq_daily_week_01 = stock_qfq_daily.iloc[0:MAX_TRADE_DAYS_PER_WEEK]
|
|
64
|
+
stock_qfq_daily_week_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK:MAX_TRADE_DAYS_PER_WEEK * 2]
|
|
65
|
+
week_01 = round(sum(stock_qfq_daily_week_01['chg']), 2)
|
|
66
|
+
week_02 = round(sum(stock_qfq_daily_week_02['chg']), 2)
|
|
67
|
+
k_line_info['sum_week'] = week_01 + week_02
|
|
68
|
+
k_line_info['week_num'] = 2
|
|
69
|
+
k_line_info['week01'] = week_01
|
|
70
|
+
k_line_info['week02'] = week_02
|
|
71
|
+
k_line_info['week_last_day'] = list(stock_qfq_daily_week_01.iloc[0:1]['date'])[0]
|
|
72
|
+
elif MAX_TRADE_DAYS_PER_WEEK < deal_days <= MAX_TRADE_DAYS_PER_WEEK * 3:
|
|
73
|
+
stock_qfq_daily_week_01 = stock_qfq_daily.iloc[0:MAX_TRADE_DAYS_PER_WEEK]
|
|
74
|
+
stock_qfq_daily_week_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK: MAX_TRADE_DAYS_PER_WEEK * 2]
|
|
75
|
+
stock_qfq_daily_week_03 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK * 2: MAX_TRADE_DAYS_PER_WEEK * 3]
|
|
76
|
+
week_01 = round(sum(stock_qfq_daily_week_01['chg']), 2)
|
|
77
|
+
week_02 = round(sum(stock_qfq_daily_week_02['chg']), 2)
|
|
78
|
+
week_03 = round(sum(stock_qfq_daily_week_03['chg']), 2)
|
|
79
|
+
k_line_info['sum_week'] = week_01 + week_02 + week_03
|
|
80
|
+
k_line_info['week_num'] = 3
|
|
81
|
+
k_line_info['week01'] = week_01
|
|
82
|
+
k_line_info['week02'] = week_02
|
|
83
|
+
k_line_info['week03'] = week_03
|
|
84
|
+
k_line_info['week_last_day'] = list(stock_qfq_daily_week_01.iloc[0:1]['date'])[0]
|
|
45
85
|
|
|
46
|
-
|
|
86
|
+
elif MAX_TRADE_DAYS_PER_WEEK * 3 < deal_days:
|
|
87
|
+
stock_qfq_daily_week_01 = stock_qfq_daily.iloc[0:MAX_TRADE_DAYS_PER_WEEK]
|
|
88
|
+
stock_qfq_daily_week_02 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK:MAX_TRADE_DAYS_PER_WEEK * 2]
|
|
89
|
+
stock_qfq_daily_week_03 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK * 2: MAX_TRADE_DAYS_PER_WEEK * 3]
|
|
90
|
+
stock_qfq_daily_week_04 = stock_qfq_daily.iloc[MAX_TRADE_DAYS_PER_WEEK * 3: MAX_TRADE_DAYS_PER_WEEK * 4]
|
|
91
|
+
week_01 = round(sum(stock_qfq_daily_week_01['chg']), 2)
|
|
92
|
+
week_02 = round(sum(stock_qfq_daily_week_02['chg']), 2)
|
|
93
|
+
week_03 = round(sum(stock_qfq_daily_week_03['chg']), 2)
|
|
94
|
+
week_04 = round(sum(stock_qfq_daily_week_04['chg']), 2)
|
|
95
|
+
k_line_info['sum_week'] = week_01 + week_02 + week_03 + week_04
|
|
96
|
+
k_line_info['week_num'] = 4
|
|
97
|
+
k_line_info['week01'] = week_01
|
|
98
|
+
k_line_info['week02'] = week_02
|
|
99
|
+
k_line_info['week03'] = week_03
|
|
100
|
+
k_line_info['week04'] = week_04
|
|
101
|
+
k_line_info['week_last_day'] = stock_qfq_daily_week_01.iloc[0:1]['date']
|
|
47
102
|
return k_line_info
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
file_path = os.path.abspath(__file__)
|
|
7
|
+
end = file_path.index('mns') + 16
|
|
8
|
+
project_path = file_path[0:end]
|
|
9
|
+
sys.path.append(project_path)
|
|
10
|
+
import mns_common.api.akshare.k_line_api as k_line_api
|
|
11
|
+
import mns_common.utils.date_handle_util as date_handle_util
|
|
12
|
+
import mns_common.api.xueqiu.xue_qiu_k_line_api as xue_qiu_k_line_api
|
|
13
|
+
import mns_common.component.cookie.cookie_info_service as cookie_info_service
|
|
14
|
+
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
15
|
+
from datetime import datetime, timedelta
|
|
16
|
+
import mns_common.api.msg.push_msg_api as push_msg_api
|
|
17
|
+
import numpy as np
|
|
18
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
19
|
+
from loguru import logger
|
|
20
|
+
import threading
|
|
21
|
+
|
|
22
|
+
# source_type = 'xue_qiu'
|
|
23
|
+
source_type = 'xue_qiu'
|
|
24
|
+
error_no = 1
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# 自定义报警处理函数
|
|
28
|
+
def custom_alert(current: int, threshold: int):
|
|
29
|
+
push_msg_api.push_msg_to_wechat('获取k线数据异常', "当前次数:" + str(current) + "阈值:" + str(threshold))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# 定义一个带超时的函数调用
|
|
33
|
+
def call_with_timeout(func, *args, timeout=10, **kwargs):
|
|
34
|
+
# 用于存储函数执行结果
|
|
35
|
+
result = None
|
|
36
|
+
exception = None
|
|
37
|
+
|
|
38
|
+
# 定义一个线程目标函数
|
|
39
|
+
def target():
|
|
40
|
+
nonlocal result, exception
|
|
41
|
+
try:
|
|
42
|
+
result = func(*args, **kwargs)
|
|
43
|
+
except Exception as e:
|
|
44
|
+
exception = e
|
|
45
|
+
|
|
46
|
+
# 创建线程并启动
|
|
47
|
+
thread = threading.Thread(target=target)
|
|
48
|
+
thread.start()
|
|
49
|
+
|
|
50
|
+
# 等待线程完成,最多等待 timeout 秒
|
|
51
|
+
thread.join(timeout)
|
|
52
|
+
|
|
53
|
+
# 如果线程仍然存活,说明函数超时了
|
|
54
|
+
if thread.is_alive():
|
|
55
|
+
raise TimeoutError(f"Function exceeded timeout of {timeout} seconds")
|
|
56
|
+
|
|
57
|
+
# 如果函数抛出了异常,重新抛出
|
|
58
|
+
if exception is not None:
|
|
59
|
+
raise exception
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_k_line_common_adapter(symbol, period, hq, end_date):
|
|
64
|
+
global error_no
|
|
65
|
+
df = pd.DataFrame()
|
|
66
|
+
try:
|
|
67
|
+
if source_type == 'em':
|
|
68
|
+
|
|
69
|
+
df = call_with_timeout(get_em_k_line_api,
|
|
70
|
+
symbol,
|
|
71
|
+
period,
|
|
72
|
+
hq,
|
|
73
|
+
end_date,
|
|
74
|
+
timeout=10)
|
|
75
|
+
elif source_type == 'xue_qiu':
|
|
76
|
+
df = call_with_timeout(get_xueqiu_k_line_api,
|
|
77
|
+
symbol,
|
|
78
|
+
period,
|
|
79
|
+
hq,
|
|
80
|
+
end_date,
|
|
81
|
+
timeout=10)
|
|
82
|
+
|
|
83
|
+
if data_frame_util.is_empty(df):
|
|
84
|
+
error_no = error_no + 1
|
|
85
|
+
except BaseException as e:
|
|
86
|
+
logger.error("获取k线异常:{}", e)
|
|
87
|
+
error_no = error_no + 1
|
|
88
|
+
if error_no == 1000:
|
|
89
|
+
push_msg_api.push_msg_to_wechat('获取k线数据异常', "当前次数:" + str(error_no))
|
|
90
|
+
return df
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# 应用带参数的装饰器
|
|
94
|
+
# @exception_counter(
|
|
95
|
+
# threshold=1500,
|
|
96
|
+
# alert_handler=custom_alert,
|
|
97
|
+
# auto_reset=False
|
|
98
|
+
# )
|
|
99
|
+
def get_em_k_line_api(symbol, period, hq, end_date):
|
|
100
|
+
# 检查symbol是否以'6'开头
|
|
101
|
+
if symbol.startswith('6'):
|
|
102
|
+
symbol_a = '1.' + symbol
|
|
103
|
+
else:
|
|
104
|
+
symbol_a = '0.' + symbol
|
|
105
|
+
stock_hfq_df = k_line_api.stock_zh_a_hist(symbol=symbol_a,
|
|
106
|
+
period=period,
|
|
107
|
+
start_date=date_handle_util.no_slash_date('1990-12-19'),
|
|
108
|
+
end_date=date_handle_util.no_slash_date(end_date),
|
|
109
|
+
adjust=hq)
|
|
110
|
+
|
|
111
|
+
stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
|
|
112
|
+
"收盘": "close", "最高": "high",
|
|
113
|
+
"最低": "low", "成交量": "volume",
|
|
114
|
+
"成交额": "amount", "振幅": "pct_chg",
|
|
115
|
+
"涨跌幅": "chg", "涨跌额": "change",
|
|
116
|
+
"换手率": "exchange"}, inplace=True)
|
|
117
|
+
stock_hfq_df['symbol'] = symbol
|
|
118
|
+
stock_hfq_df['_id'] = symbol + '-' + stock_hfq_df['date']
|
|
119
|
+
return stock_hfq_df
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# period : year quarter month week day
|
|
123
|
+
# hq: qfq:before ,hfq:after, bfq:normal
|
|
124
|
+
|
|
125
|
+
def get_xueqiu_k_line_api(symbol, period, hq, end_date):
|
|
126
|
+
if hq == 'qfq':
|
|
127
|
+
adjust = 'before'
|
|
128
|
+
elif hq == 'hfq':
|
|
129
|
+
adjust = 'after'
|
|
130
|
+
else:
|
|
131
|
+
adjust = 'normal'
|
|
132
|
+
|
|
133
|
+
period_time = 'day'
|
|
134
|
+
if period == 'daily':
|
|
135
|
+
period_time = 'day'
|
|
136
|
+
elif period == 'weekly':
|
|
137
|
+
period_time = 'week'
|
|
138
|
+
elif period == 'monthly':
|
|
139
|
+
period_time = 'month'
|
|
140
|
+
|
|
141
|
+
cookie = cookie_info_service.get_xue_qiu_cookie()
|
|
142
|
+
symbol_pre_fix = common_service_fun_api.add_pre_prefix_one(symbol)
|
|
143
|
+
dt = datetime.strptime(end_date, '%Y-%m-%d')
|
|
144
|
+
dt += timedelta(days=1)
|
|
145
|
+
timestamp = str(int(dt.timestamp() * 1000)) # 转换为毫秒
|
|
146
|
+
stock_k_line_df = xue_qiu_k_line_api.get_xue_qiu_k_line(symbol_pre_fix, period_time,
|
|
147
|
+
cookie, timestamp, adjust)
|
|
148
|
+
|
|
149
|
+
stock_k_line_df['pct_chg'] = round(abs(stock_k_line_df['high'] - stock_k_line_df['low'] / stock_k_line_df['high']),
|
|
150
|
+
2)
|
|
151
|
+
stock_k_line_df.rename(columns={"chg": "change",
|
|
152
|
+
"percent": "chg",
|
|
153
|
+
"str_day": "date",
|
|
154
|
+
"market_capital": "flow_mv",
|
|
155
|
+
"turnoverrate": "exchange"}, inplace=True)
|
|
156
|
+
stock_k_line_df = stock_k_line_df[[
|
|
157
|
+
"date",
|
|
158
|
+
"open",
|
|
159
|
+
"close",
|
|
160
|
+
"high",
|
|
161
|
+
"low",
|
|
162
|
+
"volume",
|
|
163
|
+
"amount",
|
|
164
|
+
"pct_chg",
|
|
165
|
+
"chg",
|
|
166
|
+
"change",
|
|
167
|
+
"exchange"
|
|
168
|
+
]]
|
|
169
|
+
stock_k_line_df['symbol'] = symbol
|
|
170
|
+
stock_k_line_df['date'] = stock_k_line_df['date'].str.replace('-', '')
|
|
171
|
+
stock_k_line_df['_id'] = symbol + '-' + stock_k_line_df['date']
|
|
172
|
+
stock_k_line_df['last_price'] = round(((stock_k_line_df['close']) / (1 + stock_k_line_df['chg'] / 100)), 2)
|
|
173
|
+
stock_k_line_df['max_chg'] = round(
|
|
174
|
+
((stock_k_line_df['high'] - stock_k_line_df['last_price']) / stock_k_line_df['last_price']) * 100, 2)
|
|
175
|
+
stock_k_line_df['amount_level'] = round((stock_k_line_df['amount'] / common_service_fun_api.HUNDRED_MILLION), 2)
|
|
176
|
+
stock_k_line_df['flow_mv'] = round(stock_k_line_df['amount'] * 100 / stock_k_line_df['exchange'], 2)
|
|
177
|
+
stock_k_line_df['flow_mv_sp'] = round(stock_k_line_df['flow_mv'] / common_service_fun_api.HUNDRED_MILLION, 2)
|
|
178
|
+
|
|
179
|
+
stock_k_line_df.replace([np.inf, -np.inf], 0, inplace=True)
|
|
180
|
+
stock_k_line_df.fillna(0, inplace=True)
|
|
181
|
+
stock_k_line_df['date'] = stock_k_line_df['date'].astype(str).str[:8]
|
|
182
|
+
return stock_k_line_df
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
if __name__ == '__main__':
|
|
186
|
+
while True:
|
|
187
|
+
test_df = get_k_line_common_adapter('000001', 'day', 'qfq', '2025-05-25')
|
|
188
|
+
print(test_df)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
11
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
12
|
+
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
13
|
+
import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
|
|
14
|
+
import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
mongodb_util = MongodbUtil('27017')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def sync_bfq_k_line_data(period='daily',
|
|
22
|
+
hq='hfq',
|
|
23
|
+
hq_col='stock_hfq_daily',
|
|
24
|
+
end_date='2222-01-01',
|
|
25
|
+
symbol=None):
|
|
26
|
+
|
|
27
|
+
stock_hfq_df = k_line_common_api.get_k_line_common_adapter(symbol, period, hq, end_date)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
classification = common_service_fun_api.classify_symbol_one(symbol)
|
|
32
|
+
stock_hfq_df['classification'] = classification
|
|
33
|
+
stock_hfq_df = stock_hfq_df.sort_values(by=['date'], ascending=False)
|
|
34
|
+
insert_data(stock_hfq_df, hq_col, symbol)
|
|
35
|
+
logger.info(period + 'k线同步-' + hq + '-' + symbol)
|
|
36
|
+
return stock_hfq_df
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def sync_all_bfq_k_line(period='daily',
|
|
40
|
+
hq='hfq',
|
|
41
|
+
hq_col='stock_hfq_daily',
|
|
42
|
+
end_date='22220101',
|
|
43
|
+
symbol='300085'):
|
|
44
|
+
real_time_quotes_now_es = em_stock_info_api.get_a_stock_info()
|
|
45
|
+
|
|
46
|
+
symbol_list = list(real_time_quotes_now_es['symbol'])
|
|
47
|
+
# 退市公司
|
|
48
|
+
de_list_company = company_common_service_new_api.get_de_list_company()
|
|
49
|
+
symbol_list.extend(de_list_company)
|
|
50
|
+
symbol_list = set(symbol_list)
|
|
51
|
+
if symbol is not None:
|
|
52
|
+
symbol_list = [symbol]
|
|
53
|
+
for symbol in symbol_list:
|
|
54
|
+
try:
|
|
55
|
+
sync_bfq_k_line_data(period,
|
|
56
|
+
hq,
|
|
57
|
+
hq_col,
|
|
58
|
+
end_date,
|
|
59
|
+
symbol)
|
|
60
|
+
except BaseException as e:
|
|
61
|
+
logger.warning("同步不复权k线:{},{}", symbol, e)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def insert_data(stock_hfq_df, hq_col, symbol):
|
|
65
|
+
query = {'symbol': symbol}
|
|
66
|
+
tag = mongodb_util.remove_data(query, hq_col)
|
|
67
|
+
success = tag.acknowledged
|
|
68
|
+
if success:
|
|
69
|
+
mongodb_util.insert_mongo(stock_hfq_df, hq_col)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if __name__ == '__main__':
|
|
73
|
+
sync_all_bfq_k_line('daily',
|
|
74
|
+
'qfq',
|
|
75
|
+
'stock_bfq_daily',
|
|
76
|
+
'2025-05-25',
|
|
77
|
+
'000001')
|
|
@@ -7,23 +7,21 @@ project_path = file_path[0:end]
|
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
|
|
9
9
|
from loguru import logger
|
|
10
|
-
import mns_common.
|
|
10
|
+
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
11
11
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
12
|
-
import mns_common.utils.date_handle_util as date_handle_util
|
|
13
12
|
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
14
|
-
import mns_common.api.akshare.k_line_api as k_line_api
|
|
15
13
|
import mns_scheduler.k_line.clean.daily.daily_k_line_clean_common_service as daily_k_line_clean_common_service
|
|
16
|
-
|
|
14
|
+
import mns_scheduler.k_line.common.k_line_common_api as k_line_common_api
|
|
17
15
|
mongodb_util = MongodbUtil('27017')
|
|
18
16
|
|
|
19
17
|
|
|
20
18
|
# 多线程接口容易拉爆
|
|
21
19
|
|
|
22
20
|
def save_one_symbol(symbol, period, end_date, hq, hq_col, real_time_quotes_now):
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
# 检查symbol是否以'6'开头
|
|
22
|
+
|
|
23
|
+
stock_hfq_df = k_line_common_api.get_k_line_common_adapter(symbol, period, hq, end_date)
|
|
24
|
+
|
|
27
25
|
real_time_quotes_now_one = real_time_quotes_now.loc[real_time_quotes_now['symbol'] == symbol]
|
|
28
26
|
stock_hfq_df.rename(columns={"日期": "date", "开盘": "open",
|
|
29
27
|
"收盘": "close", "最高": "high",
|
|
@@ -63,16 +61,16 @@ def sync_all_daily_data(period='daily',
|
|
|
63
61
|
hq='hfq',
|
|
64
62
|
hq_col='stock_hfq_daily',
|
|
65
63
|
end_date='22220101',
|
|
66
|
-
|
|
64
|
+
symbol_list=None):
|
|
67
65
|
create_db_index(hq_col)
|
|
68
66
|
|
|
69
|
-
real_time_quotes_now_es =
|
|
67
|
+
real_time_quotes_now_es = em_stock_info_api.get_a_stock_info()
|
|
70
68
|
# exclude b symbol
|
|
71
69
|
real_time_quotes_now = common_service_fun_api.exclude_b_symbol(real_time_quotes_now_es.copy())
|
|
72
70
|
|
|
73
71
|
real_time_quotes_now = common_service_fun_api.total_mv_classification(real_time_quotes_now.copy())
|
|
74
|
-
if
|
|
75
|
-
real_time_quotes_now = real_time_quotes_now.loc[real_time_quotes_now['symbol']
|
|
72
|
+
if symbol_list is not None:
|
|
73
|
+
real_time_quotes_now = real_time_quotes_now.loc[real_time_quotes_now['symbol'].isin(symbol_list)]
|
|
76
74
|
|
|
77
75
|
real_time_quotes_now = real_time_quotes_now.sort_values(by=['chg'], ascending=False)
|
|
78
76
|
fail_symbol_list = []
|
|
@@ -105,8 +103,10 @@ def create_db_index(db_name):
|
|
|
105
103
|
|
|
106
104
|
|
|
107
105
|
if __name__ == '__main__':
|
|
108
|
-
sync_all_daily_data('
|
|
109
|
-
# sync_all_daily_data('
|
|
106
|
+
# sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly', None, None)
|
|
107
|
+
# sync_all_daily_data('daily', 'qfq', 'stock_qfq_daily', None, None)
|
|
108
|
+
# sync_all_daily_data('daily', 'qfq', 'stock_qfq_weekly', None, None)
|
|
109
|
+
sync_all_daily_data('weekly', 'qfq', 'stock_qfq_weekly', '2025-07-19', None)
|
|
110
110
|
# sync_all_daily_data('monthly', 'qfq', 'stock_qfq_monthly', None, None)
|
|
111
111
|
|
|
112
112
|
# sync_all_daily_data('monthly', '1990-12-19', 'qfq', 'stock_qfq_monthly', None, None)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 16
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_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.utils.date_handle_util as date_handle_util
|
|
13
|
+
import mns_common.api.msg.push_msg_api as push_msg_api
|
|
14
|
+
|
|
15
|
+
mongodb_util = MongodbUtil('27017')
|
|
16
|
+
|
|
17
|
+
min_k_line_count = 5200
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# check下一个交易日k线同步状态
|
|
21
|
+
def check_k_line_sync_count():
|
|
22
|
+
now_date = datetime.now()
|
|
23
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
24
|
+
hour = now_date.hour
|
|
25
|
+
# 是否是交易日
|
|
26
|
+
if trade_date_common_service_api.is_trade_day(str_day):
|
|
27
|
+
if hour > 15:
|
|
28
|
+
qfq_day = str_day
|
|
29
|
+
k_line_day = trade_date_common_service_api.get_further_trade_date(str_day, 2)
|
|
30
|
+
else:
|
|
31
|
+
qfq_day = trade_date_common_service_api.get_last_trade_day(str_day)
|
|
32
|
+
k_line_day = str_day
|
|
33
|
+
else:
|
|
34
|
+
qfq_day = trade_date_common_service_api.get_last_trade_day(str_day)
|
|
35
|
+
k_line_day = trade_date_common_service_api.get_further_trade_date(str_day, 1)
|
|
36
|
+
|
|
37
|
+
# check 当日k线同步状态
|
|
38
|
+
query_qfq = {'date': date_handle_util.no_slash_date(qfq_day)}
|
|
39
|
+
qfq_k_line_count = mongodb_util.count(query_qfq, db_name_constant.STOCK_QFQ_DAILY)
|
|
40
|
+
if qfq_k_line_count < min_k_line_count:
|
|
41
|
+
title = '当日k线同步数量不对'
|
|
42
|
+
msg = '当日k线同步数量不对,当前k线数量:' + str(qfq_k_line_count)
|
|
43
|
+
push_msg_api.push_msg_to_wechat(title, msg)
|
|
44
|
+
|
|
45
|
+
query_last_trade = {'str_day': k_line_day}
|
|
46
|
+
last_trade_day_k_line_count = mongodb_util.count(query_last_trade, 'k_line_info')
|
|
47
|
+
if last_trade_day_k_line_count < min_k_line_count:
|
|
48
|
+
title = '下一个交易日策略k线数量不对'
|
|
49
|
+
msg = '下一个交易日策略k线数量不对,当前数量:' + str(last_trade_day_k_line_count)
|
|
50
|
+
push_msg_api.push_msg_to_wechat(title, msg)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == '__main__':
|
|
54
|
+
check_k_line_sync_count()
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_scheduler.k_line.clean.k_line_info_clean_task as k_line_info_clean_task
|
|
11
|
+
|
|
12
|
+
mongodb_util = MongodbUtil('27017')
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def clean_history_data():
|
|
16
|
+
query = {"$and": [{"trade_date": {"$gte": '2023-11-06'}}, {"trade_date": {"$lte": '2024-09-12'}}]}
|
|
17
|
+
trade_date_list_df = mongodb_util.find_query_data('trade_date_list', query)
|
|
18
|
+
trade_date_list_df = trade_date_list_df.sort_values(by=['trade_date'], ascending=False)
|
|
19
|
+
for trade_data_one in trade_date_list_df.itertuples():
|
|
20
|
+
try:
|
|
21
|
+
k_line_info_clean_task.sync_k_line_info_task(trade_data_one.trade_date)
|
|
22
|
+
logger.info("清洗数据到:{}", trade_data_one.trade_date)
|
|
23
|
+
except BaseException as e:
|
|
24
|
+
logger.error("发生异常:{},{}", trade_data_one.trade_date, e)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
if __name__ == '__main__':
|
|
28
|
+
clean_history_data()
|
|
29
|
+
# k_line_info_clean_task.sync_k_line_info('2025-02-14', None)
|
|
30
|
+
# clean_history_data()
|
|
31
|
+
# k_line_info_clean_task.sync_k_line_info('2025-02-21', None)
|
|
32
|
+
# k_line_info_clean_task.sync_k_line_info('2025-03-26', ['301601'])
|
|
33
|
+
# clean_history_data()
|
|
34
|
+
# k_line_info_clean_task.sync_k_line_info('2025-03-11', None)
|
|
35
|
+
# k_line_info_clean_task.sync_k_line_info('2025-03-13', None)
|
|
36
|
+
|
|
37
|
+
# 001389 001359
|
|
38
|
+
# k_line_info_clean_task.sync_k_line_info('2025-02-14', None)
|
|
39
|
+
# k_line_info_clean_task.sync_k_line_info('2025-02-17', None)
|
|
40
|
+
|
|
41
|
+
# clean_history_data()
|