Пример #1
0
 async def get_quotation(self,
                         code=None,
                         start=None,
                         end=None,
                         frequence=None,
                         market=MARKET_TYPE.STOCK_CN,
                         source=None,
                         output=None):
     if market is MARKET_TYPE.STOCK_CN:
         if frequence is FREQUENCE.DAY:
             if source is DATASOURCE.MONGO:
                 res = await QAQueryAsync.QA_fetch_stock_day(
                     code, start, end)
             elif source is DATASOURCE.TDX:
                 res = QATdx.QA_fetch_get_stock_day(code,
                                                    start,
                                                    end,
                                                    frequence=frequence)
         elif frequence in [
                 FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN,
                 FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN,
                 FREQUENCE.SIXTY_MIN
         ]:
             if source is DATASOURCE.MONGO:
                 res = await QAQueryAsync.QA_fetch_stock_min(
                     code, start, end, frequence=frequence)
             elif source is DATASOURCE.TDX:
                 res = QATdx.QA_fetch_get_stock_min(code,
                                                    start,
                                                    end,
                                                    frequence=frequence)
     return res
Пример #2
0
def QA_get_tick(code, start, end, market):
    """
    统一的获取期货/股票tick的接口
    """
    res = None
    if market == MARKET_TYPE.STOCK_CN:
        res = QATdx.QA_fetch_get_stock_transaction(code, start, end)
    elif market == MARKET_TYPE.FUTURE_CN:
        res = QATdx.QA_fetch_get_future_transaction(code, start, end)
    return res
Пример #3
0
def QA_get_realtime(code, market):
    """
    统一的获取期货/股票实时行情的接口
    """
    res = None
    if market == MARKET_TYPE.STOCK_CN:
        res = QATdx.QA_fetch_get_stock_realtime(code)
    elif market == MARKET_TYPE.FUTURE_CN:
        res = QATdx.QA_fetch_get_future_realtime(code)

    return res
Пример #4
0
def QA_quotation(code, start, end, frequence, market, source, output):
    """一个统一的fetch

    Arguments:
        code {str/list} -- 证券/股票的代码
        start {str} -- 开始日期
        end {str} -- 结束日期
        frequence {enum} -- 频率 QA.FREQUENCE
        market {enum} -- 市场 QA.MARKET_TYPE
        source {enum} -- 来源 QA.DATASOURCE
        output {enum} -- 输出类型 QA.OUTPUT_FORMAT

    """
    if market is MARKET_TYPE.STOCK_CN:
        if frequence is FREQUENCE.DAY:
            if source is DATASOURCE.MONGO:
                res = QAQueryAdv.QA_fetch_stock_day_adv(code, start, end)
            elif source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_day(code, start, end, '00')
            elif source is DATASOURCE.TUSHARE:
                res = QATushare.QA_fetch_get_stock_day(code, start, end, '00')
        elif frequence in [
                FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN,
                FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN
        ]:
            if source is DATASOURCE.MONGO:
                res = QAQueryAdv.QA_fetch_stock_min_adv(code,
                                                        start,
                                                        end,
                                                        frequence=frequence)
            elif source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_min(code,
                                                   start,
                                                   end,
                                                   frequence=frequence)
        elif frequence is FREQUENCE.TICK:
            if source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_transaction(code, start, end)

    # 指数代码和股票代码是冲突重复的,  sh000001 上证指数  000001 是不同的
    elif market is MARKET_TYPE.INDEX_CN:
        if frequence is FREQUENCE.DAY:
            if source is DATASOURCE.MONGO:
                res = QAQueryAdv.QA_fetch_index_day_adv(code, start, end)

    elif market is MARKET_TYPE.OPTION_CN:
        if source is DATASOURCE.MONGO:
            #res = QAQueryAdv.QA_fetch_option_day_adv(code, start, end)
            raise NotImplementedError('CURRENT NOT FINISH THIS METHOD')
    # print(type(res))
    return res
Пример #5
0
    def test_cache(self):
        # 测试内存缓存变量
        from QUANTAXIS.QAUtil.QASetting import DATABASE, stock_ip_list, \
            future_ip_list
        best_ip = select_best_ip()
        stockips = QATdx.get_ip_list_by_multi_process_ping(stock_ip_list,
                                                           _type='stock')
        stockip = QATdx.get_ip_list_by_ping(stock_ip_list, _type='stock')
        self.assertTrue(stockip == stockips[0],
                        '没有使用缓存: {} {}'.format(stockip, stockips[0]))

        futurips = QATdx.get_ip_list_by_multi_process_ping(future_ip_list,
                                                           _type='future')
        futurip = QATdx.get_ip_list_by_ping(future_ip_list, _type='future')
        self.assertTrue(futurip == futurips[0],
                        '没有使用缓存: {} {}'.format(futurip, futurips[0]))

        stockips = QATdx.get_ip_list_by_multi_process_ping(stock_ip_list,
                                                           _type='stock')
        futurips = QATdx.get_ip_list_by_multi_process_ping(future_ip_list,
                                                           _type='future')
        stockips = QATdx.get_ip_list_by_multi_process_ping(stock_ip_list,
                                                           _type='stock')
        futurips = QATdx.get_ip_list_by_multi_process_ping(future_ip_list,
                                                           _type='future')
Пример #6
0
 def get_info(self, code, frequence, market, source, output):
     if source is DATASOURCE.TDX:
         res = QATdx.QA_fetch_get_stock_info(code, self.best_ip)
         return res
     elif source is DATASOURCE.MONGO:
         res = QAQuery.QA_fetch_stock_info(
             code, format=output, collections=self.database.stock_info)
         return res
Пример #7
0
    def __init__(self, uri='mongodb://127.0.0.1:27017/quantaxis', username='', password=''):
        """
        初始化的时候 会初始化
        """

        self.database = QA_util_sql_mongo_setting(uri).quantaxis
        self.history = {}
        self.best_ip = QATdx.select_best_ip()
Пример #8
0
 def __init__(self, ip='127.0.0.1', port=27017, username='',password=''):
     """
     初始化的时候 会初始化
     """
     self.ip = ip
     self.port = port
     self.database = QA_util_sql_mongo_setting(ip, port).quantaxis
     self.history = {}
     self.best_ip=QATdx.select_best_ip()
Пример #9
0
 def __init__(self, ip='127.0.0.1', port=27017, username='', password=''):
     """
     初始化的时候 会初始化
     """
     self.ip = ip
     self.port = port
     self.database = QA_util_sql_mongo_setting(ip, port).quantaxis
     self.history = {}
     self.best_ip = QATdx.select_best_ip()
Пример #10
0
def QA_SU_save_future_min(engine, client=DATABASE):
    err_timeout_product_list = []
    err_unknown_product_list = []
    succ_product_list = []
    no_data_list = []
    QA_util_log_info('Updating future min, total %d products' %
                     len(future_product_list))

    for index, product_code in enumerate(future_product_list):
        col = QASETTING.client.future_1min[product_code]
        col.create_index([('datetime', pymongo.DESCENDING)], unique=True)
        ref = col.find({
            "code": product_code
        }).sort('datetime', pymongo.DESCENDING)
        start = '%s %s' % (DEFAULT_START_DATE, DEFAULT_START_TIME)
        if ref.count() > 0:
            start = ref.next()['datetime']
            col.delete_one({'datetime': start})
        end = time.strftime('%Y-%m-%d %H:%M:%S')
        if start != end:
            try:
                print('UPDATE %s from %s to %s' % (product_code, start, end),
                      end="")
                future_df = QATdx.QA_fetch_get_future_min(product_code,
                                                          start=start,
                                                          end=end)
                if len(future_df) > 0:
                    future_json = future_df.to_json(orient='records')
                    col.insert_many(json.loads(future_json))
                    print(' OK!')
                else:
                    no_data_list.append(product_code)
                    print(' NO DATA FROM TDX!')
                succ_product_list.append(product_code)
            except socket.timeout as ex:
                err_timeout_product_list.append('%s: error.socket.timeout' %
                                                product_code)
                print(' TIMEOUT!')
            except Exception as ex:
                err_unknown_product_list.append('%s: %s\n %s' %
                                                (product_code, ex, future_df))
                print(' UNKNOWN_ERROR!')
        else:
            print('%s is up to date %s' % (product_code, end))
    QA_util_log_info(
        'Update future_min completed!\nTotal succeed: %d\n Total error:%d' %
        (len(succ_product_list),
         len(err_timeout_product_list) + len(err_unknown_product_list)))
    if len(err_timeout_product_list) > 0:
        for each_err_log in err_timeout_product_list:
            QA_util_log_info(each_err_log)
    if len(err_unknown_product_list) > 0:
        for each_err_log in err_unknown_product_list:
            QA_util_log_info(each_err_log)
    if len(no_data_list) > 0:
        QA_util_log_info('No data from TDX: %s' % no_data_list)
Пример #11
0
def get_stock_day(code,
                  start_date,
                  end_date,
                  if_fq='00',
                  frequence='day',
                  ip=None,
                  port=None):
    # print(code, ip, port)
    return tdx.QA_fetch_get_stock_day(code, start_date, end_date, if_fq,
                                      frequence, ip, port)
Пример #12
0
def QA_quotation(code, start, end, frequence, market, source, output):
    """一个统一的fetch

    Arguments:
        code {str/list} -- 证券/股票的代码
        start {str} -- 开始日期
        end {str} -- 结束日期
        frequence {enum} -- 频率 QA.FREQUENCE
        market {enum} -- 市场 QA.MARKET_TYPE
        source {enum} -- 来源 QA.DATASOURCE
        output {enum} -- 输出类型 QA.OUTPUT_FORMAT

    """
    if market is MARKET_TYPE.STOCK_CN:
        if frequence is FREQUENCE.DAY:
            if source is DATASOURCE.MONGO:
                res = QAQueryAdv.QA_fetch_stock_day_adv(code, start, end)
            elif source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_day(code, start, end, '00')
            elif source is DATASOURCE.TUSHARE:
                res = QATushare.QA_fetch_get_stock_day(code, start, end, '00')
        elif frequence in [
                FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN,
                FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN
        ]:
            if source is DATASOURCE.MONGO:
                res = QAQueryAdv.QA_fetch_stock_min_adv(code,
                                                        start,
                                                        end,
                                                        frequence=frequence)
            elif source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_min(code,
                                                   start,
                                                   end,
                                                   frequence=frequence)
        elif frequence is FREQUENCE.TICK:
            if source is DATASOURCE.TDX:
                res = QATdx.QA_fetch_get_stock_transaction(code, start, end)
    print(type(res))
    return res
Пример #13
0
def QA_fetch_get_security_bars(code, _type, lens):
    return QATdx.QA_fetch_get_security_bars(code, _type, lens)
Пример #14
0
def get_stock_day_map(x):
    return tdx.QA_fetch_get_stock_day(x[0], x[1], x[2], x[3], x[4], x[5], x[6])
Пример #15
0
def QA_quotation(code, start, end, frequence, market, source=DATASOURCE.TDX, output=OUTPUT_FORMAT.DATAFRAME):
    """一个统一的获取k线的方法
    如果使用mongo,从本地数据库获取,失败则在线获取

    Arguments:
        code {str/list} -- 期货/股票的代码
        start {str} -- 开始日期
        end {str} -- 结束日期
        frequence {enum} -- 频率 QA.FREQUENCE
        market {enum} -- 市场 QA.MARKET_TYPE
        source {enum} -- 来源 QA.DATASOURCE
        output {enum} -- 输出类型 QA.OUTPUT_FORMAT
    """
    res = None
    if market == MARKET_TYPE.STOCK_CN:
        if frequence == FREQUENCE.DAY:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_stock_day_adv(code, start, end)
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_stock_day(code, start, end, '00')
                res = QA_DataStruct_Stock_day(res.set_index(['date', 'code']))
            elif source == DATASOURCE.TUSHARE:
                res = QATushare.QA_fetch_get_stock_day(code, start, end, '00')
        elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_stock_min_adv(
                        code, start, end, frequence=frequence)
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_stock_min(
                    code, start, end, frequence=frequence)
                res = QA_DataStruct_Stock_min(
                    res.set_index(['datetime', 'code']))

    elif market == MARKET_TYPE.FUTURE_CN:
        if frequence == FREQUENCE.DAY:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_future_day_adv(code, start, end)
                except:
                    res = None
            if source == DATASOURCE.TDX or res is None:
                res = QATdx.QA_fetch_get_future_day(code, start, end)
                res = QA_DataStruct_Future_day(res.set_index(['date', 'code']))
        elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_future_min_adv(
                        code, start, end, frequence=frequence)
                except:
                    res = None
            if source == DATASOURCE.TDX or res is None:
                res = QATdx.QA_fetch_get_future_min(
                    code, start, end, frequence=frequence)
                res = QA_DataStruct_Future_min(
                    res.set_index(['datetime', 'code']))

    elif market == MARKET_TYPE.INDEX_CN:
        if frequence == FREQUENCE.DAY:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_index_day_adv(code, start, end)
                except:
                    return None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_index_day(code, start, end)
                res = QA_DataStruct_Index_day(res.set_index(['date', 'code']))
        elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_index_min_adv(
                        code, start, end, frequence=frequence)
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_index_min(
                    code, start, end, frequence=frequence)
                res = QA_DataStruct_Index_min(
                    res.set_index(['datetime', 'code']))

    elif market == MARKET_TYPE.OPTION_CN:
        if source == DATASOURCE.MONGO:
            #res = QAQueryAdv.QA_fetch_option_day_adv(code, start, end)
            raise NotImplementedError('CURRENT NOT FINISH THIS METHOD')
    # print(type(res))

    if output is OUTPUT_FORMAT.DATAFRAME:
        return res.data
    elif output is OUTPUT_FORMAT.DATASTRUCT:
        return res
    elif output is OUTPUT_FORMAT.NDARRAY:
        return res.to_numpy()
    elif output is OUTPUT_FORMAT.JSON:
        return res.to_json()
    elif output is OUTPUT_FORMAT.LIST:
        return res.to_list()
Пример #16
0
def QA_quotation_adv(code, start, end=save_tdx.now_time(), frequence='1min',
                     market=MARKET_TYPE.STOCK_CN, source=DATASOURCE.AUTO, output=OUTPUT_FORMAT.DATAFRAME):
    """一个统一的获取k线的方法
    如果source=DATASOURCE.AUTO,优先mongo,从本地数据库获取,mongo中未下载的数据从TDX中在线补全。(仅限股票)

    Arguments:
        code {str/list} -- 期货/股票的代码
        start {str} -- 开始日期
        end {str} -- 结束日期
        frequence {enum} -- 频率 QA.FREQUENCE
        market {enum} -- 市场 QA.MARKET_TYPE
        source {enum} -- 来源 QA.DATASOURCE
        output {enum} -- 输出类型 QA.OUTPUT_FORMAT 
    """
    if pd.Timestamp(end) > pd.Timestamp(save_tdx.now_time()):
        end = save_tdx.now_time()
    res = None
    if market == MARKET_TYPE.STOCK_CN:
        if frequence == FREQUENCE.DAY or frequence == FREQUENCE.WEEK:
            if source == DATASOURCE.AUTO:
                try:
                    # 返回的是QA_DataStruct_Stock_day对象,为了与在线获取的数据格式保持统一,转成单索引
                    res = QAQueryAdv.QA_fetch_stock_day_adv(
                        code, start, end).data.reset_index(level='code')
                    # res = QAQueryAdv.QA_fetch_stock_day_adv(
                    #     code, start, end).data.reset_index(level='code')[:14]
                    start_date = res.index[-1]
                    end_date = pd.Timestamp(end)
                    if end_date-start_date > datetime.timedelta(hours=17):
                        # 从TDX补充数据,由于仅考虑个股,在这里不做入库操作,入库还是需要save
                        data_tdx = QATdx.QA_fetch_get_stock_day(
                            code, QA_util_get_next_period(start_date, frequence), end_date, '00')
                        # data_tdx与从数据库获取的数据格式上做一些统一。
                        data_tdx = data_tdx.rename(columns={"vol": "volume"}).drop([
                            'date', 'date_stamp'], axis=1)
                        data_tdx.index = pd.to_datetime(data_tdx.index)
                        res = pd.concat([res, data_tdx], sort=True)
                    res = QA_DataStruct_Stock_day(
                        res.reset_index().set_index(['date', 'code']))
                except:
                    res = None
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_stock_day_adv(code, start, end)
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_stock_day(code, start, end, '00')
                res = QA_DataStruct_Stock_day(res.set_index(['date', 'code']))
            elif source == DATASOURCE.TUSHARE:
                res = QATushare.QA_fetch_get_stock_day(code, start, end, '00')
            if frequence == FREQUENCE.WEEK:
                res = QA_DataStruct_Stock_day(
                    QA_data_day_resample(res.data))
        elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.AUTO:
                try:
                    # 返回的是QA_DataStruct_Stock_day对象,为了与在线获取的数据格式保持统一,转成单索引
                    res = QAQueryAdv.QA_fetch_stock_min_adv(
                        code, start, end, frequence=frequence).data.reset_index(level='code')
                    # res = QAQueryAdv.QA_fetch_stock_min_adv(
                    #     code, start, end, frequence=frequence).data.reset_index(level='code')[:710]
                    start_date = res.index[-1]
                    end_date = pd.Timestamp(end)
                    if end_date > start_date:
                        # 从TDX补充数据,由于仅考虑个股,在这里不做入库操作,入库还是需要save
                        data_tdx = QATdx.QA_fetch_get_stock_min(code, QA_util_get_next_period(
                            start_date, frequence), end_date, frequence=frequence)
                        # data_tdx与从数据库获取的数据格式上做一些统一。
                        data_tdx = data_tdx.rename(columns={"vol": "volume"}).drop(
                            ['date', 'datetime', 'date_stamp', 'time_stamp'], axis=1)
                        data_tdx.index = pd.to_datetime(data_tdx.index)
                        res = pd.concat([res, data_tdx], sort=True)
                    res = QA_DataStruct_Stock_day(
                        res.reset_index().set_index(['datetime', 'code']))
                except:
                    res = None
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_stock_min_adv(
                        code,
                        start,
                        end,
                        frequence=frequence
                    )
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_stock_min(
                    code,
                    start,
                    end,
                    frequence=frequence
                )
                res = QA_DataStruct_Stock_min(
                    res.set_index(['datetime',
                                   'code'])
                )

    elif market == MARKET_TYPE.FUTURE_CN:
        if frequence == FREQUENCE.DAY:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_future_day_adv(code, start, end)
                except:
                    res = None
            if source == DATASOURCE.TDX or res is None:
                res = QATdx.QA_fetch_get_future_day(code, start, end)
                res = QA_DataStruct_Future_day(res.set_index(['date', 'code']))
        elif frequence in [FREQUENCE.ONE_MIN,
                           FREQUENCE.FIVE_MIN,
                           FREQUENCE.FIFTEEN_MIN,
                           FREQUENCE.THIRTY_MIN,
                           FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_future_min_adv(
                        code,
                        start,
                        end,
                        frequence=frequence
                    )
                except:
                    res = None
            if source == DATASOURCE.TDX or res is None:
                res = QATdx.QA_fetch_get_future_min(
                    code,
                    start,
                    end,
                    frequence=frequence
                )
                res = QA_DataStruct_Future_min(
                    res.set_index(['datetime',
                                   'code'])
                )

    elif market == MARKET_TYPE.INDEX_CN:
        if frequence == FREQUENCE.DAY:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_index_day_adv(code, start, end)
                except:
                    return None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_index_day(code, start, end)
                res = QA_DataStruct_Index_day(res.set_index(['date', 'code']))
        elif frequence in [FREQUENCE.ONE_MIN,
                           FREQUENCE.FIVE_MIN,
                           FREQUENCE.FIFTEEN_MIN,
                           FREQUENCE.THIRTY_MIN,
                           FREQUENCE.SIXTY_MIN]:
            if source == DATASOURCE.MONGO:
                try:
                    res = QAQueryAdv.QA_fetch_index_min_adv(
                        code,
                        start,
                        end,
                        frequence=frequence
                    )
                except:
                    res = None
            if source == DATASOURCE.TDX or res == None:
                res = QATdx.QA_fetch_get_index_min(
                    code,
                    start,
                    end,
                    frequence=frequence
                )
                res = QA_DataStruct_Index_min(
                    res.set_index(['datetime',
                                   'code'])
                )

    elif market == MARKET_TYPE.OPTION_CN:
        if source == DATASOURCE.MONGO:
            #res = QAQueryAdv.QA_fetch_option_day_adv(code, start, end)
            raise NotImplementedError('CURRENT NOT FINISH THIS METHOD')
    # print(type(res))

    if output is OUTPUT_FORMAT.DATAFRAME:
        return res.data
    elif output is OUTPUT_FORMAT.DATASTRUCT:
        return res
    elif output is OUTPUT_FORMAT.NDARRAY:
        return res.to_numpy()
    elif output is OUTPUT_FORMAT.JSON:
        return res.to_json()
    elif output is OUTPUT_FORMAT.LIST:
        return res.to_list()
Пример #17
0
import QUANTAXIS as QA
from QUANTAXIS.QAUtil import (QASETTING, QA_util_log_info)
from QUANTAXIS.QAFetch import QATdx
import pymongo, time, json
import socket
from QUANTAXIS.QAUtil.QASetting import DATABASE

DEFAULT_START_DATE = '1990-01-01'
DEFAULT_START_TIME = '00:00:00'

future_product_list = QATdx.QA_fetch_get_future_list().code


def QA_SU_save_future_day(engine, client=DATABASE):
    err_timeout_product_list = []
    err_unknown_product_list = []
    no_data_list = []
    succ_product_list = []
    QA_util_log_info('Updating future day, total %d products' %
                     len(future_product_list))

    for index, product_code in enumerate(future_product_list):
        col = QASETTING.client.future_day[product_code]
        col.create_index([('date', pymongo.DESCENDING)], unique=True)
        ref = col.find({"code": product_code}).sort('date', pymongo.DESCENDING)
        start_date = DEFAULT_START_DATE
        if ref.count() > 0:
            start_date = ref.next()['date']
            col.delete_one({'date': start_date})
        end_date = time.strftime('%Y-%m-%d')
        if start_date != end_date:
Пример #18
0
import time

import QUANTAXIS.QAFetch.QATdx as tdx
import QUANTAXIS as QA

code = ['600831','000755']
hold = {'600831': [100, 12.16, 13.23],'000755':[100,5.63,6.32]}
columns = ['datetime', 'last_close', 'price', 'open','high','low']

names={}
for c in code:
    names[c]=QA.QA_fetch_stock_list_adv().loc[c]['name']

while True:
    try:
        df = tdx.QA_fetch_get_stock_realtime(code=code)[columns]
        df['buy'] = 0.0
        df['count'] = 0
        df['profit'] = 0.0
        df['target'] = 0.0
        df['name']=''
        for c, value in hold.items():
            df.at[c, 'name']=names[c]
            df.at[c, 'buy'] = value[1]
            df.at[c, 'count'] = value[0]
            df.at[c, 'target'] = value[2]
        df['profit'] = (df['price'] - df['buy']) * df['count']
        print(df)
        print(''.join(['-' for i in range(115)]))
    except:
        continue
Пример #19
0
    def test_QA_fetch_get_stock_day(self):

        #读取 dad 日线数据
        df_from_dad = self.extraDataFromDAD(
            self.test_day_k_line_dad_file_name[0])

        df_from_tdx = QATdx.QA_fetch_get_stock_day(
            code="600000",
            start_date=self.test_day_k_line_dates[0],
            end_date=self.test_day_k_line_dates[0])
        for idx_from_df_tdx in df_from_tdx.index:

            print(idx_from_df_tdx)

            #for idx_from_df_dad in df_from_dad.index:

            open_price1 = df_from_tdx.loc[idx_from_df_tdx, "open"]
            close_price1 = df_from_tdx.loc[idx_from_df_tdx, "close"]
            high_price1 = df_from_tdx.loc[idx_from_df_tdx, "high"]
            low_price1 = df_from_tdx.loc[idx_from_df_tdx, "low"]
            volume1 = df_from_tdx.loc[idx_from_df_tdx, "vol"]
            amount1 = df_from_tdx.loc[idx_from_df_tdx, "amount"]
            date1 = df_from_tdx.loc[idx_from_df_tdx, "date"]

            #fix here 构造和 QA_fetch_get_stock_day 返回一样类型的 dataframe 直接比较

            open_price2 = df_from_dad.loc["SH600000", "open"]
            close_price2 = df_from_dad.loc["SH600000", "close"]
            high_price2 = df_from_dad.loc["SH600000", "high"]
            low_price2 = df_from_dad.loc["SH600000", "low"]
            volume2 = df_from_dad.loc["SH600000", "volumn"]
            amount2 = df_from_dad.loc["SH600000", "turn"]
            date2 = df_from_dad.loc["SH600000", "date"]

            self.assertEqual(open_price1, round(open_price2, 2))
            self.assertEqual(close_price1, round(close_price2, 2))
            self.assertEqual(high_price1, round(high_price2, 2))
            self.assertEqual(low_price1, round(low_price2, 2))
            # 成交量和成交额 总是有误差 ??
            #self.assertEqual( volume1 , volume2 )
            #self.assertEqual( amount1 , amount2)
            self.assertEqual(date1, date2)

        df_from_tdx = QATdx.QA_fetch_get_stock_day(
            code="300439",
            start_date=self.test_day_k_line_dates[0],
            end_date=self.test_day_k_line_dates[0])
        for idx_from_df_tdx in df_from_tdx.index:
            print(idx_from_df_tdx)

            # for idx_from_df_dad in df_from_dad.index:
            open_price1 = df_from_tdx.loc[idx_from_df_tdx, "open"]
            close_price1 = df_from_tdx.loc[idx_from_df_tdx, "close"]
            high_price1 = df_from_tdx.loc[idx_from_df_tdx, "high"]
            low_price1 = df_from_tdx.loc[idx_from_df_tdx, "low"]
            volume1 = df_from_tdx.loc[idx_from_df_tdx, "vol"]
            amount1 = df_from_tdx.loc[idx_from_df_tdx, "amount"]
            date1 = df_from_tdx.loc[idx_from_df_tdx, "date"]

            # fix here 构造和 QA_fetch_get_stock_day 返回一样类型的 dataframe 直接比较
            open_price2 = df_from_dad.loc["SZ300439", "open"]
            close_price2 = df_from_dad.loc["SZ300439", "close"]
            high_price2 = df_from_dad.loc["SZ300439", "high"]
            low_price2 = df_from_dad.loc["SZ300439", "low"]
            volume2 = df_from_dad.loc["SZ300439", "volumn"]
            amount2 = df_from_dad.loc["SZ300439", "turn"]
            date2 = df_from_dad.loc["SZ300439", "date"]

            self.assertEqual(open_price1, round(open_price2, 2))
            self.assertEqual(close_price1, round(close_price2, 2))
            self.assertEqual(high_price1, round(high_price2, 2))
            self.assertEqual(low_price1, round(low_price2, 2))
            # 成交量和成交额 总是有误差 ??
            # self.assertEqual(volume1, volume2)
            # self.assertEqual( amount1 , amount2)
            self.assertEqual(date1, date2)

            #print(idx_from_df_dad)
            #print(type(open_price1), type(close_price1) ,type(high_price1), type(low_price1), type(volume1), type(amount1), type(date1))
        pass
Пример #20
0
    def get_price(self, order_book_id, start, end, freq):
        """
        :param order_book_id: e.g. 000002.XSHE
        :param start: 20160101
        :param end: 20160201
        :param freq: 1m 1d 5m 15m ...
        :returns:
        :rtype: numpy.rec.array
        """
        s = get_str_date_from_int(start)
        e = get_str_date_from_int(end)
        if freq != '1d':
            raise NotImplementedError

        is_index = False
        if ((order_book_id.startswith("0") and order_book_id.endswith(".XSHG"))
                or (order_book_id.startswith("3")
                    and order_book_id.endswith(".XSHE"))):
            is_index = True

        if order_book_id.endswith(".XSHG") or order_book_id.endswith(".XSHE"):
            order_book_id = order_book_id[:6]

        L = list(self.db[is_index and 'index_day' or 'stock_day'].find(
            {
                'code': order_book_id,
                'date': {
                    '$gte': s,
                    '$lte': e
                }
            }, {
                '_id': 0,
                'date_stamp': 0
            }).sort('date', 1))
        df = pd.DataFrame(L)
        df.rename(columns={'vol': 'volume'}, inplace=True)
        del df['code']
        df['volume'] *= 100

        if freq == '1d':
            df["datetime"] = df["date"].apply(
                lambda x: int(x.replace("-", "")) * 1000000)

        df = df[['date', 'open', 'close', 'high', 'low', 'volume', 'datetime']]
        if freq == '1d' and (not is_index):
            E = datetime.datetime.strptime(e, "%Y-%m-%d")
            if not (e in df['date'].values):
                N = datetime.datetime.today()
                if (N.date() - E.date()
                    ).days == 0 and N.weekday() != 5 and N.weekday() != 6:
                    # get realtime
                    T = QATdx.QA_fetch_get_stock_realtime(
                        (order_book_id)).reset_index()
                    T.rename(columns={
                        'price': 'close',
                        'vol': 'volume'
                    },
                             inplace=True)
                    T['date'] = T['datetime'].dt.date.apply(
                        lambda x: x.strftime('%Y-%m-%d'))
                    T["datetime"] = T["date"].apply(
                        lambda x: int(x.replace("-", "")) * 1000000)
                    T["volume"] = T["volume"].apply(lambda x: x * 100.0)
                    T = T[[
                        'date', 'open', 'close', 'high', 'low', 'volume',
                        'datetime'
                    ]]
                    df = pd.concat(objs=[df, T])
                    df = df.reset_index(drop=True)

        arr = df.to_records()
        return arr