Example #1
0
    def get_history_data(self, code_list, frequency="1min", n=1):
        """
        获取历史数据
        :param code_list:
        :param frequency: k线数据级别
        :param n: (当天)前n个交易日 n = QA_util_get_trade_gap(start_date, today_)
        :return:
        """
        # TODO 历史数据部分应放在策略计算,而不是数据采集部分
        # TODO get history bar data
        # TODO 调用QA_fetch_stock_min_adv(code, start, end) 从数据库获取数据
        today = datetime.datetime(self.cur_year, self.cur_month,
                                  self.cur_day).isoformat()[:10]
        start_date = QA_util_get_pre_trade_date(cursor_date=today, n=n)[:10]
        end_date = QA_util_get_pre_trade_date(cursor_date=today, n=1)[:10]
        # start='2019-05-08', end='2019-05-09' means start from 2019-05-08 9:30 and end to 2019-05-09 15:00
        data = None
        try:
            data = QA_fetch_stock_min_adv(code_list,
                                          start=start_date,
                                          end=end_date)
        except Exception as e:
            logger.error("fetch stock min history data failure. " +
                         e.__str__())

        if data is not None:
            for code in data.code.to_list():
                qa_data = data.select_code(code)
                if qa_data is not None:
                    # TODO 规定标准columns
                    self.publish_msg(qa_data.data.to_msgpack())
        else:
            lens = 0  # initial data len
            if frequency in ['5', '5m', '5min', 'five']:
                lens = 48 * n
            elif frequency in ['1', '1m', '1min', 'one']:
                lens = 240 * n
            elif frequency in ['15', '15m', '15min', 'fifteen']:
                lens = 16 * n
            elif frequency in ['30', '30m', '30min', 'half']:
                lens = 8 * n
            elif frequency in ['60', '60m', '60min', '1h']:
                lens = 4 * n
            lens = 20800 if lens > 20800 else lens
            # TODO 如果获取失败则在线获取 参考save stock min
            # data = self.get_security_bar_concurrent(code_list, frequency, lens)
            # TODO 规定标准columns
            # self.publish_msg(qa_data.data.to_msgpack())
        pass
Example #2
0
    def __init__(
        self,
        market_type,
        frequence,
        start,
        end,
        code_list,
        commission_fee,
    ):
        self.user = QA_User()
        self.if_settled = False
        self.account = None
        self.portfolio = None

        self.market = QA_Market()
        self.market_type = market_type
        self.frequence = frequence
        self.broker = QA_BacktestBroker(commission_fee)
        self.broker_name = 'backtest_broker'

        self.start = start
        self.end = end
        self.code_list = code_list

        if self.market_type is MARKET_TYPE.STOCK_CN and self.frequence is FREQUENCE.DAY:
            self.ingest_data = QA_fetch_stock_day_adv(
                self.code_list, self.start, self.end).to_qfq().panel_gen
        elif self.market_type is MARKET_TYPE.STOCK_CN and self.frequence[
                -3:] == 'min':
            self.ingest_data = QA_fetch_stock_min_adv(
                self.code_list, self.start, self.end,
                self.frequence).to_qfq().panel_gen
    def get(self):
        """
        采用了get_arguents来获取参数
        默认参数: code-->000001 start-->2017-01-01 09:00:00 end-->now

        """
        code = self.get_argument('code', default='000001')
        start = self.get_argument('start', default='2017-01-01 09:00:00')
        end = self.get_argument('end', default=str(datetime.datetime.now()))
        frequence = self.get_argument('frequence', default='1min')
        if_fq = self.get_argument('if_fq', default=False)

        if if_fq:
            data = QA_util_to_json_from_pandas(
                QA_fetch_stock_min_adv(code, start, end,
                                       frequence).to_qfq().data)

            self.write({'result': data})
        else:
            data = QA_util_to_json_from_pandas(
                QA_fetch_stock_min(code,
                                   start,
                                   end,
                                   format='pd',
                                   frequence=frequence))

            self.write({'result': data})

        self.write({'result': data})
Example #4
0
    def __init__(
            self,
            market_type,
            frequence,
            start,
            end,
            code_list,
            commission_fee,
            username='******',
            password='******',
            portfolio_cookie='qatestportfolio'
    ):
        """
        :param market_type: 回测的市场 MARKET_TYPE.STOCK_CN ,
        :param frequence: 'day' '1min' '5min' '15min' '30min' '60min'
        :param start:     开始日期
        :param end:       结束日期
        :param code_list: 股票代码池
        :param commission_fee: 交易佣金
        """
        self.user = QA_User(username=username, password=password)
        self.if_settled = False
        self.account = None
        self.portfolio = self.user.new_portfolio(portfolio_cookie)
        # 🛠todo market_type 应该放在 QA_Market对象里的一个属性
        self.market = QA_Market(if_start_orderthreading=True)
        self.market_type = market_type

        self.frequence = frequence
        self.broker = QA_BacktestBroker(commission_fee)
        self.broker_name = 'backtest_broker'

        self.start = start
        self.end = end
        self.code_list = code_list

        # 🛠todo 检查start日期和结束end日期是否正确
        # 🛠todo 检查code list 是否合法

        # 根据 市场类型,回测周期频率, 和股票代码列表 获取回测数据
        if self.market_type is MARKET_TYPE.STOCK_CN and self.frequence is FREQUENCE.DAY:
            # 获取日线级别的回测数据
            self.ingest_data = QA_fetch_stock_day_adv(
                self.code_list,
                self.start,
                self.end
            ).to_qfq().panel_gen
        elif self.market_type is MARKET_TYPE.STOCK_CN and self.frequence[
                -3:] == 'min':
            # 获取分钟级别的回测数据
            self.ingest_data = QA_fetch_stock_min_adv(
                self.code_list,
                self.start,
                self.end,
                self.frequence
            ).to_qfq().panel_gen

        else:
            QA_util_log_info("{} 的市场类型没有实现!".format(market_type))
Example #5
0
    def __init__(
        self,
        market_type,
        frequence,
        start,
        end,
        code_list,
        commission_fee,
    ):
        """

        :param market_type: 回测的市场 MARKET_TYPE.STOCK_CN ,
        :param frequence: 'day' '1min' '5min' '15min' '30min' '60min'
        :param start:     开始日期
        :param end:       结束日期
        :param code_list: 股票代码池
        :param commission_fee: 交易佣金
        """
        self.user = QA_User()
        self.if_settled = False
        self.account = None
        self.portfolio = None

        self.market = QA_Market()
        self.market_type = market_type
        self.frequence = frequence
        self.broker = QA_BacktestBroker(commission_fee)
        self.broker_name = 'backtest_broker'

        self.start = start
        self.end = end
        self.code_list = code_list

        if self.market_type is MARKET_TYPE.STOCK_CN and self.frequence is FREQUENCE.DAY:
            self.ingest_data = QA_fetch_stock_day_adv(
                self.code_list, self.start, self.end).to_qfq().panel_gen
        elif self.market_type is MARKET_TYPE.STOCK_CN and self.frequence[
                -3:] == 'min':
            self.ingest_data = QA_fetch_stock_min_adv(
                self.code_list, self.start, self.end,
                self.frequence).to_qfq().panel_gen
        else:
            QA_util_log_info("{} 的市场类型没有实现!".format(market_type))