【手把手系列】達錢 Python 【行情&歷史數據】串接設定教學

VolTrader平台上提供大量的資訊,透過Python Api接口可以輕鬆讀取即時和歷史資料,也可以客製化想要瞭解的數值,下面範例會使用達錢軟體、pycharm以及python3.10環境來示範完整的行情與歷史數據串接。

環境設置

達錢 VolTrader

使用我們提供的 Python API 服務,請依據下列步驟完成會員申請與軟體安裝。

  1. 加入 TOUCHANCE 會員(立即加入取得試用:https://www.touchance.com.tw/signup)。
  2. 下載並安裝 VolTrader 軟體。(下載連結:https://www.touchance.com.tw/download

安裝 Pycharm

前往pycharm官網https://www.jetbrains.com/pycharm/download/#section=windows下載community版本的pycharm,預設的python版本為3.10,如果使用的電腦不是window系統請下載相對應的mac或linux版本的pycharm

PyCharm 環境設置

1. 打開pycharm後選擇新增專案,預設儲存路徑為使用者目錄下的PycharmProjects\pythonProject

 

2. 選擇要新增的環境變量一共有四個選項,conda環境可以自訂python版本,這邊我們使用第一個選項虛擬環境(Virtualenv),python版本為3.10就可以了

3.按右下角create就可以成功建設環境,開始輸入python程式碼

 

Pycharm優點

這邊我們選擇pycharm的原因有3點:

1. 跟visual studio不同不需要大量外掛,而是直接使用預設直譯器一行一行翻譯程式碼

2. 介面專注在python上,會顯示當前檔案位置,也提供除錯、終端、同步執行等功能

3. community版本的pycharm是免費的,雖然不如professional版本但功能也十分全面且簡單上手

 

串接即時資料

VolTrader 提供提供台灣期貨交易商品(期貨、選擇權)即時行情與歷史服務,如果你需要海期行情需要向支援的期貨商(凱基, 統一, 富邦, 元富)申請開通。

1. 點擊VolTraderSample下載我們提供的sample檔案,這篇用到的是course1檔案裡面的程式

2. 將下載好的檔案解壓縮到桌面後,進入pycharm後用open file選擇資料夾開啟檔案

 

3. 點選右上方的Add Configurations,點擊左上角的+號,選擇Python

 

4. 選擇開啟的路徑檔案,Script path欄位右邊有一個小資料夾可以選擇檔案,後面想要更改檔案都是在這裡選擇檔案

 

5. 打開quote_realtime_sample.py檔案,按兩次OK,這是串接即時行情的sample檔案,下面會一一講解步驟

6. 在開始執行python講解前我們要先打開VolTrader並登入,否則python會連線不到VolTrader而處於空運行的狀態

 

7. 首先需要先匯入我們設置好的tcoreapi_mq以及quote_functions,裡面提供行情報價、連線到VolTrader等底層接口api

#載入 tcoreapi
import time

from tcoreapi_mq import *
#載入我們提供的行情 function
from quote_functions import *
import threading

 

8. 接著我們必須找到連接VolTrader的PORT,PORT需要到VolTrader自動儲存的logs底下進行查看

 

9. 使用記事本或是編輯器打開QuoteZMQService檔案,搜尋關鍵字RepPort,後面的ID就是我們連線VolTrader需要設定的PORT ID

 

10. 回到quote_realtime_sample.py檔案,使用QuoteAPI設定連線授權碼,再用g_QuoteZMQ連接剛剛找到的PORT ID

    #建立 ZMQ 連線

    #設定連線授權碼,通常不用改。
    g_QuoteZMQ = QuoteAPI("ZMQ","8076c9867a372d2a9a814ae710c256e2")
    
    #設定連接 Port,通常不用改。
    q_data = g_QuoteZMQ.Connect("51647")

 

11. 執行範例程式,如果連接成功的話,在輸出部分會回傳Success的值為OK,這邊回傳的SubPort跟剛剛連接上的Port不一樣,剛剛的Port是我們連接VolTrader所需要的Port,這邊則是未來取用行情與歷史數據需要的Port

 

12. 連線成功後將訂閱行情需要的SessionKey保存下來,然後建立一個行情執行緒使用quote_sub_th接收行情,內建的quote_sub_th函式在quote_functions.py檔案裡,在執行緒後面增加daemon為True可以讓主執行緒關閉時,子執行緒自動關閉

    # 連線成功后,將取得的 Session Key 儲存下來,後面調用指令需要帶入。
    g_QuoteSession = q_data["SessionKey"]

    #############行情#############
    # 建立一個行情執行緒
    t1 = threading.Thread(target=quote_sub_th, args=(g_QuoteZMQ, q_data["SubPort"],))
    t1.daemon = True
    t1.start()

 

13. 最後我們設定合約代碼,先解除訂閱確保沒有重複訂閱,再用SubQuote函式進行訂閱,就可以訂閱即時行情數據,這邊需要確定合約是否已經下市,如果該合約已經下市的話訂閱回傳的數據會是空值,我們使用202208,五秒後會自動解除訂閱,最後再用Logout函式進行登出

    # 即時行情訂閱
    # 設定合約代碼,測試時請注意範例的合約是否已經下市。
    testSymbol = "TC.F.TWF.MXF.202208"

    # 解訂實時報價(每次訂閱合約前,先調用解訂,避免重覆訂閱)
    g_QuoteZMQ.UnsubQuote(g_QuoteSession, testSymbol)
    # 訂閱即時行情
    g_QuoteZMQ.SubQuote(g_QuoteSession, testSymbol)
    # 訂閱五秒後自動解除訂閱
    time.sleep(5)
    # 解訂實時報價
    g_QuoteZMQ.UnsubQuote(g_QuoteSession, testSymbol)

    g_QuoteZMQ.Logout(g_QuoteSession)

 

如果你看到下面的輸出結果,而且在不斷更新行情數據代表你成功了,如果是空值可能你沒開啟VolTrader或是你輸入的合約代碼已經下市,或者該合約目前閉市可以在交易時段再執行看看:

 

如果想要更改預設的資訊,可以到quote_functions.py裡修改OnRealTimeQuote裡print的內容

import time
import json
import re
import pandas as pd
import zmq

g_DictHistory = {}

#即時行情Callback
#相關欄位,參考本範例欄位注解
def OnRealTimeQuote(symbol):
    print("FilledTime > ", symbol["FilledTime"], " > Symbol: ",symbol["Symbol"] , " > TradingPrice:", symbol["TradingPrice"])
    # print("O: ",symbol["OpeningPrice"])
    # print("H: ",symbol["HighPrice"])
    # print("L: ",symbol["LowPrice"])
    # print("C: ",symbol["ClosingPrice"])

 

下面是sample裡quote_realtime_sample.py的完整程式,要注意執行前tcoreapi_mq以及quote_functions.py都在同一個資料夾中,否則會產生匯入錯誤:

# 載入 tcoreapi
import time

from tcoreapi_mq import *
# 載入我們提供的行情 function
from quote_functions import *
import threading

g_QuoteZMQ = None
g_QuoteSession = ""


def main():
    global g_QuoteZMQ
    global g_QuoteSession

    # 建立 ZMQ 連線

    # 設定連線授權碼,通常不用改。
    g_QuoteZMQ = QuoteAPI("ZMQ", "8076c9867a372d2a9a814ae710c256e2")

    # 設定連接 Port,通常不用改。
    q_data = g_QuoteZMQ.Connect("51647")

    print(q_data)

    if q_data["Success"] != "OK":
        print("[ quote ]connection failed")
        return

    # 連線成功后,將取得的 Session Key 儲存下來,後面調用指令需要帶入。
    g_QuoteSession = q_data["SessionKey"]

    #############行情#############
    # 建立一個行情執行緒
    t1 = threading.Thread(target=quote_sub_th, args=(g_QuoteZMQ, q_data["SubPort"],))
    t1.daemon = True
    t1.start()

    # 即時行情訂閱
    # 設定合約代碼,測試時請注意範例的合約是否已經下市。
    testSymbol = "TC.F.TWF.MXF.202208"

    # 解訂實時報價(每次訂閱合約前,先調用解訂,避免重覆訂閱)
    g_QuoteZMQ.UnsubQuote(g_QuoteSession, testSymbol)
    # 訂閱即時行情
    g_QuoteZMQ.SubQuote(g_QuoteSession, testSymbol)
    # 訂閱五秒後自動解除訂閱
    time.sleep(5)
    # 解訂實時報價
    g_QuoteZMQ.UnsubQuote(g_QuoteSession, testSymbol)

    g_QuoteZMQ.Logout(g_QuoteSession)


if __name__ == '__main__':
    main()

 

回補歷史數據

回補歷史資料的步驟跟串接即時行情數據十分相似,下面會從get_quote_and_greeks_historical_data_sample.py為範例進行講解:

1. 這邊我們一樣先匯入tcoreapi_mq以及quote_functions,然後用QuoteAPI和PORT連接到VolTrader

2. 連接成功後也要保存SessionKey,再建立執行緒

    #連線成功后,將取得的 Session Key 儲存下來,後面調用指令需要帶入。
    g_QuoteSession = q_data["SessionKey"]

    #############行情#############
    #建立一個行情執行緒
    t1 = threading.Thread(target = quote_sub_th,args=(g_QuoteZMQ,q_data["SubPort"],))
    t1.daemon = True
    t1.start()

 

3. 設定合約代碼,TC.F代表期貨,TC.O代表選擇權,sample使用台指期貨2022年一月份為例,這邊我們修改成台指期貨熱門月,除了熱門月也可以設定為次熱門月

    #testSymbol = "TC.F.TWF.TXF.202201"
    # testSymbol = "TC.O.TWF.TXO.202201.C.18400"
    # HOT:熱門月,HOT2:次熱門月,TXF:台指期貨,MXF:小台指期貨
    testSymbol = 'TC.F.TWF.TXF.HOT'

 

4. 設定歷史數據回補的區間以及資料種類,資料種類包括ticks、分K、日K、Greeks秒數據以及Greeks分數據,我們一樣將範例的1K改為DK,並且時間範圍改成2021年1月3號到2022年6月3號,時間範圍的格式為四位年份、兩位月份、兩位日期以及兩位小時(24小時制)

    #訂閱歷史數據
    # message["DataType"]="TICKS"   ticks
    # message["DataType"]="1K"   1K
    # message["DataType"]="DK"   日K
    # message["DataType"]="DOGSS"   Greeks 秒數據
    # message["DataType"]="DOGSK"   Greeks 分鐘數據
    # 回補區間設定
    # yyyymmddHH, HH 00-23
    ktype = 'DK'
    sD = '2021010300'
    eD = '2022060323'

 

5. 將參數放進GetHistory就可以回補歷史資料,讀取完歷史資料我們同樣要解除訂閱以及登出帳號才會結束程式

    # 顯示歷史數據
   GetHistory(g_QuoteZMQ, g_QuoteSession, testSymbol, ktype, sD, eD)
    # 解除訂閱歷史數據
    g_QuoteZMQ.UnsubHistory(g_QuoteSession, testSymbol, ktype, sD, eD)
    # 登出帳號
    g_QuoteZMQ.Logout(g_QuoteSession)

 

如果你的輸出結果跟下面的圖一樣,那代表你的程式正常執行,如果是空值的話可能是合約代碼錯誤或是輸入的時間段資料過大,可以調整參數再執行看看

 

下面提供sample裡讀取歷史資料的完整程式:

# 載入 tcoreapi
from tcoreapi_mq import *
# 載入我們提供的行情 function
from quote_functions import *
import threading

g_QuoteZMQ = None
g_QuoteSession = ""


def main():
    global g_QuoteZMQ
    global g_QuoteSession
    global testSymbol

    # 建立 ZMQ 連線

    # 設定連線授權碼,通常不用改。
    g_QuoteZMQ = QuoteAPI("ZMQ", "8076c9867a372d2a9a814ae710c256e2")

    # 設定連接 Port,通常不用改。
    q_data = g_QuoteZMQ.Connect("51647")

    print(q_data)

    if q_data["Success"] != "OK":
        print("[ quote ]connection failed")
        return

    # 連線成功后,將取得的 Session Key 儲存下來,後面調用指令需要帶入。
    g_QuoteSession = q_data["SessionKey"]

    #############行情#############
    # 建立一個行情執行緒
    t1 = threading.Thread(target=quote_sub_th, args=(g_QuoteZMQ, q_data["SubPort"],))
    t1.daemon = True
    t1.start()

    # 即時行情訂閱
    # 設定合約代碼,測試時請注意範例的合約是否已經下市。
    # testSymbol = "TC.F.TWF.TXF.202201"
    # testSymbol = "TC.O.TWF.TXO.202201.C.18400"
    # HOT:熱門月,HOT2:次熱門月,TXF:台指期貨,MXF:小台指期貨
    testSymbol = 'TC.F.TWF.TXF.HOT'

    # 訂閱歷史數據
    # message["DataType"]="TICKS"   ticks
    # message["DataType"]="1K"   1K
    # message["DataType"]="DK"   日K
    # message["DataType"]="DOGSS"   Greeks 秒數據
    # message["DataType"]="DOGSK"   Greeks 分鐘數據
    # 回補區間設定
    # yyyymmddHH, HH 00-23
    ktype = 'DK'
    sD = '2021010300'
    eD = '2022060323'

    # 顯示歷史數據
    GetHistory(g_QuoteZMQ, g_QuoteSession, testSymbol, ktype, sD, eD)
    # 解除訂閱歷史數據
    g_QuoteZMQ.UnsubHistory(g_QuoteSession, testSymbol, ktype, sD, eD)
    # 登出帳號
    g_QuoteZMQ.Logout(g_QuoteSession)

if __name__ == '__main__':
    main()