mns-scheduler 1.3.1.2__py3-none-any.whl → 1.3.1.7__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 +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/handle_down_load_fail_ETF.py +1 -1
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/fail/handle_fail_data.py +161 -0
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/rename/__init__.py +7 -0
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/rename/rename_stock.py +18 -0
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/__init__.py +7 -0
- 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} +65 -16
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/{down_load_stock_his_2024_01.py → stock/down_load_stock_his_2025.py} +10 -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 +1 -1
- 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 +9 -7
- 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.2.dist-info → mns_scheduler-1.3.1.7.dist-info}/METADATA +1 -1
- mns_scheduler-1.3.1.7.dist-info/RECORD +214 -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.2.dist-info/RECORD +0 -204
- /mns_scheduler/extraIncome/us/one_minute/stock/{his → down_load/fail}/__init__.py +0 -0
- {mns_scheduler-1.3.1.2.dist-info → mns_scheduler-1.3.1.7.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.3.1.2.dist-info → mns_scheduler-1.3.1.7.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
|