예제 #1
0
def get_company_info():
    api = TdxHq_API()
    if api.connect('119.147.212.81', 7709):
        print(api.get_company_info_category(TDXParams.MARKET_SZ,
                                            '000001'))  #查询公司信息目录,参数:市场代码, 股票代码
        api.get_company_info_content(0, '000001',
                                     os.getcwd() + "/tdx_file/" + '000001.txt',
                                     0, 100)  #读取公司信息详情,参数文件路径不知干什么
        print(api.get_finance_info(0, '000001'))  #读取财务信息
        api.disconnect()
예제 #2
0
class TdxData:
    def __init__(self):
        self.api = TdxHq_API(heartbeat=True)
        self.dbUtil = DBUtil.getInstance()

    def get_security_quotes(self, code, type):
        return self.api.get_security_quotes([(type, code)])

    # 支持板块及个股
    def days(self, code, type, bk=False, all=False, day=5):
        category = int(config.getByKey('TDX_CATEGORY'))
        try:
            with self.api.connect(TDX_IP, TDX_PORT):
                data = []
                if all:
                    if bk:
                        for i in range(10):
                            data += self.api.get_index_bars(
                                category, type, code, (9 - i) * 800, 800)
                    else:
                        for i in range(10):
                            data += self.api.get_security_bars(
                                category, type, code, (9 - i) * 800, 800)
                    if len(data) > 0:
                        df = self.api.to_df(data).drop([
                            'amount', 'year', 'month', 'day', 'hour', 'minute'
                        ],
                                                       axis=1)
                        df['trade_date'] = df['datetime'].apply(
                            lambda x: x[0:10].replace('-', ''))
                        df = df.drop(['datetime'], axis=1)
                        df = df.sort_values(by=['trade_date'],
                                            axis=0,
                                            ascending=False)
                        return df
                    else:
                        return self.api.to_df(data)
                else:
                    if bk:
                        data = self.api.get_index_bars(category, type, code, 0,
                                                       day)  # 返回DataFrame
                    else:
                        data = self.api.get_security_bars(
                            category, type, code, 0, day)
                    if len(data) > 0:
                        df = self.api.to_df(data).drop([
                            'amount', 'year', 'month', 'day', 'hour', 'minute'
                        ],
                                                       axis=1)
                        df['trade_date'] = df['datetime'].apply(
                            lambda x: x[0:10].replace('-', ''))
                        df = df.drop(['datetime'], axis=1)
                        df = df.sort_values(by=['trade_date'],
                                            axis=0,
                                            ascending=False)
                        return df
                    else:
                        return self.api.to_df(data)
        except Exception as e:
            logging.info("暂不支持类型,代码:%s:%s" % (code, e))
            return self.api.to_df([])

    # F10 查询公司信息目录
    def get_company_info_category(self, code, type):
        with self.api.connect(TDX_IP, TDX_PORT):
            df = pd.DataFrame(self.api.get_company_info_category(type, code))
            df['txt'] = None
            return df
        return []

    def get_company_info_content(self, code, type, df):
        with self.api.connect(TDX_IP, TDX_PORT):
            return self.api.get_company_info_content(type, code,
                                                     df['filename'].values[0],
                                                     df['start'].values[0],
                                                     df['length'].values[0])
        return ""

    # 查询财务数据
    def get_finance_info(self, code, type):
        with self.api.connect(TDX_IP, TDX_PORT):
            return self.api.get_finance_info(type, code)
        return ''

    # 每年更新一次,板块个股关系
    def updateBk(self):
        with self.api.connect(TDX_IP, TDX_PORT):
            """
            # 获取股票所属板块信息
            # 板块相关参数
            BLOCK_SZ = "block_zs.dat"
            BLOCK_FG = "block_fg.dat"
            BLOCK_GN = "block_gn.dat"
            BLOCK_DEFAULT = "block.dat"
            """
            bk_zs = self.api.to_df(
                self.api.get_and_parse_block_info("block_zs.dat"))  #指数板块
            bk_fg = self.api.to_df(
                self.api.get_and_parse_block_info("block_fg.dat"))  #风格板块
            bk_gn = self.api.to_df(
                self.api.get_and_parse_block_info("block_gn.dat"))  #概念板块
            bk_default = self.api.to_df(
                self.api.get_and_parse_block_info("block.dat"))  # 默认
            self.dbUtil.to_sql(bk_gn,
                               'stock_bk_gn',
                               if_exists='replace',
                               index=False,
                               dtype=STOCK_BK_DTYPE)
            self.dbUtil.to_sql(bk_fg,
                               'stock_bk_fg',
                               if_exists='replace',
                               index=False,
                               dtype=STOCK_BK_DTYPE)
            self.dbUtil.to_sql(bk_zs,
                               'stock_bk_zs',
                               if_exists='replace',
                               index=False,
                               dtype=STOCK_BK_DTYPE)
            self.dbUtil.to_sql(bk_default,
                               'stock_bk_default',
                               if_exists='replace',
                               index=False,
                               dtype=STOCK_BK_DTYPE)

            # 获取股票列表
            tmp1 = self.api.to_df(self.api.get_security_list(0, 0))  # 深圳
            tmp1['type'] = 0
            tmp2 = self.api.to_df(self.api.get_security_list(1, 0))  # 上海
            tmp2['type'] = 1
            tmp = tmp1.append(tmp2)
            self.dbUtil.to_sql(tmp,
                               'stock_bk',
                               if_exists='replace',
                               index=False,
                               dtype=STOCK_BK)

    def updateGD(self, code, type):
        url = 'http://emweb.securities.eastmoney.com/PC_HSF10/ShareholderResearch/ShareholderResearchAjax?code=%s%s' % (
            type.lower(), code)
        html = urllib.request.urlopen(url).read()
        # 将字符串转换成字典
        data = json.loads(html.decode('utf-8'))
        # gdrs 股东人数,sdgd 十大股东 ,sdltgd 十大流通股东
        df_gdrs = pd.DataFrame(data['gdrs'])
        df_gdrs['code'] = code
        try:
            db_df_gdrs = self.dbUtil.read_sql(
                "select * from stock_gdrs where code ='%s'" % code)
            # 数据合并
            df_gdrs = df_gdrs.append(db_df_gdrs).drop_duplicates(
                subset=['code', 'rq', 'gdmc'], keep='last')
        except Exception as e:
            pass
        self.dbUtil.to_sql(df_gdrs,
                           'stock_gdrs',
                           if_exists='append',
                           index=False,
                           dtype=STOCK_GDRS_DTYPE)
        sdgd = []
        for i in range(len(data['sdgd'])):
            sdgd += data['sdgd'][i]['sdgd']
        df_sdgd = pd.DataFrame(sdgd)
        df_sdgd['code'] = code
        try:
            db_df_sdgd = self.dbUtil.read_sql(
                "select * from stock_sdgd where code ='%s'" % code)
            df_sdgd = df_sdgd.append(db_df_sdgd).drop_duplicates(
                subset=['code', 'rq', 'gdmc'], keep='last')
        except Exception as e:
            pass
        self.dbUtil.to_sql(df_sdgd,
                           'stock_sdgd',
                           if_exists='append',
                           index=False,
                           dtype=STOCK_SDGD_DTYPE)
        sdltgd = []
        for i in range(len(data['sdltgd'])):
            sdltgd += data['sdltgd'][i]['sdltgd']
        df_sdltgd = pd.DataFrame(sdltgd)
        df_sdltgd['code'] = code

        # 获取后与数据库中的数据进行merge,首次表不存在,会抛异常
        try:
            db_df_sdltgd = self.dbUtil.read_sql(
                "select * from stock_sdltgd where code ='%s'" % code)
            df_sdltgd = df_sdltgd.append(db_df_sdltgd).drop_duplicates(
                subset=['code', 'rq', 'gdmc'], keep='last')
        except Exception as e:
            pass
        self.dbUtil.to_sql(df_sdltgd,
                           'stock_sdltgd',
                           if_exists='append',
                           index=False,
                           dtype=STOCK_SDGD_DTYPE)

    # 没季度更新一次
    def updateGDs(self):
        codes = self.dbUtil.read_sql("select ts_code from stock_basic")
        tmp = codes['ts_code'].str.split('.', expand=True)
        for index, row in tmp.iterrows():
            try:
                self.updateGD(row[0], row[1])
                logging.info('%s更新结束,当前索引%s' % (row[0], index))
            except Exception as e:
                logging.info('%s更新失败,当前索引%s' % (row[0], index))

    # 分红
    # 分红地址http://data.eastmoney.com/yjfp/201812.html
    def updateFh(self, rq):
        url = 'http://data.eastmoney.com/DataCenter_V3/yjfp/getlist.ashx?filter=(ReportingPeriod=^%s^)' % rq
        html = requests.get(url)
        # 将字符串转换成字典
        data = json.loads(html.text)['data']
        if len(data) == 0:
            return 0
        df = pd.DataFrame(data)
        df['ReportingPeriod'] = df['ReportingPeriod'].apply(lambda x: x[0:10])
        # 首次需要将df_fh制空,因为表还不存在
        if self.dbUtil.is_exist("stock_fh"):
            db_fh = self.dbUtil.read_sql(
                "select * from stock_fh where ReportingPeriod = '%s'" %
                df['ReportingPeriod'][0])
            if db_fh.empty:  # 不存在当前日期的分红信息,进行拼接
                self.dbUtil.to_sql(df,
                                   'stock_fh',
                                   if_exists='append',
                                   index=False)
                return 1
            else:
                pass
        else:
            self.dbUtil.to_sql(df, 'stock_fh', if_exists='append', index=False)
            return 1

    # 更新历年分红
    def updateFhYears(self):
        now = int(time.strftime("%Y", time.localtime())) + 1
        lastYear = int(self._getFhMaxYear())
        for i in range(lastYear, now):  #初始化时开启
            type = self.updateFh('%s-06-30' % i)
            logging.info('%s-06-30%s' % (i, '成功' if type == 1 else '失败'))
            self.updateFh('%s-12-31' % i)
            logging.info('%s-12-31%s' % (i, '成功' if type == 1 else '失败'))

    def _getFhMaxYear(self):
        if self.dbUtil.is_exist('stock_fh'):
            try:
                df = self.dbUtil.read_sql(
                    'select substr(max(t.ReportingPeriod ),0,5) year from stock_fh t'
                )
                return df['year'][0].values
            except Exception as e:
                pass
        return 1991

    @classmethod
    def getInstance(cls):
        if not hasattr(TdxData, "_instance"):
            TdxData._instance = TdxData()
        return TdxData._instance
예제 #3
0
class StdQuotes(object):
    """股票市场实时行情"""
    bestip = ('47.103.48.45', 7709)

    def __init__(self, **kwargs):

        try:
            default = settings.get('SERVER').get('HQ')[0]
            self.bestip = config.get('BESTIP').get('HQ', default)
        except ValueError:
            self.config = None

        self.client = TdxHq_API(**kwargs)

    def traffic(self):
        with self.client.connect(*self.bestip):
            return self.client.get_traffic_stats()

    def quotes(self, symbol=[]):
        '''
        获取实时日行情数据

        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''

        logger.debug(type(logger))

        if type(symbol) is str:
            symbol = [symbol]

        with self.client.connect(*self.bestip):
            symbol = get_stock_markets(symbol)
            result = self.client.get_security_quotes(symbol)

            return to_data(result)

    def bars(self, symbol='000001', frequency='9', start='0', offset='100'):
        '''
        获取实时日K线数据

        :param symbol: 股票代码
        :param frequency: 数据类别
        :param market: 证券市场
        :param start: 开始位置
        :param offset: 每次获取条数
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_security_bars(int(frequency), int(market),
                                                   str(symbol), int(start),
                                                   int(offset))

            return to_data(result)

    def stock_count(self, market=MARKET_SH):
        '''
        获取市场股票数量

        :param market: 股票市场代码 sh 上海, sz 深圳
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            result = self.client.get_security_count(market=market)
            return result

    def stocks(self, market=MARKET_SH):
        '''
        获取股票列表

        :param market:
        :return:
        '''
        with self.client.connect(*self.bestip):
            counts = self.client.get_security_count(market=market)
            stocks = None

            for start in tqdm(range(0, counts, 1000)):
                result = self.client.get_security_list(market=market,
                                                       start=start)
                stocks = pandas.concat(
                    [stocks, to_data(result)],
                    ignore_index=True) if start > 1 else to_data(result)

            return stocks

    def index_bars(self,
                   symbol='000001',
                   frequency='9',
                   start='0',
                   offset='100'):
        '''
        获取指数k线

        :param symbol:
        :param frequency:
        :param start:
        :param offset:
        :return:
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_index_bars(frequency=frequency,
                                                market=market,
                                                code=symbol,
                                                start=start,
                                                count=offset)

            return to_data(result)

    def minute(self, symbol=''):
        '''
        获取实时分时数据

        :param market: 证券市场
        :param symbol: 股票代码
        :return: pd.DataFrame
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_minute_time_data(market=market,
                                                      code=symbol)
            return to_data(result)

    def minutes(self, symbol='', date='20191023'):
        '''
        分时历史数据

        :param market:
        :param symbol:
        :param date:
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_history_minute_time_data(market=market,
                                                              code=symbol,
                                                              date=date)

            return to_data(result)

    def transaction(self, symbol='', start=0, offset=10):
        '''
        查询分笔成交

        :param market: 市场代码
        :param symbol: 股票代码
        :param start: 起始位置
        :param offset: 请求数量
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_transaction_data(int(market), symbol,
                                                      int(start), int(offset))

            return to_data(result)

    def transactions(self, symbol='', start=0, offset=10, date='20170209'):
        '''
        查询历史分笔成交
        参数:市场代码, 股票代码,起始位置,日期 数量 如: 0,000001,0,10,20170209


        :param symbol: 股票代码
        :param start: 起始位置
        :param offset: 数量
        :param date: 日期
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol, string=False)
            result = self.client.get_history_transaction_data(market=market,
                                                              code=symbol,
                                                              start=start,
                                                              count=offset,
                                                              date=date)

            return to_data(result)

    def F10C(self, symbol=''):
        '''
        查询公司信息目录

        :param market: 市场代码
        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_company_info_category(int(market), symbol)

            return result

    def F10(self, symbol='', name=''):
        '''
        读取公司信息详情

        :param name: 公司 F10 标题
        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            result = {}
            market = get_stock_market(symbol, string=False)

            frequency = self.client.get_company_info_category(
                int(market), symbol)

            if name:
                for x in frequency:
                    if x['name'] == name:
                        return self.client.get_company_info_content(
                            market=market,
                            code=symbol,
                            filename=x['filename'],
                            start=x['start'],
                            length=x['length'])

            for x in frequency:
                result[x['name']] = self.client.get_company_info_content(
                    market=market,
                    code=symbol,
                    filename=x['filename'],
                    start=x['start'],
                    length=x['length'])
            else:
                pass

            return result

    def xdxr(self, symbol=''):
        '''
        读取除权除息信息

        :param market: 市场代码
        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_xdxr_info(int(market), symbol)

            return to_data(result)

    def finance(self, symbol='000001'):
        '''
        读取财务信息

        :param symbol:
        :return:
        '''
        with self.client.connect(*self.bestip):
            market = get_stock_market(symbol)
            result = self.client.get_finance_info(market=market, code=symbol)

            return to_data(result)

    def k(self, symbol='', begin=None, end=None):
        '''
        读取k线信息

        :param symbol:
        :param begin: 开始日期
        :param end: 截止日期
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            result = self.client.get_k_data(symbol, begin, end)
            return to_data(result)

    def index(self,
              symbol='000001',
              market=MARKET_SH,
              frequency='9',
              start=1,
              offset=2):
        '''
        获取指数k线

        K线种类:
        - 0 5分钟K线
        - 1 15分钟K线
        - 2 30分钟K线
        - 3 1小时K线
        - 4 日K线
        - 5 周K线
        - 6 月K线
        - 7 1分钟
        - 8 1分钟K线
        - 9 日K线
        - 10 季K线
        - 11 年K线

        :param symbol: 股票代码
        :param frequency: 数据类别
        :param market: 证券市场
        :param start: 开始位置
        :param offset: 每次获取条数
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            result = self.client.get_index_bars(int(frequency), int(market),
                                                str(symbol), int(start),
                                                int(offset))
            return to_data(result)

    def block(self, tofile="block.dat"):
        '''
        获取证券板块信息

        :param tofile:
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            result = self.client.get_and_parse_block_info(tofile)
            return to_data(result)
예제 #4
0
def test_all_functions(multithread, heartbeat, auto_retry, raise_exception):

    api = TdxHq_API(multithread=multithread, heartbeat=heartbeat,
                    auto_retry=auto_retry, raise_exception=raise_exception)
    with api.connect(time_out=30):
        log.info("获取股票行情")
        stocks = api.get_security_quotes([(0, "000001"), (1, "600300")])
        assert stocks is not None
        assert type(stocks) is list

        # 方法2
        stocks = api.get_security_quotes(0, "000001")
        assert stocks is not None
        assert type(stocks) is list

        # 方法3
        stocks = api.get_security_quotes((0, "000001"))
        assert stocks is not None
        assert type(stocks) is list

        log.info("获取k线")
        data = api.get_security_bars(9, 0, '000001', 4, 3)
        assert data is not None
        assert type(data) is list
        assert len(data) == 3

        log.info("获取 深市 股票数量")
        assert api.get_security_count(0) > 0

        log.info("获取股票列表")
        stocks = api.get_security_list(1, 0)
        assert stocks is not None
        assert type(stocks) is list
        assert len(stocks) > 0

        log.info("获取指数k线")
        data = api.get_index_bars(9, 1, '000001', 1, 2)
        assert data is not None
        assert type(data) is list
        assert len(data) == 2

        log.info("查询分时行情")
        data = api.get_minute_time_data(TDXParams.MARKET_SH, '600300')
        assert data is not None

        log.info("查询历史分时行情")
        data = api.get_history_minute_time_data(
            TDXParams.MARKET_SH, '600300', 20161209)
        assert data is not None
        assert type(data) is list
        assert len(data) > 0

        log.info("查询分时成交")
        data = api.get_transaction_data(TDXParams.MARKET_SZ, '000001', 0, 30)
        assert data is not None
        assert type(data) is list

        log.info("查询历史分时成交")
        data = api.get_history_transaction_data(
            TDXParams.MARKET_SZ, '000001', 0, 10, 20170209)

        assert data is not None
        assert type(data) is list
        assert len(data) == 10

        log.info("查询公司信息目录")
        data = api.get_company_info_category(TDXParams.MARKET_SZ, '000001')
        assert data is not None
        assert type(data) is list
        assert len(data) > 0

        start = data[0]['start']
        length = data[0]['length']
        log.info("读取公司信息-最新提示")
        data = api.get_company_info_content(
            0, '000001', '000001.txt', start, length)
        assert data is not None
        assert len(data) > 0

        log.info("读取除权除息信息")
        data = api.get_xdxr_info(1, '600300')
        assert data is not None
        assert type(data) is list
        assert len(data) > 0

        log.info("读取财务信息")
        data = api.get_finance_info(0, '000001')
        assert data is not None
        assert type(data) is OrderedDict
        assert len(data) > 0

        log.info("日线级别k线获取函数")
        data = api.get_k_data('000001', '2017-07-01', '2017-07-10')
        assert type(data) is pd.DataFrame
        assert len(data) == 6

        log.info("获取板块信息")
        data = api.get_and_parse_block_info(TDXParams.BLOCK_FG)
        assert data is not None
        assert type(data) is list
        assert len(data) > 0
예제 #5
0
print("获取指数k线")
data = api.get_index_bars(9, 1, '000001', 1, 2)
print(data)
print("查询分时行情")
data = api.get_minute_time_data(1, '600300')
print(data)
print("查询历史分时行情")
data = api.get_history_minute_time_data(1, '600300', 20161209)
print(data)
print("查询分时成交")
data = api.get_transaction_data(1, '000002', 0, 30)
print(data)
print("查询历史分时成交")
data = api.get_history_transaction_data(2, '600302', 0, 10, 20170209)
print(data)
print("查询公司信息目录")
data = api.get_company_info_category(1, '000003')
print(data)
print("读取公司信息-最新提示")
data = api.get_company_info_content(0, '000001', '000001.txt', 0, 10)
print(data)
print("读取除权除息信息")
data = api.get_xdxr_info(1, '600300')
print(data)
print("读取财务信息")
data = api.get_finance_info(0, '000001')
print(data)
print("日线级别k线获取函数")
data = api.get_k_data('000001', '2005-07-01', '2017-07-10')
print(data)
예제 #6
0
파일: quotes.py 프로젝트: tobybird/mootdx
class StdQuotes(object):
    """股票市场实时行情"""

    # __slots__ =
    def __init__(self, **kwargs):
        self.config = None

        try:
            self.config = json.loads(
                os.path.join(os.environ['HOME'], '.mootdx/config.josn'))
        except Exception as e:
            self.config = None

        self.client = TdxHq_API(**kwargs)

        if not self.config:
            self.bestip = os.environ.setdefault("MOOTDX_SERVER",
                                                '202.108.253.131:7709')
            self.bestip = self.bestip.split(':')
            self.bestip[1] = int(self.bestip[1])
        else:
            self.bestip = self.config.get('SERVER')

    # K线
    def bars(self, symbol='000001', category='9', start='0', offset='100'):
        '''
        获取实时日K线数据

        :param symbol: 股票代码
        :param category: 数据类别
        :param market: 证券市场
        :param start: 开始位置
        :param offset: 每次获取条数
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_security_bars(int(category), int(market),
                                                 str(symbol), int(start),
                                                 int(offset))
            return self.client.to_df(data)

    # 分时数据
    def minute(self, symbol=''):
        '''
        获取实时分时数据

        :param market: 证券市场
        :param symbol: 股票代码
        :return: pd.DataFrame
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_minute_time_data(int(market), symbol)
            return self.client.to_df(data)

    # 分时历史数据
    def minute_his(self, symbol='', datetime='20161209'):
        '''
        分时历史数据

        :param market:
        :param symbol:
        :param datetime:
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_history_minute_time_data(
                int(market), symbol, datetime)
            return self.client.to_df(data)

    def trans(self, symbol='', start=0, offset=10):
        '''
        查询分笔成交

        :param market: 市场代码
        :param symbol: 股票代码
        :param start: 起始位置
        :param offset: 请求数量
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_transaction_data(int(market), symbol,
                                                    int(start), int(market))
            return self.client.to_df(data)

    def trans_his(self, symbol='', start=0, offset=10, date=''):
        '''
        查询历史分笔成交

        :param market: 市场代码
        :param symbol: 股票代码
        :param start: 起始位置
        :param offset: 数量
        :param date: 日期
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_history_transaction_data(
                int(market), symbol, int(start), int(offset), date)
            return self.client.to_df(data)

    def company(self, symbol='', detail='category', *args, **kwargs):
        '''
        企业信息获取

        :param symbol:
        :param detail:
        :param args:
        :param kwargs:
        :return:
        '''
        pass

    def company_category(self, symbol=''):
        '''
        查询公司信息目录

        :param market: 市场代码
        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_company_info_category(int(market), symbol)
            return self.client.to_df(data)

    def company_content(self, symbol='', file='', start=0, offset=10):
        '''
        读取公司信息详情

        :param market: 市场代码
        :param symbol: 股票代码
        :param file: 文件名
        :param start: 起始位置
        :param offset: 数量
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_company_info_content(
                int(market), symbol, file, int(start), int(offset))
            return self.client.to_df(data)

    def xdxr(self, symbol=''):
        '''
        读取除权除息信息

        :param market: 市场代码
        :param symbol: 股票代码
        :return: pd.dataFrame or None
        '''
        market = get_stock_market(symbol)

        with self.client.connect(*self.bestip):
            data = self.client.get_xdxr_info(int(market), symbol)
            return self.client.to_df(data)

    def k(self, symbol='', begin=None, end=None):
        '''
        读取k线信息

        :param symbol:
        :param begin:
        :param end:
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            data = self.client.get_k_data(symbol, begin, end)
            return data

    def index(self,
              symbol='000001',
              market='sh',
              category='9',
              start='0',
              offset='100'):
        '''
        获取指数k线

        K线种类:
        - 0 5分钟K线
        - 1 15分钟K线
        - 2 30分钟K线
        - 3 1小时K线
        - 4 日K线
        - 5 周K线
        - 6 月K线
        - 7 1分钟
        - 8 1分钟K线
        - 9 日K线
        - 10 季K线
        - 11 年K线

        :param symbol: 股票代码
        :param category: 数据类别
        :param market: 证券市场
        :param start: 开始位置
        :param offset: 每次获取条数
        :return: pd.dataFrame or None
        '''
        market = 1 if market == 'sh' else 0

        with self.client.connect(*self.bestip):
            data = self.client.get_index_bars(int(category), int(market),
                                              str(symbol), int(start),
                                              int(offset))
            return self.client.to_df(data)

    def block(self, tofile="block.dat"):
        '''
        获取证券板块信息

        :param tofile:
        :return: pd.dataFrame or None
        '''
        with self.client.connect(*self.bestip):
            data = self.client.get_and_parse_block_info(tofile)
            return self.client.to_df(data)

    def batch(self, method='', offset=100, *args, **kwargs):
        '''
        批量下载相关数据

        :param method:
        :param offset:
        :return:
        '''

        pass
예제 #7
0
class TdxHelper:
    ip_list = [{
        'ip': '119.147.212.81',
        'port': 7709
    }, {
        'ip': '60.12.136.250',
        'port': 7709
    }]

    def __init__(self):
        #连接tdx接口
        self.api = TdxHq_API()
        if not self.api.connect('60.12.136.250', 7709):
            print("服务器连接失败!")

        # pandas数据显示设置
        pd.set_option('display.max_columns', None)  # 显示所有列
        #pd.set_option('display.max_rows', None)  # 显示所有行

        # mysql对象
        self.mysql = mysqlHelper(config.mysql_host, config.mysql_username,
                                 bluedothe.mysql_password, config.mysql_dbname)

        # pandas的mysql对象
        self.engine = create_engine(
            f'mysql+pymysql://{config.mysql_username}:{bluedothe.mysql_password}@{config.mysql_host}/{config.mysql_dbname}?charset=utf8'
        )

    #断开tdx接口连接
    def close_connect(self):
        self.api.disconnect()

    #获取k线,最后一个参数day,说明需要获取的数量,本接口只获取从最近交易日往前的数据
    #输入参数:五个参数分别为:category(k线),市场代码(0:深圳,1:上海),股票代码,开始位置(从最近交易日向前取,0表示最近交易日),返回的记录条数
    #K线种类:  0 5分钟K线; 1 15分钟K线; 2 30分钟K线; 3 1小时K线; 4 日K线;5 周K线;6 月K线;7 1分钟;8 1分钟K线; 9 日K线;10 季K线;11 年K线
    #返回值:open,close,high,low,vol,amount,year,month,day,hour,minute,datetime
    # csv格式:code,ts_code,trade_date(缩写),trade_time,time_index,open,high,low,close,amount,volume
    def get_security_bars(self, category, market, code, start=0, count=240):
        dict = {0: 'SZ', 1: 'SH'}
        ts_code = code + "." + dict[market]
        order = [
            'code', 'ts_code', 'trade_date', 'trade_time', 'time_index',
            'open', 'high', 'low', 'close', 'amount', 'volume'
        ]
        #df = self.api.get_security_bars(9, 0, '000001', 0, 10)  # 返回普通list
        df = self.api.to_df(
            self.api.get_security_bars(category, market, code, start,
                                       count))  # 返回DataFrame
        if df.empty: return df

        df.insert(0, 'ts_code', ts_code)
        df.insert(0, 'code', code)
        df['trade_time'] = df['datetime'].apply(lambda x: str(x)[11:19])
        df['time_index'] = df['trade_time'].apply(
            lambda x: datatime_util.stockTradeTime2Index(x))
        df['trade_date'] = df['datetime'].apply(
            lambda x: (str(x)[0:10]).replace('-', ''))
        df.rename(columns={'vol': 'volume'}, inplace=True)
        df.drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'],
                axis=1,
                inplace=True)
        df['volume'] = df['volume'].apply(lambda x: int(x))  #取整
        df.loc[df['amount'] == 5.877471754111438e-39,
               'amount'] = 0  #列值根据条件筛选后修改为0
        df = df[order]

        filename = config.tdx_csv_minline1_all + ts_code + ".csv"
        if os.path.isfile(filename):
            df.to_csv(filename,
                      index=False,
                      mode='a',
                      header=False,
                      sep=',',
                      encoding="utf_8_sig")
        else:
            df.to_csv(filename,
                      index=False,
                      mode='w',
                      header=True,
                      sep=',',
                      encoding="utf_8_sig")
            print("新增加的一分钟all股票数据:", filename)

    # 获取1分钟k线,最后一个参数说明需要获取的数量,本接口只获取从最近交易日往前的数据
    # 输入参数:五个参数分别为:category(k线),市场代码(0:深圳,1:上海),股票代码,开始位置(从最近交易日向前取,0表示最近交易日),返回的记录条数
    # K线种类:  0 5分钟K线; 1 15分钟K线; 2 30分钟K线; 3 1小时K线; 4 日K线;5 周K线;6 月K线;7 1分钟;8 1分钟K线; 9 日K线;10 季K线;11 年K线
    # 返回值:open,close,high,low,vol,amount,year,month,day,hour,minute,datetime
    # csv格式:code,ts_code,trade_date(缩写),trade_time,time_index,open,high,low,close,amount,volume
    def get_security_bars_minute1(self, category, market, code, start, count):
        dict = {0: 'SZ', 1: 'SH'}
        ts_code = code + "." + dict[market]
        order = [
            'code', 'ts_code', 'trade_date', 'trade_time', 'time_index',
            'open', 'high', 'low', 'close', 'amount', 'volume'
        ]
        # df = self.api.get_security_bars(9, 0, '000001', 0, 10)  # 返回普通list
        df = self.api.to_df(
            self.api.get_security_bars(category, market, code, start,
                                       count))  # 返回DataFrame
        if df.empty: return

        df.insert(0, 'ts_code', ts_code)
        df.insert(0, 'code', code)
        df['trade_time'] = df['datetime'].apply(lambda x: str(x)[11:19])
        df['time_index'] = df['trade_time'].apply(
            lambda x: datatime_util.stockTradeTime2Index(x))
        df['trade_date'] = df['datetime'].apply(
            lambda x: (str(x)[0:10]).replace('-', ''))
        df.rename(columns={'vol': 'volume'}, inplace=True)
        df.drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'],
                axis=1,
                inplace=True)
        df['volume'] = df['volume'].apply(lambda x: int(x))  # 取整
        df.loc[df['amount'] == 5.877471754111438e-39,
               'amount'] = 0  # 列值根据条件筛选后修改为0
        df = df[order]

        #过滤掉停牌的数据,在tdx中,停牌股票也能取到数据,价格是前一交易日的收盘价,所以只能用成交量或成交金额为0来判断
        #1按日期分组后取出成交量为0的日期;2循环过滤掉成交量为0的日期的数据。
        dfg = df.groupby(by='trade_date').mean()  #分组
        dfg['trade_date'] = dfg.index
        dfg = dfg[dfg.volume == 0]  #条件过滤,保留满足条件的数据
        for trade_date in dfg['trade_date'].values:
            df = df[(df['trade_date'] != trade_date)]  # 每个条件要用括号()括起来

        return df

    #可以获取多只股票的行情信息
    #返回值:market,code,active1,price,last_close,open,high,low,reversed_bytes0,reversed_bytes1,vol,cur_vol,amount,s_vol,
    #reversed_bytes2,reversed_bytes3,bid1,ask1,bid_vol1,ask_vol1,bid2,ask2,bid_vol2,ask_vol2,bid3,ask3,bid_vol3,ask_vol3,bid4,
    #ask4,bid_vol4,ask_vol4,bid5,ask5,bid_vol5,ask_vol5,reversed_bytes4,reversed_bytes5,reversed_bytes6,reversed_bytes7,
    #reversed_bytes8,reversed_bytes9,active2
    def get_security_quotes(self):
        df = self.api.to_df(
            self.api.get_security_quotes([(0, '000001'), (1, '600300')]))
        print(df)

    # 获取市场股票数量
    #返回值:value
    def get_security_count(self):
        df = self.api.to_df(self.api.get_security_count(0))  #0 - 深圳, 1 - 上海
        print(df)

    # 获取股票列表,返回值里面除了股票,还有国债等
    #返回值:code,volunit,decimal_point,name,pre_close
    def get_security_list(self):
        df = self.api.to_df(self.api.get_security_list(
            0, 10000))  # 市场代码, 起始位置 如: 0,0 或 1,100
        print(df)

    # 获取指数k线
    #输入参数同股票k线接口
    # 返回值:open,close,high,low,vol,amount,year,month,day,hour,minute,datetime,up_count  down_count
    def get_index_bars(self):
        index_dict_cn = {
            "上证指数": "999999",
            "深证成指": "399001",
            "中小板指": "399005",
            "创业板指": "399006",
            "深证综指": "399106",
            "上证50": "000016",
            "沪深300": "000300"
        }
        index_dict = {
            "sh": "999999",
            "sz": "399001",
            "zxb": "399005",
            "cyb": "399006",
            "szz": "399106",
            "sz50": "000016",
            "hs300": "000300"
        }
        for key in index_dict.keys():
            df = self.api.to_df(
                self.api.get_index_bars(9, 1, index_dict[key], 0, 2))
            print(df)

    # 查询分时行情,最近交易日的数据,一分钟一条记录
    #返回值:price,vol
    def get_minute_time_data(self):
        df = self.api.to_df(self.api.get_minute_time_data(
            1, '600300'))  #市场代码, 股票代码
        print(df)

    # 查询历史分时行情
    # 返回值:price,vol
    def get_history_minute_time_data(self):
        df = self.api.to_df(
            self.api.get_history_minute_time_data(TDXParams.MARKET_SH,
                                                  '603887',
                                                  20200420))  #市场代码, 股票代码,时间
        print(df)

    # 查询分笔成交,最近交易日数据
    #返回值:time,price,vol,num,buyorsell
    def get_transaction_data(self):
        df = self.api.to_df(
            self.api.get_transaction_data(TDXParams.MARKET_SZ, '000001', 0,
                                          30))  #市场代码, 股票代码,起始位置, 数量
        print(df)

    # 查询历史分笔成交
    #返回值:time,price,vol,buyorsell
    def get_history_transaction_data(self):
        df = self.api.to_df(
            self.api.get_history_transaction_data(
                TDXParams.MARKET_SZ, '000001', 0, 10,
                20170209))  #市场代码, 股票代码,起始位置,日期 数量
        print(df)

    # 查询公司信息目录,返回的不是具体数据
    #返回值:name,filename,start,length
    def get_company_info_category(self):
        df = self.api.to_df(
            self.api.get_company_info_category(TDXParams.MARKET_SZ,
                                               '000001'))  #市场代码, 股票代码
        print(df)

    # 读取公司信息详情
    #返回值:value
    def get_company_info_content(self):
        df = self.api.to_df(
            self.api.get_company_info_content(
                0, '000001', '000001.txt', 0,
                1000))  #市场代码, 股票代码, 文件名, 起始位置, 数量
        print(df)

    # 读取除权除息信息
    #返回值:year,month,day,category,name,fenhong,peigujia,songzhuangu,peigu
    def get_xdxr_info(self):
        df = self.api.to_df(self.api.get_xdxr_info(1, '600300'))  #市场代码, 股票代码
        print(df)

    # 读取财务信息
    #返回值:market,code,liutongguben,province,industry,updated_date,ipo_date,zongguben,guojiagu,faqirenfarengu,farengu,bgu,hgu,zhigonggu,
    #zongzichan,liudongzichan,gudingzichan,wuxingzichan,gudongrenshu,liudongfuzhai,changqifuzhai,zibengongjijin,jingzichan,zhuyingshouru,
    #zhuyinglirun,yingshouzhangkuan,yingyelirun,touzishouyu,jingyingxianjinliu,zongxianjinliu,cunhuo,lirunzonghe,shuihoulirun,jinglirun,weifenlirun,baoliu1,baoliu2
    def get_finance_info(self):
        df = self.api.to_df(self.api.get_finance_info(1,
                                                      '600300'))  #市场代码, 股票代码
        print(df)

    # 读取k线信息
    # 返回值:value
    def get_k_data(self):
        df = self.api.to_df(
            self.api.get_k_data('600300', '2017-07-03',
                                '2017-07-10'))  #股票代码, 开始时间, 结束时间
        print(df)

    # 读取板块信息
    #返回值:blockname, block_type, code_index, code
    """   BLOCK_SZ = "block_zs.dat";BLOCK_FG = "block_fg.dat";BLOCK_GN = "block_gn.dat";BLOCK_DEFAULT = "block.dat"  """

    def get_and_parse_block_info(self):
        ##指数板块 风格板块  概念板块  一般板块
        block_filename = [
            "block_zs.dat", "block_fg.dat", "block_gn.dat", "block.dat"
        ]
        for block in block_filename:
            df = self.api.to_df(
                self.api.get_and_parse_block_info(block))  #板块文件名称
            filename = config.tdx_csv_block + block[0:-4] + ".csv"
            if os.path.isfile(filename):
                os.remove(filename)
                df.to_csv(filename,
                          index=False,
                          mode='w',
                          header=True,
                          sep=',',
                          encoding="utf_8_sig")
            else:
                df.to_csv(filename,
                          index=False,
                          mode='w',
                          header=True,
                          sep=',',
                          encoding="utf_8_sig")

    # 读取板块信息,多个类型封装到一个df对象中返回
    # 返回值:data_source, block_category, block_type, block_name, block_code, ts_code, create_time
    def update_block_member(self):
        ##指数板块 风格板块  概念板块  一般板块
        #block_filename = ["block_zs.dat", "block_fg.dat", "block_gn.dat", "block.dat"]
        block_filename = ["block_zs.dat", "block_fg.dat",
                          "block_gn.dat"]  #block.dat中的数据都包含在其他版块里了,这个可以去掉
        data_source = "tdx"
        dfall = None
        for block in block_filename:
            df = self.api.to_df(
                self.api.get_and_parse_block_info(block))  # 板块文件名称
            df['data_source'] = data_source
            if block == "block.dat":
                df['block_category'] = data_source + ".yb"
            else:
                df['block_category'] = data_source + "." + block[6:8]
            df['block_type'] = df['block_type'].map(lambda x: str(x))
            df['block_type'] = df['block_category'].str.cat(
                df['block_type'], sep=".")  #, sep = "."
            df['block_code'] = ""  #使用pd直接插入到数据库时,字段不能是None值
            df['ts_code'] = df['code'].apply(lambda x: x + ".SH"
                                             if x[0:1] == "6" else x + ".SZ")
            if (dfall is not None) and (not dfall.empty):
                dfall = dfall.append(df, ignore_index=True)
            else:
                dfall = df
        if (dfall is None) or (dfall.empty): return None

        dfall.rename(columns={'blockname': 'block_name'}, inplace=True)
        dfall['create_time'] = time.strftime('%Y-%m-%d %H:%M:%S',
                                             time.localtime(time.time()))
        dfall = dfall[[
            'data_source', 'block_category', 'block_type', 'block_name',
            'block_code', 'ts_code', 'create_time'
        ]]  #列重排序

        #分组统计
        dfg = dfall.groupby(by=[
            'data_source', 'block_category', 'block_type', 'block_name',
            'block_code'
        ],
                            as_index=False).count()  # 分组求每组数量
        dfg.rename(columns={'ts_code': 'member_count'},
                   inplace=True)  #ts_code列数值为汇总值,需要重命名
        dfg['create_time'] = time.strftime(
            '%Y-%m-%d %H:%M:%S',
            time.localtime(time.time()))  #create_time列数值为汇总值,需要重新赋值
        delete_condition = f"data_source = '{data_source}'"
        mysql_script.df2db_update(delete_condition=delete_condition,
                                  block_basic_df=dfg,
                                  block_member_df=dfall)
        return (len(dfg), len(dfall))

    #获取一段时间的1分钟数据,因为每次调用接口只能返回3天的分钟数据(240*3),需要分多次调用
    #返回值:0没有提取到数据;1提取到数据
    def get_minute1_data(self, category, market, code, start_date, end_date):
        init_start_date = start_date.replace('-', '')
        init_end_date = end_date.replace('-', '')
        day = datatime_util.diffrentPeriod(datatime_util.DAILY, start_date,
                                           end_date)
        df = self.get_security_bars_minute1(category, market, code, 0,
                                            240 * 3)  # 返回DataFrame
        if df is None or df.empty:
            print('{0}没有交易数据'.format(code))
            return 0
        print(market, '--', code, '--', start_date, '--', end_date)
        #print("最大值:",df.groupby('datetime').max())
        #print(df.describe())   #df数据统计
        data_start_date = df.min()['trade_date']
        data_end_date = df.max()['trade_date']

        start_date = start_date.replace('-', '')
        end_date = end_date.replace('-', '')
        if data_end_date < start_date or end_date < data_start_date:
            print("采集时间在数据范围之外,退出函数")
            return 0
        elif end_date > data_end_date:
            end_date = data_end_date

        if start_date < data_start_date:
            #最近三天的数据中,去掉无用的数据后即是最终数据
            #需要取的数据还有三天前的数据,需要继续向前取
            n = (day - 3) // 3
            m = (day - 3) % 3
            for i in range(0, n):
                dfn = self.get_security_bars_minute1(category, market, code,
                                                     240 * 3 * (i + 1),
                                                     240 * 3)  # 返回DataFrame
                if (dfn is not None) and (not dfn.empty):
                    df = dfn.append(df, ignore_index=True)
            if m > 0:
                dfn = self.get_security_bars_minute1(category, market, code,
                                                     240 * 3 * (n + 1),
                                                     240 * m)
                if (dfn is not None) and (not dfn.empty):
                    df = dfn.append(df, ignore_index=True)

        df = df.sort_values(by=['trade_date', 'time_index'],
                            axis=0,
                            ascending=True)
        #过滤掉start_date, end_date之外的数据
        df = df[(df['trade_date'] >= str(init_start_date)) &
                (df['trade_date'] <= str(init_end_date))]  #每个条件要用括号()括起来

        dict = {0: 'SZ', 1: 'SH'}
        ts_code = code + "." + dict[market]
        filename = config.tdx_csv_minline1_all + ts_code + ".csv"
        if os.path.isfile(filename):
            df.to_csv(filename,
                      index=False,
                      mode='a',
                      header=False,
                      sep=',',
                      encoding="utf_8_sig")
            print("更新一分钟all股票数据:", filename)
        else:
            df.to_csv(filename,
                      index=False,
                      mode='w',
                      header=True,
                      sep=',',
                      encoding="utf_8_sig")
            print("新增加的一分钟all股票数据:", filename)
예제 #8
0
if len(sys.argv) > 1:
    zone, code = sys.argv[1].split('.')
    if zone == 'sz':
        market = 0

api = TdxHq_API()

api.connect('119.147.212.81', 7709)

info = api.get_company_info_category(market, code)

for i in info:
    #for k in i.keys():
    #print(k,i[k])
    #name,filename,start,length
    info2 = api.get_company_info_content(market, code, i['filename'],
                                         i['start'], i['length'])
    print(info2)


def get_data(fname):
    content = fname.decode('utf-8')
    print(content)


def get_and_parse_block_info(client, blockfile):
    try:
        meta = client.get_block_info_meta(blockfile)
    except Exception as e:
        return None

    if not meta: