【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)

提示:文章内买卖点不构成交易依据,请根据情况自行决策。

教你用python绘制带有买卖点的股票K线图(附带鳄鱼指标、顾比均线指标、dataframe格式化输出)

  • 前言
  • 一、自己绘图,是不是疯了?
  • 二、分步说明
    • 1. 准备工作
      • 1.1 安装必要的包
      • 1.2 获取日K数据
      • 1.3 下载MyTT文件
    • 2. 代码分段说明
      • 2.1 代码变编码
      • 2.2 表格美化输出
    • 3. 新增鳄鱼指标与顾比均线指标
      • 3.1 鳄鱼指标(摘自MT5)
      • 3.2 顾比均线
    • 4. 绘制K线图(封装成函数,方便调用)
  • 三、完整代码
  • 总结


前言

快速绘制一张属于自己的量化交易图,是研判指标和交易策略的有效工具。下图是个人将MT5的鳄鱼指标移植到python代码里,并通过绘图函数进行了绘制。其中红色箭头为买入标志,绿色箭头为卖出标志。当然如果要进行实盘,还需要再增加条件进行细化。这里只是抛砖引玉,故有兴趣的朋友可自行实践,也欢迎在评论区留言交流。
【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)_第1张图片


提示:以下是本篇文章正文内容,下面案例仅供参考

一、自己绘图,是不是疯了?

有人说,交易软件这么发达,也可以自己写指标,还要用Python自己写代码,是不是疯了。多此一举!

事实是,要对量化策略买卖点进行研判,以修改和再评估,绘图这种直观的方式必不可少。有多少人,只能在策略的黑匣子里琢磨,改来改去却又不知道为何修改,怎么修改?于是越改越晕…

下面咱们就来尝试自己撸代码,搞个私人定制的绘图工具。

二、分步说明

1. 准备工作

1.1 安装必要的包

安装matplotlib,mplfinance模块

pip install matplotlib
pip install mplfinance

1.2 获取日K数据

为了方便,这里我们使用 Ashare包,小巧方便,只一个文件。下载Ashare.py并将其也和测试代码放在同一目录即可。

计算指标,先得有数据,采集数据可考文章《一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)》
https://blog.csdn.net/popboy29/article/details/125815775

1.3 下载MyTT文件

访问https://github.com/mpquant/MyTT,下载MyTT文件放到运行Python的目录即可,下面会用到,需要提前准备好。了解更多指标计算可参考下文:

【指标计算】老妈再也不担心我的指标算不好了(教你用MyTT、TA-Lib、Pandas TA计算股票指标,附源代码)_IT里的交易员的博客-CSDN博客_python股票指标计算库
https://blog.csdn.net/popboy29/article/details/125826838

2. 代码分段说明

下面是分段解释,熟悉的朋友可以跳过,看不懂完整代码的再回过来看也不迟。由于这里需要引用的东西比较多,所以还是逐个给大家解释下,免得后面晕菜。

2.1 代码变编码

将6为数字代码,如“600000”转化为“sh.600000”,方便Ashare调用。

def code2symbol(code,kind="sh.code"):
    '''根据code代码开头数字转为为标准的symbol'''
    if len(code) == 6 and kind == "sh.code":
        if code[0] == "6" or code[0] == "9":  #上证股票
            return "sh"+code
        if code[0] == "0" or code[0] == "3" or code[0] == "2":  #深证股票
            return "sz"+code
        if code[0] == "4" or code[0] == "8":  #北证股票
            return "bj"+code

2.2 表格美化输出

很多人使用print输出pandas的dataframe,打印中少行少列,数据还对不齐,确实对数据分析不方便,这里咱们增加一个小工具(也是我博客的常见菜),需要对代码稍稍加工下,整段函数复制即可。

为了方便数据展示,需要调用prettytable包,请测试前提前安装,以免报错。安装语句如下:

pip install -U prettytable

格式化输出函数代码如下:

def df_table(df,index):
    import prettytable as pt
    #利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
    tb = pt.PrettyTable()
    df = df.reset_index(drop = True)
    tb.add_column(index,df.index)
    for col in df.columns.values:#df.columns.values的意思是获取列的名称
        tb.add_column(col, df[col])
    print(tb)

3. 新增鳄鱼指标与顾比均线指标

3.1 鳄鱼指标(摘自MT5)

MT5是啥?问度娘。
鳄鱼指标?鳄鱼指标有蓝、红、绿三条。蓝线,是鳄鱼的颚。红线,是鳄鱼的牙齿。绿线,是鳄鱼的上唇。基本上,无论实时价格往任何方向移动,鳄鱼线扮演着使我们的交易保持正当方向的罗盘角色。

def Alligator(CLOSE, HIGH, LOW, FAST=5, MID=8, SLOW=13):
    ''' 鳄鱼指标 '''
    MP    = (HIGH + LOW)/2 # 中间价
    # MP    = (CLOSE + HIGH + LOW)/3 # 中间价
    LIPS  = SMA(MP,FAST) #鳄鱼的嘴唇
    TEETH = SMA(MP,MID)  #鳄鱼的牙齿
    JAW   = SMA(MP,SLOW) #鳄鱼的下巴
    return LIPS,TEETH,JAW

3.2 顾比均线

顾比均线又叫顾比移动复合平均线,由澳大利亚的投资家戴若-顾比先生发明。顾比均线由短期线束:3、5、8、10、12、15均线,和 长期线束:30、35、40、45、50、60组成。用短期线束和长期线束来判断短长线的趋势,很好的过滤了单一的均线产生的骗线的问题。

def Guby(CLOSE, SHORT_MA = [3,5,8,10,12,15], LONG_MA = [30,35,40,45,50,60] ):
    '''顾比均线'''
    # 短期线束
    SHORT0 = EMA(CLOSE,SHORT_MA[0]);
    SHORT1 = EMA(CLOSE,SHORT_MA[1]);
    SHORT2 = EMA(CLOSE,SHORT_MA[2]);
    SHORT3 = EMA(CLOSE,SHORT_MA[3]);
    SHORT4 = EMA(CLOSE,SHORT_MA[4]);
    SHORT5 = EMA(CLOSE,SHORT_MA[5]);    
    # 长期线束
    LONG0 = EMA(CLOSE,LONG_MA[0]);
    LONG1 = EMA(CLOSE,LONG_MA[1]);
    LONG2 = EMA(CLOSE,LONG_MA[2]);
    LONG3 = EMA(CLOSE,LONG_MA[3]);
    LONG4 = EMA(CLOSE,LONG_MA[4]);
    LONG5 = EMA(CLOSE,LONG_MA[5]); 
    return SHORT0,SHORT1,SHORT2,SHORT3,SHORT4,SHORT5,LONG0,LONG1,LONG2,LONG3,LONG4,LONG5

4. 绘制K线图(封装成函数,方便调用)

这里以鳄鱼指标进行演示,顾比均线大家有兴趣自己修改玩。有问题可在评论区留言。
传入参数df为dataframe格式数据,必须包含open,high,low,close,volume,需要在主图添加指标的,将指标也作为一列即可。如鳄鱼指标的’LIPS’,‘TEETH’,‘JAW’。

这里对每一行进行了注释,就是方便大家修改代码,实现自己的需要。不过代码坑比较多,建议直接使用。笔者在这里折腾的时间比做指标还要长几倍!

def draw_kline(df):

    # 调用make_marketcolors函数,定义K线颜色,'i'表示根据K线颜色
    mc = mpf.make_marketcolors(
                                up="red",  # 上涨K线的颜色
                                down="green",  # 下跌K线的颜色
                                edge='i',  # 蜡烛图箱体的颜色,'i'表示跟随K线颜色
                                volume='i',  # 成交量柱子的颜色,'i'表示跟随K线颜色
                                wick='i',  # 蜡烛图影线的颜色,'i'表示跟随K线颜色
                                )

    # 调用make_mpf_style函数,自定义图表样式 ,函数返回一个字典,查看字典包含的数据,按照需求和规范调整参数
    style = mpf.make_mpf_style(base_mpl_style="ggplot", marketcolors=mc,rc={'font.family': 'SimHei', 'axes.unicode_minus': 'False'})

    # 添加单个指标示例
    # add_plot=[
        # mpf.make_addplot(df.LIPS),
        # mpf.make_addplot(df.TEETH),
        # mpf.make_addplot(df.JAW)]

    # 鳄鱼指标(后两行为多空标记)    
    add_plot=[
            mpf.make_addplot(df[['LIPS','TEETH','JAW']]),
            mpf.make_addplot(df['duo'].values, scatter=True, markersize=20, marker='^', color='r'),
            mpf.make_addplot(df['kong'].values, scatter=True, markersize=20, marker='v', color='g'),
        ]
    
    # # 顾比均线
    # add_plot=[mpf.make_addplot(df[['SHORT0','SHORT1','SHORT2','SHORT3','SHORT4','SHORT5','LONG0','LONG1','LONG2','LONG3','LONG4','LONG5']])]       
    
    # 开始绘图
    mpf.plot(data=df,
        type="candle",
        title="K线图",
        addplot=add_plot,
        ylabel="价格",
        style=style,
        volume=True,
        figratio=(20,14),
        figscale=1)

三、完整代码

绘制带有鳄鱼指标及多空方向K线图(下方是成交量)完整代码。具体多空点没有进行细化研究,故不要作为买卖依据,实盘请再细化。

import time
from Ashare import *
# 加载指标计算库
from MyTT import *

import matplotlib.pyplot as plt
import mplfinance as mpf


# ===============表格美化输出===============
def df_table(df,index):
    import prettytable as pt
    #利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
    tb = pt.PrettyTable()
    df = df.reset_index(drop = True)
    tb.add_column(index,df.index)
    for col in df.columns.values:#df.columns.values的意思是获取列的名称
        tb.add_column(col, df[col])
    print(tb)

def code2symbol(code,kind="sh.code"):
    '''根据code代码开头数字转为为标准的symbol'''
    if len(code) == 6 and kind == "sh.code":
        if code[0] == "6" or code[0] == "9":  #上证股票
            return "sh."+code
        if code[0] == "0" or code[0] == "3" or code[0] == "2":  #深证股票
            return "sz"+code
        if code[0] == "4" or code[0] == "8":  #北证股票
            return "bj"+code

def Alligator(CLOSE, HIGH, LOW, FAST=5, MID=8, SLOW=13):
    ''' 鳄鱼指标 '''
    MP    = (HIGH + LOW)/2 # 中间价
    # MP    = (CLOSE + HIGH + LOW)/3 # 中间价
    LIPS  = SMA(MP,FAST) #鳄鱼的嘴唇
    TEETH = SMA(MP,MID)  #鳄鱼的牙齿
    JAW   = SMA(MP,SLOW) #鳄鱼的下巴
    return LIPS,TEETH,JAW

def Guby(CLOSE, SHORT_MA = [3,5,8,10,12,15], LONG_MA = [30,35,40,45,50,60] ):
    '''顾比均线'''
    # 短期线束
    SHORT0 = EMA(CLOSE,SHORT_MA[0]);
    SHORT1 = EMA(CLOSE,SHORT_MA[1]);
    SHORT2 = EMA(CLOSE,SHORT_MA[2]);
    SHORT3 = EMA(CLOSE,SHORT_MA[3]);
    SHORT4 = EMA(CLOSE,SHORT_MA[4]);
    SHORT5 = EMA(CLOSE,SHORT_MA[5]);    
    # 长期线束
    LONG0 = EMA(CLOSE,LONG_MA[0]);
    LONG1 = EMA(CLOSE,LONG_MA[1]);
    LONG2 = EMA(CLOSE,LONG_MA[2]);
    LONG3 = EMA(CLOSE,LONG_MA[3]);
    LONG4 = EMA(CLOSE,LONG_MA[4]);
    LONG5 = EMA(CLOSE,LONG_MA[5]); 
    return SHORT0,SHORT1,SHORT2,SHORT3,SHORT4,SHORT5,LONG0,LONG1,LONG2,LONG3,LONG4,LONG5


def draw_kline(df):

    # 调用make_marketcolors函数,定义K线颜色,'i'表示根据K线颜色
    mc = mpf.make_marketcolors(
                                up="red",  # 上涨K线的颜色
                                down="green",  # 下跌K线的颜色
                                edge='i',  # 蜡烛图箱体的颜色
                                volume='i',  # 成交量柱子的颜色
                                wick='i',  # 蜡烛图影线的颜色
                                )

    # 调用make_mpf_style函数,自定义图表样式 ,函数返回一个字典,查看字典包含的数据,按照需求和规范调整参数
    style = mpf.make_mpf_style(base_mpl_style="ggplot", marketcolors=mc,rc={'font.family': 'SimHei', 'axes.unicode_minus': 'False'})

    # 添加单个指标示例
    # add_plot=[
        # mpf.make_addplot(df.LIPS),
        # mpf.make_addplot(df.TEETH),
        # mpf.make_addplot(df.JAW)]

    # 鳄鱼指标(后两行为多空标记)    
    add_plot=[
            mpf.make_addplot(df[['LIPS','TEETH','JAW']]),
            mpf.make_addplot(df['duo'].values, scatter=True, markersize=20, marker='^', color='r'),
            mpf.make_addplot(df['kong'].values, scatter=True, markersize=20, marker='v', color='g'),
        ]
    
    # # 顾比均线
    # add_plot=[mpf.make_addplot(df[['SHORT0','SHORT1','SHORT2','SHORT3','SHORT4','SHORT5','LONG0','LONG1','LONG2','LONG3','LONG4','LONG5']])]       
    
    # 开始绘图
    mpf.plot(data=df,
        type="candle",
        title="K线图",
        addplot=add_plot,
        ylabel="价格",
        style=style,
        volume=True,
        figratio=(20,14),
        figscale=1)


    
if __name__ == "__main__":
    # 1.过Ashare获取数据
    print('开始提取K线数据')
    name = code = '300450' 
    period = '1d'
    from  Ashare import *
    df = get_price(code2symbol(code),frequency=period,count=500)  #frequency='1d' 表是获取日K,count=1000,表示获取1000根K线
    # print('Ashare行情获取\n',df)
    # df_table(df.tail(20),'df')
    
    
    
    # 2. 测试计时开始,测试哪个就把if 后面的0改为1即可,其它改成0。
    time1 = time.time()
    print('开始计算指标')
    if 0:
        # 计算顾比均线
        df['SHORT0'],df['SHORT1'],df['SHORT2'],df['SHORT3'],df['SHORT4'],df['SHORT5'],df['LONG0'],df['LONG1'],df['LONG2'],df['LONG3'],df['LONG4'],df['LONG5'] = Guby(df['close'])
        df_table(df.tail(5),'df')

        
    if 1:
        # 计算鳄鱼指标
        df['LIPS'],df['TEETH'],df['JAW'] = Alligator(df['close'], df['high'], df['low'], FAST=5, MID=8, SLOW=13)
        df_table(df.tail(5),'df')
        
    if 1:
        df['duo'] = CROSS(df['LIPS'].values,df['JAW'].values)
        df['kong'] = CROSS(df['JAW'].values,df['LIPS'].values)
        df['duo']= df['duo'].apply(lambda x: 1 if x==True else None)
        df['kong'] = df['kong'].apply(lambda x: -1 if x==True else None)
        df_table(df.tail(20),'df')
        draw_kline(df.tail(120))
    
    time2 = time.time()
    print("计算指标并绘图耗时:",time2-time1,'秒') 

经过测试,速度还是很快的,绘图也很快。最终截图在文章开头。
【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)_第2张图片


总结

写到这里已是深夜2点。不知道为什么,写文章,深夜效率很高,不过这么熬夜,也确实对身体不好。今天先写到这里。代码均调测无误,拿来就可以用。创作不易,欢迎评论收藏!

明天还有很多工作,抓紧睡觉去。

你可能感兴趣的:(量化交易,Python经验池,python,pandas,开发语言)