def __handleMarginTotal(self, dataArr, page, randInt, retry, pause): self._writeConsole() for _ in range(retry): time.sleep(pause) try: request = self._session.get(cf.MAR_TOTAL_URL % (page, randInt), timeout=10) text = request.text.split('=')[1] text = text.replace('{pages:', '{"pages":').replace( ',data:', ',"data":').replace('T00:00:00', '').replace('"-"', '0') dataDict = Utility.str2Dict(text) data = dataDict['data'] df = pd.DataFrame(data, columns=cf.MAR_TOTAL_COLS) df['close'] = df['close'].map(cf.FORMAT) df['rzyezb'] = df['rzyezb'].astype(float) dataArr = dataArr.append(df, ignore_index=True) if page < dataDict['pages']: dataArr = self.__handleMarginTotal(dataArr, page + 1, randInt, retry, pause) except Exception as e: print(e) else: return dataArr raise IOError(cf.NETWORK_URL_ERROR_MSG)
def forecast(self, year, quarter, retry=3, pause=0.001): """ 获取业绩预告数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 type,业绩变动类型【预增、预亏等】 report_date,发布日期 pre_eps,上年同期每股收益 range,业绩变动范围 """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() self._data = self.__handleForecast(year, quarter, 1, pd.DataFrame(), retry, pause) self._data = pd.DataFrame(self._data, columns=cf.FORECAST_COLS) self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def lpr(self, startDate, endDate=None): """ 获取贷款基础利率 Parameters ------ startDate:开始日期(格式:YYYY-MM-DD) endDate:结束日期(格式:YYYY-MM-DD,为None时默认取当前日期) Return ------ DataFrame or List: [{'date':, '1Y':, ...}, ...] date:日期 1Y:1年贷款基础利率 """ self._data = pd.DataFrame() if endDate is None: endDate = Utility.getToday() request = self._session.get(cf.LPR_URL % (startDate, endDate)) dataDict = json.loads(request.text) dataList = [] for row in dataDict['records']: data = {'date': row['showDateCN'], '1Y': float(row['1Y'])} dataList.append(data) self._data = pd.DataFrame(dataList, columns=cf.LPR_COLS) return self._result()
def stockProfiles(self, retry=3, pause=0.001): """ 获取上市公司基本情况 Parameters -------- retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 city,所在城市 staff,员工人数 date,上市日期 industry,行业分类 pro_type,产品类型 main,主营业务 """ self._data = pd.DataFrame() self._writeHead() date = '%s-12-31' % Utility.getYear() self._data = pd.DataFrame() self._data = self.__handleStockProfiles(self._data, date, 1, retry, pause) return self._result()
def historyTicks(self, date=None, retry=3, pause=0.001): """ 获取历史分笔明细数据 Parameters ------ date : string 日期 format:YYYY-MM-DD, 默认为前一个交易日 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 return ------- DataFrame or list: [{'time':, 'price':, ...}, ...] time:时间 price:成交价格 change:价格变动 volume:成交手 amount:成交金额(元) type:买卖类型【买盘、卖盘、中性盘】 """ self._data = pd.DataFrame() symbol = Utility.symbol(self.__code) date = Utility.lastTradeDate() if date is None else date try: self._writeHead() page = 1 while(True): # http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php?symbol=sh600000&date=2018-12-26&page=1 # http://market.finance.sina.com.cn/transHis.php?date=2019-01-25&symbol=sh600000&page=1 url = cf.HISTORY_TICKS_URL % (date, symbol, page) tick_data = self.__handleTicks(url, cf.HISTORY_TICK_COLUMNS, retry, pause) if tick_data is not None: self._data = self._data.append(tick_data, ignore_index=True) page = page + 1 else: break except Exception as er: print(str(er)) else: return self._result() raise IOError(cf.NETWORK_URL_ERROR_MSG)
def xrxd(self, date='', retry=3, pause=0.001): """ 获取股票除权除息信息 Parameters ------ date: string format:YYYY-MM-DD retry: int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 return ------ Dict or None nd, 对应年份 fh_sh, 分红数额 djr, 股权登记日 cqr, 除权日 FHcontent, 除权除息信息 """ data = None if not date: date = Utility.getToday() symbol = Utility.symbol(self.__code) for _ in range(retry): time.sleep(pause) url = cf.HISTORY_URL % ('fq', 'qfq', symbol, 'day', date, date, 'qfq', Utility.random(17)) try: request = self._session.get(url, timeout=10) pattern = re.compile(r'({"nd".+?})') result = re.search(pattern, request.text) if result: data = eval(result.group(1)) except Exception as e: print(str(e)) return data raise IOError(cf.NETWORK_URL_ERROR_MSG)
def bigDeal(self, date=None, vol=400, retry=3, pause=0.001): """ 获取大单数据 Parameters ------ date:string 日期 format:YYYY-MM-DD retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 return ------- DataFrame or list: [{'code':, 'name', ...}, ...] code:代码 name:名称 time:时间 price:当前价格 volume:成交手 preprice :上一笔价格 type:买卖类型【买盘、卖盘、中性盘】 """ self._data = pd.DataFrame() if self.__code is None or len(self.__code) != 6 or date is None: return None symbol = Utility.symbol(self.__code) vol = vol * 100 for _ in range(retry): time.sleep(pause) try: # http://vip.stock.finance.sina.com.cn/quotes_service/view/cn_bill_download.php?symbol=sh600000&num=60&page=1&sort=ticktime&asc=0&volume=40000&amount=0&type=0&day=2018-12-26 request = self._session.get(cf.SINA_DD % (symbol, vol, date), timeout=10) request.encoding = 'gbk' lines = request.text if len(lines) < 100: return None self._data = pd.read_csv(StringIO(lines), names=cf.SINA_DD_COLS, skiprows=[0]) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: x[2:]) except Exception as e: print(e) else: return self._result() raise IOError(cf.NETWORK_URL_ERROR_MSG)
def __parseExcel(self, year, datatype, lab, column): year = Utility.getYear() if year is None else year lab = lab.encode('utf-8') if self._PY3 else lab try: df = pd.read_excel( cf.SHIBOR_DATA_URL % (datatype, year, lab, year), skiprows=[0] ) df.columns = column df['date'] = df['date'].map(lambda x: x.date()) df['date'] = df['date'].astype('datetime64[ns]') except Exception as e: print(e) else: return df
def __handleFoundHoldings(self, start, end, pageNo, retry, pause): for _ in range(retry): time.sleep(pause) if pageNo > 0: self._writeConsole() try: # http://quotes.money.163.com/hs/marketdata/service/jjcgph.php?host=/hs/marketdata/service/jjcgph.php&page=0&query=start:2018-06-30;end:2018-09-30&order=desc&count=60&type=query&req=73259 request = self._session.get( cf.FUND_HOLDS_URL % (pageNo, start, end, Utility.random(5)), timeout=10) if self._PY3: request.encoding = 'utf-8' lines = request.text lines = lines.replace('--', '0') lines = json.loads(lines) data = lines['list'] df = pd.DataFrame(data) df = df.drop([ 'CODE', 'ESYMBOL', 'EXCHANGE', 'NAME', 'RN', 'SHANGQIGUSHU', 'SHANGQISHIZHI', 'SHANGQISHULIANG' ], axis=1) for col in ['GUSHU', 'GUSHUBIJIAO', 'SHIZHI', 'SCSTC27']: df[col] = df[col].astype(float) df['SCSTC27'] = df['SCSTC27'] * 100 df['GUSHU'] = df['GUSHU'] / 10000 df['GUSHUBIJIAO'] = df['GUSHUBIJIAO'] / 10000 df['SHIZHI'] = df['SHIZHI'] / 10000 df['GUSHU'] = df['GUSHU'].map(cf.FORMAT) df['GUSHUBIJIAO'] = df['GUSHUBIJIAO'].map(cf.FORMAT) df['SHIZHI'] = df['SHIZHI'].map(cf.FORMAT) df['SCSTC27'] = df['SCSTC27'].map(cf.FORMAT) df.columns = cf.FUND_HOLDS_COLS df = df[[ 'code', 'name', 'date', 'nums', 'nlast', 'count', 'clast', 'amount', 'ratio' ]] except Exception as e: print(e) else: if pageNo == 0: return df, int(lines['pagecount']) else: return df raise IOError(cf.NETWORK_URL_ERROR_MSG)
def marginDetailsAllByDate(self, date, retry=3, pause=0.001): """ 按日期获取两市融资融券明细列表 Parameters -------- date : string 选择日期 format:YYYY-MM-DD retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return ------ DataFrame or List: [{'code':, 'name':, ...}, ...] code: 股票代码 name: 名称 rzye: 当日融资余额(元) rzyezb: 当日融资余额占比(%) rzmre: 当日融资买入额(元) rzche: 当日融资偿还额(元) rzjmre: 当日融资净买入额(元) rqye: 当日融券余额(元) rqyl: 当日融券余量(股) rqmcl: 当日融券卖出量(股) rqchl: 当日融券偿还量(股) rqjmcl: 当日融券净卖出量(股) rzrqye: 当日融资融券余额(元) rzrqyecz: 当日融资融券余额差值(元) """ self._data = pd.DataFrame() self._writeHead() self._data = self.__handleMarginDetailsAllByDate( self._data, date, 1, Utility.random(8), retry, pause) self._data.rename(columns={ 'scode': 'code', 'sname': 'name' }, inplace=True) return self._result()
def countTops(self, days=5, retry=3, pause=0.001): """ 获取个股上榜统计数据 Parameters -------- days:int 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return ------ DataFrame or List: [{'code':, 'name':, ...}, ...] code:代码 name:名称 count:上榜次数 bamount:累积购买额(万) samount:累积卖出额(万) net:净额(万) bcount:买入席位数 scount:卖出席位数 """ self._data = pd.DataFrame() if Utility.checkLhbInput(days) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml?last=5&p=1 self._data = self.__parsePage(kind=cf.LHB_KINDS[0], last=days, column=cf.LHB_GGTJ_COLS, dataArr=pd.DataFrame(), pageNo=1, retry=retry, pause=pause) self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) if self._data is not None: self._data = self._data.drop_duplicates('code') return self._result()
def __parsePage(self, cate='', event=0, num=0, retry=3, pause=0.001): for _ in range(retry): time.sleep(pause) try: rdInt = Utility.random() request = self._session.get( cf.MACRO_URL % (rdInt, cate, event, num, rdInt), timeout=10 ) if self._PY3: request.encoding = 'gbk' regSym = re.compile(r'\,count:(.*?)\}') datastr = regSym.findall(request.text) datastr = datastr[0] datastr = datastr.split('data:')[1] except Exception as e: print(e) else: return datastr raise IOError(cf.NETWORK_URL_ERROR_MSG)
def instTops(self, days=5, retry=3, pause=0.001): """ 获取机构席位追踪统计数据 Parameters -------- days:int 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code:代码 name:名称 bamount:累积买入额(万) bcount:买入次数 samount:累积卖出额(万) scount:卖出次数 net:净额(万) """ self._data = pd.DataFrame() if Utility.checkLhbInput(days) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml?last=5&p=1 self._data = self.__parsePage(kind=cf.LHB_KINDS[2], last=days, column=cf.LHB_JGZZ_COLS, dataArr=pd.DataFrame(), pageNo=1, retry=retry, pause=pause, drop_column=[2, 3]) self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def report(self, year, quarter, retry=3, pause=0.001): """ 获取业绩报表数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 eps,每股收益 eps_yoy,每股收益同比(%) bvps,每股净资产 roe,净资产收益率(%) epcf,每股现金流量(元) net_profits,净利润(万元) profits_yoy,净利润同比(%) distrib,分配方案 report_date,发布日期 """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/mainindex/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.REPORT_URL, year, quarter, 1, cf.REPORT_COLS, pd.DataFrame(), retry, pause, 11) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def profit(self, year, quarter, retry=3, pause=0.001): """ 获取盈利能力数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 roe,净资产收益率(%) net_profit_ratio,净利率(%) gross_profit_rate,毛利率(%) net_profits,净利润(万元) eps,每股收益 business_income,营业收入(百万元) bips,每股主营业务收入(元) """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/profit/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.PROFIT_URL, year, quarter, 1, cf.PROFIT_COLS, pd.DataFrame(), retry, pause) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def szMargins(self, retry=3, pause=0.001): """ 深市融资融券历史数据 Parameters -------- retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return ------ DataFrame or List: [{'date':, 'close':, ...}, ...] date: 日期 close: 深证成指收盘点数 zdf: 深证成指收盘涨跌幅(%) rzye: 融资余额(元) rzyezb: 融资余额占比(%) rzmre: 融资买入额(元) rzche: 融资偿还额(元) rzjmre: 融资净买入额(元) rqye: 融券余额(元) rqyl: 融券余量(股) rqmcl: 融券卖出量(股) rqchl: 融券偿还量(股) rqjmcl: 融券净卖出量(股) rzrqye: 融资融券余额(元) rzrqyecz: 融资融券余额差值(元) """ self._data = pd.DataFrame() self._writeHead() self._data = self.__handleMargins(self._data, 1, 'SZ', Utility.random(8), cf.MAR_COLS, retry, pause) self._data.rename(columns={'tdate': 'date'}, inplace=True) return self._result()
def debtPaying(self, year, quarter, retry=3, pause=0.001): """ 获取偿债能力数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 currentratio,流动比率 quickratio,速动比率 cashratio,现金比率 icratio,利息支付倍数 sheqratio,股东权益比率 adratio,股东权益增长率 """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/debtpaying/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.DEBTPAYING_URL, year, quarter, 1, cf.DEBTPAYING_COLS, pd.DataFrame(), retry, pause) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def growth(self, year, quarter, retry=3, pause=0.001): """ 获取成长能力数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 mbrg,主营业务收入增长率(%) nprg,净利润增长率(%) nav,净资产增长率 targ,总资产增长率 epsg,每股收益增长率 seg,股东权益增长率 """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/grow/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.GROWTH_URL, year, quarter, 1, cf.GROWTH_COLS, pd.DataFrame(), retry, pause) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def operation(self, year, quarter, retry=3, pause=0.001): """ 获取营运能力数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 arturnover,应收账款周转率(次) arturndays,应收账款周转天数(天) inventory_turnover,存货周转率(次) inventory_days,存货周转天数(天) currentasset_turnover,流动资产周转率(次) currentasset_days,流动资产周转天数(天) """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/operation/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.OPERATION_URL, year, quarter, 1, cf.OPERATION_COLS, pd.DataFrame(), retry, pause) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def cashFlow(self, year, quarter, retry=3, pause=0.001): """ 获取现金流量数据 Parameters -------- year:int 年度 e.g:2014 quarter:int 季度 :1、2、3、4,只能输入这4个季度 说明:由于是从网站获取的数据,需要一页页抓取,速度取决于您当前网络速度 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0.001 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return -------- DataFrame or List: [{'code':, 'name':, ...}, ...] code,代码 name,名称 cf_sales,经营现金净流量对销售收入比率 rateofreturn,资产的经营现金流量回报率 cf_nm,经营现金净流量与净利润的比率 cf_liabilities,经营现金净流量对负债比率 cashflowratio,现金流量比率 """ self._data = pd.DataFrame() if Utility.checkQuarter(year, quarter) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vFinanceAnalyze/kind/cashflow/index.phtml?s_i=&s_a=&s_c=&reportdate=2018&quarter=3&p=1&num=60 self._data = self.__parsePage(cf.CASHFLOW_URL, year, quarter, 1, cf.CASHFLOW_COLS, pd.DataFrame(), retry, pause) if self._data is not None: self._data['code'] = self._data['code'].map( lambda x: str(x).zfill(6)) return self._result()
def brokerTops(self, days=5, retry=3, pause=0.001): """ 获取营业部上榜统计数据 Parameters -------- days:int 天数,统计n天以来上榜次数,默认为5天,其余是10、30、60 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return --------- DataFrame or List: [{'broker':, 'count':, ...}, ...] broker:营业部名称 count:上榜次数 bamount:累积购买额(万) bcount:买入席位数 samount:累积卖出额(万) scount:卖出席位数 top3:买入前三股票 """ self._data = pd.DataFrame() if Utility.checkLhbInput(days) is True: self._writeHead() # http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml?last=5&p=1 self._data = self.__parsePage(kind=cf.LHB_KINDS[1], last=days, column=cf.LHB_YYTJ_COLS, dataArr=pd.DataFrame(), pageNo=1, retry=retry, pause=pause) return self._result()
def todayTicks(self, retry=3, pause=0.001): """ 获取当日分笔明细数据 Parameters ------ retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 return ------- DataFrame or list: [{'time':, 'price':, ...}, ...] time:时间 price:当前价格 pchange:涨跌幅 change:价格变动 volume:成交手 amount:成交金额(元) type:买卖类型【买盘、卖盘、中性盘】 """ self._data = pd.DataFrame() if self.__code is None or len(self.__code) != 6: return None if not Utility.isTradeDay(): return None # 不到交易时间 openTime = time.mktime( time.strptime(Utility.getToday() + ' 09:25:00', '%Y-%m-%d %H:%M:%S')) now = time.time() if now < openTime: return None symbol = Utility.symbol(self.__code) date = Utility.getToday() for _ in range(retry): time.sleep(pause) try: # http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_Transactions.getAllPageTime?date=2018-12-26&symbol=sh600000 request = self._session.get(cf.TODAY_TICKS_PAGE_URL % (date, symbol), timeout=10) request.encoding = 'gbk' text = request.text[1:-1] data_dict = Utility.str2Dict(text) pages = len(data_dict['detailPages']) self._writeHead() for pNo in range(1, pages + 1): # http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradedetail.php?symbol=sh600000&date=2018-12-26&page=1 url = cf.TODAY_TICKS_URL % (symbol, date, pNo) self._data = self._data.append(self.__handleTicks( url, cf.TODAY_TICK_COLUMNS, retry, pause), ignore_index=True) except Exception as e: print(str(e)) else: return self._result() raise IOError(cf.NETWORK_URL_ERROR_MSG)
def history(self, start='', end='', ktype='D', autype='qfq', index=False, retry=3, pause=0.001): """ 获取股票交易历史数据 --------- Parameters: start:string 开始日期 format:YYYY-MM-DD 为空时取上市首日 end:string 结束日期 format:YYYY-MM-DD 为空时取最近一个交易日 autype:string 复权类型,qfq-前复权 hfq-后复权 None-不复权,默认为qfq ktype:string 数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D retry: int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 return ------- DataFrame or list: [{'date':, 'open':, ...}, ...] date 交易日期 (index) open 开盘价 high 最高价 close 收盘价 low 最低价 volume 成交量 code 股票代码 """ self._data = pd.DataFrame() url = '' dataflag = '' symbol = cf.INDEX_SYMBOL[self.__code] if index else Utility.symbol( self.__code) autype = '' if autype is None else autype if (start is not None) & (start != ''): end = Utility.getToday() if end is None or end == '' else end if ktype.upper() in cf.K_LABELS: fq = autype if autype is not None else '' if self.__code[:1] in ('1', '5') or index: fq = '' kline = '' if autype is None else 'fq' if ((start is None or start == '') or (end is None or end == '')) or (start == end): # http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?_var=kline_dayqfq¶m=sh600000,day,,,640,qfq&r=0.73327461855388564 urls = [ cf.HISTORY_URL % (kline, fq, symbol, cf.TT_K_TYPE[ktype.upper()], start, end, fq, Utility.random(17)) ] else: years = Utility.ttDates(start, end) urls = [] for year in years: startdate = str(year) + '-01-01' enddate = str(year + 1) + '-12-31' # http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?_var=kline_dayqfq2008¶m=sh600000,day,2008-01-01,2009-12-31,640,qfq&r=0.73327461855388564 url = cf.HISTORY_URL % (kline, fq + str(year), symbol, cf.TT_K_TYPE[ktype.upper()], startdate, enddate, fq, Utility.random(17)) urls.append(url) dataflag = '%s%s' % (fq, cf.TT_K_TYPE[ktype.upper()]) # qfqday elif ktype in cf.K_MIN_LABELS: # http://ifzq.gtimg.cn/appstock/app/kline/mkline?param=sh600000,m30,,640&_var=m30_today&r=0.5537154641907898 urls = [ cf.HISTORY_MIN_URL % (symbol, ktype, ktype, Utility.random(16)) ] dataflag = 'm%s' % ktype # m30 else: raise TypeError('ktype input error.') for url in urls: self._data = self._data.append(self.__handleHistory( url, dataflag, symbol, index, ktype, retry, pause), ignore_index=True) if ktype not in cf.K_MIN_LABELS: if ((start is not None) & (start != '')) & ((end is not None) & (end != '')): self._data = self._data[(self._data.date >= start) & (self._data.date <= end)] return self._result() raise IOError(cf.NETWORK_URL_ERROR_MSG)
def realtime(self): """ 获取实时交易数据 getting real time quotes data 用于跟踪交易情况(本次执行的结果-上一次执行的数据) Parameters ------ stockdata(code) code : string, array-like object (list, tuple, Series). return ------- DataFrame or list: [{'name':, 'open':, ...}, ...] 0:name,股票名字 1:open,今日开盘价 2:pre_close,昨日收盘价 3:price,当前价格 4:high,今日最高价 5:low,今日最低价 6:bid,竞买价,即“买一”报价 7:ask,竞卖价,即“卖一”报价 8:volumn,成交量 maybe you need do volumn/100 9:amount,成交金额(元 CNY) 10:b1_v,委买一(笔数 bid volume) 11:b1_p,委买一(价格 bid price) 12:b2_v,“买二” 13:b2_p,“买二” 14:b3_v,“买三” 15:b3_p,“买三” 16:b4_v,“买四” 17:b4_p,“买四” 18:b5_v,“买五” 19:b5_p,“买五” 20:a1_v,委卖一(笔数 ask volume) 21:a1_p,委卖一(价格 ask price) ... 30:date,日期; 31:time,时间; """ self._data = pd.DataFrame() symbols_list = '' if isinstance(self.__code, list) or isinstance( self.__code, set) or isinstance( self.__code, tuple) or isinstance(self.__code, pd.Series): for code in self.__code: symbols_list += Utility.symbol(code) + ',' else: symbols_list = Utility.symbol(self.__code) symbols_list = symbols_list[:-1] if len( symbols_list) > 8 else symbols_list # http://hq.sinajs.cn/rn=4879967949085&list=sh600000,sh600004 request = self._session.get(cf.LIVE_DATA_URL % (Utility.random(), symbols_list), timeout=10) request.encoding = 'gbk' reg = re.compile(r'\="(.*?)\";') data = reg.findall(request.text) regSym = re.compile(r'(?:sh|sz)(.*?)\=') syms = regSym.findall(request.text) data_list = [] syms_list = [] for index, row in enumerate(data): if len(row) > 1: data_list.append([astr for astr in row.split(',')]) syms_list.append(syms[index]) if len(syms_list) == 0: return None self._data = pd.DataFrame(data_list, columns=cf.LIVE_DATA_COLS) self._data = self._data.drop('s', axis=1) self._data['code'] = syms_list ls = [cls for cls in self._data.columns if '_v' in cls] for txt in ls: self._data[txt] = self._data[txt].map(lambda x: x[:-2]) # 价格、成交量等转换为浮点类型 for col in [ 'open', 'pre_close', 'price', 'high', 'low', 'bid', 'ask', 'volume', 'amount', 'b1_v', 'b1_p', 'b2_v', 'b2_p', 'b3_v', 'b3_p', 'b4_v', 'b4_p', 'b5_v', 'b5_p', 'a1_v', 'a1_p', 'a2_v', 'a2_p', 'a3_v', 'a3_p', 'a4_v', 'a4_p', 'a5_v', 'a5_p' ]: self._data[col] = self._data[col].astype(float) return self._result()
def topList(self, date=None, retry=3, pause=0.001): """ 获取每日龙虎榜列表 Parameters -------- date:string 明细数据日期 format:YYYY-MM-DD 如果为空,返回最近一个交易日的数据 retry : int, 默认 3 如遇网络等问题重复执行的次数 pause : int, 默认 0 重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题 Return ------ DataFrame or List: [{'code':, 'name':, ...}, ...] code:代码 name :名称 pchange:涨跌幅 amount:龙虎榜成交额(万) buy:买入额(万) bratio:占总成交比例 sell:卖出额(万) sratio :占总成交比例 reason:上榜原因 unscramble: 解读 date :日期 """ self._data = pd.DataFrame() if date is None: if Utility.getHour() < 18: date = Utility.lastTradeDate() else: date = Utility.getToday() else: if not Utility.isTradeDay(date): return None for _ in range(retry): time.sleep(pause) try: # http://data.eastmoney.com/DataCenter_V3/stock2016/TradeDetail/pagesize=200,page=1,sortRule=-1,sortType=,startDate=2019-01-10,endDate=2019-01-10,gpfw=0,js=vardata_tab_1.html request = self._session.get(cf.LHB_URL % (date, date), timeout=10) request.encoding = 'gbk' text = request.text.split('_1=')[1] dataDict = Utility.str2Dict(text) self._data = pd.DataFrame(dataDict['data'], columns=cf.LHB_TMP_COLS) self._data.columns = cf.LHB_COLS self._data['buy'] = self._data['buy'].astype(float) self._data['sell'] = self._data['sell'].astype(float) self._data['amount'] = self._data['amount'].astype(float) self._data['Turnover'] = self._data['Turnover'].astype(float) self._data[ 'bratio'] = self._data['buy'] / self._data['Turnover'] self._data[ 'sratio'] = self._data['sell'] / self._data['Turnover'] self._data['bratio'] = self._data['bratio'].map(cf.FORMAT) self._data['sratio'] = self._data['sratio'].map(cf.FORMAT) self._data['date'] = date for col in ['amount', 'buy', 'sell']: self._data[col] = self._data[col].astype(float) self._data[col] = self._data[col] / 10000 self._data[col] = self._data[col].map(cf.FORMAT) self._data = self._data.drop('Turnover', axis=1) except: pass else: return self._result() raise IOError(cf.NETWORK_URL_ERROR_MSG)