【手把手系列】達錢 Python 第一個指標(均線)
這次我們要使用Ta-Lib來計算均線指標,Ta-Lib是一個提供各種指標運算的數據庫,除了均線也有布林通道、MACD、RSI指標等等,但是他不像numpy或pandas可以直接從pycharm下載,因此我們會先講解如何下載與安裝Ta-Lib,這是我們提供的sample下載連結:VolTradrSample,這篇使用的是course2檔案,後面我們會使用pandas匯入資料、matplotlib進行繪圖以及用mplfinance繪製K線圖,pandas、matplotlib、mplfinance可以透過pip install或是在pycharm直譯器進行下載,使用pycharm打開下載的資料夾請參考:達錢 Python 【行情&歷史數據】串接設定教學串接行情第2-4步驟
下載與安裝Ta-Lib
1. 點擊連結前往提供的 Python Packages:https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib,我們選擇第二個TA_Lib‑0.4.24‑cp310‑cp310‑win_amd64.whl的檔案進行下載
2. 在左下角window logo按右鍵,選擇打開Windows終端機(系統管理員)
3. 開啟終端機後輸入cd下載路徑
4. 最後輸入pip install,後面加上TA_Lib‑0.4.24‑cp310‑cp310‑win_amd64.whl,就能安裝好TaLib
Pycharm下載套件
下載歷史資料時我們需要使用pandas裡的to_csv函式、matplotlib的繪圖和mplfinance繪製K線功能,在終端機使用pip install安裝或是在pycharm中直接進行下載才能正常執行,下面介紹Pycahrm中下載檔案包的步驟:
1. 在pycharm中點擊左上角File選擇Settings,打開Project: pythonProject下的Python Interpreter點選"+"號
2. 在搜尋欄輸入pandas,點選pandas,最後按左下角的Install Package就可以完成安裝了
3. 安裝完成後只要再搜尋matplotlib點擊後按Install Package就可以了,mplfinance用同樣的方法也可以安裝成功
讀取與下載歷史資料
安裝完檔案包我們就可以開始寫程式了,還記得上一篇章最後我們能夠抓取歷史資料,除了讀取外也可以進行下載再進行讀取,這邊我們會先複習一下讀取歷史資料的步驟:
1. 同樣我們需要匯入tcoreapi_mq和quote_functions,用QuoteAPI跟PORT連接VolTrader,再建立執行緒用quote_sub_th連接行情
2. 設定合約代碼、時間區段以及資料種類,最後用GetHistory讀取歷史資料
3.下載檔案可以參考download_history_data.py,大部分都跟get_quote_and_greeks_historical_data_sample.py一樣,只差在下面三行程式,實際上要進行下載的話我們需要設定一個變數data,確定data的資料類型是pandas.dataframe才能使用to_csv函式轉換成csv檔案
# 顯示歷史數據
data = GetHistory(g_QuoteZMQ, g_QuoteSession, testSymbol, ktype, sD, eD)
# 確定歷史資料的類型,需要pandas裡DataFrame的格式才能使用to_csv函式轉成csv檔
print(type(data))
data.to_csv('history_data.csv', index= False)
4. 儲存的csv檔案會自動保存在當前的目錄下,打開檔案會跟輸出的結果一樣不過是以逗號而不是空格區分
均線指標
這部分可以參考我們提供的sample裡面的sma_signal.py檔案下面進行講解:
1.首先我們先匯入talib、pandas、matplotlib和mplfinance,matplotlib是用來畫圖的,而mplfinance是基於matplotlib加入自動繪製K線、均線等功能,匯入時我們可以將matplotlib.pyplot和
mplfinance簡稱為plt、mpf,這樣我們後面就不用輸入一大串程式碼
import talib
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
2. 下載完歷史數據後我們就可以使用pandas裡read_csv函式讀取歷史資料,這邊設置index_col可以讓資料的標籤變成日期而不是行數
# 讀取歷史資料
history_data = pd.read_csv("history_data.csv", index_col="Date", parse_dates=True)
3. 再來利用talib裡面的SMA函式計算出收盤價的15日和30日均線,SMA第一個參數是傳入想要讀取的資料,第二個參數是設定時間範圍,也就是說輸入15它會自動算出每個資料前15日的平均,簡單移動平均線(Simple Moving Average)也就是SMA也可以簡化成MA,當然talib提供的不只SMA也有EMA、WMA等等
# 計算均線
sma_15 = talib.SMA(history_data["Close"], timeperiod=15)
sma_30 = talib.SMA(history_data["Close"], timeperiod=30)
4. 接下來加入想要增加的圖表,後面會加入到K線圖中,這邊使用字典的形式方便後面調取,加入的第一項是剛剛計算的15日收盤價均線,第二項是30日均線
# 想要增加的圖表
added_plots = {"SMA15": mpf.make_addplot(sma_15),
"SMA30": mpf.make_addplot(sma_30)
}
5. 再來設定圖表的顏色與網格,使用mpf中make_mpf_style可以輕鬆改變圖表的樣式,這邊我們只改變顏色以及增加灰色網格,上漲時設定為紅色,下跌時是綠色
# 設定圖表的顏色與網狀格格式
style = mpf.make_mpf_style(marketcolors=mpf.make_marketcolors(up="r", down="g"),
gridcolor="gray")
6. 使用mpf.plot可以進行繪圖,想要畫出K線只要將type設定為candle就會自動生成了,style跟增加的圖表都是前面設置好的,這邊需要注意的是addplot傳入的參數要求為列表,因此我們要將前面的字典的值轉換為列表,volume=True會自動畫出每日成交量,returnfig=True會讓圖表關閉時正常關閉程式而不會報錯
# 畫K線和均線圖
fig, axes = mpf.plot(history_data, type="candle", style=style,
addplot=list(added_plots.values()),
volume=True,
returnfig=True)
7. 接著是設定圖例的部分,這邊比較麻煩的是K線圖會自動佔用兩種圖示,因此我們要自己指定圖例,首先讓圖例變成五個None相當於重置圖例,然後設置第三個開始的圖形標籤為前面字典的值,也就是第三個線條是15日均線、第四個線條為30日均線
# 設定圖例
axes[0].legend([None] * (len(added_plots) + 2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:], labels=list(added_plots.keys()))
8. 最後設置y軸標籤,上半部分是價格,下半部分是交易量,然後使用plt.show()將圖表畫出來,這邊需要注意的是程式會一直處於執行狀態直到關閉圖片才會自動終止程式
axes[0].set_ylabel("Price")
axes[2].set_ylabel("Volume")
plt.show()
看到下面的圖片就代表程式正常執行了,上面有K線、15日均線、30日均線,下面則是每日交易量
到這邊我們就學會如何繪製均線指標,下一篇我們會用均線來進行回測
下面提供均線指標完整程式碼:
import talib
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
# 讀取歷史資料
history_data = pd.read_csv("history_data.csv", index_col="Date", parse_dates=True)
# 計算均線
sma_15 = talib.SMA(history_data["Close"], timeperiod=15)
sma_30 = talib.SMA(history_data["Close"], timeperiod=30)
# 想要增加的圖表
added_plots = {"SMA15": mpf.make_addplot(sma_15),
"SMA30": mpf.make_addplot(sma_30)
}
# 設定圖表的顏色與網狀格格式
style = mpf.make_mpf_style(marketcolors=mpf.make_marketcolors(up="r", down="g"),
gridcolor="gray")
# 畫K線和均線圖
fig, axes = mpf.plot(history_data, type="candle", style=style,
addplot=list(added_plots.values()),
volume=True,
returnfig=True)
# 設定圖例
axes[0].legend([None] * (len(added_plots) + 2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:], labels=list(added_plots.keys()))
axes[0].set_ylabel("Price")
axes[2].set_ylabel("Volume")
plt.show()