iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
3
AI & Data

量化交易30天系列 第 15

量化交易30天 Day15 - 串接券商API做交易(二) 台股歷史tick及分K

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

上一篇串接了國外券商的Python API,不過其實台灣的券商也有提供股票下單API喔,包含:群益證券、永豐金證券、統一證券...等等,都有提供API下單的服務,其中有提供Python介面的券商有群益證券及永豐金證券,因為筆者本身是用永豐金的帳戶,下面會使用永豐金證券的API作為範例,當然大家也可以多方嘗試各家券商的API喔。

Shioaji GitHub

Shioaji是永豐金證券提供的API介面,提供報價、下單功能,官方的Document還算蠻詳細的,接下來就會照著這個Document來用用看它的功能。

安裝Shioaji

就跟一般python套件一樣,一行就安裝了。

pip install shioaji

初始化

要使用券商的API的話,需要有:

  1. 券商帳號:login的時候會用到
  2. 下單憑證:有券商帳號後,下載電腦版的下單軟體,它就會請你下載憑證(.pfx檔案),下面載入憑證時,就指定憑證檔案的路徑即可。
# 載入shioaji套件
import shioaji as sj

# Initialization
api = sj.Shioaji()

# Login
accounts = api.login("YOUR_PERSON_ID", "YOUR_PASSWORD")

# 載入憑證
api.activate_ca(
    ca_path="/c/your/ca/path/Sinopac.pfx",
    ca_passwd="YOUR_CA_PASSWORD",
    person_id="Person of this Ca",
)

Stock Contract

不管是要取得報價或是下單,要告訴電腦說你想看什麼商品,contract物件就是用來代表商品內容的,所以stock contract就是用股票當作你要查報價或下單的商品。

假設我今天對0050有興趣,可以這樣寫:
In

contract_0050 = api.Contracts.Stocks["0050"]
contract_0050

Out

Stock(exchange=<Exchange.TSE: 'TSE'>, code='0050', symbol='TSE0050', name='元大台灣50', category='00', limit_up=115.9, limit_down=94.9, reference=105.4, update_date='2020/09/18', margin_trading_balance=7405, day_trade=<DayTrade.Yes: 'Yes'>)

上面server回應的訊息中,attributes的部份在document都有解釋。

取得歷史tick資料

tick資料呢,就是每筆成交的資料,所以它的index不會是固定的時間區間(例如:之前的日收盤資料就是固定每天都是一筆),它會紀錄每筆成交的價格及交易量,算是蠻詳細的資料。
In

ticks = api.ticks(contract_0050, "2020-09-18")
ticks

Out

Ticks(
    ts=[1600419602458055000, 1600419615455942000, 1600419619462302000, ...], 
    close=[105.4, 105.4, 105.35, ...],
    volume=[82, 3, 5, ...],
    bid_price=[105.35, 105.35, 105.3, ...],
    bid_volume=[5, 5, 3, ...],
    ask_price=[105.4, 105.4, 105.4, ...],
    ask_volume=[56, 53, 293, ...]
)

server回應的訊息,是將每種資料(包含:時間、成交價、成交量、委買價量、委賣價量)各用一個list表示。

將tick資料轉換成DataFrame

因為tick資料很多,list就會變成一長串,閱讀上不是那麼容易,因此可以把它轉成DataFrame會比較好看。

import pandas as pd
tick_data_df = pd.DataFrame({**ticks})
tick_data_df.ts = pd.to_datetime(tick_data_df.ts)
tick_data_df.head()

將ticks整理成資料表格之後,就變得比較容易讀了。

取得歷史K棒資料

之前有寫過Tiingo的每日OHLC資料,而shioaji有提供以分鐘為區間的OHLC(俗稱分K資料,以分鐘為單位):

kbars = api.kbars(contract_0050, start="2020-09-18", end="2020-09-18")
kbars_df = pd.DataFrame({**kbars})
kbars_df.ts = pd.to_datetime(kbars_df.ts)
kbars_df.head()

上圖中,09:01的資料是紀錄從9點到9點01分這段時間的OHLC及成交量。

本篇總結
這篇先寫獲取tick data、分K數據的方式,下一篇會講解如何用shioaji獲取盤中即時數據以及即時的個股Snapshot功能,請繼續收看。

P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。

筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day14 - 串接券商API做交易(一) IB + IbPy
下一篇
量化交易30天 Day16 - 串接券商API做交易(三) 台股盤中即時資料
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Hanny
iT邦新手 5 級 ‧ 2020-11-24 16:13:05

想請問怎麼透過永豐金api取得大盤加權指數

Sean Liu iT邦新手 4 級 ‧ 2020-11-25 16:43:17 檢舉

您好,contract的部份使用下列寫法即可:
api.Contracts.Indexs.TSE.TSE001

justsoso iT邦新手 5 級 ‧ 2022-01-28 20:34:07 檢舉

你想想知道各股可以迴圈抓股價下來嗎?我有參考https://ithelp.ithome.com.tw/articles/10279671
但不曉得為什麼只會存入一檔且每次都會不一樣

0
gn01671418
iT邦新手 5 級 ‧ 2022-07-19 21:29:11

您好,請問轉換成Dataframe時會出現錯誤 'DataFrame' object has no attribute 'ts'是什麼原因? 謝謝

我要留言

立即登入留言