def get_rsi(self, symbol: str, date: str, n: int):
        """ 计算所有日期的 RSI(n) 序列, 返回给定日期的 RSI(n) """

        key = f'rsi-{n}'
        if self.computed_memo.contains(symbol, key):
            if len(self.computed_memo.get(symbol, key)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                if date in global_data_instance.symbol_to_date_set[symbol]:
                    offset = global_data_instance.find_date_offset(
                        symbol, date)
                    return self.computed_memo.get(symbol, key)[offset]
                else:
                    return np.nan

        close_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)

        # LC:=REF(CLOSE,1);
        lc = ref(close_array, 1)

        # RSI:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
        rsi = self.sma(np.maximum(close_array - lc, 0), n, 1) / (
            self.sma(np.abs(close_array - lc), n, 1) + 1e-6) * 100  # 避免0÷0
        self.computed_memo.set(symbol, key, rsi)  # 计算出来后填入缓存

        offset = global_data_instance.find_date_offset(symbol, date)
        return rsi[offset]
    def get_cci(self, symbol: str, date: str, n: int):
        """ 计算所有日期的 CCI(n) 序列, 返回给定日期的 CCI(n) """

        key = f'cci-{n}'
        if self.computed_memo.contains(symbol, key):
            if len(self.computed_memo.get(symbol, key)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                if date in global_data_instance.symbol_to_date_set[symbol]:
                    offset = global_data_instance.find_date_offset(
                        symbol, date)
                    return self.computed_memo.get(symbol, key)[offset]
                else:
                    return np.nan

        close_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)
        high_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.HIGH, global_data_instance.START_DOWNLOAD_DATE)
        low_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.LOW, global_data_instance.START_DOWNLOAD_DATE)

        # TYP:=(HIGH+LOW+CLOSE)/3;
        # CCI:(TYP-MA(TYP,N))/(0.015*AVEDEV(TYP,N));
        typ = (high_array + low_array + close_array) / 3
        cci = (typ - self.ma(typ, n)) / (0.015 * self.avedev(typ, n))
        self.computed_memo.set(symbol, key, cci)  # 计算出来后填入缓存

        offset = global_data_instance.find_date_offset(symbol, date)
        return cci[offset]
Example #3
0
    def get_kdj(self, symbol: str, date: str, n: int, m: int):
        """ 计算所有日期的 KDJ 序列, 返回给定日期的 KDJ 的J值 """

        key = f'kdj-{n}-{m}'
        if self.computed_memo.contains(symbol, key):
            if len(self.computed_memo.get(symbol, key)) == len(global_data_instance.symbol_to_date_list[symbol]):  # 并且array长度相等(数据存在且正确)
                if date in global_data_instance.symbol_to_date_set[symbol]:
                    offset = global_data_instance.find_date_offset(symbol, date)
                    return self.computed_memo.get(symbol, key)[offset]
                else:
                    return np.nan

        close_array = global_data_instance.get_array_since_date(symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)
        high_array = global_data_instance.get_array_since_date(symbol, OHLCV.HIGH, global_data_instance.START_DOWNLOAD_DATE)
        low_array = global_data_instance.get_array_since_date(symbol, OHLCV.LOW, global_data_instance.START_DOWNLOAD_DATE)

        # 获取LLV(N)
        key = f'llv-{n}'
        llv = None
        if self.computed_memo.contains(symbol, key):  # 已有计算
            if len(self.computed_memo.get(symbol, key)) == len(global_data_instance.symbol_to_date_list[symbol]):  # 并且array长度相等(数据存在且正确)
                llv = self.computed_memo.get(symbol, key)
        if llv is None:
            llv = self.llv(low_array, n)
            self.computed_memo.set(symbol, key, llv)  # 计算出来后填入缓存

        # 获取HHV(N)
        key = f'hhv-{n}'
        hhv = None
        if self.computed_memo.contains(symbol, key):  # 已有计算
            if len(self.computed_memo.get(symbol, key)) == len(global_data_instance.symbol_to_date_list[symbol]):  # 并且array长度相等(数据存在且正确)
                hhv = self.computed_memo.get(symbol, key)
        if hhv is None:
            hhv = self.hhv(high_array, n)
            self.computed_memo.set(symbol, key, hhv)  # 计算出来后填入缓存

        # RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
        rsv: np.ndarray = (close_array - llv) / (hhv - llv + 0.00000001) * 100  # 避免除以0
        if np.isnan(rsv[0]):  # 若第一天停牌 则hhv-llv等于0 相除之后会变成nan 导致之后的计算全部错误
            rsv[0] = 0

        k = self.sma(rsv, m, 1)
        d = self.sma(k, m, 1)
        j = 3 * k - 2 * d

        # 计算KDJ需要较多运算 不能直接读取(要算SMA) 所以把结果暂时存下来
        key = f'kdj-{n}-{m}'
        self.computed_memo.set(symbol, key, j)

        offset = global_data_instance.find_date_offset(symbol, date)
        return j[offset]
Example #4
0
    def get_dmi(self, symbol: str, date: str, n: int):
        """ 计算所有日期的 PDI、MDI 序列, 返回给定日期的 (PDI, MDI) 值 """

        key_pdi = f'pdi-{n}'
        pdi = None
        if self.computed_memo.contains(symbol, key_pdi):  # 已有计算
            if len(self.computed_memo.get(symbol, key_pdi)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                pdi = self.computed_memo.get(symbol, key_pdi)

        key_mdi = f'mdi-{n}'
        mdi = None
        if self.computed_memo.contains(symbol, key_mdi):  # 已有计算
            if len(self.computed_memo.get(symbol, key_mdi)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                mdi = self.computed_memo.get(symbol, key_mdi)

        if (pdi is not None) and (mdi is not None):
            if date in global_data_instance.symbol_to_date_set[symbol]:
                offset = global_data_instance.find_date_offset(symbol, date)
                return (self.computed_memo.get(symbol, key_pdi)[offset],
                        self.computed_memo.get(symbol, key_mdi)[offset])

        close_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)
        high_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.HIGH, global_data_instance.START_DOWNLOAD_DATE)
        low_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.LOW, global_data_instance.START_DOWNLOAD_DATE)

        mtr = calc_mtr(high_array, low_array, close_array, n)
        hd: np.ndarray = np.nan_to_num(high_array - ref(high_array, 1))
        ld: np.ndarray = np.nan_to_num(ref(low_array, 1) - low_array)

        dmp = sum_recent(np.where(np.logical_and(hd > 0, hd > ld), hd, 0), n)
        dmm = sum_recent(np.where(np.logical_and(ld > 0, ld > hd), ld, 0), n)

        pdi = dmp * 100 / mtr
        mdi = dmm * 100 / mtr

        self.computed_memo.set(symbol, key_pdi, pdi)  # 计算出来后填入缓存
        self.computed_memo.set(symbol, key_mdi, mdi)  # 计算出来后填入缓存

        offset = global_data_instance.find_date_offset(symbol, date)
        return (pdi[offset], mdi[offset])
    def get_ma(self, symbol: str, date: str, n: int) -> float:
        """ 计算所有日期的 N日均线 的序列(若有缓存则无需计算),返回给定日期的 N日均线 的值 """

        key = f'ma-{n}'
        if self.computed_memo.contains(symbol, key):  # 已有计算
            if len(self.computed_memo.get(symbol, key)) == len(global_data_instance.symbol_to_date_list[symbol]):  # 并且array长度相等(数据存在且正确)
                if date in global_data_instance.symbol_to_date_set[symbol]:
                    offset = global_data_instance.find_date_offset(symbol, date)
                    return self.computed_memo.get(symbol, key)[offset]
                else:
                    return np.nan

        close_array = global_data_instance.get_array_since_date(symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)

        # 计算MA
        if len(close_array) > n:  # 避免只有50天数据却计算了MA90的问题 否则求卷积后提取时会有问题
            ma_array = self.ma(close_array, n)
            self.computed_memo.set(symbol, key, ma_array)  # 计算出来后填入缓存

            offset = global_data_instance.find_date_offset(symbol, date)
            return ma_array[offset]
        else:
            return np.nan
    def get_macd(self, symbol: str, date: str, short: int, long: int,
                 mid: int):
        """ 计算所有日期的MACD序列, 返回给定日期的MACD """

        close_array = global_data_instance.get_array_since_date(
            symbol, OHLCV.CLOSE, global_data_instance.START_DOWNLOAD_DATE)

        # 获取EMA(CLOSE,SHORT)
        key = f'ema-{short}'
        ema_short = None
        if self.computed_memo.contains(symbol, key):  # 已有计算
            if len(self.computed_memo.get(symbol, key)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                ema_short = self.computed_memo.get(symbol, key)
        if ema_short is None:
            ema_short = self.ema(close_array, short)
            self.computed_memo.set(symbol, key, ema_short)  # 计算出来后填入缓存

        # 获取EMA(CLOSE,LONG)
        key = f'ema-{long}'
        ema_long = None
        if self.computed_memo.contains(symbol, key):  # 已有计算
            if len(self.computed_memo.get(symbol, key)) == len(
                    global_data_instance.symbol_to_date_list[symbol]
            ):  # 并且array长度相等(数据存在且正确)
                ema_long = self.computed_memo.get(symbol, key)
        if ema_long is None:
            ema_long = self.ema(close_array, long)
            self.computed_memo.set(symbol, key, ema_long)  # 计算出来后填入缓存

        # DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
        dif: np.ndarray = ema_short - ema_long

        # DEA:EMA(DIF,MID);
        dea: np.ndarray = self.ema(dif, mid)

        # MACD:(DIF-DEA)*2;
        macd: np.ndarray = (dif - dea) * 2

        key = f'macd-{short}-{long}-{mid}'
        self.computed_memo.set(symbol, key, macd)

        offset = global_data_instance.find_date_offset(symbol, date)
        return macd[offset]