对强弱指标RSI是根据一定时期内上涨点数和下跌点数之和的比率制作出的一种技术曲线。能够反映出市场在一定时期内的景气程度。由威尔斯.威尔德(Welles Wilder)最早应用于期货买卖,后来人们发现在众多的图表技术分析中,强弱指标的理论和实践极其适合于股票市场的短线投资,于是被用于股票升跌的测量和分析中。该分析指标的设计是以三条线来反映价格走势的强弱,这种图形可以为投资者提供操作依据,非常适合做短线差价操作,我一直想将常用的技术指标背离写成程序,进行自动检测,下一个文字,我将会配合RSI指标买卖点写成程序分析给大家,欢迎交流,因为我对一些指标了解不太深。
需要程序关注关注微信公众号,数据分析与运用,回复rsi背离就可以了
我们看一下东方财富指标RSi。比如天齐锂业
我们看到RSI有3条线,周期为6,12,24,可以理解为短期,中期,长期指标数据,我们提供的程序可以自由选择周期,建议12。
我们看一下程序背离检测,我们检测底背离和顶背离,我们任务指标和股价没有同时变化,或者指标钝化,我们的可以认为是背离的形态。,我结合akshare金融数据,只需要输入股票代码就可以了,如果想检测创业板的数据将df=ak.stock_zh_a_daily()换成df=ak.stock_zh_a_cyb_daily(),就可以了,我们看一下程序。
我们输入股票代码,比如sz002466,天齐锂业,按0k就可以了。
什么输入背离周期比如30,代表30天,一个半月
我们输入数据开始日期,比如20210101,代表2021年1月1日
我们输入RSI计算周期,比如12,和同花顺一样。
我们看一下程序绘制股票图,方便我们进行分析。,我们加入成交量
我们看一下保存下来的数据。
我们 看一下检测结果。打开同花顺,查看天齐锂业,检测的结果还是很好的
程序代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mplfinance as mpf
import PySimpleGUI as sg
from finta import TA
import MyTT
import akshare as ak
stock=sg.popup_get_file('输入股票代码比如sz002466,sz代表上海交易所,sh代表上海交易所')
daily=sg.popup_get_file('输入背离检测周期,比如30,代表30天')
start_date=sg.popup_get_file('输入数据开始时间比如20210101')
period=sg.popup_get_file('输入rsi周期数,建议12,中线和同花顺一样')
#数据来源东方财富
df=ak.stock_zh_a_daily(symbol=stock,start_date=start_date)
#df['open'].shift(1)
## 峰值条件:max大于前后两天,且max大于最近30天的所有max
#我们采用收盘价进行计算
#我们让前一日的收盘价不变,今天的收盘价退一天
df['new_close']=df['close'].shift(1)
#明天收盘价退一天
df['next_close']=df['close'].shift(2)
#30日均线
df['mean_30']=df['close'].rolling(int(daily)).mean()
#30日最大值
df['mean_30_max']=df['close'].rolling(int(daily)).max()
#30日最小值
df['mean_30_min']=df['close'].rolling(int(daily)).min()
#检测顶
# 峰值条件:max大于前后两天,且max大于最近30天的所有max
top=[]
x=df
#检测股票顶
for i in range(1,len(df['close'].tolist())-1):
if x['new_close'][i]>=x['close'][i-1]and x['new_close'][i]>=x['next_close'][i+1] and x['new_close'][i]>=x['mean_30_max'][i-1]:
top.append('顶')
else:
top.append('无')
top.insert(0,'无')
top.insert(1,'无')
df['股票顶']=top
base=[]
#检测股票低
#底值条件:min小于前后两天,且小于最近30天所有的min
for i in range(1,len(df['close'].tolist())-1):
if x['new_close'][i]>=x['close'][i-1]and x['new_close'][i]>=x['next_close'][i+1] and x['new_close'][i]<=x['mean_30_min'][i-1]:
base.append('底')
else:
base.append('无')
base.insert(0,'无')
base.insert(1,'无')
df['股票底']=base
#计算rsi指标
#后面为技术周期,现在中期16,还有6,24等
rsi=TA.RSI(df,period=int(period))
#将数据和到一个表中
df['rsi']=rsi
#现在rsi,昨天rsi不变
df['new_rsi']=df['rsi'].shift(1)
#下一天macd
df['next_rsi']=df['rsi'].shift(2)
#30日均线
df['rsi_mean_30']=df['rsi'].rolling(int(daily)).mean()
#30日最大值
df['rsi_mean_30_max']=df['rsi'].rolling(int(daily)).max()
#30日最小值
df['rsi_mean_30_min']=df['rsi'].rolling(int(daily)).min()
#检测rsi顶
# 峰值条件:max大于前后两天,且max大于最近30天的所有max
rsi_top=[]
for i in range(1,len(df['close'].tolist())-1):
if x['new_rsi'][i]>=x['rsi'][i-1]and x['new_rsi'][i]>=x['next_rsi'][i+1] and x['new_rsi'][i]>=x['rsi_mean_30_max'][i-1]:
rsi_top.append('顶')
else:
rsi_top.append('无')
rsi_top.insert(0,'无')
rsi_top.insert(1,'无')
df['rsi顶']=rsi_top
#检测rsi底
#底值条件:min小于前后两天,且小于最近30天所有的min
rsi_base=[]
for i in range(1,len(df['close'].tolist())-1):
if x['new_rsi'][i]>=x['rsi'][i-1]and x['new_rsi'][i]>=x['next_rsi'][i+1] and x['new_rsi'][i]<=x['rsi_mean_30_min'][i-1]:
rsi_base.append('底')
else:
rsi_base.append('无')
rsi_base.insert(0,'无')
rsi_base.insert(1,'无')
df['rsi底']=rsi_base
#检测rsi顶背离,如果股票顶对应rsi无我们可以认为顶背离
stock_rsi_top_deviate=[]
for x,y in zip(df['股票顶'].tolist(),df['rsi顶'].tolist()):
#如果2个不相等
if x!=y:
stock_rsi_top_deviate.append('rsi顶背离')
else:
stock_rsi_top_deviate.append('无')
#检测rsi底背离,如果股票底对应rsi底无我们可以认为顶背离
stock_rsi_base_deviate=[]
for x,y in zip(df['股票底'].tolist(),df['rsi底'].tolist()):
#如果2个不相等
if x!=y:
stock_rsi_base_deviate.append('rsi底背离')
else:
stock_rsi_base_deviate.append('无')
df['rsi顶背离']=stock_rsi_top_deviate
df['rsi底背离']=stock_rsi_base_deviate
df.to_excel(r'C:\Users\Administrator\Desktop\{}rsi背离.xlsx'.format(stock))
print(df)
#绘制股票图
df1=df
macd=TA.MACD(df1)
boll=TA.BBANDS(df1)
rsi=TA.RSI(df1,period=int(period))
df1.rename(columns={'date':'Date','open':'Open','close':'Close','high':'High','low':'Low','volume':'Volume'},inplace=True)
#时间格式转换
plt.rcParams['font.family']='SimHei'
plt.rcParams['axes.unicode_minus']=False
df1['Date']=pd.to_datetime(df1['Date'])
#出现设置索引
df1.set_index(['Date'],inplace=True)
#设置股票颜
mc=mpf.make_marketcolors(up='r',down='g',edge='i',volume='i')
#设置系统
s=mpf.make_mpf_style(marketcolors=mc)
add_plot=[mpf.make_addplot(macd['MACD'],panel=2,title='{}MACD'.format(stock),color='r'),mpf.make_addplot(macd['SIGNAL'],panel=1,color='y'),
mpf.make_addplot(rsi,panel=3,title='RSI'),
mpf.make_addplot(boll['BB_UPPER'],panel=0,color='r',title='BOLL'),mpf.make_addplot(boll['BB_MIDDLE'],panel=0,color='m'),mpf.make_addplot(boll['BB_LOWER'],panel=0,color='g')]
#绘制股票图,5,10,20日均线
mpf.plot(df1,type='candle',style=s,mav=(5,10,20),addplot=add_plot,volume=True)
plt.show()