大发5分快三_5分快三APP下载_以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)

  • 时间:
  • 浏览:1
  • 来源:台湾新闻网_台湾主流媒体_台湾门户网站

    被委托人以前写过若干“给应用进程员加财商”的系列文,目的是通过股票案例讲述Python知识点,让亲戚亲戚朋友在学习Python的一起去还能掌握相关的股票知识,所谓一举两得。

    在以前的系列文里,亲戚亲戚朋友能看到K线,均线,成交量的案例,在本文里,亲戚亲戚朋友能看到通过RSI案例讲述Python邮件编程的知识点,在后继系列文里,亲戚亲戚朋友还能看到MACD,BIAS,KDJ等指标相关案例。

1  RSI指标的原理和算法描述

    相对强弱指标(RSI)是通过比较某个九时内单股价格的涨跌幅度来判断多空双方的强弱程度,以此来预测未来走势。从数值上看,它体现出某股的买卖力量,什么都投资者能据此预测未来价格的走势,在实践中,通常与移动平均线配合使用,以提高分析的准确性。

    RSI指标的计算公式如下所示。

    第一步,RS(相对波特率)=N日内收盘价涨数和的均值÷N日内收盘价跌数和的均值

    第二步,RSI(相对强弱指标)=60 -60 ÷(1+RS)

    请注意,这里“均值“的计算措施可太少还里能 是简单移动平均(SMA),也可太少还里能 是加权移动平均(WMA)指数移动平均(EMA)。本书采用的是比较简单的简单移动平均算法,有些软件采用的是后并不是平均算法。采用不同的平均算法会原应RSI的值不同,但趋势太少改变,对交易的指导意义什么都 会变。

    以6日RSI指标为例,从当日算起向前推算6个交易日,获取到包括本日在内的7个收盘价,用每一日的收盘价减去上一交易日的收盘价,以此措施得到6个数值,哪些数值蕴含 正有负。很久 再按如下3个步骤计算RSI指标。

    第一步,up=6个数字中正数之和的平均值。

    第二步,down=先取6个数字中负数之和的绝对值,再对绝对值取平均值。

    第三步,RS=up除以down,RS表示相对波特率

    第四步,RSI(相对强弱指标)=60 -60 ÷(1+RS)

    机会再对第四步得出的结果进行数学变换,能进一步约去RS因素,得到如下的结论:RSI=60 x(up) ÷(up+down),也什么都 说,RSI等于60 乘以up除以(up和down的和)。

    从本质上来看,RSI反映了某阶段内(比如6个交易日内)由价格上涨引发的波动占总波动的百分比率,百分比越大,说明有些时间段内股票越强势,反之机会百分比越小,则说明股票弱势程度强。

    从上述公式中亲戚亲戚朋友能看到,RSI的值介于0到60 之间,目前比较常见的基准周期为6日\12日和24日。把每个交易日的RSI值在坐标图上的点连成曲线,即能绘制成RSI指标线,也什么都 说,目前沪深股市中RSI指标线是由两根曲线构成,如下图所示。

  

2  把用Matplotlib绘制的RSI指标图存为图片

    在如下的DrawRSI.py案例中,亲戚亲戚朋友将根据上述算法绘制60 0584(长电科技)从2018年9月到2019年5月间的的6日、12日和24日的RSI指标。

    本例的数据来自csv文件,而该文件的数据来自网络股票接口,相关内容亲戚亲戚朋友可太少还里能 阅读以前博文。在本案例中,都会把由matplotlib生成的图形存为png格式,以方便以前用邮件的形式发送。    

1	#!/usr/bin/env python
2	#coding=utf-8
3	import pandas as pd
4	import matplotlib.pyplot as plt
5	#计算RSI的措施,入参periodList传入周期列表 
6	def calRSI(df,periodList):
7	    #计算和上一另另还有一个交易日收盘价的差值
8	    df['diff'] = df["Close"]-df["Close"].shift(1) 
9	    df['diff'].fillna(0, inplace = True)    
10	    df['up'] = df['diff']
11	    #过滤掉小于0的值
12	    df['up'][df['up']] = 0
13	    df['down'] = df['diff']
14	    #过滤掉大于0的值
15	    df['down'][df['down']] = 0
16	    #通过for循环,依次计算periodList中不同周期的RSI等值
17	    for period in periodList:
18	        df['upAvg'+str(period)] = df['up'].rolling(period).sum()/period
19	        df['upAvg'+str(period)].fillna(0, inplace = True)
20	        df['downAvg'+str(period)] = abs(df['down'].rolling(period).sum()/period)
21	        df['downAvg'+str(period)].fillna(0, inplace = True)
22	        df['RSI'+str(period)] = 60

 - 60

/((df['upAvg'+str(period)]/df['downAvg'+str(period)]+1))
23	    return df

    在第5行里,亲戚亲戚朋友定义了用于计算RSI值的calRSI措施,该措施第一另另还有一个参数是蕴含 日期收盘价等信息的dataframe类型的df对象,第3个参数是周期列表。

    在第8行里,亲戚亲戚朋友把本交易日和上个交易日收盘价的差价存入了'diff'列,这里是用shift(1)来获取df里上一行(即上个交易日)的收盘价。机会第一行的diff值是NaN,什么都不还里能 用第9行的fillna措施把NaN值更新成0。

    在第11行里,在df对象里创建了up列,该列的值暂时和diff值相同,有正有负,但马上就通过第12行的df['up'][df['up']<0] = 0代码,把up列中的负值设置成0,原先一来,up列里就只蕴含 了“N日内收盘价的涨数”。在第13行和第15行里,用同样的措施,在df对象中创建了down列,并在其中存入了“N日内收盘价的跌数”。

    很久 是通过第17行的for循环,遍历存储在periodList中的周期对象,实在通过下面第26行的代码,亲戚亲戚朋友能看到计算RSI的周期分别是6天、12天和2半个月。针对每个周期,先是在第18行,算出了有些周期内收盘价涨数和的均值,并把有些均值存入df对象中的'upAvg'+str(period)列中,比如当前周期是6,没人 该涨数的均值是存入df[‘upAvg6‘]列。在第20行,则算出该周期内的收盘价跌数的均值,并存入'downAvg'+str(period)列中。最后在第22行,算出本周期内的RSI值,并上放df对象中的'RSI'+str(period)里。 

24    filename='D:\\stockData\ch10\\60
05842018-09-012019-05-31.csv'
25    df = pd.read_csv(filename,encoding='gbk')
26    list = [6,12,24] #周期列表
27    #调用措施计算RSI
28    stockDataFrame = calRSI(df,list) 
29    #print(stockDataFrame)
60

    #以前开使绘图
31    plt.figure()
32    stockDataFrame['RSI6'].plot(color="blue",label='RSI6')
33    stockDataFrame['RSI12'].plot(color="green",label='RSI12')
34    stockDataFrame['RSI24'].plot(color="purple",label='RSI24')
35    plt.legend(loc='best') #绘制图例       
36    #设置x轴坐标标签和旋转角度
37    major_index=stockDataFrame.index[stockDataFrame.index==0]
38    major_xtics=stockDataFrame['Date'][stockDataFrame.index==0]
39    plt.xticks(major_index,major_xtics)
40    plt.setp(plt.gca().get_xticklabels(), rotation=60

) 
41    #带网格线,且设置了网格样式
42    plt.grid(line) 
43    plt.title("RSI效果图")
44    plt.rcParams['font.sans-serif']=['SimHei']
45    plt.savefig('D:\\stockData\ch10\\60
05842018-09-012019-05-31.png')
46    plt.show()

     在第25行里,亲戚亲戚朋友从指定csv文件里得到了蕴含 日期收盘价等信息的数据,并在第26行指定了另另还有一个计算周期。在第28行里,亲戚亲戚朋友调用了calRSI措施计算了另另还有一个周期的RSI值,并存入stockDataFrame对象,当前第29行的输出励志的话 是注释掉的,在打开后,亲戚亲戚朋友能看到计算后的结果值,其蕴含 有upAvg6、downAvg6和RSI6等列。

    在得到RSI数据后,从第31行以前开使绘图,其中比较重要的步骤是通过第32行到第34行的代码,用plot措施绘制两根曲线,很久 通过第35行的legend措施设置图例,通过第37行和第38行的代码设置x轴刻度的文字以及旋转效果,通过第42行的代码设置网格样式,通过第43的代码设置标题。

    在第46行通过show措施绘图前,亲戚亲戚朋友通过第45行的代码,用savefig措施把图形保存到了指定目录,请注意这句话不还里能 上放show措施前,只要保存的图片就会是空的。

    运行上述代码,能看到如下图所示的RSI效果图。不还里能 说明的是,机会本例在计算收盘价涨数和均值和收盘价跌数和均值时,用的是简单移动平均算法,什么都绘制出来的图形机会和有些软件里的不一致,但趋势相同。只要,在指定目录里,能看到png图片。

     

3  整合K线后用邮件发送

    在DrawKwithRSI.py代码里,亲戚亲戚朋友将完成如下另另还有一个工作,第一,计算6日、12日和24日的RSI值。第二,绘制K线加均线加RSI指标图,并把结果保存为png格式图片。第三,发送邮件,并把png图片以富文本的格式展示在邮件正文中。

1    #!/usr/bin/env python
2    #coding=utf-8
3    import pandas as pd
4    import matplotlib.pyplot as plt 
5    from mpl_finance import candlestick2_ochl
6    from matplotlib.ticker import MultipleLocator
7    import smtplib
8    from email.mime.text import MIMEText
9    from email.mime.image import MIMEImage
10    from email.mime.multipart import MIMEMultipart
11    #计算RSI的措施,入参periodList传入周期列表 
12    def calRSI(df,periodList):
13        和DrawRSI.py案例中的一致    

    从第3行到第10行,亲戚亲戚朋友引入了相关的库文件,第12行定义的calRSI措施和以前案例中的删改一致,什么都就不再给出代码。    

14	filename='D:\\stockData\ch10\\60
05842018-09-012019-05-31.csv'
15	df = pd.read_csv(filename,encoding='gbk')
16	list = [6,12,24] #周期列表
17	#调用措施计算RSI
18	stockDataFrame = calRSI(df,list) 
19	figure = plt.figure()
20	#创建子图     
21	(axPrice, axRSI) = figure.subplots(2, sharex=True)
22	#调用措施,在第axPrice子图里绘制K线图 
23	candlestick2_ochl(ax = axPrice, opens=df["Open"].values, closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
24	axPrice.set_title("K线图和均线图")#设置子图标题
25	stockDataFrame['Close'].rolling(window=3).mean().plot(ax=axPrice,color="red",label='半个月均线')
26	stockDataFrame['Close'].rolling(window=5).mean().plot(ax=axPrice,color="blue",label='半个月均线')
27	stockDataFrame['Close'].rolling(window=10).mean().plot(ax=axPrice,color="green",label='10天均线')
28	axPrice.legend(loc='best') #绘制图例
29	axPrice.set_ylabel("价格(单位:元)")
60

	axPrice.grid(line) #带网格线        
31	#在axRSI子图里绘制RSI图形
32	stockDataFrame['RSI6'].plot(ax=axRSI,color="blue",label='RSI6')
33	stockDataFrame['RSI12'].plot(ax=axRSI,color="green",label='RSI12')
34	stockDataFrame['RSI24'].plot(ax=axRSI,color="purple",label='RSI24')
35	plt.legend(loc='best') #绘制图例
36	plt.rcParams['font.sans-serif']=['SimHei']       
37	axRSI.set_title("RSI图")#设置子图的标题
38	axRSI.grid(line) #带网格线
39	#设置x轴坐标标签和旋转角度
40	major_index=stockDataFrame.index[stockDataFrame.index%7==0]
41	major_xtics=stockDataFrame['Date'][stockDataFrame.index%7==0]
42	plt.xticks(major_index,major_xtics)
43	plt.setp(plt.gca().get_xticklabels(), rotation=60

) 
44	plt.savefig('D:\\stockData\ch10\\60
0584RSI.png')

    在第18行里,亲戚亲戚朋友通过调用calRSI措施得到了另另还有一个周期的RSI数据。在第21行里,设置了axPrice和axRSI这另另还有一个子图共享x轴标签,在第23行里绘制了K线图,在第25行到第27行里,绘制了3日、5日和10日的均线,在第32行到第34行里,绘制了6日、12日和24日的两根RSI指标图。在第44行里通过savefig措施,把蕴含 K线、均线和RSI指标线的图形处于指定目录中。     

45	#发送邮件
46	def sendMail(username,pwd,from_addr,to_addr,msg):
47	    和以前sendMailWithPicAttachment.py案例中的一致
48	def buildMail(HTMLContent,subject,showFrom,showTo,attachfolder,attachFileName):
49	    message = MIMEMultipart()
60

	    body = MIMEText(HTMLContent, 'html', 'utf-8')
51	    message.attach(body)
52	    message['Subject'] = subject
53	    message['From'] = showFrom
54	    message['To'] = showTo
55	    imageFile = MIMEImage(open(attachfolder+attachFileName, 'rb').read())
56	    imageFile.add_header('Content-ID', attachFileName)
57	    imageFile['Content-Disposition'] = 'attachment;filename="'+attachFileName+'"'
58	    message.attach(imageFile)
59	    return message

 第46行定义的sendMail措施和以前案例中的删改一致,什么都就不给出删改的代码。本案例与以前不同的是,在第48行里,专门定义了buildMail措施,用来组装邮件对象,邮件的诸多每项由该措施的参数所定义。

    具体而言,在第49行里定义邮件类型是MIMEMultipart,也什么都 说带附件的邮件,在第60 行和第51行里,根据参数HTMLContent构建了邮件的正文,在第52行到第54行里,设置了邮件的相关属性值,从第55行到第57行,根据入参构建了MIMEImage类型的图片类附件,在第58行里,通过attach措施把附件并入邮件正文。    

60
	subject='RSI效果图'
61	attachfolder='D:\\stockData\\ch10\\'
62	attachFileName='60
0584RSI.png'
63	HTMLContent = '<html><head></head><body>'\
64	 '<img src="cid:'+attachFileName+'"/>'\
65	 '</body></html>'
66	message = buildMail(HTMLContent,subject,'hsm_computer@163.com','hsm_computer@163.com',attachfolder,attachFileName) 
67	sendMail('hsm_computer','xxx','hsm_computer@163.com','hsm_computer@163.com',message.as_string())  
68	#最后再绘制
69	plt.show()

 在第60 行到第66行,亲戚亲戚朋友设置了邮件的相关属性值,并在第66行里,通过调用buildMail措施创建了邮件对象message,在第第67行里,通过调用sendMail措施发送邮件,最后在第69行通过show措施绘制了图形。请亲戚亲戚朋友注意本案例中的另另还有一个细节。

    第一,           第64行cid的值不还里能 和第56行的Content-ID值一致,只要图片不还里能 以附件的形式发送,无法在邮件正文里以富文本的格式展示。

    第二,           亲戚亲戚朋友是先构建和发送邮件,再通过第69行的代码绘制图形,机会次序颠倒先绘制图形后发送邮件励志的话 ,show措施被调用后应用进程会阻塞在有些位置,代码无法继续执行。要等到手动关闭掉由show措施弹出的窗口后,才会触发sendMail措施发送邮件。

    第三,           在本案例的第48行,亲戚亲戚朋友专门封装了用于构建邮件对象的buildMail措施,在其中通过参数动态地构建邮件,原先机会要发送其它邮件,则可太少还里能 调用该措施,从而能提升代码的重用性。

    运行上述代码,亲戚亲戚朋友能在弹出的窗口里看到K线、均线和RSI指标图整合后的效果图,只不还里能 在邮件的正文里看到相同的图。

     

4  RSI指标对买卖点的指导意义

    一般来说,亲戚亲戚朋友把6日、12日和24日的RSI指标称为为短期、中期和长期指标。和KDJ指标一样,RSI指标都会超买和超卖区。

    具体而言,当RSI值在60 到70间波动时,表示当前属于强势情况表,如继续上升,超过60 时,则到超买区,极机会在短期内转升为跌。反之RSI值在20到60 之间时,说明当前市场处于相对弱势,如下降到20以下,则进入超卖区,股价机会跳出反弹。

    在讲述RSI交易策略前,亲戚亲戚朋友先来讲述下在实际操作中总结出来的RSI指标的不足英文。

    第一,周期较短(比如6日)的RSI指标比较灵敏,但快速震荡的次数较多,可靠性相对差些,而周期较长(比如24日)的RSI指标可靠性强,但灵敏度不足英文,时不时会“滞后”的情况表。

    第二,当数值在40到60 间波动时,往往参考价值不大,具体而言,当数值向上突破60 临界点时,表示股价已转强,反之向下跌破60 时则表示转弱,不过在实践过程中,时不时会跳出RSI跌破60 后股价却不下跌,而突破60 后股价不涨。

    综合RSI算法、相关理论以及不足英文,亲戚亲戚朋友来讲述下实际操作中常用的基于该指标的卖策略。

    第一,RSI短期指标(6日)在20以下超卖区与中长期RSI(12日或24日)处于黄金交叉,即6日线上穿12日或24日线,则说明即将处于反弹行情,机会其它技术或政策等方面没太少疑问,可太少还里能 适当买进。

    第二,反之,RSI短期指标(6日)在60 以上超买区与中长期RSI(12日或24日)处于死亡交叉,即6日线下穿12日或24日线,则说明机会会跳出高位反转的情况表,机会没人 其它利捷报 ,可太少还里能 考虑卖出。

5 计算卖点,以邮件的形式发送

    根据上文描述,这里采用的基于RSI的买点策略是,RSI6日线在20以下与中长期RSI(12日或24日)处于黄金交叉。在如下的calRSIBuyPoints.py案例中,亲戚亲戚朋友据此策略计算60 0584(长电科技)从2018年9月到2019年5月间的卖点,只要通过邮件发送买点日期。     

1	#!/usr/bin/env python
2	#coding=utf-8
3	import pandas as pd
4	import smtplib
5	from email.mime.text import MIMEText
6	from email.mime.image import MIMEImage
7	from email.mime.multipart import MIMEMultipart
8	#计算RSI的措施,入参periodList传入周期列表 
9	def calRSI(df,periodList):
10	    和DrawRSI.py案例中的一致,省略相关代码
11	filename='D:\\stockData\ch10\\60
05842018-09-012019-05-31.csv'
12	df = pd.read_csv(filename,encoding='gbk')
13	list = [6,12,24] #周期列表
14	#调用措施计算RSI
15	stockDataFrame = calRSI(df,list) 

    在上述代码的第15行里,亲戚亲戚朋友通过调用calRSI措施计算RSI指标值,这每项和10.3.2每项的calRSIBuyPoints.py相关代码非常之类于,什么都就不再重复说明。   

16	cnt=0    
17	sellDate=''
18	while cnt<=len(stockDataFrame)-1:
19	    if(cnt>=60

):#前几天有误差,从第60

天算起
20	        try:        
21	            #规则1,这天RSI6高于60

22	            if stockDataFrame.iloc[cnt]['RSI6']<60

:
23	                #规则2.1,当天RSI6下穿RSI12
24	                if  stockDataFrame.iloc[cnt]['RSI6']<stockDataFrame.iloc[cnt]['RSI12'] and stockDataFrame.iloc [cnt-1]['RSI6']>stockDataFrame.iloc[cnt-1]['RSI12']:
25	                    sellDate = sellDate+stockDataFrame.iloc[cnt]['Date'] + ','
26	                    #规则2.2,当天RSI6下穿RSI24
27	                if  stockDataFrame.iloc[cnt]['RSI6']<stockDataFrame.iloc[cnt]['RSI24'] and stockDataFrame.iloc[cnt-1] ['RSI6']>stockDataFrame.iloc[cnt-1]['RSI24']:
28	                    if sellDate.index(stockDataFrame.iloc[cnt]['Date']) == -1:
29	                        sellDate = sellDate+stockDataFrame.iloc[cnt]['Date'] + ','
60

	        except:
31	            pass                
32	    cnt=cnt+1
33	print(sellDate)

    在第18行到第32行的while循环里,亲戚亲戚朋友计算了基于RSI的卖点,在第22行的励志的话 里,亲戚亲戚朋友制定了第一另另还有一个规则:RSI6数值大于60 ,在第23行和第27行,亲戚亲戚朋友在规则一的基础上制定了另另还有一个并行的规则,通过上述代码,亲戚亲戚朋友会在sellDate对象里存放RSI6大于60 只要RSI6下穿RSI12(或RSI24)的交易日,哪些交易日即为卖点。    

34	def sendMail(username,pwd,from_addr,to_addr,msg):
35	    和以前calRSIBuyPoints.py案例中的删改一致
36	def buildMail(HTMLContent,subject,showFrom,showTo,attachfolder,attachFileName):
37	    和以前calRSIBuyPoints.py案例中的删改一致
38	subject='RSI卖点分析'
39	attachfolder='D:\\stockData\\ch10\\'
40	attachFileName='60
0584RSI.png'
41	HTMLContent = '<html><head></head><body>'\
42	 '卖点日期' + sellDate + \
43	 '<img src="cid:'+attachFileName+'"/>'\
44	 '</body></html>'
45	message = buildMail(HTMLContent,subject,'hsm_computer@163.com','hsm_computer@163.com',attachfolder,attachFileName) 
46	sendMail('hsm_computer','xxx','hsm_computer@163.com','hsm_computer@163.com',message.as_string()) 

 第34行和第36行的另另还有一个用于发送邮件和构建构建的措施和以前案例的删改一致,什么都就不再额外说明。

   在第38行亲戚亲戚朋友定义的邮件标题是“RSI卖点分析”,在第41行定义的描述正文的HTMLContent对象里,亲戚亲戚朋友存放的也是“卖点日期”,最终是通过第46行调用sendMail措施发送邮件。

    运行上述代码,亲戚亲戚朋友能看到如下图所示的邮件,其中包括了卖点日期和指标图。这里通过计算得出的卖点日期比较多,经分析,哪些日期以前,股价多有下跌情况表。

        

6 总结和版权说明

    本文是给应用进程员加财商系列,以前的系列文如下:

    以预测股票涨跌案例入门基于SVM的机器学习  

    用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)  

    本文力争做到删改,比如代码按行编号,并针对行号删改解释,且图文并茂,什么都机会亲戚亲戚朋友感觉可太少还里能 ,请尽量帮忙推荐一下。

本文的内容即将出书,在出版的书里,是用股票案例和亲戚亲戚朋友讲述Python入门时的知识点,敬请期待

    

    有不少女网民转载和我很久转载我的博文,被委托人感到十分荣幸,这也是被委托人不断写博文的动力。关于本文的版权有如下统一的说明,抱歉就不逐一回复了。

    1 本文可转载,太少告知,转载时请用链接的措施,给出原文出处,别简单地通过文本措施给出,一起去写明原作者是hsm_computer。

    2 在转载时,请原文转载 ,谢绝洗稿。只要被委托人保留追究法律责任的权利。

猜你喜欢

2分飞艇概率_ 西瓜皮怎么做好吃?西瓜皮的功效与作用

一2分飞艇概率到夏天,天气热到快2分飞艇概率要原地爆炸的之后 ,之后 能吃上一口冰镇西瓜苹果 ,那是再清爽不过了!西瓜苹果 爽口鲜嫩,又中有 维生素A和矿物质,深受你

2019-10-19

极速pk10官方网站_睡眠不好怎么办 远离睡前不能做的10大事件【星健康】

来源:STAR星贝网2016-07-0802:09:15  原文标题:睡眠不好为什么办远离睡前不都都还可以做的10大事件【星健康】--来源:明星保健养生分享网站-STAR星贝网

2019-10-19

2分pk10安全吗 _淘米水除了浇花,还有这些妙用!

2分pk10安全吗 洗米的刚刚 ,轻快洗,过滤洗米水,越多 用锅子盛装。实在越多 小小一锅的水,越多 要轻易倒掉,肯能水是很珍贵的资源!除了浇花草盆栽之外,洗米水还有以下

2019-10-19

幸运pk10官网pk10 _China Daily Website

Copyrig幸运pk10官网pk10 ht1995- .Allrightsreserve幸运pk10官网pk10 d.Thecontent(includ

2019-10-19

分分飞艇平台开户_China Daily Website

Copy分分飞艇平台开户righ分分飞艇平台开户t1分分飞艇平台开户995- .Allrightsreserved.Thecontent(incl分分飞艇

2019-10-19