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

article/2025/10/27 23:43:34

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

教你用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代码里,并通过绘图函数进行了绘制。其中红色箭头为买入标志,绿色箭头为卖出标志。当然如果要进行实盘,还需要再增加条件进行细化。这里只是抛砖引玉,故有兴趣的朋友可自行实践,也欢迎在评论区留言交流。
在这里插入图片描述


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

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

有人说,交易软件这么发达,也可以自己写指标,还要用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"+codeif code[0] == "0" or code[0] == "3" or code[0] == "2":  #深证股票return "sz"+codeif 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."+codeif code[0] == "0" or code[0] == "3" or code[0] == "2":  #深证股票return "sz"+codeif code[0] == "4" or code[0] == "8":  #北证股票return "bj"+codedef 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,JAWdef 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,LONG5def 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,'秒') 

经过测试,速度还是很快的,绘图也很快。最终截图在文章开头。
在这里插入图片描述


总结

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

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


http://chatgpt.dhexx.cn/article/Pth5UrrW.shtml

相关文章

股票K线图绘制

股票K线图绘制 文章目录 股票K线图绘制前言一、股票K线图基础知识二、用Python绘制股票K线图总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都…

屏幕画笔工具Pointofix,期货/股票复盘分析画线好工具

工具介绍: Pointofix可以将K线图表定格在屏幕某一个画面上,然后可以使用工具趋势线、图形,放大某个细节等,是一款很好的复盘分析画线工具。 Pointofix使用功能: 1.高亮屏幕:手绘笔; 2.直线&…

解决一个信号6问题(sig6,signal6,SIGABRT,double free or corruption (!prev))

我遇到的信号6 99%都是由于数据越界导致,在memcpy的时候没有错误,在free的时候系统报SIGABRT。今天也不例外。代码是我写的,考虑不周,以后拷贝更多加小心。 上图中的data大小为1024,如果memcpy 1025各字节,…

Thread 1:Program received signal:SIGABRT错误之一

引起错误Thread 1:Program received signal:"SIGABRT"的可能情况很多 本文描述的是使用Tab Bar Controller时Tab Bar Item对应的View Controller在Attributes inspector中的NIB NAME与在identity inspector中的class设置的不对应引起的。 如图(图片可能…

Thread 1: signal SIGABRT问题解决

解决办法是记住先前的操作,找到相关问题原因,比如控件关联。 如图打开 Show the Connections inspector把相关联的Outlet叉掉: 猜测:Thread 1: signal SIGABRT类型的错误,是某种具体的内部关联引发的错误&#xff0c…

Android异常之SIGABRT

欢迎关注WX公众号: Android开发时出现这样的报错信息: # unknown(29937)SIGABRT #00 pc 0004a124 /system/lib/libc.so (tgkill12) [armeabi-v7a] 2 #01 pc 000478c3 /system/lib/libc.so (pthread_kill34) [armeabi-v7a] 3 #02 pc 0001d525 /system/li…

SIGABRT错误的解决办法

本人原创,转载请注明出处:http://iphone.xiaoxiaostudio.net 在iPhone开发中可能经常会遇到 SIGABRT 错误,我开始也不知道如何调试SIGABRT这个错误,每次都是不断的尝试,最后在stackoverflow找到了方法,整理…

SIGKILL和SIGTERM、SIGINT

如果不对信号处理,就会导致程序退出,但如果程序捕获信号进行处理,按照它的逻辑,它是不一定会退出的。 在这三个信号中,sigkill是不能被捕获的,程序收到这个信号后,一定会退出。这就是kill -9一…

C++ signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT等等的说明)

转载来自:https://blog.csdn.net/u014470361/article/details/83591513 SIGHUP /* hangup */ ~~~~~~ SIGHUP,hong up ,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各…

Fatal signal 6 (SIGABRT), code 0 (SI_USER) in tid 2377 (Thread-2), pid 2335

app 运行报错 解决: 选择菜单:File->Settings->Build,Execution,Deployment->Instant Run,将右侧的顶部复选框关闭即可。

linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTR

SIGHUP /* hangup */ SIGHUP,hong up ,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。 登录Linux时,系统会分配给登录…

linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)

SIGHUP /* hangup */ ~~~~~~ SIGHUP,hong up ,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。 ~~~~~~ 登录Linux时,系统会分配给登录用户…

CANopen DS402 驱动电机运动控制与顺序功能图SFC设计方法

总线型步进电机驱动器 总线型步进电机驱动器是一个总的概括, 物理总线逻辑通信协议RS-485Modbus/RTUCANbusCANopenEthernetEtherNET/IPEtherneteSCL工业以太网PROFINET 其涉及基于RS-485的Modbus/RTU协议、基于CANbus 的 CANopen 协议、 基于 Ethernet 的 Ether…

CANopen dsp402 对象字典 603F 错误码

Object 603Fh: Error code The Error code captures the code of the last error that occurred in the drive. It corresponds to the value of the lower 16 bits of object 1003h pre-defined error field.

新魔百和九联UNT402A-免拆机-刷机固件及教程

新魔百和九联UNT402A-免拆机-刷机固件及教程 步骤一:【打开adb功能】 将机顶盒插入网线连接电视并开机--然后准备一个USB键盘插入机顶盒,然后机顶盒开机1分钟后,按USB键盘上的F7和F8按钮 两个按钮交替按,随后弹出一个界面&#x…

EtherCAT从站协议栈代码笔记之cia402appl.c

原文:https://nobuta.blog.csdn.net/article/details/82425552?utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-10.control&dist_request_id&depth_1-utm_sourcedistribute.pc_relevant.none-…

汇川AM402、H3U和上位机C#ModebusTcp通讯

目录 一、测试任务 二、测试环境 三、PLC工程 1、组态配置 2、ip地址、端口号 3、全局变量定义 四、C#端Winform程序创建 1创建主界面 2、创建子窗口 3、运行生成,界面效果 4、Modebus协议说明 5、Modebus操作说明 六、AM402测试 1、寄存器读测试 2、MW1…

新魔百和UNT402A免拆机破解(附教程)

九联UNT402A刷机教程指南 今天跟大家分享下关于九联UNT402A刷机教程, UNT402A与UNT之前型号有明显区别, 就是采用的处理器不在是海思处理器, 取而代之的是晶晨处理器,下面讲讲如何刷机 下载地址: 百度链接&#xff1…

重新激活“HTTP错误代码402”,释放Web 3.0的潜力(上)

发表时间:2022年2月28日 信息来源:coingeek.com 原文作者:Jerry Chan 是时候夺回互联网了。 在这个互联网充斥着广告和恶意软件的时代,个人数据和网络冲浪历史被收集并贩卖,用以偿付网络上大量免费提供的信息。我们身…

计算机考研402,考研初试402高分复试被淘汰,原来因为这几点被pass掉,以此为戒...

原标题:考研初试402高分复试被淘汰,原来因为这几点被pass掉,以此为戒 近几日,不少高校都已经举行了考研复试,并且已经在官网上公布了录取结果,大家都知道复试是考研的一个关键阶段!加上今年复试…