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 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 __init__(self, code, start, end): super().__init__() self.frequence = FREQUENCE.DAY self.market_type = MARKET_TYPE.STOCK_CN self.backtest_stock_code = code start = QA_util_get_last_day( QA_util_get_real_date(start, trade_date_sse, -1), 100) self.stock_day_data = QAQuery_Advance.QA_fetch_stock_day_adv( self.backtest_stock_code, start, end) self.stock_day_data_qfq = self.stock_day_data.to_qfq() # print(self.stock_day_data) self.stock_bollinger_bands = QA_indicator_BOLL( self.stock_day_data_qfq()) # print(len(self.stock_bollinger_bands)) # print(self.stock_bollinger_bands) self.current_state = 0
def QA_quotation(code, start, end, frequence, market, source=DATASOURCE.TDX, output=OUTPUT_FORMAT.DATAFRAME): """一个统一的获取k线的方法 如果使用mongo,从本地数据库获取,失败则在线获取 Arguments: code {str/list} -- 期货/股票的代码 start {str} -- 开始日期 end {str} -- 结束日期 frequence {enum} -- 频率 QA.FREQUENCE market {enum} -- 市场 QA.MARKET_TYPE source {enum} -- 来源 QA.DATASOURCE output {enum} -- 输出类型 QA.OUTPUT_FORMAT """ res = None if market == MARKET_TYPE.STOCK_CN: if frequence == FREQUENCE.DAY: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_stock_day_adv(code, start, end) except: res = None if source == DATASOURCE.TDX or res == None: res = QATdx.QA_fetch_get_stock_day(code, start, end, '00') res = QA_DataStruct_Stock_day(res.set_index(['date', 'code'])) elif source == DATASOURCE.TUSHARE: res = QATushare.QA_fetch_get_stock_day(code, start, end, '00') elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_stock_min_adv( code, start, end, frequence=frequence) except: res = None if source == DATASOURCE.TDX or res == None: res = QATdx.QA_fetch_get_stock_min( code, start, end, frequence=frequence) res = QA_DataStruct_Stock_min( res.set_index(['datetime', 'code'])) elif market == MARKET_TYPE.FUTURE_CN: if frequence == FREQUENCE.DAY: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_future_day_adv(code, start, end) except: res = None if source == DATASOURCE.TDX or res is None: res = QATdx.QA_fetch_get_future_day(code, start, end) res = QA_DataStruct_Future_day(res.set_index(['date', 'code'])) elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_future_min_adv( code, start, end, frequence=frequence) except: res = None if source == DATASOURCE.TDX or res is None: res = QATdx.QA_fetch_get_future_min( code, start, end, frequence=frequence) res = QA_DataStruct_Future_min( res.set_index(['datetime', 'code'])) elif market == MARKET_TYPE.INDEX_CN: if frequence == FREQUENCE.DAY: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_index_day_adv(code, start, end) except: return None if source == DATASOURCE.TDX or res == None: res = QATdx.QA_fetch_get_index_day(code, start, end) res = QA_DataStruct_Index_day(res.set_index(['date', 'code'])) elif frequence in [FREQUENCE.ONE_MIN, FREQUENCE.FIVE_MIN, FREQUENCE.FIFTEEN_MIN, FREQUENCE.THIRTY_MIN, FREQUENCE.SIXTY_MIN]: if source == DATASOURCE.MONGO: try: res = QAQueryAdv.QA_fetch_index_min_adv( code, start, end, frequence=frequence) except: res = None if source == DATASOURCE.TDX or res == None: res = QATdx.QA_fetch_get_index_min( code, start, end, frequence=frequence) res = QA_DataStruct_Index_min( res.set_index(['datetime', 'code'])) elif market == MARKET_TYPE.OPTION_CN: if source == DATASOURCE.MONGO: #res = QAQueryAdv.QA_fetch_option_day_adv(code, start, end) raise NotImplementedError('CURRENT NOT FINISH THIS METHOD') # print(type(res)) if output is OUTPUT_FORMAT.DATAFRAME: return res.data elif output is OUTPUT_FORMAT.DATASTRUCT: return res elif output is OUTPUT_FORMAT.NDARRAY: return res.to_numpy() elif output is OUTPUT_FORMAT.JSON: return res.to_json() elif output is OUTPUT_FORMAT.LIST: return res.to_list()
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()