有了這些功能後,想要知道能不能跑所有的股票,然後做這些事情,無論是行情訂閱,還是歷史資料。因此本篇是進行取行情的部分。
本日程式碼使用:d18_stock_list.ipynb
首先簡單的使用api.Contracts.Stocks
看看結果:
(OES, OTC, TSE)
看起來只有交易所的資料,那就先取得TSE的資料吧!
# 取得股票資料
stock_list = api.Contracts.Stocks["TSE"]
stock_list
結果出現的是:
TSE(TSE031785, TSE033803, TSE031523...(以下略過)
看來很難用這樣的方式。找出股票的詳細資料
既然沒有辦法,那就從資料中找出規則。推測category
為00
為權證,那就把它過濾掉吧!
stocks = [] # record the code
rights = [] # record the code
for data in stock_list:
# print(f"{data.code}-{data.symbol}-{data.name}")
if data.category == "00":
rights.append(data.code)
else:
stocks.append(data.code)
過濾成兩個列表,一個是股票一個是權證。檢查股票是否都是正確的。使用print(len(stocks))
觀看股票的數量,結果發現資料不太穩和,因此檢查裡面的資料,好像有一些為「特」的商品,像是「國泰金乙特」看來這樣也不能單純地使用。
在這邊使用api.Contracts.Stocks["2882B"],結果呈現為:
Stock(exchange=<Exchange.TSE: 'TSE'>, code='2882B', symbol='TSE2882B', name='國泰金乙特', category='17', unit=1000, limit_up=68.4, limit_down=56.0, reference=62.2, update_date='2021/10/01')
接個看看category == "17"
是否能過濾掉飛公司的資料:
spacial_stock = []
for data in stock_list:
if data.category == "17":
print(data)
結果還是不行,仍有不少金融公司股票在裡面:
exchange=<Exchange.TSE: 'TSE'> code='2851' symbol='TSE2851' name='中再保' category='17' unit=1000 limit_up=30.15 limit_down=24.75 reference=27.45 update_date='2021/10/01' margin_trading_balance=63057 day_trade=<DayTrade.Yes: 'Yes'>
exchange=<Exchange.TSE: 'TSE'> code='2897' symbol='TSE2897' name='王道銀行' category='17' unit=1000 limit_up=8.37 limit_down=6.85 reference=7.61 update_date='2021/10/01' day_trade=<DayTrade.Yes: 'Yes'>
看來category
也不能使用
從現有的資料中,找不到可以用簡單的方法找出來股票清單,Shioaji所列出來的都是他們自己編好的股票資料,無法清楚地取得所有清單資訊,或是過濾非一般股票的資訊。看來這個部分是無解。
對於API本來很有期待的,但是使用後,有點綁手綁腳,雖然為Python,說明文件也還算有涵蓋所有功能資料,但是很多細節卻沒有寫出,造成困擾。
用Stocks取得市場內所有商品的資訊,並不妥當,看來還是希望我們取得清楚股票代碼吧!