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
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
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
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
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')
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
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()
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()
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()
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)
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)
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
def QA_fetch_get_security_bars(code, _type, lens): return QATdx.QA_fetch_get_security_bars(code, _type, lens)
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])
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()
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()
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:
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
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
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