实现其他指标:基础指标(一)

有些指标TA-Lib没有提供,或者不符合使用的场景,需要改造更方便时使用,只能自己计算,有些是很早之前写的,写法或算法上没有经过优化,比较粗糙。

单个指标(没有与其他指标一起计算):

# ==========================================
    # HHV公式:一定周期内求最高值,用法:HHV(X,N),求N周期内X最高值
    # 参数:
    #   price_array:价格数组
    #   N:周期
    # ==========================================
    @staticmethod
    def HHV(price_array, C):
        ret_code = RET_OK
        HHVALlPrice = price_array

        # 取需要行数的数据
        HHVPrice = HHVALlPrice.tail(C)
   
        h_value = max(HHVPrice)
       
        return ret_code, h_value


    # ==========================================
    # LLV公式:一定周期内求最低值,用法:HHV(X,N),求N周期内X最高值
    # 参数:
    #   price_array:价格数组
    #   N:周期
    # ==========================================
    @staticmethod
    def LLV(price_array, C):
        ret_code = RET_OK
        LLVVALlPrice = price_array
        # 取需要行数的数据
        LLVPrice = LLVVALlPrice.tail(C)
     
        lValue = min(LLVPrice)
  
        return ret_code, lValue


    # ==========================================
    # MA均线
    # 参数:
    #     close_array:收盘价数组
    #     N:周期
    # 响应:
    #     MA:MA值
    #     DIFF:与上一个值的差
    # ==========================================
    @staticmethod
    def MA_1(close_array, N=10):

        realPrice = np.array(close_array)
        ma = pd.DataFrame()
 
        realMa = ta.MA(realPrice, timeperiod=N, matype=0)
  
        ma["MA"] = realMa

        ma["DIFF"] = pd.DataFrame(realMa).diff()
        # 删除空值
        ma = ma[ma["DIFF"].notnull()]

        return ma


    # ==========================================
    # MA均线,返回带有自动计算与上一MA的差值
    # 参数:
    #     close_array:收盘价数组
    #     N:周期
    # 响应:
    #     MA:MA值
    #     DIFF:与上一个值的差
    # ==========================================
    @staticmethod
    def MA_DIFF(close_array, N):
        ma = pd.DataFrame()

        realMa = ta.MA(close_array, timeperiod=N, matype=0)
 
        ma["MA"] = realMa

        ma["DIFF"] = pd.DataFrame(realMa).diff()
        # 删除空值
        ma = ma[ma["MA"].notnull()]


        return ma


    # ==========================================
    # MA均线
    # 参数:
    #     close_array:收盘价数组
    #     N:周期
    # 响应:
    #     MA:MA值
    # ==========================================
    @staticmethod
    def MA(close_array, N):
        ma = pd.DataFrame()
        realMa = ta.MA(close_array, timeperiod=N, matype=0)

        ma["MA"] = realMa

        return ma

    # ==========================================
    # MA均线,已删除空值
    # 参数:
    #     close_array:收盘价数组
    #     N:周期
    # 响应:
    #     MA:MA值
    # ==========================================
    @staticmethod
    def MA_NOTNULL(close_array, N):
        ma = pd.DataFrame()

        realMa = ta.MA(close_array, timeperiod=N, matype=0)
        ma["MA"] = realMa

        # 删除空值
        ma = ma[ma["MA"].notnull()]

        return ma

    # ======================================
    # EMA指标,返回带有自动计算与上一MA的差值,并删除空值
    # 参数:
    #    close_array:close数组,numpy格式
    #    N:周期
    # =======================================
    @staticmethod
    def EMA_1(close_array, N):
        timeStamp = DateUtils.get_time_stamp()
        realPrice = np.array(close_array)
        ema = pd.DataFrame()
        ema["EMA"] = realEma

        ema["DIFF"] = pd.DataFrame(realEma).diff()
        # 删除空值
        ema = ema[ema["diff"].notnull()]
 

        return ema

    # ======================================
    # EMA指标,返回带有自动计算与上一MA的差值
    # 参数:
    # close_array:收盘价numpy格式数组
    # N:周期
    # 响应:
    # EMA: EMA值
    # DIFF: 与上一个值的差
    # =======================================
    @staticmethod
    def EMA(close_array, N):

        ema = pd.DataFrame()

        realEma = ta.EMA(close_array, timeperiod=N)
        ema["EMA"] = realEma

        ema["DIFF"] = pd.DataFrame(realEma).diff()

        return ema

    # ======================================
    # RSI指标
    # 参数:
    #     close_array:收盘价numpy格式数组
    #     P1,P2,P3:短中长三个值
    #
    # 响应:
    #     RSI1:RSI1
    #     RSI2:RSI2
    #     RSI3:RSI3
    # =======================================
    @staticmethod
    def RSI(close_array, P1=6, P2=12, P3=24):
        ret_code = RET_OK
        rsiPrice = pd.DataFrame()
        rsiValue = pd.DataFrame()

        if len(close_array) == 0:
            ret_code = RET_ERROR
        else:
            # rsiPrice = np.array(price)
            rsiValue['RSI1'] = ta.RSI(close_array, timeperiod=P1)
            rsiValue['RSI2'] = ta.RSI(close_array, timeperiod=P2)
            rsiValue['RSI3'] = ta.RSI(close_array, timeperiod=P3)

        return ret_code, rsiValue


    # ======================================
    # MACD指标
    # 参数:
    #     close_array:收盘价numpy格式数组
    #     P1,P2,P3:短中长三个值
    #
    # 响应:
    #     RSI1:RSI1
    #     RSI2:RSI2
    #     RSI3:RSI3
    # =======================================
    @staticmethod
    def MACD(stock_price, fastperiod=12, slowperiod=26, signalperiod=9):
        dif, dea, macd = ta.MACD(stock_price,
                                 fastperiod=fastperiod,
                                 slowperiod=slowperiod,
                                 signalperiod=signalperiod)

        macd_values = pd.DataFrame()
        macd_values['DIF'] = dif
        macd_values['DEA'] = dea
        macd_values['MACD'] = macd * 2

        return macd_values

    # ======================================
    # RSI指标
    #     参数:
    #        stock_price:DataFrame格式四个价格数组
    #        P1,P2,P3:短中长三个值
    #
    #     响应:
    #        K:K值
    #        D:D值
    #        J:J值
    #        KDIFF:K值与上一个值的差
    #        KDDIFF:K和D的差值
    # =======================================
    @staticmethod
    def KDJ(stock_price, P1=9, P2=3, P3=3):

        kdjData = pd.DataFrame()
        # 获取最低价列表
        lowList = stock_price.get("low").rolling(P1).min()

        # 填充数据
        lowList.fillna(0.0, inplace=True)
        # lowList.fillna(inplace=True)

        # 获取最高价列表
        highList = stock_price.get("high").rolling(P1).max()
        # 填充数据
        highList.fillna(0.0, inplace=True)

        RSV = (stock_price.get("close") - lowList) / (highList - lowList) * 100


        kdjData["K"] = RSV.ewm(com=2).mean()

        kdjData["D"] = kdjData["K"].ewm(com=2).mean()

        kdjData["J"] = 3 * kdjData["K"] - 2 * kdjData["D"]

        kdjData["KDIFF"] = kdjData["K"].diff()

        kdjData["KDDIFF"] = (kdjData["K"] - kdjData["D"])

        return kdjData

    # ======================================
    # CCI指标
    #        参数:
    #           stock_price:DataFrame格式四个价格数组
    #           N:周期,默认14
    #
    #        响应:
    #          CCI:CCI值
    #          DIFF:与上一个值的差
    # =======================================
    @staticmethod
    def CCI(stock_price, N=14):
        cci = pd.DataFrame()
        price_high = stock_price.get("high")

        price_low = stock_price.get("low")
        price_close = stock_price.get("close")

        cci_array = ta.CCI(np.array(price_high), np.array(price_low), np.array(price_close), timeperiod=N)
        cci["CCI"] = cci_array
        cci["DIFF"] = pd.DataFrame(cci_array).diff()
        # 删除空值
        cci = cci[cci["DIFF"].notnull()]
        return cci


    # ======================================
    # STD指标
    #         参数:
    #             stock_price:DataFrame格式四个价格数组
    #             N:周期
    #
    #         响应:
    #             STD:STD值
    #             DIFF:与上一个值的差
    # =======================================
    @staticmethod
    def STD(stock_price, N):
        std = pd.DataFrame()
        realPrice = np.array(stock_price["close"])
        ema = pd.DataFrame()

        real_std = ta.STDDEV(realPrice, timeperiod=N)
        std["STD"] = real_std

        std["DIFF"] = pd.DataFrame(real_std).diff()
        # 删除空值
        std = std[std["DIFF"].notnull()]

        return std

    # ====================================
    # slope函数:SLOPE(X,N) 返回线性回归斜率
    #
    # 参数:
    #   stock_price:numpy格式的数组
    #   N:周期
    # 响应:
    #
    # ====================================
    @staticmethod
    def SLOPE(stock_price, N):
        slope = ta.LINEARREG_SLOPE(stock_price, timeperiod=N)
        return slope

    # ===================================
    # SAR函数
    #
    # 参数:
    #   stock_price:dataFrame格式
    #   (N,S,M),N为计算周期,S为步长,M为极值
    # 响应:
    #
    # ===================================
    @staticmethod
    def SAR(stock_price, S, M):
        high = stock_price['high']
        low = stock_price['low']
        sar = ta.SAR(high, low, acceleration=S, maximum=M)
        return sar

如有更好的写法可留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值