用Python做股票指标RSI分析

作者: 羋学僧 | 来源:发表于2020-11-14 11:31 被阅读0次

    一、数据源:Tushare财经数据接口包

    Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过Tushare的数据存储功能,将数据全部保存到本地后进行分析。应一些用户的请求,从0.2.5版本开始,Tushare同时兼容Python 2.x和Python 3.x,对部分代码进行了重构,并优化了一些算法,确保数据获取的高效和稳定。

    官网地址

    二、RSI基本概念

    在股票市场上,买方和卖方力量的消长会影响股票的架构,如果股票的买入力量大于卖出力量,则股票的价格会上涨,反之则会下跌。

    如何运用一种巧妙的方法来判断股票的买入力量和卖出力量的强弱?

    韦尔斯●维尔德在1978年6月的Future杂志月刊上发表了一种衡量证券自身内在相对强度的指标,这个指标叫Relative Strength Index,简称RSI,中文名字相对强弱指标

    RSI计算公式和方法


    其中:

    UP ― 价格变化正数值的平均值;
    DDOWN ― 价格变化负数值的平均值。

    举例:

    A B C D E F G H I J
    Date Close Up Down Up Avg. Down Avg. Cell E/F 1.0+"G" 100/"H" (100-Cell I) = RSI
    11/1 $22.44
    11/2 $22.61 0.17
    11/3 $22.67 0.06
    11/4 $22.88 0.21
    11/5 $23.36 0.48
    11/8 $23.23 -0.13
    11/9 $23.08 -0.15
    11/10 $22.86 -0.22
    11/11 $23.17 0.21
    11/12 $23.69 0.52
    11/15 $23.77 0.08
    11/16 $23.84 0.08
    11/17 $24.32 0.48
    11/18 $24.80 0.48
    14 Day Totals 2.77 0.5 0.198 0.036 5.50 6.50 15.38 84.62

    同样,按此方法可计算其他任何日数的RSI。至于用多少日的RSI才合适。最初RSI指标提出来时是用14天,14天作为参数则成为默定值。但在实际操作中,分析者常觉得14天太长了一点,才有5天和9天之方法。

    RSI指标的超买超卖状态

    ●当RSI取值为50时,UP和DOWN的取值相同,股票的买入力量等于股票的卖出力量;

    ●RSI取值越大,说明UP的取值超过DOWN取值的程度越大,股票的买入热度大于卖出热度的程度越大;

    ●RSI取值越小,可以推出说明DOWN的取值超过UP取值的程度越大,股票的卖出热度大于买入热度的程度越大。

    • RSI取值等于8020分别为较常用的“超买线”“超卖线”的刻画。RSI为80是 股票超买的临界点,RSI为20是股票超卖的临界点,RSI 取值为50设定为“中心线”,该线表明股票的买入力量等于卖出力量。

    • 当RSI大于80时,股票出现超买信号。股票买入力量过大,买入力量在未来可能会减小,所以股票未来价格可能会下跌,此时卖出股票,未来下跌后再买入股票,从而赚取价差。

    • 当RSI小于20时,股票出现超卖信号。股票卖出力量过大,卖出力量在未来终归回到正常,因此股票未来价格可能会上涨,投资者此时可以做多股票,未来价格上涨后卖出。

    RSI指标的黄金交叉和死亡交叉

    在股票市场使用RSI指标时,一般会定义不同时间跨度的RSI值。当短期RSI线向上穿过长期RSI线时,股票近期买入的力量较强,价格上涨的力量很大,其释放出一个较强的买入信号,这个信号被称为“黄金交叉”当短期RSI线向下跌破长期RSI线时,股票近期卖出的力量较强,价格下跌的力量很大,其释放出一个较强的卖出信号,被称为“死亡交叉”

    import tushare as ts
    import time
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    pro = ts.pro_api()
    
    #查询当前所有正常上市交易的股票列表
    data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
    
    BOCM = pro.daily(ts_code='600519.SH', start_date='20190101', end_date='20200628')
    
    BOCM.index = BOCM.trade_date
    BOCM.index = pd.to_datetime(BOCM.trade_date,format = "%Y-%m-%d")
    BOCM.sort_index(inplace=True)
    
    BOCMclp = BOCM.close
    BOCMclpS = BOCMclp.shift(1)
    clprcChange = BOCMclp - BOCMclpS
    clprcChange = clprcChange.dropna()
    
    indexprc = clprcChange.index
    upPrc = pd.Series(0, index = indexprc)
    upPrc[clprcChange>0] = clprcChange[clprcChange>0]
    downPrc = pd.Series(0, index = indexprc)
    downPrc[clprcChange<0] = - clprcChange[clprcChange<0]
    
    rsidata = pd.concat([BOCMclp,clprcChange,upPrc,downPrc],axis=1)
    rsidata.columns = [["Close" , "PrcChange" , "upPrc" , "downPrc" ]]
    rsidata = rsidata.dropna()
    
    SMUP= []
    SMDOWN= []
    
    for i in range(6,len(upPrc)+1):
        SMUP.append(np.mean( upPrc.values[(i-6):i], dtype=np.float32))
        SMDOWN.append(np.mean( downPrc.values[(i-6):i], dtype=np.float32))
    
    rsi6= [100*SMUP[i]/(SMUP[i]+SMDOWN[i]) for i in range(0,len(SMUP))]
    
    indexRsi= indexprc[5: ]
    Rsi6=pd.Series(rsi6, index= indexRsi)
    
    fig = plt.figure(figsize = (16,8))
    UP = pd.Series(SMUP,index = indexRsi)
    DOWN = pd.Series(SMDOWN,index = indexRsi)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.subplot(411)
    plt.plot(BOCMclp,'k')
    plt.xlabel('date')
    plt.ylabel('Close')
    plt.title('RSI相关指标')
    plt.subplot(412)
    plt.plot(UP,'b')
    plt.xlabel('UP')
    plt.subplot(413)
    plt.plot(DOWN,'y')
    plt.xlabel('DOWN')
    plt.subplot(414)
    plt.plot(Rsi6,'g')
    plt.xlabel('Rsi6')
    
    fig = plt.figure(figsize=(16, 8))
    plt.plot(Rsi6)
    plt.title(' RSI6指标超买和超卖')
    plt.ylim(-10,110)
    plt.axhline(y=80, color= 'red')
    plt.axhline(y=20, color='red')
    plt. show()
    
    def rsi(price,period=6):
    
        clprcChange = price - price.shift(1)
        clprcChange = clprcChange.dropna()
        indexprc = clprcChange.index
        
        upPrc = pd.Series(0, index = indexprc)
        upPrc[clprcChange > 0] = clprcChange[clprcChange > 0]
        downPrc = pd.Series(0, index = indexprc )
        downPrc[clprcChange < 0] = - clprcChange[clprcChange < 0]
        
        rsidata = pd.concat( [price, clprcChange, upPrc , downPrc],axis = 1)
        rsidata.columns = ['price', 'PrcChange ', 'upPrc', 'downPrc']
        rsidata = rsidata.dropna()
        
        SMUP = []
        SMDOWN = []
        
        for i in range(period, len(upPrc) + 1):
            SMUP.append(np.mean(upPrc.values[(i - period):i], dtype = np.float32))
            SMDOWN.append(np.mean(downPrc.values[(i-period):i], dtype = np.float32))
            rsi = [100 * SMUP[i] / (SMUP[i] + SMDOWN[i]) for i in range(0,len(SMUP))]
    
        indexRsi = indexprc[(period - 1):]
        rsi = pd.Series(rsi, index = indexRsi)
        
        return rsi
    
    Rsi24 = rsi(BOCMclp,period=24)
    Rsi24.tail()
    
    #黄金交叉与死亡交叉
    fig = plt.figure(figsize=(16, 8))
    plt.plot(Rsi6[ '2019-01-03' :],label="Rsi6")
    plt.plot(Rsi24[ '2019-01-03':],label="Rsi24",color='red', linestyle= "dashed")
    plt.title("RSI的黄金交叉与死亡交叉")
    plt.ylim(-10,110)
    plt.legend()
    

    相关文章

      网友评论

        本文标题:用Python做股票指标RSI分析

        本文链接:https://www.haomeiwen.com/subject/jdubbktx.html