目錄
一、黃金價格與美元實際利率
二、最終結果
三、代碼
1.import
2.代碼
2.1 Tkinter 經典寫法
2.2 creatWidget()函式與控制元件事件系結
2.3 generateImage()函式:pands+matplotlib
四、完整代碼
一、黃金價格與美元實際利率
在《黃金價格與實際利率的關系》的文章中,作者指出,“實際利率是唯一與黃金價格相關的指標”,但并不是直線相關,只有實際利率轉為負的時候,黃金價格才會大幅上漲,
而實際利率、名義利率與通貨膨脹率有該關系:實際利率=名義利率-通貨膨脹率
通貨膨脹率使用美國十年年平準通脹率10-Year Breakeven Inflation Rate (T10YIE):10-Year Breakeven Inflation Rate | FRED | St. Louis Fed
名義利率使用美國十年期國債收益率 Market Yield on U.S. Treasury Securities at 10-Year Constant Maturity (DGS10):https://fred.stlouisfed.org/series/DGS10
黃金價格使用MT4軟體的XAUUSD日線資料
所需檔案已上傳至博客資源中(正在審核):https://download.csdn.net/download/zsllsz2022/35932952
二、最終結果

選擇DGS10、T10YIE、Xau檔案后,并設定保存位置,然后點擊生成圖片,會在左側顯示示意圖,并在指定檔案夾內生成PNG格式的圖片,
三、代碼
1.import
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import mpl_toolkits.axisartist as AA
from mpl_toolkits.axisartist.axislines import SubplotZero
import pylab
pylab.mpl.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
plt.rcParams['axes.unicode_minus']=False #用于解決不能顯示負號的問題
2.代碼
2.1 Tkinter 經典寫法
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import mpl_toolkits.axisartist as AA
from mpl_toolkits.axisartist.axislines import SubplotZero
import pylab
pylab.mpl.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
plt.rcParams['axes.unicode_minus']=False #用于解決不能顯示負號的問題
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack() #使用pack布局管理器
self.config(width=1100, height=500) #加入控制元件后修改此引數即可知道含義
self.creatWidget()
#用于控制按鈕使用順序,若某個Flag為0,表示該Button操作未完成
self.selectFileDGS10Flag = 0
self.selectFileT10YIEFlag = 0
self.selectFileXauFlag = 0
self.SavePathFlag = 0
def creatWidget(self):
pass
if __name__ == '__main__':
root = Tk()
root.title("實際利率與黃金價格走勢圖") #視窗名稱
root.geometry("1100x500+200+50") #主視窗位置與大小/此處含義為寬度1100,高度500,+200表示距左邊螢屏距離,+50表示距離上邊螢屏距離
root.resizable(0,0) #不可伸縮大小,個人習慣使用固定視窗大小,然后使用pack布局設定好絕對位置
app = Application(master=root)
root.mainloop() #進入事件回圈

2.2 creatWidget()函式與控制元件事件系結
def creatWidget(self):
#text,command,bg引數與place方法里的x,y引數,見效果圖即可
#或者手動修改后查看異同
#控制元件-圖片示意圖
self.imageShow = Text(self,width=130,height=35)
self.imageShow.place(x=15,y=25)
#控制元件-上傳檔案按鈕
btnSelectFileDGS10 = Button(self,text="選擇DGS10檔案",command=self.selectFileDGS10,bg="blue")
btnSelectFileDGS10.place(x=950,y=30)
btnSelectFileT10YIE = Button(self, text="選擇T10YIE檔案", command=self.selectFileT10YIE, bg="blue")
btnSelectFileT10YIE.place(x=950, y=80)
btnSelectFileXau = Button(self, text="選擇Xau檔案", command=self.selectFileXau, bg="blue")
btnSelectFileXau.place(x=959, y=130)
#控制元件-設定存盤位置按鈕
btnSavePath = Button(self, text="設定保存位置", command=self.SavePath, bg="green")
btnSavePath.place(x=959, y=180)
#控制元件-生成圖片按鈕
btn = Button(self,text="生成圖片", command=self.generateImage, bg="green")
btn.place(x=969, y=230)
def generateImage(self):
#若未完成上傳檔案,則彈出Error視窗
#此處只有當三個Flag均為1時,才可以繼續往下執行
if(self.selectFileDGS10Flag == 0 or self.selectFileT10YIEFlag == 0 or self.selectFileXauFlag == 0):
messagebox.showinfo("Error","請先上傳檔案")
return
#若未設定圖片存盤路徑,則彈出Error視窗
if(self.SavePathFlag == 0):
messagebox.showinfo("Error","請先設定保存路徑")
return
#其余功能見下文
pass
#使用askopenfilename獲取檔案絕對路徑
#使用askdirectory獲取檔案夾絕對路徑
#當成功完成讀取操作后將Flag設定為1
def selectFileDGS10(self):
self.pathDGS10 = askopenfilename(title="上傳檔案")
if len(self.pathDGS10) != 0:
self.selectFileDGS10Flag = 1
def selectFileT10YIE(self):
self.pathT10YIE = askopenfilename(title="上傳檔案")
if len(self.pathT10YIE) != 0:
self.selectFileT10YIEFlag = 1
def selectFileXau(self):
self.pathXau = askopenfilename(title="上傳檔案")
if len(self.pathXau) != 0:
self.selectFileXauFlag = 1
def SavePath(self):
self.SavePath = askdirectory(title="設定存盤位置")
if len(self.SavePath) != 0:
self.SavePathFlag = 1

2.3 generateImage()函式:pands+matplotlib
def generateImage(self):
#若未完成上傳檔案,則彈出Error視窗
#此處只有當三個Flag均為1時,才可以繼續往下執行
if(self.selectFileDGS10Flag == 0 or self.selectFileT10YIEFlag == 0 or self.selectFileXauFlag == 0):
messagebox.showinfo("Error","請先上傳檔案")
return
#若未設定圖片存盤路徑,則彈出Error視窗
if(self.SavePathFlag == 0):
messagebox.showinfo("Error","請先設定保存路徑")
return
#pd.read_csv讀取檔案,檔案路徑即為askdirectory函式讀取結果
#資料從2019年7月19日開始切片,前提使用parse_dates=True將時間決議為時間物件
#na_values將特定字串識別成Nan
#index_col設定df索引
self.dfDGS10 = pd.read_csv(self.pathDGS10, index_col="DATE", parse_dates=True, na_values=["."])["2019-7-19":]
self.dfT10YIE = pd.read_csv(self.pathT10YIE, index_col="DATE", parse_dates=True, na_values=["."])["2019-7-19":]
self.srAu = pd.read_csv(self.pathXau, header=None, names=["DATE", "open", "high", "low", "close", "v"],
parse_dates=True)["close"]["2019-7-19":]
#重新構造一個DataFrame
#realRate為真實利率,即名義利率-通貨膨脹率
self.realRate = pd.DataFrame({"realRate": (self.dfDGS10["DGS10"] - self.dfT10YIE["T10YIE"]), "DGS10": self.dfDGS10["DGS10"],
"T10YIE": self.dfT10YIE["T10YIE"], "au": self.srAu})
#dropna-how:篩選方式-‘any’,表示該行/列只要有一個以上的空值,就洗掉該行/列;‘all’,表示該行/列全部都為空值,就洗掉該行/列,
realRate = self.realRate.dropna(how="any")
fig, ax = plt.subplots(figsize=(100, 50))
plt.title("實際利率與黃金價格走勢圖", fontsize=140)
#設定右邊的坐標軸
ax2 = ax.twinx()
ax2.tick_params(labelsize=100) #設定刻度大小
ax2.yaxis.set_major_locator(ticker.MultipleLocator(50))#設定黃金價格刻度間隔
ax2.set_ylabel("黃金價格/$",size=120)#設定label名稱與大小
#設定坐標軸
ax.tick_params(labelsize=100)
ax.xaxis.set_major_locator(ticker.MultipleLocator(100))
ax.set_ylabel("利率/%",size=120)
#畫圖-各引數具體含義參照效果圖即可
ax.plot(realRate.index, realRate["DGS10"], "-.g", label="美國十年期國債收益率/%", linewidth=10)
ax.plot(realRate.index, realRate["T10YIE"], "-.b", label="10-Year Breakeven Inflation Rate/%", linewidth=10)
ax.plot(realRate.index, realRate["realRate"], "-.r", label="實際利率/%", linewidth=20)
#使用ax的label代替ax2的label,或可將ax2的legend加入到ax的legend中
ax.plot([], [], "-.y", label="黃金價格/$", linewidth=20)
ax2.plot(realRate.index, realRate["au"], "-.y", label="黃金價格", linewidth=20)
#legeng大小與位置,upper left即為左上角
ax.legend(fontsize=100,loc="upper left")
#柵格grid
ax.grid(linestyle=":", color="b", linewidth=5)
self.imagePathPng = self.SavePath + "/result.png"
plt.savefig(self.imagePathPng,dpi=10,bbox_inches='tight')
#將保存到指定路徑的圖片重新讀取并插入到Text控制元件中
self.photo = PhotoImage(file=self.imagePathPng)
self.imageShow.image_create(1.0,image=self.photo)
四、完整代碼
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker
import mpl_toolkits.axisartist as AA
from mpl_toolkits.axisartist.axislines import SubplotZero
import pylab
pylab.mpl.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
plt.rcParams['axes.unicode_minus']=False #用于解決不能顯示負號的問題
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack() #使用pack布局管理器
self.config(width=1100, height=500) #加入控制元件后修改此引數即可知道含義
self.creatWidget()
#用于控制按鈕使用順序,若某個Flag為0,表示該Button操作未完成
self.selectFileDGS10Flag = 0
self.selectFileT10YIEFlag = 0
self.selectFileXauFlag = 0
self.SavePathFlag = 0
def creatWidget(self):
#text,command,bg引數與place方法里的x,y引數,見效果圖即可
#或者手動修改后查看異同
#控制元件-圖片示意圖
self.imageShow = Text(self,width=130,height=35)
self.imageShow.place(x=15,y=25)
#控制元件-上傳檔案按鈕
btnSelectFileDGS10 = Button(self,text="選擇DGS10檔案",command=self.selectFileDGS10,bg="blue")
btnSelectFileDGS10.place(x=950,y=30)
btnSelectFileT10YIE = Button(self, text="選擇T10YIE檔案", command=self.selectFileT10YIE, bg="blue")
btnSelectFileT10YIE.place(x=950, y=80)
btnSelectFileXau = Button(self, text="選擇Xau檔案", command=self.selectFileXau, bg="blue")
btnSelectFileXau.place(x=959, y=130)
#控制元件-設定存盤位置按鈕
btnSavePath = Button(self, text="設定保存位置", command=self.SavePath, bg="green")
btnSavePath.place(x=959, y=180)
#控制元件-生成圖片按鈕
btn = Button(self,text="生成圖片", command=self.generateImage, bg="green")
btn.place(x=969, y=230)
def generateImage(self):
#若未完成上傳檔案,則彈出Error視窗
#此處只有當三個Flag均為1時,才可以繼續往下執行
if(self.selectFileDGS10Flag == 0 or self.selectFileT10YIEFlag == 0 or self.selectFileXauFlag == 0):
messagebox.showinfo("Error","請先上傳檔案")
return
#若未設定圖片存盤路徑,則彈出Error視窗
if(self.SavePathFlag == 0):
messagebox.showinfo("Error","請先設定保存路徑")
return
#pd.read_csv讀取檔案,檔案路徑即為askdirectory函式讀取結果
#資料從2019年7月19日開始切片,前提使用parse_dates=True將時間決議為時間物件
#na_values將特定字串識別成Nan
#index_col設定df索引
self.dfDGS10 = pd.read_csv(self.pathDGS10, index_col="DATE", parse_dates=True, na_values=["."])["2019-7-19":]
self.dfT10YIE = pd.read_csv(self.pathT10YIE, index_col="DATE", parse_dates=True, na_values=["."])["2019-7-19":]
self.srAu = pd.read_csv(self.pathXau, header=None, names=["DATE", "open", "high", "low", "close", "v"],
parse_dates=True)["close"]["2019-7-19":]
#重新構造一個DataFrame
#realRate為真實利率,即名義利率-通貨膨脹率
self.realRate = pd.DataFrame({"realRate": (self.dfDGS10["DGS10"] - self.dfT10YIE["T10YIE"]), "DGS10": self.dfDGS10["DGS10"],
"T10YIE": self.dfT10YIE["T10YIE"], "au": self.srAu})
#dropna-how:篩選方式-‘any’,表示該行/列只要有一個以上的空值,就洗掉該行/列;‘all’,表示該行/列全部都為空值,就洗掉該行/列,
realRate = self.realRate.dropna(how="any")
fig, ax = plt.subplots(figsize=(100, 50))
plt.title("實際利率與黃金價格走勢圖", fontsize=140)
#設定右邊的坐標軸
ax2 = ax.twinx()
ax2.tick_params(labelsize=100) #設定刻度大小
ax2.yaxis.set_major_locator(ticker.MultipleLocator(50))#設定黃金價格刻度間隔
ax2.set_ylabel("黃金價格/$",size=120)#設定label名稱與大小
#設定坐標軸
ax.tick_params(labelsize=100)
ax.xaxis.set_major_locator(ticker.MultipleLocator(100))
ax.set_ylabel("利率/%",size=120)
#畫圖-各引數具體含義參照效果圖即可
ax.plot(realRate.index, realRate["DGS10"], "-.g", label="美國十年期國債收益率/%", linewidth=10)
ax.plot(realRate.index, realRate["T10YIE"], "-.b", label="10-Year Breakeven Inflation Rate/%", linewidth=10)
ax.plot(realRate.index, realRate["realRate"], "-.r", label="實際利率/%", linewidth=20)
#使用ax的label代替ax2的label,或可將ax2的legend加入到ax的legend中
ax.plot([], [], "-.y", label="黃金價格/$", linewidth=20)
ax2.plot(realRate.index, realRate["au"], "-.y", label="黃金價格", linewidth=20)
#legeng大小與位置,upper left即為左上角
ax.legend(fontsize=100,loc="upper left")
#柵格grid
ax.grid(linestyle=":", color="b", linewidth=5)
self.imagePathPng = self.SavePath + "/result.png"
plt.savefig(self.imagePathPng,dpi=10,bbox_inches='tight')
#將保存到指定路徑的圖片重新讀取并插入到Text控制元件中
self.photo = PhotoImage(file=self.imagePathPng)
self.imageShow.image_create(1.0,image=self.photo)
#使用askopenfilename獲取檔案絕對路徑
#使用askdirectory獲取檔案夾絕對路徑
#當成功完成讀取操作后將Flag設定為1
def selectFileDGS10(self):
self.pathDGS10 = askopenfilename(title="上傳檔案")
if len(self.pathDGS10) != 0:
self.selectFileDGS10Flag = 1
def selectFileT10YIE(self):
self.pathT10YIE = askopenfilename(title="上傳檔案")
if len(self.pathT10YIE) != 0:
self.selectFileT10YIEFlag = 1
def selectFileXau(self):
self.pathXau = askopenfilename(title="上傳檔案")
if len(self.pathXau) != 0:
self.selectFileXauFlag = 1
def SavePath(self):
self.SavePath = askdirectory(title="設定存盤位置")
if len(self.SavePath) != 0:
self.SavePathFlag = 1
if __name__ == '__main__':
root = Tk()
root.title("實際利率與黃金價格走勢圖") #視窗名稱
root.geometry("1100x500+200+50") #主視窗位置與大小/此處含義為寬度1100,高度500,+200表示距左邊螢屏距離,+50表示距離上邊螢屏距離
root.resizable(0,0) #不可伸縮大小,個人習慣使用固定視窗大小,然后使用pack布局設定好絕對位置
app = Application(master=root)
root.mainloop() #進入事件回圈
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/344252.html
標籤:python
