本人最近在尝试着发表“以股票案例入门Python编程语言”系列的文章,在这些文章里,将用Python工具绘制各种股票指标,在讲述各股票指标的含义以及计算方式的同时,验证基于各种指标的交易策略,本文是第一篇,通过K线和均线案例讲述Numpy,Maplotlib等相关库的用法,并且还用代码案例来验证买卖的交易策略。在本系列的后面文章中,将陆续通过python绘制成交量、KDJ、MACD、RSI和OBV等指标,而且还会用Python编写针对这些指标的交易策略,敬请关注。

1 K线整合均线的案例

均线也叫移动平均线(Moving Average,简称MA),是指某段时间内的平均股价(或指数)连成的曲线,通过它我们能清晰地看到股价的历史波动,从而能进一步预测未来价格的发展趋势。

均线一般分短期、中期和长期这三类。

1 通常把5天和10天移动平均线称为短期均线,一般供短线投资者参照。

2一般把20天、30天和60天移动平均线作为中期均线,一般供中线投资者参考。

3 一般120天和250天(甚至更长)移动平均线称为长期均线,一般供长线投资者参考。

不过在实践中,我们一般需要综合地观察短期中期和长期均线,从中能分析出市场的多空趋势。比如,如果某股价格的三类均线均上涨,且短期中期长期均线是从上到下排列,则说明该股价格趋势向上;反之如果并列下跌,且长期中期短期均线从上到下排列,则说明股价趋势向下。

讲完概念了,我们通过rolling方法绘制均线。

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 candlestick_ochl
6 #从文件里得到数据
7 df = pd.read_csv('D:/stockData/ch6/600895.csv',encoding='gbk')
8 #设置图的位置
9 fig = plt.figure()
10 ax = fig.subplot(111)
11 #调用方法,绘制K线图
12 candlestick_ochl(opens=df["Open"].values, closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
13 df['Close'].rolling(window=3).mean().plot(color="red",label='3天均线')
14 df['Close'].rolling(window=5).mean().plot(color="blue",label='5天均线')
15 df['Close'].rolling(window=10).mean().plot(color="green",label='10天均线')
16 plt.legend(loc='best') #绘制图例
17 #设置x轴的标签
18 plt.xticks(range(len(df.index.values)),df.index.values,rotation=30 )
19 ax.grid(True) #带网格线
20 plt.title("600895张江高科的K线图")
21 plt.show()

从第13行到第15行里,通过rolling方法,根据每天的收盘价,计算了3天、5天和10天均线,并为每种均线设置了图例,在第16行里,通过legend方法设置了图例的位置。上述代码的运行效果如下图所示,从中我们不仅能看到这段时间内的K线图,还能看到3根均线。

2 K线整合均线的改进版案例

在本例中,我们将做如下两点改进,其中请大家着重观察操作坐标轴的ax对象。

第一,为了更灵活地得到股市数据,这里是根据开始时间和结束时间,先是调用get_data_yahoo接口,从yahoo的接口里获取股票数据,同时为了留一份数据,所以会把从接口爬取到的数据保存到本地csv文件,做完之后再绘制图形。

第二,在之前的案例中,x轴的刻度是每个交易日的日期,但如果显示的时间范围过长,那么时间刻度就会太密集,影响美观效果,所以这里将只显示主刻度。改进后的代码如下所示。

1	#!/usr/bin/env python
2 #coding=utf-8
3 import pandas_datareader
4 import pandas as pd
5 import matplotlib.pyplot as plt
6 from mpl_finance import candlestick2_ochl
7 from matplotlib.ticker import MultipleLocator
8 #根据指定代码和时间范围,获取股票数据
9 code='600895.ss'
10 stock = pandas_datareader.get_data_yahoo(code,'2019-01-01','2019-03-31')
11 #删除最后一行,因为get_data_yahoo会多取一天数据
12 stock.drop(stock.index[len(stock)-1],inplace=True)
13 #保存在本地
14 stock.to_csv('D:\\stockData\ch7\\600895.csv')
15 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk',index_col=0)
16 #设置窗口大小
17 fig, ax = plt.subplots(figsize=(10, 8))
18 xmajorLocator = MultipleLocator(5) #将x轴主刻度设置为5的倍数
19 ax.xaxis.set_major_locator(xmajorLocator)
20 #调用方法,绘制K线图
21 candlestick2_ochl(ax = ax,
22 opens=df["Open"].values,closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green')
23 #如下是绘制3种均线
24 df['Close'].rolling(window=3).mean().plot(color="red",label='3天均线')
25 df['Close'].rolling(window=5).mean().plot(color="blue",label='5天均线')
26 df['Close'].rolling(window=10).mean().plot(color="green",label='10天均线')
27 plt.legend(loc='best') #绘制图例
28 ax.grid(True) #带网格线
29 plt.title("600895张江高科的K线图")
30 plt.rcParams['font.sans-serif']=['SimHei']
31 plt.setp(plt.gca().get_xticklabels(), rotation=30)
32 plt.show()

相比之前代码,这段代码有四个改进点。

第一,从第9行到第14行里,我们通过第五章分析过的get_data_yahoo方法,传入股票代码、开始和结束时间这三个参数,从yahoo接口里获得股票交易的数据。

请注意该方法返回的数据会比传入的结束时间多一天,比如我们传入的结束时间是2019-03-31,但它会返回后一天(即2019-04-01)的数据,所以得通过第12行的drop方法,删除stock对象(该对象类型是dataframe)最后一行的数据。删除的时候是通过stock.index[len(stock)-1]指定删除长度减1的索引值,因为索引值是从0开始,而且需要指定inplace=True,否则的话,删除的结果无法更新到stock这个dataframe里。

第二,在第17行里,通过figsize方法设置了窗口的大小尺寸。

第三,通过第18行和第19行的代码,设置了主刻度是5的倍数。之所以设置成5的倍数,是因为一般一周的交易日是5天。但这里不能简单地把主刻度设置成每周一,因为某些周一有可能是股市休市的法定假日。

第四,由于无需在x轴上设置每天的日期,所以这里无需再调用plt.xticks方法,但是得调用如第31行所示的代码,设置x轴刻度的旋转角度,否则x轴展示的时间依然有可能会重叠。

这段代码的运行效果如下图所示,从中大家能看到改进后的效果,而且,由于本次展示的股票时间段变长了(是3个月),所以相比drawKAndMA.py案例,均线的效果更为明显,尤其是三日均线,更是几乎贯穿于整个交易日范围。

3 葛兰碧均线八大买卖法则

在均线实践理论中,投资专家葛兰碧创造的八项买卖法则可谓经典,具体的细节如下图所示。

1 移动平均线从下降逐渐转为平水平,且有超上方抬头迹象,而股价从均线下方突破时,为买进信号,如上图中的A点。

2 股价于移动平均线之上运行时下跌,但未跌破均线,此时股价再次上扬,此时为买入信号,如图中的C点。

3 股价位于均线上运行,下跌时破均线,但均线呈上升趋势,不久股价回到均线之上时,为买进信号,如图中的B点。

4 股价在均线下方运行时大跌,远离均线时向均线靠近,此时为买进时机,如图中的D点。

5 均线的上升趋势逐渐变平,且有向下迹象,而股价从均线上方向下穿均线,为卖出信号,如图中的E点。

6 股价向上穿过均线,不过均线依然保持下跌趋势,此后股价又下跌回均线下方,为卖出信号,如图中的F点。

7 股价运行在均线下方,出现上涨,但未过均线就再次下跌,此为卖出点,如图中的G点。

8 股价在均线的上方运行,连续上涨且继续远离均线,这种趋势说明随时会出现获利回吐的卖盘打压,此时是卖出的时机,如前图中的H点。

4 通过DataFrame对象验证均线的买点策略

根据上述八大买卖原则,我们在张江高科2019年1月到3月的交易数据内,用pandas库里的dataframe等对象,根据5日均线计算参考买点,代码如下所示。

1	#!/usr/bin/env python
2 #coding=utf-8
3 import pandas as pd
4 #从文件里得到数据
5 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk')
6 maIntervalList = [3,5,10]
7 #虽然在后文里只用到了5日均线,但这里演示设置3种均线
8 for maInterval in maIntervalList:
9 df['MA_' + str(maInterval)] = df['Close'].rolling(window=maInterval).mean()
10 cnt=0
11 while cnt<=len(df)-1:
12 try:
13 #规则1,收盘价连续三天上扬
14 if df.iloc[cnt]['Close']<df.iloc[cnt+1]['Close'] and df.iloc[cnt+1]['Close']<df.iloc[cnt+2]['Close']:
15 #规则2,5日均线连续三天上扬
16 if df.iloc[cnt]['MA_5']<df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']<df.iloc[cnt+2]['MA_5']:
17 #规则3,第3天,收盘价上穿5日均线
18 if df.iloc[cnt+1]['MA_5']>df.iloc[cnt]['Close'] and df.iloc[cnt+2]['MA_5']<df.iloc[cnt+1]['Close']:
19 print("Buy Point on:" + df.iloc[cnt]['Date'])
20 except: #有几天是没5日均线的,所以用except处理异常
21 pass:
22 cnt=cnt+1

虽然在计算参考买点时,只用到了5日均价,但在第8行和第9行的for循环里,我们通过rolling方法,还是计算了3日、5日和10日的均价,并把计算后的结果记录到当前行的MA_3、MA_5和MA_10这三列中,这样做的目的是为了演示动态创建列的做法。

在第11行到第22行的while循环里,我们依次遍历了每天的交易数据,并在第14行,第16行和第18行里,通过三个if语句,设置了3个规则。由于在前几天是没有5日均价了,且在遍历最后2天交易数据时,在执行诸如df.iloc[cnt+2]['Close']的语句中会出现索引越界,所以在while循环里我们用到了try…except异常处理语句。

运行上述代码,我们能看到的结果是:Buy Point on:2019-03-08,结合上图,我们能看到3月8日之后的交易日里,股价有一定程度的上涨,所以能证实基于均线的“买”原则,但影响股价的因素太多,大家应全面分析,切勿在实战中只用这原则来买卖股票。

5 通过DataFrame验证均线的卖点策略

同样地,根据5日均线计算参考买点,在如下案例中,我们计算了张江高科2019年1月到3月内的卖点。

1	#!/usr/bin/env python
2 #coding=utf-8
3 import pandas as pd
4 #从文件里得到数据
5 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk')
6 maIntervalList = [3,5,10]
7 #虽然在后文里只用到了5日均线,但这里演示设置3种均线
8 for maInterval in maIntervalList:
9 df['MA_' + str(maInterval)] = df['Close'].rolling(window=maInterval).mean()
10 cnt=0
11 while cnt<=len(df)-1:
12 try:
13 #规则1,收盘价连续三天下跌
14 if df.iloc[cnt]['Close']>df.iloc[cnt+1]['Close'] and df.iloc[cnt+1]['Close']>df.iloc[cnt+2]['Close']:
15 #规则2,5日均线连续三天下跌
16 if df.iloc[cnt]['MA_5']>df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']>df.iloc[cnt+2]['MA_5']:
17 #规则3,第3天,收盘价下穿5日均线
18 if df.iloc[cnt+1]['MA_5']<df.iloc[cnt]['Close'] and df.iloc[cnt+2]['MA_5']>df.iloc[cnt+1]['Close']:
19 print("Sell Point on:" + df.iloc[cnt]['Date'])
20 except: #有几天是没5日均线的,所以用except处理异常
21 pass
22 cnt=cnt+1

运行后,我们能得到两个卖点:2019-01-23和2019-01-23,这同样能在上图描述的K线图里得到验证。

6 求推荐,后文预告与版权说明

在本系列的后面文章中,将陆续通过python绘制成交量、KDJ、MACD、RSI和OBV等指标,而且还会用Python编写针对这些指标的交易策略,敬请关注。

本文用了我将近3个小时,如果大家感觉好,请帮忙推荐下。

关于转载有如下的说明。

1 本文文字和代码均属原创,可转载,但谢绝用于商业用户。

2 转载时请用链接的方式,给出原文出处,同时写明原作者是hsm_computer。

3 在转载时,请原文转载 ,如要在转载修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

    

用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)的更多相关文章

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

    在用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)一文里,我讲述了通过爬虫接口得到股票数据并绘制出K线均线图形的方式,在本文里,将 ...

  2. 利用JFreeChart绘制股票K线图完整解决方案

    http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...

  3. highcharts绘制股票k线

    借助highcharts绘制股票k线: 后台通过websocket没个一定时间下发最新数据,然后重新绘制k线; 开发文档: https://api.highcharts.com/highcharts/ ...

  4. WPF中使用amCharts绘制股票K线图

    原文:WPF中使用amCharts绘制股票K线图 本想自己用GDI绘图, 通过数据直接绘制一张蜡柱图, 但觉得这样子的功能比较少, 所以到网上搜索一些能画出K线图的控件. 发现DynamicDataD ...

  5. python pandas 画图、显示中文、股票K线图

    目录: 1.pandas官方画图链接 2.标记图中数据点 3.画图显示中文 4.画股票K线图 5.matplotlib基本用法 6.format输出 6.format输出例子 eps_range=[0 ...

  6. Python图像处理丨OpenCV+Numpy库读取与修改像素

    摘要:本篇文章主要讲解 OpenCV+Numpy 图像处理基础知识,包括读取像素和修改像素. 本文分享自华为云社区<[Python图像处理] 二.OpenCV+Numpy库读取与修改像素> ...

  7. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  8. Python分页爬取数据的分析

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 向右奔跑 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  9. $python数据分析基础——初识numpy库

    numpy库是python的一个著名的科学计算库,本文是一个quickstart. 引入:计算BMI BMI = 体重(kg)/身高(m)^2 假如有如下几组体重和身高数据,让求每组数据的BMI值: ...

随机推荐

  1. CountDownLatch和CyclicBarrier 专题

    4.Runnable接口和Callable接口的区别 有点深的问题了,也看出一个Java程序员学习知识的广度. Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行ru ...

  2. StackLayout

    堆栈式地放置内容可以在xaml中完成视图,也可以在cs代码中完成视图 Xamarin的所有视图和布局都是可以 1.在xaml中完成 2.在cs代码中完成视图 (类比WPF) 示例 在cs代码中完成视图 ...

  3. [PHP7.0-PHP7.2]的新特性和新变更

    php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...

  4. HTML5离线缓存攻击测试(二)

    经过昨天的测试,发现使用离线缓存的网站会被攻击.但是,不使用离线缓存的网站就真的不会受到这样的攻击么? 据我理解,按照标准当浏览器请求manifest文件时,若没有请求到,或者文件发生改变,应当不使用 ...

  5. <input type="image"> 和 <img> 用法区别

    原文:<input type="image"> 和 <img> 用法区别 w3c定义如下: Image <input type="image ...

  6. 规则“Microsoft Visual Studio 2008 的早期版本”失败。此计算机上安装了 Microsoft Visual Studio 2008 的早期版本。请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1。

    今天重装了一下系统后,需要装开发工具,我用的开发工具是Visual Studio2008 和SQL Server2008R2,装完Visual Studio2008的时候在装数据库的时候却出现这样的问 ...

  7. Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点

    原文:Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点 经过前面几期的学习,我们知道了Android的前世今生,也大致了解了Android的系统架构和应用组件,然后花了几期来 ...

  8. DataTable 更改在有数据列的类型方法

    原文:DataTable 更改在有数据列的类型方法 /// <summary> /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改 ...

  9. C#数据导出Excel详细介绍

    概要: excel导出在C#代码中应用己经很广泛了,我这里就做些总结,供自己和读者学习用. Excel知识点.一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引 ...

  10. EasyUI 实现编辑功能,给Combobox 赋值

    1: <input id="RequestType" name="RequestType" class="easyui-combobox&quo ...