前言
在众多的市场股票交易软件中,每个界面并不仅仅只显示一个指标图,往往股票交易软件会将所有指标图并列放置达到对比的效果,这样的好处是,能更加直观的看到各种指标,同时结合各种指标进行分析。就像前面博文一样,单一指标往往是错误的,并不具有参考价值。
所以,本篇博文将使用TA-Lib库实现K线、均线、成交量、KDJ、MACD的对比指标汇总图。
计算各类指标
毫无疑问,我们如果需要绘制这些指标,首先要做的就是获取绘制这些指标的基本参数。下面,我们将一一通过TA-Lib库进行计算。
(1)首先,我们需要获取一个股票半年的数据,以歌尔股份为例:
import akshare as ak df = ak.stock_zh_a_daily(symbol="sz002241", start_date="20200701", end_date="20210130", adjust="qfq") df.to_excel("歌尔股份year.xlsx")
(2)接着,计算各类均线,比如常用的10,30,60日均线。
import pandas as pd import talib df = pd.read_excel("歌尔股份year.xlsx") df["SMA10"]=talib.SMA(df['close'],timeperiod=10) df["SMA30"]=talib.SMA(df['close'],timeperiod=30) df["SMA60"]=talib.SMA(df['close'],timeperiod=60) df['SMA10'].fillna(method="bfill",inplace=True) df['SMA30'].fillna(method="bfill",inplace=True) df['SMA60'].fillna(method="bfill",inplace=True)
(3)计算成交量
red_pred = np.where(df["close"] > df["open"], df["volume"], 0) blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)
(4)计算KDJ
df['K'], df['D'] = talib.STOCH(df['high'].values, df['low'].values, df['close'].values, fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['K'].fillna(0,inplace=True) df['D'].fillna(0,inplace=True) df['J']=3*df['K']-2*df['D']
(5)计算MACD
dif, dea, bar = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9) dif[np.isnan(dif)], dea[np.isnan(dea)], bar[np.isnan(bar)] = 0, 0, 0 red_bar = np.where(bar > 0, 2 * bar, 0) blue_bar = np.where(bar < 0, 2 * bar, 0)
绘图
这里K线图与均线图为最上面的一张图,成交量在K线图下方,KDJ图在成交量下方,MACD在KDJ图下方,所以整个图是4行1列。首先,我们创建绘制图形的画布:
import matplotlib.pyplot as plt import matplotlib.ticker as ticker import mpl_finance as mpf import talib import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] fig, axes = plt.subplots(4, 1, sharex=True, figsize=(15, 10)) ax1, ax2, ax3, ax4 = axes.flatten()
(1)绘制K线图与均线图
mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r', colordown='green', alpha=1.0) ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线 ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线 ax1.plot(np.arange(0, len(df)), df['SMA60']) # 绘制60日均线 ax1.set(ylabel=u"K线图")
(2)绘制成交量
ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red") ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue") ax2.set(ylabel=u"成交量")
(3)绘制KDJ
ax3.plot(np.arange(0,len(df["date"])), df["K"], label="K") ax3.plot(np.arange(0,len(df["date"])), df["D"], label="D") ax3.plot(np.arange(0,len(df["date"])), df["J"], label="J") ax3.legend() ax3.set(ylabel=u"KDJ")
(4)绘制MACD
ax4.plot(np.arange(0, len(df)), dif) ax4.plot(np.arange(0, len(df)), dea) ax4.bar(np.arange(0, len(df)), red_bar, color="red") ax4.bar(np.arange(0, len(df)), blue_bar, color="blue") ax4.set(ylabel=u"MACD") ax1.xaxis.set_major_locator(ticker.MaxNLocator(20)) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') plt.show()
运行之后,显示的效果图如下图所示:
特别备注:有的小伙伴可能非常疑惑,为什么其他股票软件都是一一对应的,而你的KDJ与MACD前面为何出现空缺值?其实真正的KDJ,MACD图前面都有一部分空缺,而其他软件因为时间跨度很长,一般用户不会去看10年前的数据,甚至按以前直接计算的方式自己填充了值,让数据一一对应,不过就算完整前面几日数据也是没有参考意义的。记住凡是曲线中有任何移动均线的参数,都会造成前部分有空缺值或无效值,这是无法避免的。