python 入门数据分析木木理财

用Python做股票指标RSI分析

2020-11-14  本文已影响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指标的黄金交叉和死亡交叉

在股票市场使用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()
上一篇下一篇

猜你喜欢

热点阅读