量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。
上一篇串接了國外券商的Python API,不過其實台灣的券商也有提供股票下單API喔,包含:群益證券、永豐金證券、統一證券...等等,都有提供API下單的服務,其中有提供Python介面的券商有群益證券及永豐金證券,因為筆者本身是用永豐金的帳戶,下面會使用永豐金證券的API作為範例,當然大家也可以多方嘗試各家券商的API喔。
Shioaji是永豐金證券提供的API介面,提供報價、下單功能,官方的Document還算蠻詳細的,接下來就會照著這個Document來用用看它的功能。
就跟一般python套件一樣,一行就安裝了。
pip install shioaji
要使用券商的API的話,需要有:
# 載入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",
)
不管是要取得報價或是下單,要告訴電腦說你想看什麼商品,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資料呢,就是每筆成交的資料,所以它的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資料很多,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整理成資料表格之後,就變得比較容易讀了。
之前有寫過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玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。
想請問怎麼透過永豐金api取得大盤加權指數
您好,contract的部份使用下列寫法即可:api.Contracts.Indexs.TSE.TSE001
你想想知道各股可以迴圈抓股價下來嗎?我有參考https://ithelp.ithome.com.tw/articles/10279671
但不曉得為什麼只會存入一檔且每次都會不一樣
您好,請問轉換成Dataframe時會出現錯誤 'DataFrame' object has no attribute 'ts'是什麼原因? 謝謝