以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)

    本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得。

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

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

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

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

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

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

    请注意,这里“均值“的计算方法可以是简单移动平均(SMA),也可以是加权移动平均(WMA)指数移动平均(EMA)。本书采用的是比较简单的简单移动平均算法,有些软件采用的是后两种平均算法。采用不同的平均算法会导致RSI的值不同,但趋势不会改变,对交易的指导意义也不会变。

    以6日RSI指标为例,从当日算起向前推算6个交易日,获取到包括本日在内的7个收盘价,用每一日的收盘价减去上一交易日的收盘价,以此方式得到6个数值,这些数值中有正有负。随后再按如下四个步骤计算RSI指标。

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

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

    第三步,RS=up除以down,RS表示相对强度

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

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

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

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

 

以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略) 

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

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

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

    在第5行里,我们定义了用于计算RSI值的calRSI方法,该方法第一个参数是包含日期收盘价等信息的dataframe类型的df对象,第二个参数是周期列表。

    在第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天和24天。针对每个周期,先是在第18行,算出了这个周期内收盘价涨数和的均值,并把这个均值存入df对象中的’upAvg’+str(period)列中,比如当前周期是6,那么该涨数的均值是存入df[‘upAvg6‘]列。在第20行,则算出该周期内的收盘价跌数的均值,并存入’downAvg’+str(period)列中。最后在第22行,算出本周期内的RSI值,并放入df对象中的’RSI’+str(period)里。 

     在第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图片。

    

以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略) 

3  整合K线后用邮件发送

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

    从第3行到第10行,我们引入了相关的库文件,第12行定义的calRSI方法和之前案例中的完全一致,所以就不再给出代码。    

    在第18行里,我们通过调用calRSI方法得到了三个周期的RSI数据。在第21行里,设置了axPrice和axRSI这两个子图共享x轴标签,在第23行里绘制了K线图,在第25行到第27行里,绘制了3日、5日和10日的均线,在第32行到第34行里,绘制了6日、12日和24日的三根RSI指标图。在第44行里通过savefig方法,把包含K线、均线和RSI指标线的图形存在指定目录中。     

 第46行定义的sendMail方法和之前案例中的完全一致,所以就不给出详细的代码。本案例与之前不同的是,在第48行里,专门定义了buildMail方法,用来组装邮件对象,邮件的诸多要素由该方法的参数所定义。

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

来源:hsm_computer

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年8月3日
下一篇 2019年8月3日

相关推荐