Example #1
0
    def __init__(self,
                 _fit_period: int = 60,
                 _fit_begin: int = 252,
                 _factor: int = 1,
                 _smooth_period: int = 1,
                 _use_key: str = 'closeprice',
                 _idx_key: str = 'time',
                 _ret_key: typing.Tuple[str] = ('estimate', 'predict')):
        super().__init__()

        self.fit_count = 0
        self.fit_period = _fit_period
        self.fit_begin = _fit_begin
        self.factor = math.sqrt(_factor)
        self.smooth_period = _smooth_period

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.data = DataStruct(
            [self.idx_key, self.ret_key[0], self.ret_key[1]], self.idx_key)

        self.last_price = None
        self.rate_buf = []
        self.param = None
        self.sigma2 = None
Example #2
0
    def __init__(self,
                 _period: int,
                 _use_key: str,
                 _init_n: int = 20,
                 _min_n: int = 20,
                 _max_n: int = 60,
                 _rate: float = 2.0,
                 _idx_key: str = 'time'):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.keys = [self.idx_key, 'upband', 'midband', 'downband']

        self.data = DataStruct(self.keys, self.idx_key)

        self.period = _period
        self.rate = _rate
        self.buf = []

        self.prev_std = None

        self.dynamic_n = float(_init_n)
        self.min_n = _min_n
        self.max_n = _max_n
Example #3
0
    def __init__(
            self,
            _fit_period: int = 60,
            _fit_begin: int = 252,
            _use_key: str = 'closeprice',
            _idx_key: str = 'time',
            _ret_key: typing.Tuple[str] = ('mean', 'std'),
    ):
        super().__init__()

        # fitting control
        self.fit_count = 0
        self.fit_period = _fit_period
        self.fit_begin = _fit_begin

        self.model = ARMAIGARCHModel(_use_mu=False)

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.data = DataStruct(
            [self.idx_key, self.ret_key[0], self.ret_key[1]], self.idx_key)
        # log return buf
        self.last_price = None
        self.return_buf = []
        # model params
        self.phi = None
        self.theta = None
        self.alpha = None
        self.beta = None
        self.const = None
        self.new_mean = None
        self.new_info = None
        self.new_var = None
Example #4
0
    def __init__(
            self,
            _price_data: DataStruct,
            _volatility_data: DataStruct,
            _stop_type: int,
            _rate: float = 4,
            _price_use_key: str = 'closeprice',
            _volatility_use_key: str = 'volatility',
            _idx_key: str = 'time',
            _ret_key: str = 'stopprice',
    ):
        super().__init__()

        assert len(_price_data) == 1
        assert len(_volatility_data) == 1

        self.stop_type = _stop_type
        self.rate = _rate
        self.price_use_key = _price_use_key
        self.volatility_use_key = _volatility_use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.data = DataStruct(
            [self.idx_key, self.ret_key],
            self.idx_key,
        )

        self._addOne(_price_data, _volatility_data)
Example #5
0
    def __init__(
        self, _ada_period: int=30,
        _init_x: float = 0.0, _init_P: float =1.0,
        _init_R: float = 0.1 ** 2, _init_Q: float = 0.01 ** 2,
        _use_key: str = 'closeprice',
        _idx_key: str = 'time', _ret_key: str = 'kalman'
    ):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct(
            [self.idx_key, self.ret_key],
            self.idx_key
        )

        self.ada_period = _ada_period
        self.value_std = FastSTD(_ada_period, _use_key=self.use_key)
        self.x_std = FastSTD(_ada_period, _use_key='x')

        self.R = _init_R
        self.Q = _init_Q

        self.x = _init_x
        self.P = _init_P
    def __init__(
        self,
        _data: DataStruct,
        _stop_type: int,
        _stop_rate: float = 0.05,
        _use_key: str = 'closeprice',
        _idx_key: str = 'time',
        _ret_key: str = 'stopprice',
    ):
        super().__init__()

        assert len(_data) == 1

        self.stop_type = _stop_type
        self.stop_rate = _stop_rate
        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        price = _data[self.use_key][0]
        if self.stop_type == SignalType.LONG:
            stop_price = price * (1 - self.stop_rate)
        elif self.stop_type == SignalType.SHORT:
            stop_price = price * (1 + self.stop_rate)
        else:
            raise Exception('unknown type')
        time = _data.index()[0]

        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key,
                               [[time, stop_price]])
    def updateData(self) -> typing.Union[None, ReturnMarket, ReturnSettlement]:
        if not self.symbol_dict:
            self._set_symbol_dict()
            self._sub_data()

        while True:
            # update datetime and tradingday, and check settlement
            self.cur_datetime = datetime.utcnow()
            cur_tradingday = self.cur_datetime.date().strftime('%Y%m%d')
            if self.tradingday != cur_tradingday:
                logging.info('New TradingDay: {}'.format(cur_tradingday))
                tmp = self.tradingday
                self.tradingday = cur_tradingday
                return self.addSettlementEvent(tmp)

            raw_data = self.data_sub.pop()
            # check lts
            data_lts = raw_data['lts']
            cur_lts = time() * 1000
            if data_lts + TIMEOUT < cur_lts:  # too old data
                continue

            symbol = (raw_data['exname'], raw_data['symbol'])
            try:
                tickers = raw_data['data']['tickers']
                for d in tickers:
                    d['datetime'] = datetime.utcfromtimestamp(d['time'] / 1000)
                datastruct = DataStruct(self.column_list,
                                        'datetime',
                                        _dicts=raw_data['data']['tickers'])
                return self.addMarketEvent(symbol, datastruct)
            except Exception as e:
                logging.error('get datastruct error: {}'.format(e))
Example #8
0
    def __init__(
        self,
        _price_data: DataStruct,
        _atr_data: DataStruct,
        _stop_type: int,
        _rate: float = 3,
        _price_use_key: str = 'closeprice',
        _atr_use_key: str = 'atr',
        _idx_key: str = 'time',
        _ret_key: str = 'stopprice',
    ):
        super().__init__()

        assert len(_price_data) == 1
        assert len(_atr_data) == 1

        self.stop_type = _stop_type
        self.rate = _rate
        self.price_use_key = _price_use_key
        self.atr_use_key = _atr_use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.data = DataStruct(
            [self.idx_key, self.ret_key],
            self.idx_key,
        )

        self.best_price = _price_data[self.price_use_key][0]
        self._addOne(_price_data, _atr_data)
Example #9
0
    def getSettlementData(self):
        tmp = DataStruct(['tradingday', 'fund', 'commission', 'margin'],
                         'tradingday')
        for d in self.settlement_record:
            tmp.addDict(d)

        return tmp
Example #10
0
    def __init__(
        self,
        _fit_period: int = 60,
        _fit_begin: int = 252,
        _factor: int = 1,
        _smooth_period: int = 1,
        _use_key: str = 'closeprice',
        _idx_key: str = 'time',
        _ret_key: str = 'predict',
    ):
        super().__init__()

        # fitting control
        self.fit_count = 0
        self.fit_period = _fit_period
        self.fit_begin = _fit_begin
        # scale the volatility
        self.factor = math.sqrt(_factor)
        self.smooth_period = _smooth_period

        self.model = IGARCHModel(_use_mu=False)

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)
        # log return buf
        self.last_price = None
        self.return_buf = []
        # model params
        self.alpha = None
        self.beta = None
        self.const = None
        self.latent = None
Example #11
0
    def fetchData(
            self, _tradingday: str, _symbol: typing.Tuple[str, str],
            _cache=True, _index: str = 'datetime'
    ) -> typing.Union[None, DataStruct]:
        exname, symbol = _symbol

        table_name = self.table_key.format(exname, symbol)
        key = self.market_key.format(table_name, _tradingday)
        if _cache:
            try:
                return self.cache[key]
            except KeyError:
                pass

        # fetch from database
        begin_date = arrow.get(_tradingday, 'YYYYMMDD')
        end_date = begin_date.shift(days=1)
        con, cur = self._get_psql_con_cur()
        cur.execute(
            "SELECT * FROM {} WHERE datetime>='{}' AND datetime<'{}' "
            "ORDER BY {}".format(
                table_name, begin_date, end_date, _index
            )
        )
        data = list(cur.fetchall())
        if len(data):
            data = DataStruct(self.columns, _index, data)
        else:
            data = None

        if _cache:
            self.cache[key] = data
        return data
Example #12
0
    def __init__(
        self,
        _init_step: float = 0.02,
        _max_step: float = 0.2,
        _close_key: str = 'closeprice',
        _high_key: str = 'highprice',
        _low_key: str = 'lowprice',
        _idx_key: str = 'time',
        _ret_key: str = 'sar',
    ):
        super().__init__()

        self.close_key = _close_key
        self.high_key = _high_key
        self.low_key = _low_key

        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)

        self.init_step = _init_step
        self.max_step = _max_step

        self.status = self.BEGIN
        self.ep = None
        self.step = None
        self.sar = None
    def __init__(
        self,
        _data: DataStruct,
        _stop_type: int,
        _stop_rate: float = 0.05,
        _use_key: str = 'closeprice',
        _idx_key: str = 'time',
        _ret_key: str = 'stopprice',
    ):
        super().__init__()

        assert len(_data) == 1

        self.stop_type = _stop_type
        self.stop_rate = _stop_rate
        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key

        self.best_price = _data.toDict()[self.use_key]

        time = _data.index()[0]

        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key,
                               [[time, self.get_stop_price()]])
Example #14
0
    def settlement(self, _backtest_key) -> DataStruct:
        settlement_list = self.fetchSettlementRecords(_backtest_key)
        keys = ['tradingday', 'type', 'fund', 'commission', 'margin']
        ret = DataStruct(keys, 'tradingday')
        for d in settlement_list:
            ret.addDict(d)

        return ret
Example #15
0
    def getSignalData(self):
        tmp = DataStruct(
            ['strategy', 'tradingday', 'datetime', 'symbol', 'strength'],
            'datetime')
        for d in self.signal_record:
            tmp.addDict(d)

        return tmp
Example #16
0
    def __init__(self,
                 _use_key: str,
                 _idx_key: str = 'time',
                 _ret_key: str = 'low'):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)
Example #17
0
    def fillToBuySell(
            self,
            _backtest_key: str,
            _strategy: str = None) -> typing.Tuple[DataStruct, DataStruct]:
        fill_list = self.fetchFillRecords(_backtest_key, _strategy)
        keys = [
            'type', 'index', 'symbol', 'tradingday', 'datetime', 'quantity',
            'action', 'direction', 'price', 'commission', 'strategy'
        ]
        buy_ret = DataStruct(keys, 'datetime')
        sell_ret = DataStruct(keys, 'datetime')

        for d in fill_list:
            if d['direction'] == DirectionType.BUY:
                buy_ret.addDict(d)
            if d['direction'] == DirectionType.SELL:
                sell_ret.addDict(d)

        return buy_ret, sell_ret
Example #18
0
    def signalToLongShort(
            self,
            _backtest_key: str,
            _strategy: str = None) -> typing.Tuple[DataStruct, DataStruct]:
        signal_list = self.fetchSignalRecords(_backtest_key, _strategy)
        keys = [
            'type', 'symbol', 'strategy', 'signal_type', 'tradingday',
            'datetime', 'strength'
        ]
        long_ret = DataStruct(keys, 'datetime')
        short_ret = DataStruct(keys, 'datetime')

        for d in signal_list:
            if d['signal_type'] == SignalType.LONG:
                long_ret.addDict(d)
            if d['signal_type'] == SignalType.SHORT:
                short_ret.addDict(d)

        return long_ret, short_ret
Example #19
0
    def getFillData(self):
        tmp = DataStruct([
            'strategy', 'tradingday', 'datetime', 'symbol', 'index', 'action',
            'direction', 'price', 'quantity', 'commission'
        ], 'datetime')
        for d in self.fill_record:
            d = copy(d)
            d['action'] = ActionType.toStr(d['action'])
            d['direction'] = DirectionType.toStr(d['direction'])
            tmp.addDict(d)

        return tmp
Example #20
0
    def getOrderData(self):
        tmp = DataStruct([
            'strategy', 'tradingday', 'datetime', 'symbol', 'index',
            'order_type', 'action', 'direction', 'quantity', 'price'
        ], 'datetime')
        for d in self.order_record:
            d = copy(d)
            d['order_type'] = OrderType.toStr(d['order_type'])
            d['action'] = ActionType.toStr(d['action'])
            d['direction'] = DirectionType.toStr(d['direction'])
            tmp.addDict(d)

        return tmp
Example #21
0
    def __init__(self,
                 _period: int,
                 _use_key: str = 'closeprice',
                 _idx_key: str = 'time',
                 _ret_key: str = 'momentum'):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)

        self.buf = deque(maxlen=_period)
Example #22
0
    def __init__(
            self, _use_key: str, _idx_key: str = 'time',
            _ret_key: typing.Sequence[str] = ('open', 'high', 'low', 'close')
    ):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct(
            [self.idx_key] + list(self.ret_key),
            self.idx_key
        )
Example #23
0
    def updateData(self) -> typing.Union[None, ReturnMarket, ReturnSettlement]:
        if not self.symbol_dict:
            self._set_symbol_dict()
            self._sub_data()

        while True:
            # update datetime and tradingday, and check settlement
            self.cur_datetime = datetime.utcnow()
            cur_tradingday = self.cur_datetime.date().strftime('%Y%m%d')
            if self.tradingday != cur_tradingday:
                logging.info('New TradingDay: {}'.format(cur_tradingday))
                tmp = self.tradingday
                self.tradingday = cur_tradingday
                return self.addSettlementEvent(tmp)

            raw_data = self.data_sub.pop()
            # check lts
            data_lts = raw_data['lts']
            cur_lts = time() * 1000
            if data_lts + TIMEOUT < cur_lts:  # too old data
                continue

            symbol = (raw_data['exname'], raw_data['symbol'])
            tuple_data = clip_depth(raw_data['data'], LEVEL)
            try:
                last_data = self.last_data_dict[symbol]
                if last_data != tuple_data:
                    return self.addMarketEvent(
                        symbol,
                        DataStruct(self.column_list, 'datetime',
                                   [tuple_data + (self.cur_datetime, )]))
                else:
                    continue
            except KeyError:
                datastruct = DataStruct(self.column_list, 'datetime',
                                        [tuple_data + (self.cur_datetime, )])
                return self.addMarketEvent(symbol, datastruct)
            finally:
                self.last_data_dict[symbol] = tuple_data
Example #24
0
    def __init__(self,
                 _skip_period: int = 1,
                 _use_key: str = 'closeprice',
                 _idx_key: str = 'time',
                 _ret_key: str = 'logreturn'):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)

        self.skip_period = _skip_period
        self.buf = deque(maxlen=self.skip_period)
Example #25
0
    def __init__(self,
                 _period: int,
                 _use_key: str = 'closeprice',
                 _idx_key: str = 'time',
                 _ret_key: str = 'kurtosis'):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)

        self.period = _period
        self.last_price = None
        self.buf = deque(maxlen=self.period)
Example #26
0
    def __init__(
            self, _period: int, _use_key: str='closeprice',
            _idx_key: str = 'time', _ret_key: str = 'ema'
    ):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct(
            [self.idx_key, self.ret_key],
            self.idx_key
        )

        self.period = _period
Example #27
0
    def fetchDayData(
            self, _begin_day: str, _end_day: str,
            _symbol: str, _index: str = 'datetime'
    ) -> DataStruct:
        exname, symbol = _symbol

        table_name = self.table_key.format(exname, symbol)
        con, cur = self._get_psql_con_cur()
        cur.execute(
            "SELECT * FROM {} WHERE datetime>='{}' AND datetime<'{}' "
            "ORDER BY {}".format(
                table_name, _begin_day, _end_day, _index
            )
        )
        data = list(cur.fetchall())

        return DataStruct(self.columns, _index, data)
Example #28
0
    def __init__(self,
                 _period: int = 26,
                 _use_key: str = 'closeprice',
                 _rate: float = 2.0,
                 _idx_key: str = 'time',
                 _ret_key=('upband', 'midband', 'downband')):
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.keys = [self.idx_key] + list(_ret_key)

        self.data = DataStruct(self.keys, self.idx_key)

        self.period = _period
        self.rate = _rate
        self.buf = deque(maxlen=self.period)
    def deal(self, _market_event: MarketEvent):
        """
        recv ticker data from market supply,
        and split into min, the call do_deal(...)

        :param _market_event:
        :return:
        """
        symbol = _market_event.symbol
        data = _market_event.data

        for period in self.min_periods:
            key = symbol + (period, )
            try:
                spliter = self.split_dict[key]
            except KeyError:
                spliter = self.split_dict[key] = SplitIntoMinute(period)

            flag = False
            for d in data:
                flag = flag or spliter.addOne(d)
            if flag:  # gen new bar
                if len(spliter.getBarList()) > 1:  # has finished bar
                    last_bar = spliter.getBarList().pop(0)
                    last_begin_time = spliter.getBarBeginTimeList().pop(0)
                    last_end_time = spliter.getBarEndTimeList().pop(0)
                    price_list = last_bar['price']
                    volume_list = last_bar['amount']
                    bar_data = DataStruct([
                        'open', 'high', 'low', 'close', 'volume', 'begin_time',
                        'end_time'
                    ], 'begin_time')
                    bar_data.addDict({
                        'open': price_list[0],
                        'high': max(price_list),
                        'low': min(price_list),
                        'close': price_list[-1],
                        'volume': sum(volume_list),
                        'begin_time': last_begin_time,
                        'end_time': last_end_time
                    })
                    self.do_deal(
                        MarketEvent(_market_event.market_register_key,
                                    _market_event.strategy,
                                    _market_event.symbol, bar_data), period)
Example #30
0
    def __init__(self,
                 _N: int = 30,
                 _use_key: typing.List[str] = ['highprice', 'lowprice'],
                 _idx_key: str = 'time',
                 _ret_key: str = 'rsrs'):
        """
        _N: sample length
        """
        super().__init__()

        self.use_key = _use_key
        self.idx_key = _idx_key
        self.ret_key = _ret_key
        self.data = DataStruct([self.idx_key, self.ret_key], self.idx_key)

        self.N = _N

        self.high_buf = deque(maxlen=self.N)
        self.low_buf = deque(maxlen=self.N)