一、数据源: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取值等于80或20分别为较常用的“超买线”和“超卖线”的刻画。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()
网友评论