我们分析股票时通常会在行情软件上观察股票的走势图,通过走势图的技术指标来判断未来股价的变动方向。对于中小股民来说,技术指标分析相比于基本面分析似乎更靠谱些,因为以中小股民的能力是很难解读政策实质性是利好还是利空,利好多大,利空多大,而走势则涵盖了所有的盘面信息,当主力做多,就表明有资金进场,此时一切指标都会走好,我们只需要跟着主力进场就行。因此观察技术指标的变化十分重要。目前常用的技术指标有K线、均线、成交量、MACD、KDJ等,其实所有的技术指标都是依据股票收盘价、开盘价、最高价、最低价等原始的交易数据用特定的算法公式计算而来,本节就在获取到交易数据的基础上展开常用技术指标的实现。
k线图可视化
K线记录着开盘价、最高价、最低价、收盘价这四个数据,早期matplotlib.finance的Candlestick()方法可直接绘制K线图,从Matplotlib 2.2.0版本开始,matplotlib.finance已经被从Matplotlib中剥离,需要单独安装mpl_finance包。mpl_finance中常用的绘制K线方法的接口有candlestick_ochl、candlestick2_ochl等,我们会分别介绍这两种接口的区别。
candlestick2_ochl() 方法的接口参数中,ax是绘制图形的axis对象,opens, closes, highs, lows分别是开盘价、收盘价、最高价、最低价的序列值。ochl即opens, closes, highs, lows的缩写,同理ohlc是opens,highs,lows,closes的缩写。
candlestick2_ochl(ax, opens, closes, highs, lows, width=4, colorup='k', colordown='r', alpha=0.75)
我们使用Pandas库DataReader()来获取浙大网新的股票交易数据。
# DataReader()来获取浙大网新2018,1,1至今的股票交易数据
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018,1,1), datetime.date.today())
以下为绘制浙大网新K线图的完整例程,效果显示如下图所示。
import datetime
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.date.today())
fig = plt.figure(figsize=(8, 6), dpi=100, facecolor="white") # 创建fig对象
fig.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
graph_KAV = fig.add_subplot(1, 1, 1) # 创建子图
mpf.candlestick2_ochl(graph_KAV, df_stockload.Open, df_stockload.Close, df_stockload.High, df_stockload.Low, width=0.5,
colorup='r', colordown='g') # 绘制K线走势
graph_KAV.set_title("600797 浙大网新-日K线")
graph_KAV.set_xlabel("日期")
graph_KAV.set_ylabel("价格")
graph_KAV.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_KAV.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定,每15天标一个日期
graph_KAV.grid(True, color='k')
graph_KAV.set_xticklabels(
[df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_KAV.get_xticks()]) # 标签设置为日期
# X轴每个ticker标签都向右倾斜45度
for label in graph_KAV.xaxis.get_ticklabels():
label.set_rotation(45)
label.set_fontsize(10) # 设置标签字号
plt.show()
另一个绘制K线方法candlestick_ochl的接口参数中,ax是绘制图形的 axis 对象,quotes是所有的股票数据序列,其中每一行都按照开盘价、收盘价、最高价、最低价的顺序排列。
candlestick_ochl(ax, quotes, width=0.2, colorup='r', colordown='g', alpha=1.0)
#绘制前需要使用zip方法生成股票数据列表
ohlc = list(zip(np.arange(0,len(df_stockload.index)),df_stockload.Open,df_stockload.Close,df_stockload.High,df_stockload.Low))#使用zip方法生成数据列表
mpf.candlestick_ochl(graph_KAV, ohlc, width=0.2, colorup='r', colordown='g', alpha=1.0)#绘制K线走势
均线可视化
均线是技术分析中最基础也是最普遍的一种工具,它是指单位周期内的平均价格,我们看到在上涨途中随着股价上涨,均线也保持上行,反应了周期内持股人的平均持股成本上升了,反之亦然。一般来说,在上涨过程中由于主力筹码较多可视为主力的成本线,在上涨末期时由于主力派发筹码给了散户,可视为散户的成本线。一般行情软件上的K线图都会叠加移动平均线的显示,我们也在上一小节绘制的K线图上增加M20、M30、M60三种移动平均线。Pandas中早期提供了pd.rolling_mean()接口,现在更改为df.rolling().mean()这种方式,使用方法仍然只需提供收盘价和移动平均时间窗口大小即可,对使用者来说是非常方便快捷的。
以下为在graph_KAV子图上绘制移动平均线的例程代码,显示效果如下所示:
""" 绘制移动平均线图 """
df_stockload['Ma20'] = df_stockload.Close.rolling(window=20).mean()#pd.rolling_mean(df_stockload.Close,window=20)
df_stockload['Ma30'] = df_stockload.Close.rolling(window=30).mean()#pd.rolling_mean(df_stockload.Close,window=30)
df_stockload['Ma60'] = df_stockload.Close.rolling(window=60).mean()#pd.rolling_mean(df_stockload.Close,window=60)
numt = np.arange(0, len(df_stockload.index))
#绘制均线走势
graph_KAV.plot(numt, df_stockload['Ma20'],'black',label='M20',lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma30'],'green',label='M30',lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma60'],'blue',label='M60',lw=1.0)
graph_KAV.legend(loc='best')
""" 绘制移动平均线图 """
成交量可视化
技术分析时通常会将价格和成交量相结合来判断主力的动向。成交量指的是时间单位内股票交易成交的数量,以手为单位(1手等于100股)。我们获取到的股票原始数据中已经包含了成交量信息,因此只需要通过plt.bar()方法就可以绘制出成交量柱状图。这里我们通过Matplotlib创建另一个子图subplot显示成交量,条件判断当收盘价高于开盘价时显示红色,反则显示绿色。
由于包含K线子图和成交量子图,需要协调两个子图的位置和比例,这里导入GridSpec创建子图,GridSpec可自定义子图的位置和调整子图行和列的相对高度和宽度,将K线子图和成交量子图比例设置为3.5:1,由于成交量与日K线的子图之间存在空隙,可将hspace变量设置为0去除子图之间的空隙。
#协调两个子图的位置和比例
gs = gridspec.GridSpec(2, 1, left=0.05, bottom=0.15, right=0.96, top=0.96, wspace=None, hspace=0, height_ratios=[3.5,1])
接着调整xticklabels的日期显示在成交量X轴下方,用set_visible(False)将日K线的X轴labels隐藏。
#调整xticklabels的日期显示在成交量子图graph_VOL的X轴下方
graph_VOL.set_xticklabels([df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_VOL.get_xticks()])#标签设置为日期
#将日K线X轴labels隐藏
for label in graph_KAV.xaxis.get_ticklabels():
label.set_visible(False)
以下为多子图分别显示K线、均线、成交量的例程代码,显示效果如下所示:
import numpy as np
import matplotlib.pyplot as plt
import mpl_finance as mpf # 替换 import matplotlib.finance as mpf
import pandas_datareader.data as web
import datetime
import matplotlib.gridspec as gridspec#新增导入gridspec用于分割子图
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.date.today())
fig = plt.figure(figsize=(8,6), dpi=100,facecolor="white")#创建fig对象
gs = gridspec.GridSpec(2, 1, left=0.05, bottom=0.15, right=0.96, top=0.96, wspace=None, hspace=0, height_ratios=[3.5,1])
graph_KAV = fig.add_subplot(gs[0,:])
graph_VOL = fig.add_subplot(gs[1,:])
""" 绘制K线图 """
mpf.candlestick2_ochl(graph_KAV, df_stockload.Open, df_stockload.Close, df_stockload.High, df_stockload.Low, width=0.5,
colorup='r', colordown='g') # 绘制K线走势
graph_KAV.set_title("600797 浙大网新-日K线")
graph_KAV.set_xlabel("日期")
graph_KAV.set_ylabel("价格")
graph_KAV.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_KAV.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定,每15天标一个日期
graph_KAV.grid(True, color='k')
graph_KAV.set_xticklabels(
[df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_KAV.get_xticks()]) # 标签设置为日期
""" 绘制K线图 """
""" 绘制移动平均线图 """
df_stockload['Ma20'] = df_stockload.Close.rolling(window=20).mean()#pd.rolling_mean(df_stockload.Close,window=20)
df_stockload['Ma30'] = df_stockload.Close.rolling(window=30).mean()#pd.rolling_mean(df_stockload.Close,window=30)
df_stockload['Ma60'] = df_stockload.Close.rolling(window=60).mean()#pd.rolling_mean(df_stockload.Close,window=60)
numt = np.arange(0, len(df_stockload.index))
#绘制均线走势
graph_KAV.plot(numt, df_stockload['Ma20'],'black',label='M20',lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma30'],'green',label='M30',lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma60'],'blue',label='M60',lw=1.0)
graph_KAV.legend(loc='best')
""" 绘制移动平均线图 """
""" 绘制成交量图 """
graph_VOL.bar(numt, df_stockload.Volume,color=['g' if df_stockload.Open[x] > df_stockload.Close[x] else 'r' for x in range(0,len(df_stockload.index))])
graph_VOL.set_ylabel(u"成交量")
graph_VOL.set_xlabel(u"日期")
graph_VOL.set_xlim(0,len(df_stockload.index)) #设置一下X轴的范围
graph_VOL.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定,每15天标一个日期
graph_VOL.set_xticklabels([df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_VOL.get_xticks()])#标签设置为日期
""" 绘制成交量图 """
#将日K线X轴labels隐藏
for label in graph_KAV.xaxis.get_ticklabels():
label.set_visible(False)
#X轴每个ticker标签都向右倾斜45度
for label in graph_VOL.xaxis.get_ticklabels():
label.set_rotation(45)
label.set_fontsize(10)#设置标签字号
plt.show()
MACD可视化
MACD称为异同移动平均线,本质上是以短期(常用为12日)移动平均线与长期(常用为26日)移动平均线之间的聚合与分离状况(±DIF值)来对行情趋势判断,DEA则是对DIF值进行N日移动平滑用于辅助观察变化。
通常将±DIF(正负离差值)与EMA(离差值的N日平均线)的交叉信号作为买卖信号的依据。理论上,在持续加速的涨势中,12日EMA线在26日EMA线之上,其间的正离差值(+DIF)会越来越大,DIF距离DEA也会变大,BAR柱状线也会扩展;反之,在加速跌势中负离差值(−DIF)也会越来越大。当行情即将反转时,DIF距离DEA会逐渐减小,正如指标出现背离的情形时,第二段股价超越了第一段股价,但第二段运行的速度比第一段低了。
MACD计算方法如下所示,以零轴为中心轴,将各点的DIF和DEA连接起来就会形成在零轴上下交叉移动的两条线,即为MACD图,还可以利用辅助指标BAR红绿柱状线的形态来决定买卖时机。
DIF(差离值)= EMA(12日收盘价移动平均线)− EMA(26日收盘价移动平均线)
DEA(差离平均值)= DIF的9日移动平均线
BAR(柱状值)= 2 ×(DIF − DEA)
这里我们推荐TA-Lib库来实现技术指标。TA-Lib是一套被业界广泛应用的开源技术分析库,在国外很常用,各种大型的开源量化框架都会内置这个库。TA-Lib的好处是可以让使用者专注于策略的设计,而不用重复造轮子一样花时间实现技术指标。TA-Lib中MACD方法可以根据输入的收盘价直接计算得到DIF、DEA、BAR三组数据,只需要1行代码就轻松搞定。TA-Lib参数输入为array in、array out,因此收盘价close为numpy.ndarray类型的序列,返回值也为一个序列,我们可以将其想象为一条曲线。
这里仍然通过Matplotlib创建另一个子图subplot显示MACD指标,我们使用plot函数对DIF、DEA指标进行绘制,而柱状图bar可使用numpy.where函数分别实现红柱和绿柱,当bar>0时,保持数值,否则为0,得到红柱数组,同理当bar<0时,得到绿柱数组。
增加MACD子图graph_MACD,在子图上绘制MACD指标。以下为多子图分别显示K线、均线、成交量、MACD的例程代码,显示效果如下所示:
同样调整xticklabels的日期显示在MACD子图的X轴下方。
# ! /usr/bin/env python
# -*- encoding: utf-8 -*-
# author pythontab.com
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec # 分割子图
import mpl_finance as mpf # 替换 import matplotlib.finance as mpf
import pandas_datareader.data as web
import datetime
import talib
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.date.today())
fig = plt.figure(figsize=(15, 6), dpi=100, facecolor="white") # 创建fig对象
gs = gridspec.GridSpec(4, 1, left=0.05, bottom=0.2, right=0.96, top=0.96, wspace=None, hspace=0,
height_ratios=[3.5, 1, 1, 1])
graph_KAV = fig.add_subplot(gs[0, :])
graph_VOL = fig.add_subplot(gs[1, :])
graph_MACD = fig.add_subplot(gs[2, :])
""" 绘制K线图 """
mpf.candlestick2_ochl(graph_KAV, df_stockload.Open,df_stockload.Close,df_stockload.High,df_stockload.Low, width=0.5, colorup='r', colordown='g')#绘制K线走势
""" 绘制K线图 """
""" 绘制移动平均线图 """
df_stockload['Ma20'] = df_stockload.Close.rolling(window=20).mean() # pd.rolling_mean(df_stockload.Close,window=20)
df_stockload['Ma30'] = df_stockload.Close.rolling(window=30).mean() # pd.rolling_mean(df_stockload.Close,window=30)
df_stockload['Ma60'] = df_stockload.Close.rolling(window=60).mean() # pd.rolling_mean(df_stockload.Close,window=60)
numt = np.arange(0, len(df_stockload.index))
# 绘制均线走势
graph_KAV.plot(numt, df_stockload['Ma20'], 'black', label='M20', lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma30'], 'green', label='M30', lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma60'], 'blue', label='M60', lw=1.0)
graph_KAV.legend(loc='best')
""" 绘制移动平均线图 """
graph_KAV.set_title(u"600797 浙大网新-日K线")
graph_KAV.set_ylabel(u"价格")
graph_KAV.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_KAV.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定 每15天标一个日期
graph_KAV.grid(True, color='k')
""" 绘制成交量图 """
graph_VOL.bar(numt, df_stockload.Volume, color=['g' if df_stockload.Open[x] > df_stockload.Close[x] else 'r' for x in
range(0, len(df_stockload.index))])
graph_VOL.set_ylabel(u"成交量")
graph_VOL.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_VOL.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定 每15天标一个日期
""" 绘制成交量图 """
''' 绘制MACD '''
macd_dif, macd_dea, macd_bar = talib.MACD(df_stockload['Close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dif, 'red', label='macd dif') #dif
graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dea, 'blue', label='macd dea') #dea
#绘制BAR>0 柱状图
bar_red = np.where(macd_bar>0, 2*macd_bar, 0)
#绘制BAR<0 柱状图
bar_green = np.where(macd_bar<0, 2*macd_bar, 0)
graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_red, facecolor='red')
graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_green, facecolor='green')
graph_MACD.legend(loc='best',shadow=True, fontsize ='10')
graph_MACD.set_ylabel("MACD")
graph_MACD.set_xlabel("日期")
graph_MACD.set_xlim(0,len(df_stockload.index)) #设置一下X轴的范围
graph_MACD.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定,每15天标一个日期
graph_MACD.set_xticklabels([df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_MACD.get_xticks()])#标签设置为日期
''' 绘制MACD '''
# X-轴每个ticker标签都向右倾斜45度
for label in graph_KAV.xaxis.get_ticklabels():
# label.set_rotation(45)
# label.set_fontsize(10)#设置标签字体
label.set_visible(False)
for label in graph_VOL.xaxis.get_ticklabels():
# label.set_rotation(45)
# label.set_fontsize(10)#设置标签字体
label.set_visible(False)
for label in graph_MACD.xaxis.get_ticklabels():
label.set_rotation(45)
label.set_fontsize(10)#设置标签字体
plt.show()
KDJ可视化
前面讲的MACD属于趋势类指标,趋势指标的滞后性导致人们无法区分股价的逆趋势变动是属于正常的修正还是趋势的反转。震荡指标的表现形式为指标值在设定的水平值之间或围绕一个中心线上下波动,当指标值长期保持在一个极端区间形成超买或超卖现象时,可推断股价存在反转的可能。不过任何指标都不会是完美的,震荡指标存在钝化缺陷,即在超强的市场中超买之后持续超买,超弱的市场中超卖之后持续超卖,这样会干扰到买卖点的判断,过早出局失去可观的主升浪行情或者过早建仓而被套牢。这里讲下最为常用的震荡指标KDJ的可视化实现。
从交易原理上来看,KDJ指标最基础的交易思想建立在由Larry Williams提出的威廉指标(Williams %R,简称W%R)之上。威廉指标的计算首先选定一个特定的时间跨度(比如14日),然后找出这一特定区间的最高价和最低价,构成一个价格变化区间,而后分析这一时间跨度最后一个时间点的收盘价与期间最高价和最低价的相对位置,以此来衡量市场的超买或超卖现象。
KDJ指标的最早雏形是由芝加哥期货交易商George Lane提出的KD指标,该指标又被称为随机震荡指标(Stochastic Oscillator Indicator)。KD指标的分析思想与威廉指标类似,也使用特定时间跨度中的最后收盘价与该时间跨度内的最高价和最低价的相对位置来推测市场的超买和超卖情况。与威廉指标不同的是,它在收盘价与最高价和最低价的相对位置的比值上,又融合了移动平均的思想,用更多的信息来捕捉市场的超买超卖现象。KDJ指标则是在随机震荡指标K线和D线的基础上增加了一条J线,进一步提高了随机震荡指标对市场买卖信号捕捉的准确度。
求KDJ指标的第一步是计算未成熟随机值RSV(Raw Stochastic Value),计算公式如下,其中n为时间跨度。显然RSV取值范围在0~100之间,取值越大说明收盘价在价格区间中的相对位置越高,市场可能出现超买的现象,反之亦然。
RSV =(第n天的收盘价 − 最近n天内的最低价)/(最近n天内的最高价 − 最近n天内的最低价)* 100%
K值由前一日的K值和当期RSV值经过一定权重调整后相加得到,计算公式如下:
K值 = 2/3 * 前一日K值 + 1/3 * 当日RSV值
D值由前一日的D值和当期K值经过一定权重调整后相加得到,计算公式如下:
D值 = 2/3 * 前一日D值 + 1/3 * 当日K值
J值是KD的辅助指标,进一步反映了K指标和D指标的乖离程度,计算公式如下:
J值 = 3 * K值 − 2 * D值
我们仍然可以使用TA-Lib中STOCH(Stochastic Oscillator Slow)方法计算得到K、D值,再由K、D值计算得到 J 值,不过为了让大家能够侧面感受下TA-Lib的便捷,我们通过计算公式来实现KDJ指标。在计算第一期的K值和D值时,如果没有指定则K值和D值默认取值为50。在K值和D值求解过程中,平滑权重2/3和1/3是较为常用的权重,可根据股价走势特点适当修改。由于K、D当前值与上一个值相关,必须保证第一个值为非NA值,否则遍历计算时所有值都无效。选择周期跨度为9日,则RSV值前8个数值为NA,第9个数据产生第一个有效RSV值,此时对应的K、D值为其序列中的第一个值即默认值,下一组开始为有效的K、D值。
以下为KDJ子图显示KDJ指标的例程代码,其他部分代码与以上例程相同,不再列出,显示效果如下所示:
# ! /usr/bin/env python
# -*- encoding: utf-8 -*-
# author pythontab.com
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec # 分割子图
import mpl_finance as mpf # 替换 import matplotlib.finance as mpf
import pandas_datareader.data as web
import datetime
import talib
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df_stockload = web.DataReader("600797.SS", "yahoo", datetime.datetime(2018, 1, 1), datetime.date.today())
fig = plt.figure(figsize=(15, 6), dpi=100, facecolor="white") # 创建fig对象
gs = gridspec.GridSpec(4, 1, left=0.05, bottom=0.2, right=0.96, top=0.96, wspace=None, hspace=0,
height_ratios=[3.5, 1, 1, 1])
graph_KAV = fig.add_subplot(gs[0, :])
graph_VOL = fig.add_subplot(gs[1, :])
graph_MACD = fig.add_subplot(gs[2, :])
graph_KDJ = fig.add_subplot(gs[3, :])
""" 绘制K线图 """
mpf.candlestick2_ochl(graph_KAV, df_stockload.Open,df_stockload.Close,df_stockload.High,df_stockload.Low, width=0.5, colorup='r', colordown='g')#绘制K线走势
""" 绘制K线图 """
""" 绘制移动平均线图 """
df_stockload['Ma20'] = df_stockload.Close.rolling(window=20).mean() # pd.rolling_mean(df_stockload.Close,window=20)
df_stockload['Ma30'] = df_stockload.Close.rolling(window=30).mean() # pd.rolling_mean(df_stockload.Close,window=30)
df_stockload['Ma60'] = df_stockload.Close.rolling(window=60).mean() # pd.rolling_mean(df_stockload.Close,window=60)
numt = np.arange(0, len(df_stockload.index))
# 绘制均线走势
graph_KAV.plot(numt, df_stockload['Ma20'], 'black', label='M20', lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma30'], 'green', label='M30', lw=1.0)
graph_KAV.plot(numt, df_stockload['Ma60'], 'blue', label='M60', lw=1.0)
graph_KAV.legend(loc='best')
""" 绘制移动平均线图 """
graph_KAV.set_title(u"600797 浙大网新-日K线")
graph_KAV.set_ylabel(u"价格")
graph_KAV.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_KAV.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定 每15天标一个日期
graph_KAV.grid(True, color='k')
""" 绘制成交量图 """
graph_VOL.bar(numt, df_stockload.Volume, color=['g' if df_stockload.Open[x] > df_stockload.Close[x] else 'r' for x in
range(0, len(df_stockload.index))])
graph_VOL.set_ylabel(u"成交量")
graph_VOL.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围
graph_VOL.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定 每15天标一个日期
""" 绘制成交量图 """
''' 绘制MACD '''
macd_dif, macd_dea, macd_bar = talib.MACD(df_stockload['Close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dif, 'red', label='macd dif') #dif
graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dea, 'blue', label='macd dea') #dea
#绘制BAR>0 柱状图
bar_red = np.where(macd_bar>0, 2*macd_bar, 0)
#绘制BAR<0 柱状图
bar_green = np.where(macd_bar<0, 2*macd_bar, 0)
graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_red, facecolor='red')
graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_green, facecolor='green')
graph_MACD.legend(loc='best',shadow=True, fontsize ='10')
graph_MACD.set_ylabel("MACD")
graph_MACD.set_xlabel("日期")
graph_MACD.set_xlim(0,len(df_stockload.index)) #设置一下X轴的范围
graph_MACD.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定,每15天标一个日期
graph_MACD.set_xticklabels([df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_MACD.get_xticks()])#标签设置为日期
''' 绘制MACD '''
''' 绘制KDJ '''
xd = 9-1
date = df_stockload.index.to_series()
RSV = pd.Series(np.zeros(len(date)-xd),index=date.index[xd:])
Kvalue = pd.Series(0.0,index=RSV.index)
Dvalue = pd.Series(0.0,index=RSV.index)
Kvalue[0],Dvalue[0] = 50,50
for day_ind in range(xd, len(df_stockload.index)):
RSV[date[day_ind]] = (df_stockload.Close[day_ind] - df_stockload.Low[day_ind-xd:day_ind+1].min())/(df_stockload.High[day_ind-xd:day_ind+1].max()-df_stockload.Low[day_ind-xd:day_ind+1].min())*100
if day_ind > xd:
index = day_ind-xd
Kvalue[index] = 2.0/3*Kvalue[index-1]+RSV[date[day_ind]]/3
Dvalue[index] = 2.0/3*Dvalue[index-1]+Kvalue[index]/3
df_stockload['RSV'] = RSV
df_stockload['K'] = Kvalue
df_stockload['D'] = Dvalue
df_stockload['J'] = 3*Kvalue-2*Dvalue
graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['K'], 'blue', label='K') #K
graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['D'], 'g--', label='D') #D
graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['J'], 'r-', label='J') #J
graph_KDJ.legend(loc='best',shadow=True, fontsize ='10')
graph_KDJ.set_ylabel("KDJ")
graph_KDJ.set_xlabel("日期")
graph_KDJ.set_xlim(0,len(df_stockload.index)) #设置一下X轴的范围
graph_KDJ.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定,每15天标一个日期
graph_KDJ.set_xticklabels([df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_MACD.get_xticks()])#标签设置为日期
''' 绘制KDJ '''
# X-轴每个ticker标签都向右倾斜45度
for label in graph_KAV.xaxis.get_ticklabels():
# label.set_rotation(45)
# label.set_fontsize(10)#设置标签字体
label.set_visible(False)
for label in graph_VOL.xaxis.get_ticklabels():
# label.set_rotation(45)
# label.set_fontsize(10)#设置标签字体
label.set_visible(False)
for label in graph_MACD.xaxis.get_ticklabels():
# label.set_rotation(45)
# label.set_fontsize(10)#设置标签字体
label.set_visible(False)
for label in graph_KDJ.xaxis.get_ticklabels():
label.set_rotation(45)
label.set_fontsize(10)#设置标签字体
plt.show()