Example #1
0
    def __QA_backtest_prepare(self):
        """
        这是模型内部的 初始化,主要是初始化一些账户和市场资产
        写成了私有函数
        @yutiansut
        2017/7/20
        """
        if len(str(self.strategy_start_date))==10:
            self.strategy_start_time=str(self.strategy_start_date)+' 15:00:00'
        elif len(str(self.strategy_start_date))==19:
            self.strategy_start_time=str(self.strategy_start_date)
            self.strategy_start_date=str(self.strategy_start_date)[0:10]
        else:
            QA_util_log_info('Wrong start date format')

        if len(str(self.strategy_end_date))==10:
            self.strategy_end_time=str(self.strategy_end_date)+' 15:00:00'
        elif len(str(self.strategy_end_date))==19:
            self.strategy_end_time=str(self.strategy_end_date)
            self.strategy_end_date=str(self.strategy_end_date)[0:10]
        else:
            QA_util_log_info('Wrong end date format')
        # 重新初始账户资产
        self.market = QA_Market(self.commission_fee_coeff)
        self.setting.QA_setting_init()
        self.account.init()
        self.start_real_date = QA_util_get_real_date(
            self.strategy_start_date, self.trade_list, 1)
        self.start_real_time=str(self.start_real_date)+' '+self.strategy_start_time.split(' ')[1]
        self.start_real_id = self.trade_list.index(self.start_real_date)
        self.end_real_date = QA_util_get_real_date(
            self.strategy_end_date, self.trade_list, -1)
        self.end_real_id = self.trade_list.index(self.end_real_date)
        self.end_real_time=str(self.end_real_date)+' '+self.strategy_end_time.split(' ')[1]
        # 重新初始化账户的cookie
        self.account.account_cookie = str(random.random())
        # 初始化股票池的市场数据
        if self.benchmark_type in ['I','index']:
            self.benchmark_data = QA_fetch_index_day_adv(
                self.benchmark_code, self.start_real_date, self.end_real_date)
        elif self.benchmark_type in ['S','stock']:
            self.benchmark_data = QA_fetch_stock_day_adv(
                self.benchmark_code, self.start_real_date, self.end_real_date)
        if self.backtest_type in ['day', 'd', '0x00']:
            self.market_data = QA_fetch_stocklist_day_adv(
                self.strategy_stock_list, self.trade_list[self.start_real_id - int(
                    self.strategy_gap+1)], self.trade_list[self.end_real_id]).to_qfq()

        elif self.backtest_type in ['1min', '5min', '15min', '30min', '60min']:
            self.market_data = QA_fetch_stocklist_min_adv(
                self.strategy_stock_list, QA_util_time_gap(self.start_real_time,self.strategy_gap+1,'<',self.backtest_type),
                QA_util_time_gap(self.end_real_time,1,'>',self.backtest_type), self.backtest_type).to_qfq()

        elif self.backtest_type in ['index_day']:
            self.market_data = QA_fetch_index_day_adv(self.strategy_stock_list, self.trade_list[self.start_real_id - int(
                self.strategy_gap+1)], self.end_real_date)

        elif self.backtest_type in ['index_1min', 'index_5min', 'index_15min', 'index_30min', 'index_60min']:
            self.market_data = QA_fetch_index_min_adv(
                self.strategy_stock_list, QA_util_time_gap(self.start_real_time,self.strategy_gap+1,'<',self.backtest_type.split('_')[1]),  QA_util_time_gap(self.end_real_time,1,'>',self.backtest_type.split('_')[1]), self.backtest_type.split('_')[1])
Example #2
0
    def __QA_backtest_prepare(self):
        """
        这是模型内部的 初始化,主要是初始化一些账户和市场资产
        写成了私有函数
        @yutiansut
        2017/7/20
        """

        # 重新初始账户资产
        self.market = QA_Market(self.commission_fee_coeff)
        self.setting.QA_setting_init()
        self.account.init()
        self.start_real_date = QA_util_get_real_date(self.strategy_start_date,
                                                     self.trade_list, 1)
        self.start_real_id = self.trade_list.index(self.start_real_date)
        self.end_real_date = QA_util_get_real_date(self.strategy_end_date,
                                                   self.trade_list, -1)
        self.end_real_id = self.trade_list.index(self.end_real_date)
        # 重新初始化账户的cookie
        self.account.account_cookie = str(random.random())
        # 初始化股票池的市场数据
        self.benchmark_data = QA_fetch_index_day_adv(self.benchmark_code,
                                                     self.start_real_date,
                                                     self.end_real_date)
        if self.backtest_type in ['day', 'd', '0x00']:
            self.market_data = QA_fetch_stocklist_day_adv(
                self.strategy_stock_list,
                self.trade_list[self.start_real_id - int(self.strategy_gap)],
                self.trade_list[self.end_real_id]).to_qfq()

        elif self.backtest_type in ['1min', '5min', '15min', '30min', '60min']:
            self.market_data = QA_fetch_stocklist_min_adv(
                self.strategy_stock_list,
                self.trade_list[self.start_real_id - int(self.strategy_gap)],
                self.trade_list[self.end_real_id + 1],
                self.backtest_type).to_qfq()

        elif self.backtest_type in ['index_day']:
            self.market_data = QA_fetch_index_day_adv(
                self.strategy_stock_list,
                self.trade_list[self.start_real_id - int(self.strategy_gap)],
                self.trade_list[self.end_real_id])

        elif self.backtest_type in [
                'index_1min', 'index_5min', 'index_15min', 'index_30min',
                'index_60min'
        ]:
            self.market_data = QA_fetch_index_min_adv(
                self.strategy_stock_list, self.start_real_date,
                self.end_real_date,
                self.backtest_type.split('_')[1])
Example #3
0
 def subscribe_callback(self, code):
     """
     订阅回调
     :param code:
     :return:
     """
     if not isinstance(code, str):
         logger.error('not string , %s' % code)
         return
     today = datetime.datetime(self.cur_year, self.cur_month,
                               self.cur_day).isoformat()[:10]
     end_date = QA_util_get_pre_trade_date(cursor_date=today, n=1)[:10]
     if code not in self.code_list:
         self.code_list.append(code)
         # ETF or Stock, 获取前天的收盘价格
         logger.info("try fetch %s ,%s" % (code, end_date))
         if code.startswith('5') or code.startswith('1'):
             _data = QA_fetch_index_day_adv(code, end_date, end_date)
         else:
             _data = QA_fetch_stock_day_adv(code, end_date, end_date)
         if _data is not None:
             self.pre_market_data = concat(
                 [self.pre_market_data,
                  _data.data.reset_index()])
             logger.info("fetch %s" % _data.data.to_csv(header=False))
Example #4
0
 def test_getAdv_diffQA(self):
     """和QA返回的数据对比一致性
     """
     code = '000001'
     days = 365 * 1.2
     start = datetime.datetime.now() - datetime.timedelta(days)
     end = datetime.datetime.now() - datetime.timedelta(0)
     df = qm.getAdv(code, start, end)
     self.assertTrue(len(df) > 0, "返回数据数量应该大于0。")
     df2 = QA_fetch_index_day_adv(code, start, end)
     self.assertTrue(
         len(df.data) == len(df2.data),
         "和QA返回的数据,长度不一致{} {}".format(len(df.data), len(df2.data)))
     # 两种方式检测numpy数据一致性
     obo = self.differOneByOne(df.data, df2.data)
     self.assertTrue(df.data.equals(df2.data), "和QA返回的数据不一致{}".format(obo))
Example #5
0
    def get_prices(
        self,
        code_list: Union[str, Tuple[str], List[str]] = None,
        start_time: Union[str, datetime.datetime] = None,
        end_time: Union[str, datetime.datetime] = None,
        fq: str = None,
        frequence: str = None,
        price_type: str = None,
    ):
        """
        价格数据获取接口,单因子输入后,可以通过单因子获取股票代码,时间等参数信息

        参数
        ---
        :param code_list: 股票代码
        :param start_time: 起始时间
        :param end_time: 截止时间
        :param fq: 复权方式
        :param frequence: 时间频率
        """
        # 1. 股票池
        if isinstance(code_list, tuple):
            code_list = list(code_list)

        # 2. 时间频率
        if not frequence:
            frequence = self.frequence
        frequence = utils.get_frequence(frequence)

        if not start_time:
            start_time = self.start_time

        if not end_time:
            end_time = self.end_time

        if (not start_time) or (not end_time):
            raise ValueError("价格获取接口需要指定起始时间与结束时间")

        start_time = str(pd.Timestamp(start_time))[:19]
        end_time = str(pd.Timestamp(end_time))[:19]

        data = QA_fetch_stock_day_adv(code=code_list,
                                      start=start_time,
                                      end=end_time)
        index_data = QA_fetch_index_day_adv(code="000001",
                                            start=start_time,
                                            end=end_time)
        # 3. 复权
        if not fq:
            fq = self.fq

        if not fq:
            data = data
        elif fq.lower() in ["pre", "qfq", "前复权"]:
            data = data.to_qfq()
        elif fq.lower() in ["post", "hfq", "后复权"]:
            data = data.to_hfq()
        elif fq.lower() in ["none", "bfq", "不复权"]:
            data = data

        # 4. 重采样
        # 考虑到停牌退市等原因,重采样会有异常值,即日期与我们需要的日期不一致
        # 这里采用指数作为基准,对重采样数据进行再处理
        # 对于停牌数据缺失,采用前值作为填充
        if frequence == "1d":
            data = data.data.unstack().ffill().stack()
        else:
            index_data = index_data.resample(frequence).unstack()
            data = data.resample(frequence).unstack().ffill()
            data = data.reindex(index_data.index).stack()
            if frequence == '1q':
                data.index = data.index.map(lambda x:
                                            (utils.QA_fmt_quarter(x[0]), x[1]))

        # 5. 价格类型
        if not price_type:
            price_type = self.price_type

        if price_type.lower() is "avg":
            avg = data["amount"] / data["volume"] / 100.0
            return avg.unstack()
        return data[price_type.lower()].unstack()
Example #6
0
    def __QA_backtest_prepare(self):
        """
        这是模型内部的 初始化,主要是初始化一些账户和市场资产
        写成了私有函数
        @yutiansut
        2017/7/20
        """

        self.strategy_stock_list = np.unique(
            self.strategy_stock_list).tolist()  # 保证不会重复
        if len(str(self.strategy_start_date)) == 10:
            self.strategy_start_time = str(
                self.strategy_start_date) + ' 15:00:00'
        elif len(str(self.strategy_start_date)) == 19:
            self.strategy_start_time = str(self.strategy_start_date)
            self.strategy_start_date = str(self.strategy_start_date)[0:10]
        else:
            self.__QA_backtest_log_info(self, 'Wrong start date format')

        if len(str(self.strategy_end_date)) == 10:
            self.strategy_end_time = str(self.strategy_end_date) + ' 15:00:00'
        elif len(str(self.strategy_end_date)) == 19:
            self.strategy_end_time = str(self.strategy_end_date)
            self.strategy_end_date = str(self.strategy_end_date)[0:10]
        else:
            self.__QA_backtest_log_info(self, 'Wrong end date format')
        # 重新初始账户资产
        self.market = QA_Market(self.commission_fee_coeff)
        self.setting.QA_setting_init()
        self.account.init()
        self.account_d_value.append(self.account.init_assest)
        self.start_real_date = QA_util_get_real_date(self.strategy_start_date,
                                                     self.trade_list, 1)
        self.start_real_time = str(
            self.start_real_date) + ' ' + self.strategy_start_time.split(
                ' ')[1]
        self.start_real_id = self.trade_list.index(self.start_real_date)
        self.end_real_date = QA_util_get_real_date(self.strategy_end_date,
                                                   self.trade_list, -1)
        self.end_real_id = self.trade_list.index(self.end_real_date)
        self.end_real_time = str(self.end_real_date) + \
            ' ' + self.strategy_end_time.split(' ')[1]
        # 重新初始化账户的cookie
        self.account.account_cookie = str(random.random())
        # 初始化股票池的市场数据
        if self.benchmark_type in ['I', 'index']:
            self.benchmark_data = QA_fetch_index_day_adv(
                self.benchmark_code, self.trade_list[self.start_real_id - 1],
                self.end_real_date)
        elif self.benchmark_type in ['S', 'stock']:
            self.benchmark_data = QA_fetch_stock_day_adv(
                self.benchmark_code, self.trade_list[self.start_real_id - 1],
                self.end_real_date)
        if self.backtest_type in ['day', 'd', '0x00']:
            self.market_data = QA_fetch_stocklist_day_adv(
                self.strategy_stock_list,
                self.trade_list[self.start_real_id -
                                int(self.strategy_gap + 1)],
                self.trade_list[self.end_real_id]).to_qfq()

        elif self.backtest_type in ['1min', '5min', '15min', '30min', '60min']:
            self.market_data = QA_fetch_stocklist_min_adv(
                self.strategy_stock_list,
                QA_util_time_gap(self.start_real_time, self.strategy_gap + 1,
                                 '<', self.backtest_type),
                QA_util_time_gap(self.end_real_time, 1, '>',
                                 self.backtest_type),
                self.backtest_type).to_qfq()

        elif self.backtest_type in ['index_day']:
            self.market_data = QA_fetch_index_day_adv(
                self.strategy_stock_list,
                self.trade_list[self.start_real_id -
                                int(self.strategy_gap + 1)],
                self.end_real_date)

        elif self.backtest_type in [
                'index_1min', 'index_5min', 'index_15min', 'index_30min',
                'index_60min'
        ]:
            self.market_data = QA_fetch_index_min_adv(
                self.strategy_stock_list,
                QA_util_time_gap(self.start_real_time, self.strategy_gap + 1,
                                 '<',
                                 self.backtest_type.split('_')[1]),
                QA_util_time_gap(self.end_real_time, 1, '>',
                                 self.backtest_type.split('_')[1]),
                self.backtest_type.split('_')[1])
        self.market_data_dict = dict(
            zip(list(self.market_data.code), self.market_data.splits()))
        self.market_data_hashable = self.market_data.dicts
        self.dirs = '.{}QUANTAXIS_RESULT{}{}{}{}{}'.format(
            os.sep, os.sep, self.topic_name, os.sep, self.stratey_version,
            os.sep)
        os.makedirs(self.dirs, exist_ok=True)