python股票量化交易(9)---使用TA-Lib库实现股价走势对比图

凡天将发斯人也,未发其福,先发其慧;此慧一发,则浮者自实,肆者自敛;建所温良若此,天启之矣。

前言

在众多的市场股票交易软件中,每个界面并不仅仅只显示一个指标图,往往股票交易软件会将所有指标图并列放置达到对比的效果,这样的好处是,能更加直观的看到各种指标,同时结合各种指标进行分析。就像前面博文一样,单一指标往往是错误的,并不具有参考价值。

所以,本篇博文将使用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(df["date"], df["K"], label ="K")
ax3.plot(df["date"], df["D"], label ="D")
ax3.plot(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年前的数据,甚至按以前直接计算的方式自己填充了值,让数据一一对应,不过就算完整前面几日数据也是没有参考意义的。记住凡是曲线中有任何移动均线的参数,都会造成前部分有空缺值或无效值,这是无法避免的。

猜你喜欢

转载自blog.csdn.net/liyuanjinglyj/article/details/113430285
今日推荐