예제 #1
0
    def run(self, save_trade_record=False):
        self.initialize()
        # 初始化 account_data
        if self.account:
            for account in self.account:
                Environment.current_account_data = AccountData()
                Environment.current_account_data.account_id = generate_random_id.generate_random_id(account)
                Environment.current_account_data.total_balance = self.capital[account]
                Environment.current_account_data.available = self.capital[account]
                # Environment.logger(Environment.current_account_data.account_id, Environment.current_account_data.available)
                Environment.bar_account_data_list.append(Environment.current_account_data)
        # if self.run_mode == RunMode.TRADE.value:
        #     self.end = self._get_data.get_end_time_tag(benchmark=self.benchmark, period=Period.DAILY.value)

        # 缓存数据开关,和bar_index的计算
        if self.period == Period.DAILY.value:
            self.daily_data_cache = True
        elif self.period == Period.ONE_MIN.value:
            self.one_min_data_cache = True
        # 
        security_list = copy.copy(self.universe)
        security_list = list(set(security_list))
        if self._daily_data_cache:
            Environment.daily_data = self._get_data.cache_all_stock_data(dividend_type=self.rights_adjustment)
            Environment.index_daily_data = self._get_data.cache_all_index_data()

        if self.one_min_data_cache:
            Environment.one_min_data = self._get_data.cache_all_stock_data(period=Period.ONE_MIN.value)

        if self.period == Period.DAILY.value:
            Environment.benchmark_index = [i for i in Environment.index_daily_data['close'][self.benchmark].index
                                           if self.start <= i <= self.end]

        elif self.period == Period.ONE_MIN.value:
            Environment.benchmark_index = [data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in
                                           Environment.one_min_data['open'].ix[self.benchmark].index
                                           if i >= data_transfer.date_str_to_int(self.start)]

        self.bar_index = 0

        while True:
            try:
                # Environment.logger(self.time_tag, Environment.benchmark_index)
                self.time_tag = Environment.benchmark_index[self.bar_index]
            except IndexError:
                if self.run_mode == RunMode.BACKTESTING.value:
                    if save_trade_record:
                        run_backtesting_analysis_engine(self)
                        break
                # elif self.run_mode == RunMode.TRADE.value:
                #     读取最新tick, 更新最新的分钟或者日线
                #     if 读取最新tick, 更新最新的分钟或者日线 == done:
                #         daily_data.append(new_day_data)
                #         self.bar_index += 1
                #         benchmark_index.append(new_day_time_tag)
            else:
                run_bar_engine(self)
예제 #2
0
    def get_all_market_data(self,
                            stock_code=[],
                            field=[],
                            start="",
                            end="",
                            period=Period.DAILY.value,
                            rights_adjustment=RightsAdjustment.NONE.value):
        """
        复权因子和skip_pause在这做
        :param stock_code:
        :param field:
        :param start:
        :param end:
        :param period:
        :param rights_adjustment:
        :return: 代码-n,字段-n,时间-n,  return dataframe 行-代码-timetag(多层索引),列-字段
        """

        if period == Period.DAILY.value:
            db_name = DatabaseName.MARKET_DATA_DAILY.value
            end = data_transfer.date_str_to_int(end)
            values = []
            colum = {"_id": 0, "timetag": 1}
            for i in field:
                colum[i] = 1
            for stock in stock_code:
                self.conn.check_connected()
                stock_market_data = self.conn.select_colum(
                    db_name=db_name,
                    table=stock,
                    value={"timetag": {
                        "$lte": end
                    }},
                    colum=colum)
                stock_market_data_list = list(stock_market_data)
                if stock_market_data_list:
                    df = pd.DataFrame(stock_market_data_list)
                    values.append(
                        pd.DataFrame(df[field].values,
                                     index=df['timetag'],
                                     columns=field))
            market_data = pd.concat(values, keys=stock_code)
        elif period == Period.ONE_MIN.value:
            db_name = DatabaseName.MARKET_DATA_ONE_MIN.value

        return market_data
예제 #3
0
    def run(self, save_trade_record=False):
        self.initialize()

        # 初始化 account_data
        if self.account:
            for account in self.account:
                Environment.current_account_data = AccountData()
                Environment.current_account_data.account_id = generate_random_id.generate_random_id(
                    account)
                Environment.current_account_data.total_balance = self.capital[
                    account]
                Environment.current_account_data.available = self.capital[
                    account]
                Environment.bar_account_data_list.append(
                    Environment.current_account_data)

        if self.run_mode == RunMode.TRADE.value:
            self.end = self._get_data.get_end_timetag(
                benchmark=self.benchmark, period=Period.DAILY.value)

        # 缓存数据开关,和bar_index的计算
        if self.period == Period.DAILY.value:
            self.daily_data_cache = True
        elif self.period == Period.ONE_MIN.value:
            self.one_min_data_cache = True
        stock_list = copy.copy(self.universe)
        stock_list.append(self.benchmark)
        stock_list = list(set(stock_list))
        if self._daily_data_cache:
            Environment.daily_data = self._get_data.get_all_market_data(
                stock_code=stock_list,
                field=["open", "high", "low", "close", "volumn", "amount"],
                end=self.end,
                period=Period.DAILY.value)
        if self.one_min_data_cache:
            Environment.one_min_data = self._get_data.get_all_market_data(
                stock_code=stock_list,
                field=["open", "high", "low", "close", "volumn", "amount"],
                end=self.end,
                period=Period.ONE_MIN.value)

        if self.period == Period.DAILY.value:
            Environment.benchmark_index = [
                data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i
                in Environment.daily_data["open"].ix[self.benchmark].index
                if i >= data_transfer.date_str_to_int(self.start)
            ]

        elif self.period == Period.ONE_MIN.value:
            Environment.benchmark_index = [
                data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i
                in Environment.one_min_data["open"].ix[self.benchmark].index
                if i >= data_transfer.date_str_to_int(self.start)
            ]

        # print(self.benchmark, self.start, self.end, self.period, self.rights_adjustment, self.run_mode)
        self.bar_index = 0
        while True:
            try:
                self.timetag = Environment.benchmark_index[self.bar_index]
            except IndexError:
                if self.run_mode == RunMode.BACKTESTING.value:
                    if save_trade_record:
                        run_backtesting_analysis_engine(self)

                    break
                elif self.run_mode == RunMode.TRADE.value:
                    '''读取最新tick, 更新最新的分钟或者日线
                    if 读取最新tick, 更新最新的分钟或者日线 == done:
                        daily_data.append(new_day_data)
                        self.bar_index += 1
                        benchmark_index.append(new_day_timetag)
                    '''
                    pass

            else:

                date = int(
                    data_transfer.millisecond_to_date(millisecond=self.timetag,
                                                      format="%Y%m%d"))
                run_bar_engine(self)

        @abstractmethod
        def initialize(self):
            pass

        @abstractmethod
        def handle_bar(self, event):
            pass
예제 #4
0
    def get_market_data(self,
                        market_data,
                        stock_code=[],
                        field=[],
                        start="",
                        end="",
                        count=-1):
        """
        从dataframe解析数据成最终的数据格式,count都在在这里做
        因为停牌或者其他原因取不到数据的,1 2 3 返回的是-1,其他返回的是pandas的空或者NaN,所以可以使用 >0判断是否取到值
        :param market_data:
        :param stock_code:
        :param field:
        :param start:
        :param end:
        :param count:
        :return:
        """
        if start != "":
            start = data_transfer.date_str_to_int(start)
        else:
            start = 0
        if end != "":
            end = data_transfer.date_str_to_int(end)
        else:
            end = 0
        # (1)代码-1,字段-1,时间-1,  return float
        if len(stock_code) == 1 and len(field) == 1 and (
                start == end) and count == -1:
            try:
                return market_data[field[0]].ix[stock_code[0], end]
            # 停牌或者其他情情况取不到数据的返回-1
            except:
                return -1
        # (2)代码-n,字段-1,时间-1,  return Series
        elif len(stock_code) > 1 and len(field) == 1 and (
                start == end) and count == -1:
            result_dict = {}
            for stock in stock_code:
                try:
                    result_dict[stock] = market_data[field[0]].ix[stock, end]
                except:
                    result_dict[stock] = -1
            return pd.Series(result_dict)
        # (3)代码-1,字段-n,时间-1,  return Series
        elif len(stock_code) == 1 and len(field) > 1 and (
                start == end) and count == -1:
            result_dict = {}
            for field_one in field:
                try:
                    result_dict[field_one] = market_data[field_one].ix[
                        stock_code[0], end]
                except:
                    result_dict[field_one] = -1
            return pd.Series(result_dict)
        # (4)代码-1,字段-1,时间-n,  return Series
        elif len(stock_code) == 1 and len(field) == 1 and (
                start != end) and count == -1:
            try:
                series = market_data[field[0]].ix[stock_code[0]]
            except KeyError:
                return pd.Series()

            series = series[series.index >= start]
            series = series[series.index <= end]
            return series
        # (5)代码-n,字段-1,时间-n,  return dataframe 行-timetag,列-代码
        elif len(stock_code) > 1 and len(field) == 1 and (start !=
                                                          end) and count == -1:
            result_dict = {}
            for stock in stock_code:
                index = market_data.ix[stock].index
                index = index[index <= end]
                index = index[index >= start]
                result_dict[stock] = market_data[field[0]].ix[stock][index]
            return pd.DataFrame(result_dict)
        # (6)代码-n,字段-n,时间-1,  return dataframe 行-字段,列-代码
        elif len(stock_code) > 1 and len(field) > 1 and (
                start == end) and count == -1:
            result_dict = {}
            for stock in stock_code:
                try:
                    result_dict[stock] = market_data.ix[stock].ix[end]
                except:
                    result_dict[stock] = pd.Series()
            return pd.DataFrame(result_dict).ix[field]
        # (7)代码-1,字段-n,时间-n,  return dataframe 行-timetag,列-字段
        elif len(stock_code) == 1 and len(field) > 1 and (start !=
                                                          end) and count == -1:
            index = market_data.ix[stock_code[0]].index
            index = index[index <= end]
            index = index[index >= start]
            return market_data.ix[stock_code[0]][field].ix[index]
        # 代码-n,字段-n,时间-n,  return dataframe 行-代码-timetag(多层索引),列-字段
        else:
            result_dict = {}
            for stock in stock_code:
                index = market_data.ix[stock].index
                index = index[index <= end]
                index = index[index >= start]
                result_dict[stock] = market_data.ix[stock][field].ix[index]
            return pd.concat(result_dict, keys=stock_code)