• Tkinter绘制股票K线图


    在前面的文章中,我们一起学习了如何通过 Python 抓取东方财富网的实时股票数据以及如何制作成 Tkinter GUI 程序,链接如下

    用 Python 爬取股票实时数据 Tkinter制作股票数据抓取小程序,有点秀!

    今天我们就在这个基础上,在 Tkinter 程序中绘制 K 线图,一起来看看吧

    子窗口

    我们今天的整体代码还是基于上次的 Tkinter 股票程序,在主类 MainCreator 下面创建一个函数 create_subwindow

        def create_subwindow(self):
            t = ttk.Toplevel()
            t.wm_title("K线图")
            sub_window = SubWindiw()
            sub_window.subWindow(t)
    • 1

    我们这里使用 Toplevel 来创建子窗口,再来看看子窗口相关的代码

    class SubWindiw:
        def __init__(self):
            pass
        def all_files(self):
          ...
        def getDate(self):
          ...
        def subWindow(self, root_frame):
          ...
        def go(self):
          ...
    • 1

    对于子窗口代码,subWindow 函数是子窗口的主要函数

    子窗口框架

    子窗口主要代码如下

        def subWindow(self, root_frame):
            file_list = self.all_files()

            # 创建主框架
            main_frame = ttk.Frame(root_frame)
            main_frame.pack()

            # 在主框架下创建股票日期输入框子框架
            date_frame = ttk.Frame(main_frame, relief=tix.SUNKEN)
            date_frame.pack(fill=X, side=TOP)
            # 创建标签‘开始日期’
            date_start_label = ttk.Label(date_frame, text='开始日期')
            date_start_label.pack(side=LEFT)
            # 创建开始日期代码输入框
            re_date = self.getDate()
            self.de_start = ttk.DateEntry(date_frame, startdate=re_date)
            self.de_start.pack(side=LEFT, padx=4, pady=4)
            # 创建标签‘结束日期’
            date_end_label = ttk.Label(date_frame, text='结束日期')
            date_end_label.pack(side=LEFT)
            # 创建结束日期代码输入框
            self.de_end = ttk.DateEntry(date_frame)
            self.de_end.pack(side=LEFT, padx=4, pady=4)

            # 在主框架下创建查询按钮子框架
            search_frame = ttk.Frame(main_frame, relief=tix.SUNKEN)
            search_frame.pack(fill=X, side=TOP)
            # 文件选择框
            search_label = ttk.Label(search_frame, text='选择股票文件')
            search_label.pack(side=LEFT)
            values = file_list
            self.cbo = ttk.Combobox(
                master=search_frame,
                values=values,
                width=45,
            )
            self.cbo.pack(side=LEFT, expand=YES, pady=5, fill=X)

            # 占位 check button
            cb = ttk.Checkbutton(search_frame, text="占位")
            # cb.pack(side=LEFT, padx=5, fill=X)

            # 创建查询按钮并设置功能
            stock_find = ttk.Button(search_frame, text='查询', command=self.go)
            stock_find.pack(pady=4, expand=YES, side=LEFT)

            # 创建股票图形输出框架
            self.stock_graphics = tk.Frame(root_frame, relief=tix.RAISED)
            self.stock_graphics.pack(expand=1, fill=tix.BOTH, anchor=tix.CENTER)
    • 1

    主要还是分三个区域,日期选择区域,股票文件选择区域以及K线图展示区域

    还有两个功能性函数 all_filesgetDate

    all_files

        def all_files(self):
            file_list = []
            for root, dirs, files in os.walk("./"):
                for f in files:
                    if 'csv' in f and 'days' in f:
                        file_list.append(f)
            return file_list
    • 1

    getDate

        def getDate(self):
            today = datetime.datetime.now()
            offset = datetime.timedelta(days=-1)
            re_date = (today + offset).strftime('%Y/%m/%d')
            return today + offset
    • 1

    绘制K线图

    最后我们看看绘制K线图的代码

        def go(self):
            code_name = self.cbo.get()
            start_date = self.de_start.entry.get()
            end_date = self.de_end.entry.get()
            gupiao_file = self.cbo.get()
            if not gupiao_file:
                messbox.showerror("股票文件为空""请选择股票数据文件!")
                return
            stock_data = pd.read_csv(gupiao_file)
            data = stock_data.loc[:, ['时间''开盘价',
                                      '收盘价''最高价''最低价''成交量(手)']]  # :取所有行数据,后面取date列,open列等数据
            data = data.rename(columns={'时间''Date''开盘价''Open',
                                        '收盘价''Close''最高价''High''最低价''Low',
                                        '成交量(手)''Volume'})  # 更换列名,为后面函数变量做准备
            data.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
            # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
            data.index = pd.DatetimeIndex(data.index)
            data = data.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列
            data = data[data.index < end_date][data.index > start_date]

            if not data.values.any():
                print("股票数据为空")
                messbox.showerror("股票数据为空""请选择合理的时间!")
                return
            my_color = mpf.make_marketcolors(up='r',
                                             down='g',
                                             edge='inherit',
                                             wick='inherit',
                                             volume='inherit')
            # 设置图表的背景色
            my_style = mpf.make_mpf_style(marketcolors=my_color,
                                          figcolor='#002B36',
                                          facecolor='#002B36',
                                          edgecolor='w',
                                          # gridcolor='(0.82, 0.83, 0.85)',
                                          rc={'font.family''SimHei',
                                              'xtick.labelcolor''white',
                                              'ytick.labelcolor''white',
                                              'axes.labelcolor''white',
                                              })
            self.fig, self.axlist = mpf.plot(data, style=my_style, type='candle',
                                             mav=(51020), volume=True, show_nontrading=False, returnfig=True)
            canvas = FigureCanvasTkAgg(self.fig, master=self.stock_graphics)  # 设置tkinter绘制区
            if len(self.stock_graphics.winfo_children()) == 2:
                self.stock_graphics.winfo_children()[0].destroy()
            canvas.draw()

            canvas._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)
    • 1

    我们通过 Matplotlib + mplfinance 来绘制K线图

    首先是通过 Pandas 来处理数据,把我们爬取到的数据处理成 mplfinance 需要的格式,如下

    alt

    接下来只需要调用plot函数即可

    self.fig, self.axlist = mpf.plot(data, style=my_style, type='candle',
                                             mav=(51020), volume=True, show_nontrading=False, returnfig=True)
    • 1

    这样我们就完成了整个绘制股票K线图的代码,喜欢就点个赞吧~

    后面我们还会基于以上代码,一起完成一个股票数据 Web 展示程序,最终完成一个股票量化平台,敬请期待哦!

    本文由 mdnice 多平台发布

  • 相关阅读:
    【学习笔记】C++ 中 static 关键字的作用
    对话跨国消费品牌DPO:数据安全合规从何做起?8.11直播见
    微服务远程调用组件Feign的使用详解
    金昌JCH文件批量转BMP/JPG图片脚本
    Python入门教程之基本语法详解,收藏慢慢学~
    盘点一下今年世界杯中国赞助商及联名入圈品牌
    儿童护眼灯AA好还是AAA好?双十二精选国AA儿童护眼灯
    做决策、定战略、带团队:顶级高手常用的16个思维模型
    原生XMLHttpRequest发起请求
    10. Tasks and functions(任务和函数)
  • 原文地址:https://blog.csdn.net/zhouwei_1989_/article/details/126511467