# coding:utf-8
#
# The MIT License (MIT)
#
# Copyright (c) 2016-2021 yutiansut/QUANTAXIS
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import concurrent
import datetime
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import json
import pandas as pd
import pymongo
from QUANTAXIS.QAFetch import QA_fetch_get_stock_block
from QUANTAXIS.QAFetch.QATdx import (
QA_fetch_get_option_day,
QA_fetch_get_option_min,
QA_fetch_get_index_day,
QA_fetch_get_index_min,
QA_fetch_get_stock_day,
QA_fetch_get_stock_info,
QA_fetch_get_stock_list,
QA_fetch_get_future_list,
QA_fetch_get_index_list,
QA_fetch_get_future_day,
QA_fetch_get_future_min,
QA_fetch_get_stock_min,
QA_fetch_get_stock_transaction,
QA_fetch_get_index_transaction,
QA_fetch_get_stock_xdxr,
QA_fetch_get_bond_day,
QA_fetch_get_bond_list,
QA_fetch_get_bond_min,
select_best_ip,
QA_fetch_get_hkstock_day,
QA_fetch_get_hkstock_list,
QA_fetch_get_hkstock_min,
QA_fetch_get_usstock_list,
QA_fetch_get_usstock_day,
QA_fetch_get_usstock_min,
)
from QUANTAXIS.QAFetch.QATdx import (
QA_fetch_get_commodity_option_AL_contract_time_to_market,
QA_fetch_get_commodity_option_AU_contract_time_to_market,
QA_fetch_get_commodity_option_CU_contract_time_to_market,
QA_fetch_get_commodity_option_SR_contract_time_to_market,
QA_fetch_get_commodity_option_M_contract_time_to_market,
QA_fetch_get_commodity_option_RU_contract_time_to_market,
QA_fetch_get_commodity_option_CF_contract_time_to_market,
QA_fetch_get_commodity_option_C_contract_time_to_market,
QA_fetch_get_option_50etf_contract_time_to_market,
QA_fetch_get_option_300etf_contract_time_to_market,
QA_fetch_get_option_all_contract_time_to_market,
QA_fetch_get_option_list,
)
from QUANTAXIS.QAUtil import (
DATABASE,
QA_util_get_next_day,
QA_util_get_real_date,
QA_util_log_info,
QA_util_to_json_from_pandas,
trade_date_sse
)
from QUANTAXIS.QAData.data_fq import _QA_data_stock_to_fq
from QUANTAXIS.QAFetch.QAQuery import QA_fetch_stock_day
from QUANTAXIS.QAUtil import Parallelism
from QUANTAXIS.QAFetch.QATdx import ping, get_ip_list_by_multi_process_ping, stock_ip_list
from multiprocessing import cpu_count
# ip=select_best_ip()
def now_time():
return str(QA_util_get_real_date(str(datetime.date.today() - datetime.timedelta(days=1)), trade_date_sse, -1)) + \
' 17:00:00' if datetime.datetime.now().hour < 15 else str(QA_util_get_real_date(
str(datetime.date.today()), trade_date_sse, -1)) + ' 15:00:00'
def QA_SU_save_single_stock_day(code : str, client= DATABASE, ui_log=None):
'''
save single stock_day
保存单个股票日线数据
:param code: 要保存数据的股票代码
:param client:
:param ui_log: 给GUI qt 界面使用
:param ui_progress: 给GUI qt 界面使用
'''
#stock_list = QA_fetch_get_stock_list().code.unique().tolist()
coll_stock_day = client.stock_day
coll_stock_day.create_index(
[("code",
pymongo.ASCENDING),
("date_stamp",
pymongo.ASCENDING)]
)
err = []
def __saving_work(code, coll_stock_day):
try:
QA_util_log_info(
'##JOB01 Now Saving STOCK_DAY==== {}'.format(str(code)),
ui_log
)
# 首选查找数据库 是否 有 这个代码的数据
ref = coll_stock_day.find({'code': str(code)[0:6]})
end_date = str(now_time())[0:10]
# 当前数据库已经包含了这个代码的数据, 继续增量更新
# 加入这个判断的原因是因为如果股票是刚上市的 数据库会没有数据 所以会有负索引问题出现
if ref.count() > 0:
# 接着上次获取的日期继续更新
start_date = ref[ref.count() - 1]['date']
QA_util_log_info(
'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'
.format(code,
start_date,
end_date),
ui_log
)
if start_date != end_date:
coll_stock_day.insert_many(
QA_util_to_json_from_pandas(
QA_fetch_get_stock_day(
str(code),
QA_util_get_next_day(start_date),
end_date,
'00'
)
)
)
# 当前数据库中没有这个代码的股票数据, 从1990-01-01 开始下载所有的数据
else:
start_date = '1990-01-01'
QA_util_log_info(
'UPDATE_STOCK_DAY \n Trying updating {} from {} to {}'
.format(code,
start_date,
end_date),
ui_log
)
if start_date != end_date:
coll_stock_day.insert_many(
QA_util_to_json_from_pandas(
QA_fetch_get_stock_day(
str(code),
start_date,
end_date,
'00'
)
)
)
except Exception as error0:
print(error0)
err.append(str(code))
__saving_work(code, coll_stock_day)
if len(err) < 1:
QA_util_log_info('SUCCESS save stock day ^_^', ui_log)
else:
QA_util_log_info('ERROR CODE \n ', ui_log)
QA_util_log_info(err, ui_log)
def QA_SU_save_stock_day(client=DATABASE, ui_log=None, ui_progress=None):
'''
save stock_day
保存日线数据
:param client:
:param ui_log: 给GUI qt 界面使用
:param ui_progress: 给GUI qt 界面使用
:param ui_progress_int_value: 给GUI qt 界面使用
'''
stock_list = QA_fetch_get_stock_list().code.unique().tolist()
coll_stock_day = client.stock_day
coll_stock_day.create_index(
[("code",
pymongo.ASCENDING),
("date_stamp",
pymongo.ASCENDING)]
)
err = []
def __saving_work(code, coll_stock_day):
try:
QA_util_log_info(
'##JOB01 Now Saving STOCK_DAY==== {}'.format(str(code)),
ui_log
)
# 首选查找数据库 是否 有 这个代码的数据
ref = coll_stock_day.find({'code': str(code)[0:6]})
end_date = str(now_time())[0:10]
# 当前数据库已经包含了这个代码的数据, 继续增量更新
# 加入这个判断的原因是因为如果股票是刚上市的 数�