c-畫K線(含說明)

import talib

import numpy as np

import tushare as ts

import matplotlib.pyplot as plt

import mpl_finance as mpf

import pandas as pd

#data = ts.get_k_data('399300', index=True, start='2017-01-01', end='2017-06-31')

data=pd.read_csv('2017_tx.csv',usecols=['date','open','close','high','low','volume'])

data=data.head(60)

#TA-lib wants numpy arrays of "double" floats as inputs. You want to convert it to double float data.-->np.array(data['close'],dtype=float)

fig = plt.figure(figsize=(17, 10))

ax = fig.add_axes([0,0.2,1,0.5])

ax2 = fig.add_axes([0,0,1,0.2])

#------劃直線------------

fruits = [3,6,7,9]

for x2 in fruits:

plt.axvline(x=x2, ymin=0, ymax = 20, linewidth=2, color='B')

#------劃直線------------

mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'],

width=0.5, colorup='r', colordown='g', alpha=0.6)

ax.set_xticks(range(0, len(data['date']), 10))

ax.plot(sma_10, label='10 日均线')

ax.plot(sma_30, label='30 日均线')

ax.legend(loc='upper left')

ax.grid(True)

mpf.volume_overlay(ax2, data['open'], data['close'], data['volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)

ax2.set_xticks(range(0, len(data['date']), 10))

ax2.set_xticklabels(data['date'][::10], rotation=30)

ax2.grid(True)

#plt.show()

plt.show()

#------------------------------------------------------------------------

本文原载于我的博客。本文欢迎转载,但请保留本段文字,尊重作者的权益。谢谢。

致敬Matplotlib 教程

Matplotlib 蜡烛图教程

关于使用 Matplotlib 画蜡烛图,任何一个搜索引擎都可以搜到非常多的内容,但通常都不足以为学习者提供清晰的思路和简便的实现步骤,本文力求在这两方面为学习者提供帮助。

尝试过画蜡烛图的同学,应该听说过 matplotlib.finance,而且大部分同学对这个库大概率是不抱有好感的(因为其中的雅虎接口很坑爹),但这个库确实是画蜡烛图的利器。

这个库中,共有四个画蜡烛图的函数:

1

2

3

4

matplotlib.finance.candlestick2_ochl(ax, opens, closes, highs, lows, width=4, colorup='k', colordown='r', alpha=0.75)

matplotlib.finance.candlestick2_ohlc(ax, opens, highs, lows, closes, width=4, colorup='k', colordown='r', alpha=0.75)

matplotlib.finance.candlestick_ochl(ax, quotes, width=0.2, colorup='k', colordown='r', alpha=1.0)

matplotlib.finance.candlestick_ohlc(ax, quotes, width=0.2, colorup='k', colordown='r', alpha=1.0)¶

我们选取 mpf.candlestick2_ochl 作为例子,数据用 tushare,计算均线用 talib,动手实践。

初级绘制

秉承着画出来就好的想法,按照文档的说明,先搞一套试试。这里面最大的坑是什么呢?

是日线图的时间间隔问题(非交易日无法跳过,导致图像断裂),这个问题在《Python 金融大数据分析》中也没有刻意去解决(可能是作者认为这点无关紧要),但仍有不少同学希望能够画出更好看的图。无论是官方文档还是实际操作,一般的方法都是建议重新调整横坐标,被动地过滤掉非交易时间段,例如我设置成每 10 个交易日标记一次:

1

2

ax.set_xticks(range(0, len(data['date']), 10))

ax.set_xticklabels(data['date'][::10])

再加上 10 日和 30 日均线,一起画出来:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import talib

import numpy as np

import tushare as ts

import matplotlib.pyplot as plt

import matplotlib.finance as mpf


data = ts.get_k_data('399300', index=True, start='2017-01-01', end='2017-06-31')

sma_10 = talib.SMA(np.array(data['close']), 10)

sma_30 = talib.SMA(np.array(data['close']), 30)

fig = plt.figure(figsize=(24, 8))

ax = fig.add_subplot(1, 1, 1)

ax.set_xticks(range(0, len(data['date']), 10))

ax.set_xticklabels(data['date'][::10])

ax.plot(sma_10, label='10 日均线')

ax.plot(sma_30, label='30 日均线')

ax.legend(loc='upper left')

mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'],

width=0.5, colorup='r', colordown='green',

alpha=0.6)

plt.grid()

加上成交量

有了上面的 k 线图之后,希望继续加上一个成交量的图。加上成交量后,又要注意什么呢?

首先是坐标的对齐,k 线和成交量不能错开,时间得对得上。这不是什么困难的事情,只要在创建子图时,加上 sharex=True,或者暴力一点,也可以把两个子图的横轴设置成相同的。其次是两个子图的对齐方式,我希望是“两张图并成一张图”,及两张子图之间没有间隙。这一点也不困难,只需要写上 plt.subplots_adjust(hspace=0) 就行了。

成交量的图有几种画法,这里介绍两种不同的思路。

柱状图

pandas 对画图的支持是非常好的,对于从 tushare 里拿出来的 DataFrame,可以拿出成交量一列,直接画出柱状图:

1

data['volume'].plot(kind='bar', color='k', alpha=0.3)

从而整个的代码块变成:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

import talib

import numpy as np

import tushare as ts

import matplotlib.pyplot as plt

import matplotlib.finance as mpf


data = ts.get_k_data('399300', index=True, start='2017-01-01', end='2017-06-31')

sma_10 = talib.SMA(np.array(data['close']), 10)

sma_30 = talib.SMA(np.array(daa['close']), 30)

fig, (ax, ax2) = plt.subplots(2, 1, sharex=True, figsize=(17, 10))

mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'],

width=0.5, colorup='r', colordown='green', alpha=0.6)

ax.set_xticklabels(data['date'][::10])

ax.plot(sma_10, label='10 日均线')

ax.plot(sma_30, label='30 日均线')

ax.legend(loc='upper left')

ax.grid(True)

data['volume'].plot(kind='bar', color='k', alpha=0.3)

ax2.set_xticks(range(0, len(data['date']), 10))

ax2.set_xticklabels(data['date'][::10], rotation=30)

ax2.grid(True)

plt.subplots_adjust(hspace=0)

会发现这里的成交量是单色的,而如果想让成交量不是单色的,会比较麻烦,于是引申出另一种方法。

mpf.volume_overlay

matplotlib.finance 中有直接用于画成交量的函数:

1

matplotlib.finance.volume_overlay(ax, opens, closes, volumes, colorup='k', colordown='r', width=4, alpha=1.0)

那就直接用起来:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

import talib

import numpy as np

import tushare as ts

import matplotlib.pyplot as plt

import matplotlib.finance as mpf


data = ts.get_k_data('399300', index=True, start='2017-01-01', end='2017-06-31')

sma_10 = talib.SMA(np.array(data['close']), 10)

sma_30 = talib.SMA(np.array(data['close']), 30)

fig, (ax, ax2) = plt.subplots(2, 1, sharex=True, figsize=(17, 10))

mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'],

width=0.5, colorup='r', colordown='g', alpha=0.6)

ax.set_xticklabels(data['date'][::10])

ax.plot(sma_10, label='10 日均线')

ax.plot(sma_30, label='30 日均线')

ax.legend(loc='upper left')

ax.grid(True)

mpf.volume_overlay(ax2, data['open'], data['close'], data['volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)

ax2.set_xticks(range(0, len(data['date']), 10))

ax2.set_xticklabels(data['date'][::10], rotation=30)

ax2.grid(True)

plt.subplots_adjust(hspace=0)

进阶

讲道理,到上一部分,画出来的图就已经像回事了,不过还是有一点别扭:k 线和成交量两个子图的大小是一样的。忍不了啊,继续折腾吧。

折腾了好一会,发现一个比较简便的方法是调整坐标轴:

1

2

ax = fig.add_axes([0,0.2,1,0.5])

ax2 = fig.add_axes([0,0,1,0.2])

注意这时候就不用再设置两张子图的间距了。好了,最终版本出来了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import talib

import numpy as np

import tushare as ts

import matplotlib.pyplot as plt

import matplotlib.finance as mpf


data = ts.get_k_data('399300', index=True, start='2017-01-01', end='2017-06-31')

sma_10 = talib.SMA(np.array(data['close']), 10)

sma_30 = talib.SMA(np.array(data['close']), 30)

fig = plt.figure(figsize=(17, 10))

ax = fig.add_axes([0,0.2,1,0.5])

ax2 = fig.add_axes([0,0,1,0.2])

mpf.candlestick2_ochl(ax, data['open'], data['close'], data['high'], data['low'],

width=0.5, colorup='r', colordown='g', alpha=0.6)

ax.set_xticks(range(0, len(data['date']), 10))

ax.plot(sma_10, label='10 日均线')

ax.plot(sma_30, label='30 日均线')

ax.legend(loc='upper left')

ax.grid(True)

mpf.volume_overlay(ax2, data['open'], data['close'], data['volume'], colorup='r', colordown='g', width=0.5, alpha=0.8)

ax2.set_xticks(range(0, len(data['date']), 10))

ax2.set_xticklabels(data['date'][::10], rotation=30)

ax2.grid(True)

plt.show()

最后

细心的同学会发现上面代码块中,所有的子图叫做 ax 和 ax2,这是因为如果把第一个子图的名称换成别的,蜡烛图就画不出来了,这个我也不明白是咋回事,还希望知道的同学指点下。

#------------------------------------------------------------------------------------------------------------------------------------------------------------

利用matplotlib.finance绘制K线图时使用关键要点

绘制k线图的核心语句是:

import matplotlib.finance as mpf mpf.candlestick_ochl( ax, matrix_data, colorup=***, colordown=***)

这其中 ax 是 matploblib 的 axis,matrix_data 是股价数据。

matrix_data 是 np.matrix 对象,对于 candlestick_ochl 方法来讲,它需要按照约定的顺序来排列数据,即 matrix_data 每一行中前五个数据必须是:时间、开盘价、收盘价、最高价、最低价。

在这里,“时间”不是 datetime 对象,也不是 string,它必须使用 matplotlib.pylab 中的 date2num(datetime) 方法来将datetime对象转换一个特定的时间戳数字。

通常我们会用 pandas.DataFrame 来储存股价数据——比如,利用 pd.read_csv() 读取 csv 文件后,得到就是一个 DataFrame 对象。假定 DataFrame 中包含有 date, open, close, high, low, volume 六列数据,在将其转化为 candlestick_ochl() 中所需的 matrix_data,要做如下几步工作:

    1. 删除空行

    2. 按时间升序排列数据

    3. 将date转化为特定的时间戳数据

    4. 按照 date,open,close,high,low,volume 的顺序重新排列 DataFrame

    5. 将 DataFrame 转为 matrix

删除空行

假定 pd.read_csv() 读入的数据为 data

data[data['volume']==0]=np.nan data=data.dropna()

按时间升序排列数据

data.sort_values(by='date',ascending=True,inplace=True)

将date转化为特定的时间戳数据

from matplotlib.pylab import date2num data.date=data.date.apply(lambda x:date2num(x))

按照 date,open,close,high,low,volume 的顺序重新排列 DataFrame

data=data[['date','open','close','high','low','volume']]

将 DataFrame 转为 matrix

data_mat=data.as_matrix()

合成代码案例

绘制k线

import matplotlib.pyplot as plt import matplotlib.finance as mpf import numpy as np import pandas as pd from matplotlib.pylab import date2num data=pd.read_csv(u'兴业银行.csv',usecols=['date','open','close','high','low','volume']) data[data['volume']==0]=np.nan data=data.dropna() data.sort_values(by='date',ascending=True,inplace=True) data=data[['date','open','close','high','low','volume']] # data=data.head(60) data.date=pd.to_datetime(data.date) data.date=data.date.apply(lambda x:date2num(x)) data_mat=data.as_matrix() fig,ax=plt.subplots(figsize=(1200/72,480/72)) fig.subplots_adjust(bottom=0.1) mpf.candlestick_ochl(ax,data_mat,colordown='#53c156', colorup='#ff1717',width=0.3,alpha=1) ax.grid(True) ax.xaxis_date() plt.show()

candle.png

并置成交量图

fig,(ax1,ax2)=plt.subplots(2,sharex=True,figsize=(1200/72,480/72)) mpf.candlestick_ochl(ax1,data_mat,colordown='#53c156', colorup='#ff1717',width=0.3,alpha=1) ax1.grid(True) ax1.xaxis_date() plt.bar(data_mat[:,0],data_mat[:,5],width=0.5) ax2.set_ylabel('Volume') ax2.grid(True) plt.show()

作者:那未必

链接:https://www.jianshu.com/p/a4b6e1d7ce94

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。