mns-scheduler 1.3.1.7__py3-none-any.whl → 1.3.1.9__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/company_info/em_stock_info/sync_em_stock_info_sync.py +5 -4
- mns_scheduler/trade/auto_login/trader_auto_service.py +1 -1
- mns_scheduler/trade/sync_position_api.py +2 -2
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +1 -1
- mns_scheduler/zz_task/data_sync_task.py +2 -43
- {mns_scheduler-1.3.1.7.dist-info → mns_scheduler-1.3.1.9.dist-info}/METADATA +1 -1
- {mns_scheduler-1.3.1.7.dist-info → mns_scheduler-1.3.1.9.dist-info}/RECORD +9 -59
- mns_scheduler/baidu/__init__.py +0 -7
- mns_scheduler/baidu/baidu_yun_pan_handle_service.py +0 -122
- mns_scheduler/extraIncome/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/common/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/common/db_create_index.py +0 -9
- mns_scheduler/extraIncome/a_stock/one_minute/common/symbol_handle_util.py +0 -41
- mns_scheduler/extraIncome/a_stock/one_minute/etf/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/etf/etf_one_minute_sync_task.py +0 -87
- mns_scheduler/extraIncome/a_stock/one_minute/index/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/index/main_index_sync_task.py +0 -74
- mns_scheduler/extraIncome/a_stock/one_minute/kzz/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/kzz/kzz_one_minute_sync_task.py +0 -87
- mns_scheduler/extraIncome/a_stock/one_minute/one_minute_sync_task.py +0 -34
- mns_scheduler/extraIncome/a_stock/one_minute/stock/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/stock/stock_one_minute_sync_task.py +0 -89
- mns_scheduler/extraIncome/a_stock/one_minute/upload/__init__.py +0 -7
- mns_scheduler/extraIncome/a_stock/one_minute/upload/etf_upload_to_baidu_task.py +0 -95
- mns_scheduler/extraIncome/a_stock/one_minute/upload/index_upload_to_baidu_task.py +0 -87
- mns_scheduler/extraIncome/a_stock/one_minute/upload/kzz_upload_to_baidu_task.py +0 -95
- mns_scheduler/extraIncome/a_stock/one_minute/upload/stock_upload_to_baidu_task.py +0 -85
- mns_scheduler/extraIncome/hk/__init__.py +0 -7
- mns_scheduler/extraIncome/hk/hk_stock_qfq_daily_k_line.py +0 -102
- mns_scheduler/extraIncome/us/__init__.py +0 -7
- mns_scheduler/extraIncome/us/daily/__init__.py +0 -7
- mns_scheduler/extraIncome/us/daily/us_stock_qfq_daily_k_line.py +0 -103
- mns_scheduler/extraIncome/us/one_minute/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/api/__init__.py +0 -0
- mns_scheduler/extraIncome/us/one_minute/api/alpha_vantage_api.py +0 -34
- mns_scheduler/extraIncome/us/one_minute/api/em_us_one_minute_api.py +0 -139
- mns_scheduler/extraIncome/us/one_minute/api/stock_etf_info_api.py +0 -68
- mns_scheduler/extraIncome/us/one_minute/api/y_finance_api.py +0 -63
- mns_scheduler/extraIncome/us/one_minute/etf/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/__init__.py +0 -11
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/down_load_ETF_his_2024.py +0 -152
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/etf/handle_down_load_fail_ETF.py +0 -67
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/fail/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/fail/handle_fail_data.py +0 -161
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/rename/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/rename/rename_stock.py +0 -18
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/down_load_stock_his_01.py +0 -203
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/down_load_stock_his_02.py +0 -202
- mns_scheduler/extraIncome/us/one_minute/stock/down_load/stock/down_load_stock_his_2025.py +0 -144
- mns_scheduler/extraIncome/us/one_minute/stock/now/__init__.py +0 -7
- mns_scheduler/extraIncome/us/one_minute/stock/now/us_etf_one_minute_sync.py +0 -52
- mns_scheduler/extraIncome/us/one_minute/stock/now/us_stock_one_minute_sync.py +0 -141
- {mns_scheduler-1.3.1.7.dist-info → mns_scheduler-1.3.1.9.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.3.1.7.dist-info → mns_scheduler-1.3.1.9.dist-info}/top_level.txt +0 -0
|
@@ -1,102 +0,0 @@
|
|
|
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 mns_common.db.MongodbUtil import MongodbUtil
|
|
10
|
-
from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
|
|
11
|
-
import mns_common.constant.extra_income_db_name as extra_income_db_name
|
|
12
|
-
import mns_common.constant.db_name_constant as db_name_constant
|
|
13
|
-
import akshare as ak
|
|
14
|
-
from loguru import logger
|
|
15
|
-
import mns_scheduler.baidu.baidu_yun_pan_handle_service as baidu_yun_pan_handle_service
|
|
16
|
-
import mns_scheduler.hk.hk_company_info_sync_service_api as hk_company_info_sync_service_api
|
|
17
|
-
|
|
18
|
-
mongodb_util_27017 = MongodbUtil('27017')
|
|
19
|
-
mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def hk_stock_daily_qfq_sync():
|
|
23
|
-
hk_stock_path = '/港股/qfq/'
|
|
24
|
-
hk_stock_exist_df = baidu_yun_pan_handle_service.get_file_folder(hk_stock_path)
|
|
25
|
-
hk_stock_exist_df['symbol'] = hk_stock_exist_df['name'].astype(str).str[:5]
|
|
26
|
-
|
|
27
|
-
hk_stock_info_df = mongodb_util_27017.find_all_data(db_name_constant.EM_HK_STOCK_INFO)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
hk_stock_info_df = hk_stock_info_df.sort_values(by=['amount'], ascending=False)
|
|
31
|
-
del hk_stock_info_df['_id']
|
|
32
|
-
# 上传港股列表
|
|
33
|
-
baidu_yun_pan_handle_service.upload_to_baidu('港股列表', hk_stock_path, hk_stock_info_df)
|
|
34
|
-
hk_ggt_component_df = hk_company_info_sync_service_api.get_hk_ggt_component()
|
|
35
|
-
# 上传港股通列表
|
|
36
|
-
hk_stock_info_ggt_df = hk_stock_info_df.loc[hk_stock_info_df['symbol'].isin(hk_ggt_component_df['symbol'])]
|
|
37
|
-
baidu_yun_pan_handle_service.upload_to_baidu('港股通列表', hk_stock_path, hk_stock_info_ggt_df)
|
|
38
|
-
hk_stock_info_df = hk_stock_info_df.loc[~(hk_stock_info_df['symbol'].isin(hk_stock_exist_df['symbol']))]
|
|
39
|
-
fail_list = []
|
|
40
|
-
|
|
41
|
-
for hk_stock_one in hk_stock_info_df.itertuples():
|
|
42
|
-
symbol = hk_stock_one.symbol
|
|
43
|
-
name = hk_stock_one.name
|
|
44
|
-
try:
|
|
45
|
-
save_one_symbol(symbol, hk_stock_path)
|
|
46
|
-
|
|
47
|
-
except BaseException as e:
|
|
48
|
-
logger.error("同步出现异常:{},{},{}", e, symbol, name)
|
|
49
|
-
fail_list.append(symbol)
|
|
50
|
-
# 处理失败的
|
|
51
|
-
for symbol_fail in fail_list:
|
|
52
|
-
try:
|
|
53
|
-
save_one_symbol(symbol_fail, hk_stock_path)
|
|
54
|
-
except BaseException as e:
|
|
55
|
-
logger.error("同步出现异常:{},{},{}", e, symbol, name)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def save_one_symbol(symbol, hk_stock_path):
|
|
59
|
-
hk_stock_k_line_df = hk_stock_k_line_api(symbol, k_line_period='daily', start_date='18000101',
|
|
60
|
-
end_date='22220101', fq='qfq')
|
|
61
|
-
|
|
62
|
-
hk_stock_k_line_df["date"] = hk_stock_k_line_df["date"].astype(str)
|
|
63
|
-
|
|
64
|
-
hk_stock_k_line_df['_id'] = hk_stock_k_line_df['date'] + '_' + symbol
|
|
65
|
-
hk_stock_k_line_df['symbol'] = symbol
|
|
66
|
-
|
|
67
|
-
query = {'symbol': symbol}
|
|
68
|
-
if mongodbUtilV2_27019.remove_data(query, extra_income_db_name.HK_STOCK_DAILY_QFQ_K_LINE).acknowledged > 0:
|
|
69
|
-
mongodbUtilV2_27019.insert_mongo(hk_stock_k_line_df, extra_income_db_name.HK_STOCK_DAILY_QFQ_K_LINE)
|
|
70
|
-
del hk_stock_k_line_df['_id']
|
|
71
|
-
del hk_stock_k_line_df['symbol']
|
|
72
|
-
# 上传列表
|
|
73
|
-
baidu_yun_pan_handle_service.upload_to_baidu(symbol, hk_stock_path, hk_stock_k_line_df)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def hk_stock_k_line_api(symbol='00001', k_line_period='daily', start_date='18000101',
|
|
77
|
-
end_date='22220101', fq='qfq'):
|
|
78
|
-
stock_hk_hist_df = ak.stock_hk_hist(symbol=symbol,
|
|
79
|
-
period=k_line_period,
|
|
80
|
-
start_date=start_date,
|
|
81
|
-
end_date=end_date,
|
|
82
|
-
adjust=fq)
|
|
83
|
-
stock_hk_hist_df = stock_hk_hist_df.rename(columns={
|
|
84
|
-
"日期": "date",
|
|
85
|
-
"涨跌额": "change_price",
|
|
86
|
-
"涨跌幅": "chg",
|
|
87
|
-
"开盘": "open",
|
|
88
|
-
"最高": "high",
|
|
89
|
-
"最低": "low",
|
|
90
|
-
"收盘": "close",
|
|
91
|
-
"成交量": "volume",
|
|
92
|
-
"成交额": "amount",
|
|
93
|
-
"振幅": "pct_chg",
|
|
94
|
-
"换手率": "exchange"
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
return stock_hk_hist_df
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if __name__ == '__main__':
|
|
101
|
-
# us_stock_k_line_api()
|
|
102
|
-
hk_stock_daily_qfq_sync()
|
|
@@ -1,103 +0,0 @@
|
|
|
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 mns_common.db.MongodbUtil import MongodbUtil
|
|
10
|
-
from mns_common.db.v2.MongodbUtilV2 import MongodbUtilV2
|
|
11
|
-
import mns_common.constant.extra_income_db_name as extra_income_db_name
|
|
12
|
-
import mns_common.constant.db_name_constant as db_name_constant
|
|
13
|
-
import akshare as ak
|
|
14
|
-
from loguru import logger
|
|
15
|
-
import mns_scheduler.baidu.baidu_yun_pan_handle_service as baidu_yun_pan_handle_service
|
|
16
|
-
|
|
17
|
-
mongodb_util_27017 = MongodbUtil('27017')
|
|
18
|
-
mongodbUtilV2_27019 = MongodbUtilV2('27019', extra_income_db_name.EXTRA_INCOME)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def us_stock_daily_qfq_sync():
|
|
22
|
-
us_stock_path = '/美股/qfq/'
|
|
23
|
-
|
|
24
|
-
us_stock_exist_df = baidu_yun_pan_handle_service.get_file_folder(us_stock_path)
|
|
25
|
-
us_stock_exist_df['name'] = us_stock_exist_df['name'].str.replace(r'\.csv$', '', regex=True)
|
|
26
|
-
|
|
27
|
-
em_us_stock_info_df = mongodb_util_27017.find_all_data(db_name_constant.EM_US_STOCK_INFO)
|
|
28
|
-
|
|
29
|
-
# 将列 A 转为字符串,并提取前三位
|
|
30
|
-
em_us_stock_info_df["simple_symbol"] = em_us_stock_info_df["simple_symbol"].astype(str).str[:3]
|
|
31
|
-
em_us_stock_info_df = em_us_stock_info_df.sort_values(by=['amount'], ascending=False)
|
|
32
|
-
# 上传列表
|
|
33
|
-
baidu_yun_pan_handle_service.upload_to_baidu('美股列表', us_stock_path, em_us_stock_info_df)
|
|
34
|
-
|
|
35
|
-
em_us_stock_info_df = em_us_stock_info_df.loc[~em_us_stock_info_df['symbol'].isin(us_stock_exist_df['name'])]
|
|
36
|
-
|
|
37
|
-
fail_list = []
|
|
38
|
-
for us_stock_one in em_us_stock_info_df.itertuples():
|
|
39
|
-
symbol = us_stock_one.symbol
|
|
40
|
-
name = us_stock_one.name
|
|
41
|
-
try:
|
|
42
|
-
save_one_symbol(us_stock_one, us_stock_path, symbol)
|
|
43
|
-
except BaseException as e:
|
|
44
|
-
logger.error("同步出现异常:{},{},{}", e, symbol, name)
|
|
45
|
-
fail_list.append(symbol)
|
|
46
|
-
fail_stock_df = em_us_stock_info_df.loc[em_us_stock_info_df['symbol'].isin(fail_list)]
|
|
47
|
-
|
|
48
|
-
for us_stock_fail_one in fail_stock_df.itertuples():
|
|
49
|
-
symbol = us_stock_fail_one.symbol
|
|
50
|
-
name = us_stock_fail_one.name
|
|
51
|
-
try:
|
|
52
|
-
save_one_symbol(us_stock_fail_one, us_stock_path, symbol)
|
|
53
|
-
except BaseException as e:
|
|
54
|
-
logger.error("同步出现异常:{},{},{}", e, symbol, name)
|
|
55
|
-
fail_list.append(symbol)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def save_one_symbol(us_stock_one, us_stock_path, symbol):
|
|
59
|
-
simple_symbol = us_stock_one.simple_symbol
|
|
60
|
-
code = simple_symbol + '.' + symbol
|
|
61
|
-
|
|
62
|
-
us_stock_k_line_df = us_stock_k_line_api(code, k_line_period='daily', start_date='18000101',
|
|
63
|
-
end_date='22220101', fq='qfq')
|
|
64
|
-
us_stock_k_line_df['_id'] = us_stock_k_line_df['date'] + '_' + symbol
|
|
65
|
-
us_stock_k_line_df['symbol'] = symbol
|
|
66
|
-
|
|
67
|
-
query = {'symbol': symbol}
|
|
68
|
-
if mongodbUtilV2_27019.remove_data(query, extra_income_db_name.US_STOCK_DAILY_QFQ_K_LINE).acknowledged > 0:
|
|
69
|
-
mongodbUtilV2_27019.insert_mongo(us_stock_k_line_df, extra_income_db_name.US_STOCK_DAILY_QFQ_K_LINE)
|
|
70
|
-
del us_stock_k_line_df['_id']
|
|
71
|
-
del us_stock_k_line_df['symbol']
|
|
72
|
-
|
|
73
|
-
# 上传列表
|
|
74
|
-
baidu_yun_pan_handle_service.upload_to_baidu(symbol, us_stock_path, us_stock_k_line_df)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def us_stock_k_line_api(symbol='106.GE', k_line_period='daily', start_date='18000101',
|
|
78
|
-
end_date='22220101', fq='hfq'):
|
|
79
|
-
stock_us_hist_df = ak.stock_us_hist(symbol=symbol,
|
|
80
|
-
period=k_line_period,
|
|
81
|
-
start_date=start_date,
|
|
82
|
-
end_date=end_date,
|
|
83
|
-
adjust=fq)
|
|
84
|
-
stock_us_hist_df = stock_us_hist_df.rename(columns={
|
|
85
|
-
"日期": "date",
|
|
86
|
-
"涨跌额": "change_price",
|
|
87
|
-
"涨跌幅": "chg",
|
|
88
|
-
"开盘": "open",
|
|
89
|
-
"最高": "high",
|
|
90
|
-
"最低": "low",
|
|
91
|
-
"收盘": "close",
|
|
92
|
-
"成交量": "volume",
|
|
93
|
-
"成交额": "amount",
|
|
94
|
-
"振幅": "pct_chg",
|
|
95
|
-
"换手率": "exchange"
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
return stock_us_hist_df
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if __name__ == '__main__':
|
|
102
|
-
# us_stock_k_line_api()
|
|
103
|
-
us_stock_daily_qfq_sync()
|
|
File without changes
|
|
@@ -1,34 +0,0 @@
|
|
|
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 alpha_vantage.timeseries import TimeSeries
|
|
9
|
-
|
|
10
|
-
# 初始化TimeSeries对象
|
|
11
|
-
ts = TimeSeries(key='PP23H4H1059FTUK7', output_format='pandas')
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
# 开始月份 2000-01
|
|
15
|
-
def sync_one_minute_data(symbol, month):
|
|
16
|
-
# 获取分钟数据(以苹果公司股票为例,60分钟间隔)
|
|
17
|
-
data, meta_data = ts.get_intraday(symbol=symbol, interval='1min', outputsize='full', month=month,
|
|
18
|
-
extended_hours='true', adjusted='false')
|
|
19
|
-
|
|
20
|
-
data['time'] = data.index
|
|
21
|
-
data.columns = [
|
|
22
|
-
"open",
|
|
23
|
-
"high",
|
|
24
|
-
"low",
|
|
25
|
-
"close",
|
|
26
|
-
"volume",
|
|
27
|
-
"time",
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
return data
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if __name__ == '__main__':
|
|
34
|
-
sync_one_minute_data('TSLA', '2020-08')
|
|
@@ -1,139 +0,0 @@
|
|
|
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
|
|
@@ -1,68 +0,0 @@
|
|
|
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()
|
|
@@ -1,63 +0,0 @@
|
|
|
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
|
-
proxy = 'http://127.0.0.1:7890'
|
|
10
|
-
|
|
11
|
-
os.environ['HTTP_PROXY'] = proxy
|
|
12
|
-
os.environ['HTTPS_PROXY'] = proxy
|
|
13
|
-
|
|
14
|
-
import yfinance as yf
|
|
15
|
-
|
|
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
|
-
# 雅虎财经获取基本数据方法
|
|
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'
|
|
32
|
-
yf_ticker = yf.Ticker(symbol)
|
|
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)
|
|
39
|
-
df = df[[
|
|
40
|
-
"Open",
|
|
41
|
-
"High",
|
|
42
|
-
"Low",
|
|
43
|
-
"Close",
|
|
44
|
-
"Volume",
|
|
45
|
-
]]
|
|
46
|
-
df['time'] = df.index
|
|
47
|
-
df.columns = [
|
|
48
|
-
"open",
|
|
49
|
-
"high",
|
|
50
|
-
"low",
|
|
51
|
-
"close",
|
|
52
|
-
"volume",
|
|
53
|
-
"time",
|
|
54
|
-
]
|
|
55
|
-
df['time'] = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S')
|
|
56
|
-
# df['str_day'] = df['time'].str.slice(0, 10)
|
|
57
|
-
# df['minute'] = df['time'].str.slice(11, 19)
|
|
58
|
-
return df
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if __name__ == '__main__':
|
|
62
|
-
df=get_us_one_minute('B', '2025-05-01', '2025-05-10')
|
|
63
|
-
print(df)
|
|
@@ -1,11 +0,0 @@
|
|
|
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 akshare as ak
|
|
9
|
-
|
|
10
|
-
us_stock_current_df = ak.stock_us_spot()
|
|
11
|
-
print(us_stock_current_df)
|