共计 3993 个字符,预计需要花费 10 分钟才能阅读完成。
在后面的文章中,咱们一起学习了如何通过 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)
咱们这里应用 Toplevel
来创立子窗口,再来看看子窗口相干的代码
class SubWindiw:
def __init__(self):
pass
def all_files(self):
...
def getDate(self):
...
def subWindow(self, root_frame):
...
def go(self):
...
对于子窗口代码,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)
次要还是分三个区域,日期抉择区域,股票文件抉择区域以及 K 线图展现区域
还有两个功能性函数 all_files
和 getDate
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
getDate
def getDate(self):
today = datetime.datetime.now()
offset = datetime.timedelta(days=-1)
re_date = (today + offset).strftime('%Y/%m/%d')
return today + offset
绘制 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=(5, 10, 20), 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)
咱们通过 Matplotlib + mplfinance 来绘制 K 线图
首先是通过 Pandas 来解决数据,把咱们爬取到的数据处理成 mplfinance 须要的格局,如下
接下来只须要调用 plot
函数即可
self.fig, self.axlist = mpf.plot(data, style=my_style, type='candle',
mav=(5, 10, 20), volume=True, show_nontrading=False, returnfig=True)
这样咱们就实现了整个绘制股票 K 线图的代码,喜爱就点个赞吧~
前面咱们还会基于以上代码,一起实现一个股票数据 Web 展现程序,最终实现一个股票量化平台,敬请期待哦!
本文由 mdnice 多平台公布