本人最近在尝试着发表“以股票案例入门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. Xamarin简介

    简介 简单来说,Xamarin提供了使用C#完成iOS,Android和Windows Phone三个移动平台开发的可能性Xamarin包括Xamarin.Andriod.Xamarin.IOS.Xa ...

  2. 数字证书原理 good

    文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...

  3. mvn 命令在command prompt无法识别

    Download maven from this website: https://maven.apache.org/download.cgi 解压binary包后放到一个位置,比如C:\apache ...

  4. 原生Js监听普通dom尺寸变化

    原生Js监听普通dom尺寸变化 具体做法有以下几种: 初始化项目后,轮询,反复查看 dom 尺寸是否变化,这种一听就感觉不好,开销太大. 监听元素的滚动事件,在 目标 dom 里面包裹一个同等大小的 ...

  5. 起调UWP的几种方法

    原文:起调UWP的几种方法 由于种种原因吧,我需要使用一个WPF程序起调一个UWP程序,下面总结一下,给自己个备份. 启动UWP程序的关键是协议启动 给我们的UWP应用添加一个协议,like this ...

  6. TThreadList Demo

    type TForm1 = class(TForm) Button1: TButton; Button3: TButton; ListBox1: TListBox; Button2: TButton; ...

  7. Win8 Metro(C#)数字图像处理--2.66FloodFill算法

    原文:Win8 Metro(C#)数字图像处理--2.66FloodFill算法  [函数名称]   洪水填充算法函数 WriteableBitmap FloodfillProcess(Write ...

  8. 2013 lost connection to mysql server during query

    navicat 导入sql大脚本到mysql数据库报错 解决办法: 修改mysql.ini配置文件: max_allowed_packet=256M wait_timeout=5000

  9. C#字符串类型

    C#字符串类型(string)是一种引用类型,是System.String的别名,表示Unicode字符串. 两种表示方法: 1.“C#” 直接用双引号括起来. 2.使用@,@“c:\test”,可以 ...

  10. GetParent、SetParent、MoveWindow - 获取、指定父窗口和移动窗口,IsChild - 判断两个窗口是不是父子关系

    提示: SetParent 应该 Windows.SetParent, 因为 TForm 的父类有同名方法. //声明: {获取父窗口句柄} GetParent(hWnd: HWND): HWND; ...