mns-scheduler 1.3.1.0__py3-none-any.whl → 1.3.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mns-scheduler might be problematic. Click here for more details.
- mns_scheduler/baidu/__init__.py +1 -1
- mns_scheduler/baidu/baidu_yun_pan_handle_service.py +2 -2
- mns_scheduler/company_info/announce/__init__.py +1 -1
- mns_scheduler/company_info/announce/company_announce_sync_service.py +1 -1
- mns_scheduler/company_info/base/__init__.py +1 -1
- mns_scheduler/company_info/base/sync_company_hold_info_api.py +1 -1
- mns_scheduler/company_info/clean/__init__.py +1 -1
- mns_scheduler/company_info/clean/company_info_clean_api.py +1 -1
- mns_scheduler/company_info/constant/__init__.py +1 -1
- mns_scheduler/company_info/de_list_stock/__init__.py +1 -1
- mns_scheduler/company_info/de_list_stock/de_list_stock_service.py +1 -1
- mns_scheduler/company_info/em_stock_info/__init__.py +1 -1
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +8 -3
- mns_scheduler/company_info/remark/__init__.py +1 -1
- mns_scheduler/company_info/remark/company_remark_info_sync.py +1 -1
- mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
- mns_scheduler/db/script/__init__.py +1 -1
- mns_scheduler/db/script/col_move_script.py +1 -1
- mns_scheduler/db/script/db_move/__init__.py +1 -1
- mns_scheduler/db/script/db_move/col_move_one_service.py +1 -1
- mns_scheduler/db/script/sync/__init__.py +1 -1
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +1 -1
- mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +1 -1
- mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +1 -1
- mns_scheduler/db/script/update/__init__.py +1 -1
- mns_scheduler/db/script/update/update_col_field.py +1 -1
- mns_scheduler/debt/__init__.py +1 -1
- mns_scheduler/debt/kzz_bond_info_sync.py +1 -1
- mns_scheduler/extraIncome/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/common/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/common/symbol_handle_util.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/etf/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/etf/etf_one_minute_sync_task.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/index/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/index/main_index_sync_task.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/kzz/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/kzz/kzz_one_minute_sync_task.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/one_minute_sync_task.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/stock/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/stock/stock_one_minute_sync_task.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/upload/__init__.py +1 -1
- mns_scheduler/extraIncome/a_stock/one_minute/upload/etf_upload_to_baidu_task.py +95 -0
- mns_scheduler/extraIncome/a_stock/one_minute/upload/index_upload_to_baidu_task.py +87 -0
- mns_scheduler/extraIncome/a_stock/one_minute/upload/kzz_upload_to_baidu_task.py +95 -0
- mns_scheduler/extraIncome/a_stock/one_minute/upload/{upload_to_baidu_task.py → stock_upload_to_baidu_task.py} +4 -2
- mns_scheduler/extraIncome/hk/__init__.py +1 -1
- mns_scheduler/extraIncome/hk/hk_stock_qfq_daily_k_line.py +1 -1
- mns_scheduler/extraIncome/us/__init__.py +1 -1
- mns_scheduler/extraIncome/us/daily/__init__.py +1 -1
- mns_scheduler/extraIncome/us/daily/us_stock_qfq_daily_k_line.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/__init__.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/api/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/api/alpha_vantage_api.py +2 -2
- mns_scheduler/extraIncome/us/one_minute/api/em_us_one_minute_api.py +139 -0
- mns_scheduler/extraIncome/us/one_minute/api/stock_etf_info_api.py +68 -0
- mns_scheduler/extraIncome/us/one_minute/api/y_finance_api.py +25 -9
- mns_scheduler/extraIncome/us/one_minute/etf/__init__.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/__init__.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/__init__.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/__init__.py +5 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/down_load_ETF_his_2024.py +4 -2
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/handle_down_load_fail_ETF.py +67 -0
- mns_scheduler/extraIncome/us/one_minute/stock/{his → down_load/stock}/__init__.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/down_load_stock_his_01.py +203 -0
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/{down_load_stock_his_2024_02.py → stock/down_load_stock_his_02.py} +67 -16
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/{down_load_stock_his_2024_01.py → stock/down_load_stock_his_2025.py} +12 -11
- mns_scheduler/extraIncome/us/one_minute/stock/now/__init__.py +7 -0
- mns_scheduler/extraIncome/us/one_minute/stock/now/us_etf_one_minute_sync.py +52 -0
- mns_scheduler/extraIncome/us/one_minute/stock/now/us_stock_one_minute_sync.py +141 -0
- mns_scheduler/finance/__init__.py +1 -1
- mns_scheduler/finance/em_financial_asset_liability_sync_service_api.py +1 -1
- mns_scheduler/finance/em_financial_profit_sync_service_api.py +1 -1
- mns_scheduler/finance/finance_common_api.py +1 -1
- mns_scheduler/finance/sync_financial_report_service_api.py +1 -1
- mns_scheduler/hk/__init__.py +1 -1
- mns_scheduler/hk/hk_company_info_sync_service_api.py +1 -1
- mns_scheduler/hk/hk_industry_info_sync_service_api.py +1 -1
- mns_scheduler/industry/__init__.py +1 -1
- mns_scheduler/industry/ths/__init__.py +1 -1
- mns_scheduler/industry/ths/ths_industry_index_service.py +1 -1
- mns_scheduler/industry/ths/ths_industry_sync_service.py +1 -1
- 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 +1 -1
- mns_scheduler/k_line/clean/daily/__init__.py +1 -1
- mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +1 -1
- mns_scheduler/k_line/clean/daily/daily_k_line_service.py +1 -1
- 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 +1 -1
- mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +1 -1
- 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/test/__init__.py +1 -1
- mns_scheduler/k_line/test/k_line_info_clean_his_data.py +1 -1
- mns_scheduler/k_line/year_quarter/__init__.py +1 -1
- mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +1 -1
- 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 +1 -1
- mns_scheduler/risk/__init__.py +1 -1
- mns_scheduler/risk/financial/annual_report_audit_check_api.py +1 -1
- mns_scheduler/risk/financial/profit_income_check_api.py +1 -1
- mns_scheduler/risk/financial_report_risk_check_api.py +1 -1
- mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +1 -1
- mns_scheduler/risk/self/wei_pan_stock_api.py +1 -1
- mns_scheduler/risk/test/__init__.py +1 -1
- mns_scheduler/risk/test/fix_blask_list.py +1 -1
- mns_scheduler/risk/transactions/transactions_check_api.py +1 -1
- mns_scheduler/self_choose/__init__.py +1 -1
- mns_scheduler/self_choose/ths_self_choose_service.py +14 -7
- mns_scheduler/trade/auto_login/trader_auto_service.py +1 -1
- mns_scheduler/trade/auto_sell_service_api.py +2 -2
- mns_scheduler/trade/balance/__init__.py +1 -1
- mns_scheduler/trade/balance/ths_account_balance_service.py +1 -1
- mns_scheduler/trade/sync_position_api.py +1 -1
- mns_scheduler/trade/task/trader_task_service.py +1 -1
- mns_scheduler/trade/tfp/__init__.py +1 -1
- mns_scheduler/trade/tfp/stock_tfp_info_sync.py +1 -1
- mns_scheduler/us/__init__.py +1 -1
- mns_scheduler/us/baidu_yun_pan_handle_service.py +1 -1
- mns_scheduler/us/us_company_info_sync_service_api.py +1 -1
- mns_scheduler/zt/script/__init__.py +1 -1
- mns_scheduler/zt/script/fix_error_deal_day.py +1 -1
- mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +1 -1
- mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +1 -1
- mns_scheduler/zt/script/sync_now_higt_chg_zt.py +1 -1
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +1 -1
- mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +1 -1
- mns_scheduler/zz_task/data_sync_task.py +13 -3
- {mns_scheduler-1.3.1.0.dist-info → mns_scheduler-1.3.1.6.dist-info}/METADATA +1 -1
- mns_scheduler-1.3.1.6.dist-info/RECORD +210 -0
- mns_scheduler/extraIncome/us/one_minute/stock/his/us_stock_one_minute_his.py +0 -199
- mns_scheduler/extraIncome/us/one_minute/stock/his/us_stock_one_minute_his_2024.py +0 -212
- mns_scheduler/extraIncome/us/one_minute/stock/us_stock_one_minute_task.py +0 -26
- mns_scheduler-1.3.1.0.dist-info/RECORD +0 -203
- {mns_scheduler-1.3.1.0.dist-info → mns_scheduler-1.3.1.6.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.3.1.0.dist-info → mns_scheduler-1.3.1.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import sys
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
file_path = os.path.abspath(__file__)
|
|
12
|
+
end = file_path.index('mns') + 17
|
|
13
|
+
project_path = file_path[0:end]
|
|
14
|
+
sys.path.append(project_path)
|
|
15
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
16
|
+
from loguru import logger
|
|
17
|
+
import mns_scheduler.baidu.baidu_yun_pan_handle_service as baidu_yun_pan_handle_service
|
|
18
|
+
from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
|
|
19
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
20
|
+
from datetime import datetime
|
|
21
|
+
import mns_common.constant.extra_income_db_name as extra_income_db_name
|
|
22
|
+
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
23
|
+
|
|
24
|
+
mongodb_util = MongodbUtil('27017')
|
|
25
|
+
mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def upload_kzz_to_baidu():
|
|
29
|
+
a_stock_path = '/A股/可转债/1分钟'
|
|
30
|
+
|
|
31
|
+
now_date_time = datetime.now()
|
|
32
|
+
now_year = now_date_time.year
|
|
33
|
+
month = now_date_time.month
|
|
34
|
+
a_stock_path = a_stock_path + str(now_year) + '/' + str(month)
|
|
35
|
+
# 创建路径
|
|
36
|
+
baidu_yun_pan_handle_service.mkdir_baidu_new_folder(a_stock_path)
|
|
37
|
+
em_a_kzz_info_df = em_stock_info_api.get_kzz_info()
|
|
38
|
+
|
|
39
|
+
em_a_kzz_info_df = classify_symbol(em_a_kzz_info_df)
|
|
40
|
+
|
|
41
|
+
em_a_kzz_info_df['symbol'] = em_a_kzz_info_df.apply(
|
|
42
|
+
lambda row: row['symbol'] + '.SZ' if row['classification'] in ['S', 'C']
|
|
43
|
+
else row['symbol'] + '.BJ' if row['classification'] in ['X']
|
|
44
|
+
else row['symbol'] + '.SH',
|
|
45
|
+
axis=1
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
file_folder_df = baidu_yun_pan_handle_service.get_file_folder(a_stock_path)
|
|
49
|
+
if data_frame_util.is_not_empty(file_folder_df):
|
|
50
|
+
# 去除文件名中的 .csv 后缀
|
|
51
|
+
file_folder_df['name'] = file_folder_df['name'].str.replace(r'\.csv$', '', regex=True)
|
|
52
|
+
em_a_kzz_info_df = em_a_kzz_info_df.loc[~(em_a_kzz_info_df['symbol'].isin(file_folder_df['name']))]
|
|
53
|
+
fail_list = []
|
|
54
|
+
for stock_one in em_a_kzz_info_df.itertuples():
|
|
55
|
+
symbol = stock_one.symbol
|
|
56
|
+
name = stock_one.name
|
|
57
|
+
try:
|
|
58
|
+
|
|
59
|
+
col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_KZZ + '_' + str(now_year)
|
|
60
|
+
|
|
61
|
+
if month < 10:
|
|
62
|
+
month_str = '0' + str(month)
|
|
63
|
+
else:
|
|
64
|
+
month_str = str(month)
|
|
65
|
+
begin_time = str(now_year) + '-' + month_str + '-01 09:00:00'
|
|
66
|
+
query = {'symbol': symbol, 'time': {"$gte": begin_time}}
|
|
67
|
+
one_minute_k_line_bfq_df = mongodbUtilV2_27019.find_query_data(col_name, query)
|
|
68
|
+
if data_frame_util.is_not_empty(one_minute_k_line_bfq_df):
|
|
69
|
+
one_minute_k_line_bfq_df = one_minute_k_line_bfq_df.sort_values(by=['time'], ascending=True)
|
|
70
|
+
del one_minute_k_line_bfq_df['_id']
|
|
71
|
+
del one_minute_k_line_bfq_df['symbol']
|
|
72
|
+
result = baidu_yun_pan_handle_service.upload_to_baidu(symbol, a_stock_path, one_minute_k_line_bfq_df)
|
|
73
|
+
if result != 0:
|
|
74
|
+
fail_list.append(symbol)
|
|
75
|
+
except BaseException as e:
|
|
76
|
+
fail_list.append(symbol)
|
|
77
|
+
logger.error("上传数据异常:{}", e)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def classify_symbol(kzz_real_time_quotes):
|
|
81
|
+
kzz_real_time_quotes['classification'] = kzz_real_time_quotes['market'].apply(
|
|
82
|
+
lambda market: classify_symbol_one(market))
|
|
83
|
+
return kzz_real_time_quotes
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# 单个股票分类
|
|
87
|
+
def classify_symbol_one(market):
|
|
88
|
+
if market == 0:
|
|
89
|
+
return 'S'
|
|
90
|
+
else:
|
|
91
|
+
return 'H'
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == '__main__':
|
|
95
|
+
upload_kzz_to_baidu()
|
|
@@ -2,7 +2,7 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
file_path = os.path.abspath(__file__)
|
|
5
|
-
end = file_path.index('mns') +
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
@@ -45,6 +45,8 @@ def upload_stock_to_baidu():
|
|
|
45
45
|
em_a_stock_info_df = em_a_stock_info_df.loc[~(em_a_stock_info_df['symbol'].isin(file_folder_df['name']))]
|
|
46
46
|
fail_list = []
|
|
47
47
|
for stock_one in em_a_stock_info_df.itertuples():
|
|
48
|
+
symbol = stock_one.symbol
|
|
49
|
+
name = stock_one.name
|
|
48
50
|
try:
|
|
49
51
|
classification = stock_one.classification
|
|
50
52
|
if classification == 'X':
|
|
@@ -59,7 +61,7 @@ def upload_stock_to_baidu():
|
|
|
59
61
|
elif classification == 'C':
|
|
60
62
|
col_name = extra_income_db_name.ONE_MINUTE_K_LINE_BFQ_C
|
|
61
63
|
col_name = col_name + '_' + str(now_year)
|
|
62
|
-
|
|
64
|
+
|
|
63
65
|
if month < 10:
|
|
64
66
|
month_str = '0' + str(month)
|
|
65
67
|
else:
|
|
@@ -2,7 +2,7 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
file_path = os.path.abspath(__file__)
|
|
5
|
-
end = file_path.index('mns') +
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
from alpha_vantage.timeseries import TimeSeries
|
|
@@ -31,4 +31,4 @@ def sync_one_minute_data(symbol, month):
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
if __name__ == '__main__':
|
|
34
|
-
sync_one_minute_data('
|
|
34
|
+
sync_one_minute_data('TSLA', '2020-08')
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import requests
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def stock_hk_hist_min_em(
|
|
14
|
+
symbol: str = "01611",
|
|
15
|
+
period: str = "1",
|
|
16
|
+
adjust: str = "",
|
|
17
|
+
start_date: str = "1979-09-01 09:32:00",
|
|
18
|
+
end_date: str = "2222-01-01 09:32:00",
|
|
19
|
+
) -> pd.DataFrame:
|
|
20
|
+
"""
|
|
21
|
+
东方财富网-行情-港股-每日分时行情
|
|
22
|
+
https://quote.eastmoney.com/hk/00948.html
|
|
23
|
+
:param symbol: 股票代码
|
|
24
|
+
:type symbol: str
|
|
25
|
+
:param period: choice of {'1', '5', '15', '30', '60'}
|
|
26
|
+
:type period: str
|
|
27
|
+
:param adjust: choice of {'', 'qfq', 'hfq'}
|
|
28
|
+
:type adjust: str
|
|
29
|
+
:param start_date: 开始日期
|
|
30
|
+
:type start_date: str
|
|
31
|
+
:param end_date: 结束日期
|
|
32
|
+
:type end_date: str
|
|
33
|
+
:return: 每日分时行情
|
|
34
|
+
:rtype: pandas.DataFrame
|
|
35
|
+
"""
|
|
36
|
+
adjust_map = {
|
|
37
|
+
"": "0",
|
|
38
|
+
"qfq": "1",
|
|
39
|
+
"hfq": "2",
|
|
40
|
+
}
|
|
41
|
+
if period == "1":
|
|
42
|
+
url = "https://push2his.eastmoney.com/api/qt/stock/trends2/get"
|
|
43
|
+
params = {
|
|
44
|
+
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",
|
|
45
|
+
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58",
|
|
46
|
+
"ut": "fa5fd1943c7b386f172d6893dbfba10b",
|
|
47
|
+
"iscr": "0",
|
|
48
|
+
"ndays": "5",
|
|
49
|
+
"secid": f"116.{symbol}",
|
|
50
|
+
"_": "1623766962675",
|
|
51
|
+
}
|
|
52
|
+
r = requests.get(url, timeout=15, params=params)
|
|
53
|
+
data_json = r.json()
|
|
54
|
+
temp_df = pd.DataFrame(
|
|
55
|
+
[item.split(",") for item in data_json["data"]["trends"]]
|
|
56
|
+
)
|
|
57
|
+
temp_df.columns = [
|
|
58
|
+
"时间",
|
|
59
|
+
"开盘",
|
|
60
|
+
"收盘",
|
|
61
|
+
"最高",
|
|
62
|
+
"最低",
|
|
63
|
+
"成交量",
|
|
64
|
+
"成交额",
|
|
65
|
+
"最新价",
|
|
66
|
+
]
|
|
67
|
+
temp_df.index = pd.to_datetime(temp_df["时间"])
|
|
68
|
+
temp_df = temp_df[start_date:end_date]
|
|
69
|
+
temp_df.reset_index(drop=True, inplace=True)
|
|
70
|
+
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
|
|
71
|
+
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
|
|
72
|
+
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
|
|
73
|
+
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
|
|
74
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
75
|
+
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
76
|
+
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
|
|
77
|
+
temp_df["时间"] = pd.to_datetime(temp_df["时间"]).astype(str)
|
|
78
|
+
return temp_df
|
|
79
|
+
else:
|
|
80
|
+
url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"
|
|
81
|
+
params = {
|
|
82
|
+
"fields1": "f1,f2,f3,f4,f5,f6",
|
|
83
|
+
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
|
|
84
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
85
|
+
"klt": period,
|
|
86
|
+
"fqt": adjust_map[adjust],
|
|
87
|
+
"secid": f"116.{symbol}",
|
|
88
|
+
"beg": "0",
|
|
89
|
+
"end": "20500000",
|
|
90
|
+
"_": "1630930917857",
|
|
91
|
+
}
|
|
92
|
+
r = requests.get(url, timeout=15, params=params)
|
|
93
|
+
data_json = r.json()
|
|
94
|
+
temp_df = pd.DataFrame(
|
|
95
|
+
[item.split(",") for item in data_json["data"]["klines"]]
|
|
96
|
+
)
|
|
97
|
+
temp_df.columns = [
|
|
98
|
+
"时间",
|
|
99
|
+
"开盘",
|
|
100
|
+
"收盘",
|
|
101
|
+
"最高",
|
|
102
|
+
"最低",
|
|
103
|
+
"成交量",
|
|
104
|
+
"成交额",
|
|
105
|
+
"振幅",
|
|
106
|
+
"涨跌幅",
|
|
107
|
+
"涨跌额",
|
|
108
|
+
"换手率",
|
|
109
|
+
]
|
|
110
|
+
temp_df.index = pd.to_datetime(temp_df["时间"])
|
|
111
|
+
temp_df = temp_df[start_date:end_date]
|
|
112
|
+
temp_df.reset_index(drop=True, inplace=True)
|
|
113
|
+
temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
|
|
114
|
+
temp_df["收盘"] = pd.to_numeric(temp_df["收盘"], errors="coerce")
|
|
115
|
+
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
|
|
116
|
+
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
|
|
117
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
118
|
+
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
119
|
+
temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
|
|
120
|
+
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
121
|
+
temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
|
|
122
|
+
temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
|
|
123
|
+
temp_df["时间"] = pd.to_datetime(temp_df["时间"]).astype(str)
|
|
124
|
+
temp_df = temp_df[
|
|
125
|
+
[
|
|
126
|
+
"时间",
|
|
127
|
+
"开盘",
|
|
128
|
+
"收盘",
|
|
129
|
+
"最高",
|
|
130
|
+
"最低",
|
|
131
|
+
"涨跌幅",
|
|
132
|
+
"涨跌额",
|
|
133
|
+
"成交量",
|
|
134
|
+
"成交额",
|
|
135
|
+
"振幅",
|
|
136
|
+
"换手率",
|
|
137
|
+
]
|
|
138
|
+
]
|
|
139
|
+
return temp_df
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
import csv
|
|
10
|
+
import requests
|
|
11
|
+
import pandas as pd
|
|
12
|
+
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
13
|
+
from functools import lru_cache
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@lru_cache()
|
|
17
|
+
def get_us_stock_info():
|
|
18
|
+
em_us_stock_info_df = em_stock_info_api.get_us_stock_info()
|
|
19
|
+
em_us_stock_info_df['symbol'] = em_us_stock_info_df['symbol'].str.replace('_', '-')
|
|
20
|
+
em_us_stock_info_df = em_us_stock_info_df.loc[em_us_stock_info_df['total_mv'] != 0]
|
|
21
|
+
|
|
22
|
+
alpha_us_stock_info = get_us_stock_list()
|
|
23
|
+
alpha_us_stock_info = alpha_us_stock_info.loc[alpha_us_stock_info['assetType'] == 'Stock']
|
|
24
|
+
|
|
25
|
+
em_us_stock_info_df = em_us_stock_info_df.loc[
|
|
26
|
+
em_us_stock_info_df['symbol'].isin(alpha_us_stock_info['symbol'])]
|
|
27
|
+
em_us_stock_info_df = em_us_stock_info_df.sort_values(by=['flow_mv'], ascending=False)
|
|
28
|
+
return em_us_stock_info_df
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@lru_cache()
|
|
32
|
+
def get_us_etf_info():
|
|
33
|
+
em_us_stock_info_df = em_stock_info_api.get_us_stock_info()
|
|
34
|
+
em_us_stock_info_df['symbol'] = em_us_stock_info_df['symbol'].str.replace('_', '-')
|
|
35
|
+
em_us_stock_info_df = em_us_stock_info_df.loc[em_us_stock_info_df['total_mv'] != 0]
|
|
36
|
+
|
|
37
|
+
alpha_us_stock_info = get_us_stock_list()
|
|
38
|
+
alpha_us_stock_info = alpha_us_stock_info.loc[alpha_us_stock_info['assetType'] == 'ETF']
|
|
39
|
+
|
|
40
|
+
em_us_stock_info_df = em_us_stock_info_df.loc[
|
|
41
|
+
em_us_stock_info_df['symbol'].isin(alpha_us_stock_info['symbol'])]
|
|
42
|
+
em_us_stock_info_df = em_us_stock_info_df.sort_values(by=['flow_mv'], ascending=False)
|
|
43
|
+
return em_us_stock_info_df
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@lru_cache()
|
|
47
|
+
def get_us_stock_list():
|
|
48
|
+
# replace the "demo" apikey below with your own key from https://www.alphavantage.co/support/#api-key
|
|
49
|
+
CSV_URL = 'https://www.alphavantage.co/query?function=LISTING_STATUS&apikey=demo'
|
|
50
|
+
with requests.Session() as s:
|
|
51
|
+
download = s.get(CSV_URL)
|
|
52
|
+
decoded_content = download.content.decode('utf-8')
|
|
53
|
+
cr = csv.reader(decoded_content.splitlines(), delimiter=',')
|
|
54
|
+
my_list = list(cr)
|
|
55
|
+
# 提取列名(第1行)
|
|
56
|
+
columns = my_list[0]
|
|
57
|
+
# 提取数据(第2行及以后)
|
|
58
|
+
values = my_list[1:]
|
|
59
|
+
|
|
60
|
+
# 转换为 DataFrame
|
|
61
|
+
df = pd.DataFrame(values, columns=columns)
|
|
62
|
+
df = df.rename(columns={'ipoDate': 'list_date'})
|
|
63
|
+
return df
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == '__main__':
|
|
67
|
+
get_us_stock_info()
|
|
68
|
+
get_us_etf_info()
|
|
@@ -2,7 +2,7 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
file_path = os.path.abspath(__file__)
|
|
5
|
-
end = file_path.index('mns') +
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
|
|
@@ -14,10 +14,28 @@ os.environ['HTTPS_PROXY'] = proxy
|
|
|
14
14
|
import yfinance as yf
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
#
|
|
18
|
+
# “history”函数包含许多参数,了解它们对于正确解释您收到的数据非常重要:
|
|
19
|
+
#
|
|
20
|
+
# period:如前所述,特别有用的是值“max”。以下是有效值:1d、5d、1mo、3mo、6mo、1y、2y、5y、10y、ytd、max。
|
|
21
|
+
# 间隔:定义每个条形的大小。条形越小,限制越严格,只能检索 7 天的 1 分钟数据。以下是有效值:1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
|
|
22
|
+
# start:开始日期。服务器需要格式为 YYYY-MM-DD 的字符串。
|
|
23
|
+
# end:结束日期。服务器需要格式为 YYYY-MM-DD 的字符串。
|
|
24
|
+
# repost:定义是否包含与正常交易时间不对应的数据。默认值为 False
|
|
25
|
+
# auto_adjust:是否根据股票分割和股息支付调整价格。默认值是true。
|
|
26
|
+
# 雅虎财经获取基本数据方法
|
|
17
27
|
def get_us_one_minute(symbol, start_time, end_time):
|
|
28
|
+
# start_time = '2025-05-01'
|
|
29
|
+
# end_time = '2025-05-09'
|
|
30
|
+
start_time = '2025-05-09'
|
|
31
|
+
end_time = '2025-05-11'
|
|
18
32
|
yf_ticker = yf.Ticker(symbol)
|
|
19
|
-
df = yf_ticker.history(period='5d',
|
|
20
|
-
|
|
33
|
+
df = yf_ticker.history(period='5d',
|
|
34
|
+
interval='1m',
|
|
35
|
+
start=start_time,
|
|
36
|
+
end=end_time,
|
|
37
|
+
prepost=False,
|
|
38
|
+
auto_adjust=False)
|
|
21
39
|
df = df[[
|
|
22
40
|
"Open",
|
|
23
41
|
"High",
|
|
@@ -35,13 +53,11 @@ def get_us_one_minute(symbol, start_time, end_time):
|
|
|
35
53
|
"time",
|
|
36
54
|
]
|
|
37
55
|
df['time'] = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S')
|
|
38
|
-
df['str_day'] = df['time'].str.slice(0, 10)
|
|
39
|
-
df['minute'] = df['time'].str.slice(11, 19)
|
|
56
|
+
# df['str_day'] = df['time'].str.slice(0, 10)
|
|
57
|
+
# df['minute'] = df['time'].str.slice(11, 19)
|
|
40
58
|
return df
|
|
41
|
-
# df_test = df.loc[df['str_day'] == '2025-04-30']
|
|
42
|
-
# print(sum(df_test['volume']))
|
|
43
|
-
# sum(df.loc[(df['str_day'] == '2025-04-30') & (df['time'] > '16:00:00')]['volume'])
|
|
44
59
|
|
|
45
60
|
|
|
46
61
|
if __name__ == '__main__':
|
|
47
|
-
get_us_one_minute('
|
|
62
|
+
df=get_us_one_minute('B', '2025-05-01', '2025-05-10')
|
|
63
|
+
print(df)
|
|
@@ -2,6 +2,10 @@ 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
|
+
import akshare as ak
|
|
9
|
+
|
|
10
|
+
us_stock_current_df = ak.stock_us_spot()
|
|
11
|
+
print(us_stock_current_df)
|
|
@@ -2,7 +2,7 @@ import sys
|
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
4
|
file_path = os.path.abspath(__file__)
|
|
5
|
-
end = file_path.index('mns') +
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
import mns_common.component.em.em_stock_info_api as em_stock_info_api
|
|
@@ -22,12 +22,14 @@ mongodb_util_27017 = MongodbUtil('27017')
|
|
|
22
22
|
mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
|
|
23
23
|
from datetime import datetime
|
|
24
24
|
|
|
25
|
+
no_choose_symbol = ['FNGA', 'MSTU', 'SPYU']
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
def sync_us_stock_one_minute(now_year, now_month):
|
|
27
29
|
real_time_quotes_all_us = em_stock_info_api.get_us_stock_info()
|
|
28
30
|
real_time_quotes_all_us_stocks = real_time_quotes_all_us.loc[real_time_quotes_all_us['flow_mv'] == 0]
|
|
29
31
|
real_time_quotes_all_us_stocks = real_time_quotes_all_us_stocks.sort_values(by=['amount'], ascending=False)
|
|
30
|
-
|
|
32
|
+
real_time_quotes_all_us_stocks = real_time_quotes_all_us_stocks.loc[~real_time_quotes_all_us_stocks['symbol'].isin(no_choose_symbol)]
|
|
31
33
|
real_time_quotes_all_us_stocks = real_time_quotes_all_us_stocks.loc[
|
|
32
34
|
real_time_quotes_all_us_stocks['amount'] >= 50000000]
|
|
33
35
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 17
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
11
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
12
|
+
from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
|
|
13
|
+
import mns_common.constant.extra_income_db_name as extra_income_db_name
|
|
14
|
+
import mns_scheduler.extraIncome.us.one_minute.api.alpha_vantage_api as alpha_vantage_api
|
|
15
|
+
|
|
16
|
+
mongodb_util_27017 = MongodbUtil('27017')
|
|
17
|
+
mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def handle_fail_data():
|
|
21
|
+
query = {"type": "ETF", }
|
|
22
|
+
fail_df = mongodb_util_27017.find_query_data('us_stock_one_minute_down_load_fail', query)
|
|
23
|
+
|
|
24
|
+
for stock_one in fail_df.itertuples():
|
|
25
|
+
try:
|
|
26
|
+
|
|
27
|
+
now_year = stock_one.now_year
|
|
28
|
+
now_month = stock_one.now_month
|
|
29
|
+
symbol = stock_one.symbol
|
|
30
|
+
id_key = symbol + '_' + now_month
|
|
31
|
+
path = r'F:\us_etf\one_minute\{}'.format(now_year)
|
|
32
|
+
if not os.path.exists(path):
|
|
33
|
+
os.makedirs(path)
|
|
34
|
+
|
|
35
|
+
path = path + '\{}'.format(now_month)
|
|
36
|
+
if not os.path.exists(path):
|
|
37
|
+
os.makedirs(path)
|
|
38
|
+
|
|
39
|
+
df = alpha_vantage_api.sync_one_minute_data(symbol, now_month)
|
|
40
|
+
df = df.fillna(0)
|
|
41
|
+
df['time'] = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S')
|
|
42
|
+
df['str_day'] = df['time'].str.slice(0, 10)
|
|
43
|
+
df['minute'] = df['time'].str.slice(11, 19)
|
|
44
|
+
df['_id'] = symbol + "_" + df['time']
|
|
45
|
+
df['symbol'] = symbol
|
|
46
|
+
df_export_df = df.copy()
|
|
47
|
+
export_original_data(df_export_df, symbol, path)
|
|
48
|
+
logger.info("同步股票分钟票数据完成:{}", stock_one.symbol)
|
|
49
|
+
query = {"_id": id_key}
|
|
50
|
+
mongodb_util_27017.remove_data(query, 'us_stock_one_minute_down_load_fail')
|
|
51
|
+
except BaseException as e:
|
|
52
|
+
logger.error("同步股票分钟数据出现异常:,{},{},{}", e, symbol, now_month)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def export_original_data(df, symbol, path):
|
|
56
|
+
file_name = path + '\{}.csv'.format(symbol)
|
|
57
|
+
if data_frame_util.is_not_empty(df):
|
|
58
|
+
df = df.dropna(subset=['_id'])
|
|
59
|
+
del df['str_day']
|
|
60
|
+
del df['minute']
|
|
61
|
+
del df['_id']
|
|
62
|
+
del df['symbol']
|
|
63
|
+
df.to_csv(file_name, index=False, encoding='utf-8')
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == '__main__':
|
|
67
|
+
handle_fail_data()
|