Python Matplotlib绘制漂亮的K线图,利用Tushare绘制K线图

1 引言

做量化分析,难免要将自己的某些指标等绘制在K线图上,或者对某些指标进行改造观察K线图和指标对应的走势关系。那么用Python如何绘制和炒股软件类似的效果呢。

2 准备工具

(1)数据源:Tushare(国内做量化研究高质量数据)

Tushare大数据社区

(2)常用指标计算:Ta-lib (离线下载安装链接如下)

https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

(3)K线绘图工具:mpl_finance.py (下载链接如下)

https://download.csdn.net/download/yifengdongying/29738748

3 开始工作

3.1 导入依赖包

import mpl_finance
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import ticker
import talib

3.2 编制计算指标的函数

这里只计算了最常见的两个指标MACD、KDJ,量化小伙伴,可以自己进行加工改造,找到适合自己的指标。

利用talib计算MACD指标
def macd_cal(df):
    df['DIFF'], df['DEA'], df['MACD'] = talib.MACD(df['close'].values)
    df['MACD'] *= 2 #国内MACD需要乘以2
    return df

利用talib计算KDJ指标
def kdj_cal(df):
    df['kdj_k'], df['kdj_d'] = talib.STOCH(df['high'].values,
                                           df['low'].values,
                                           df['close'].values,
                                           fastk_period=9,
                                           slowk_period=5,
                                           slowk_matype=1,
                                           slowd_period=5,
                                           slowd_matype=1)  # 计算kdj的正确配置

    df.loc[:, 'kdj_j'] = 3.0 * df.loc[:, 'kdj_k'] - 2.0 * df.loc[:, 'kdj_d']
    return df

3.3 编制绘图的函数


k线绘制
def ax_kline(ax, df):
    date_tickers = df['trade_date'].values

    def format_date(x, pos=None):
        # 由于前面股票数据在 date 这个位置传入的都是int
        # 因此 x=0,1,2,...

        # date_tickers 是所有日期的字符串形式列表
        if x < 0 or x > len(date_tickers) - 1:
            return ''
        return date_tickers[int(x)]

    date_len = len(df)
    dateLoc = int(date_len / 10 + 0.5)
    ax.xaxis.set_major_locator(ticker.MultipleLocator(dateLoc))
    ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
    ax.set_ylabel('K')
    ax.grid(True)
    plt.setp(ax.get_xticklabels(), visible=False)
    mpl_finance.candlestick_ochl(
        ax=ax,
        quotes=df[['iNum', 'open', 'close', 'high', 'low']].values,
        width=0.7,
        colorup='r',
        colordown='g',
        alpha=0.7)

    ax.set_title('%s' % (df['ts_code'].iloc[0]))

kdj指标绘制
def ax_kdj(ax, df):
    ax.plot(df['iNum'], df[['kdj_k', 'kdj_d', 'kdj_j']])
    # make these tick labels invisible
    ax.set_ylabel('KDJ')
    ax.grid(True)
    plt.setp(ax.get_xticklabels(), visible=True)

    ax.set_title('KDJ:', loc='right')

macd指标绘制
def ax_macd(ax, df):
    ax.bar(df['iNum'], df['MACD'], color='b')
    ax.plot(df['iNum'], df[['DIFF', 'DEA']])
    ax.set_ylabel('MACD')
    # ax.set_title('MACD_%s_%0.2f'%(df['ts_code'][0],success_rate_macd))
    ax.grid(True)
    plt.setp(ax.get_xticklabels(), visible=True)

绘图主程序
def kplot(df, index):
    '''
    df:  数据格式如下(实例):
        ts_code         000001.SZ
        trade_date       20190329
        open                12.26
        high                12.82
        low                 12.21
        close               12.82
        pre_close           12.22
        change                0.6
        pct_chg              4.91
        vol           1.66951e+06
        amount         2.1083e+06
        DIFF          -0.00807692
        DEA           -0.00448718
        MACD          -0.00717949
        kdj_k             46.7579
        kdj_d             47.4992
        kdj_j             45.2753
        Name: 20190329, dtype: object
    '''

    df = df.sort_values('trade_date')
    df['iNum'] = np.arange(len(df))

    if index == 'MACD':
        fig = plt.figure(figsize=[12, 8])
        ax1 = plt.axes([0.1, 0.3, 0.8, 0.6])
        ax_kline(ax1, df)
        ax2 = plt.axes([0.1, 0.1, 0.8, 0.2], sharex=ax1)
        ax_macd(ax2, df)

    elif index == 'KDJ':
        fig = plt.figure(figsize=[12, 8])
        ax1 = plt.axes([0.1, 0.3, 0.8, 0.6])
        ax_kline(ax1, df)
        ax2 = plt.axes([0.1, 0.1, 0.8, 0.2], sharex=ax1)
        ax_kdj(ax2, df)

    return fig

3.4 获取K线数据并绘图

if __name__ == '__main__':
    import tushare as ts

    ts.set_token('********需要用户自己去Tushare注册获取Token链接在第2章******')
    pro = ts.pro_api()
    df = ts.pro_bar(api=pro, ts_code='600036.SH', adj='qfq', start_date='20210301')
    print(df.shape)
    df = df.sort_values('trade_date')
    df['iNum'] = np.arange(len(df))
    df = macd_cal(df)
    df = kdj_cal(df)
    df['iNum'] = np.arange(len(df))
    date_tickers = df['trade_date']
    fig = kplot(df, 'MACD')
    plt.show(fig)

4 结果展示

4.1 K线图+MACD

Python Matplotlib绘制漂亮的K线图,利用Tushare绘制K线图

4.2 K线图+KDJ

Python Matplotlib绘制漂亮的K线图,利用Tushare绘制K线图

Original: https://blog.csdn.net/yifengdongying/article/details/120660025
Author: 晨&航
Title: Python Matplotlib绘制漂亮的K线图,利用Tushare绘制K线图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/765627/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球