Scanners,顧名思義就是在盤中或盤後掃描個股使用,例如每日交易量排行。
官方說明文件:https://sinotrade.github.io/tutor/market_data/scanners/
Scanner參數說明
api.scanners(
scanner_type: shioaji.constant.ScannerType, #排行類型
ascending: bool = True, #排序方式,預設排序方式為遞增
date: str = None, #排行資料日期,若未指定日期,則預設為當天
count: shioaji.shioaji.ConstrainedIntValue = 100, #所要抓取的筆數,預設下回傳前100筆個股
timeout: int = 30000, #timeout時間,預設為30000ms
cb: Callable[[List[shioaji.data.ChangePercentRank]], NoneType] = None,
)
在說明文件中,會列出該function可以傳入的參數,若在參數後面有等號「=」,表示此參數有預設值,在call function的時候可以不必傳入參數(選填),若沒有給定該參數的值,則會直接帶入預設值;如果參數後面沒有等號「=」,則表示該參數沒有預設值,在call function的時候一定要給定這個參數值(必填),否則無法執行。
count這個參數,是用來指定所要抓取的個股筆數,預設下是回傳排行前100名的個股資訊,可允許參數值範圍為1~200。
ScannerType是用來指定所要抓取的排行類型,目前提供下列五種:
執行Scanners所回傳的排行資訊,都是shioaji.data.ChangePercentRank物件的List,物件屬性說明如下:
屬性 | 值 | 說明 |
---|---|---|
date | '2021-09-17' | 日期 |
code | '2330' | 股票代碼 |
name | '台積電' | 股票名稱 |
ts | 1631889000000000000 | 時間 |
open | 600.0 | 開盤價 |
high | 610.0 | 最高價 |
low | 599.0 | 最低價 |
close | 600.0 | 收盤價 |
price_range | 11.0 | 價格變動區間(最高價-最低價) |
tick_type | 2 | tick類型 |
change_price | 0.0 | 變動價格 |
change_type | 3 | 變動類型 |
average_price | 601.91 | 均價 |
volume | 57 | 最後一個tick的成交量,若收盤後才抓,則為盤後定價成交量 |
total_volume | 40717 | 總成交量 |
amount | 34200000 | 成交金額 |
total_amount | 24508038290 | 總成交金額 |
yesterday_volume | 22539 | 前一交易日成交量 |
volume_ratio | 1.81 | 成交量比率(今日總成交量/前一交易日成交量) |
buy_price | 600.0 | 委買價 |
buy_volume | 1107 | 委買量 |
sell_price | 601.0 | 委賣價 |
sell_volume | 3 | 委賣量 |
bid_orders | 0 | |
bid_volumes | 0 | |
ask_orders | 0 | |
ask_volumes | 0 |
tick_type說明
Constant | 值 | 說明 |
---|---|---|
TickType.No | 0 | 無法判斷 |
TickType.Buy | 1 | 外盤 |
TickType.Sell | 2 | 內盤 |
change_type說明
Constant | 值 | 說明 |
---|---|---|
ChangeType.LimitUp | 1 | 漲停 |
ChangeType.Up | 2 | 上漲 |
ChangeType.Unchanged | 3 | 平盤 |
ChangeType.Down | 4 | 下跌 |
ChangeType.LimitDown | 5 | 跌停 |
所謂的成交金額,是指 成交數量*成交價格,而AmountRank是以total_amount總成交金額做排行
抓取範例如下:
amount_rank = api.scanners(
scanner_type = sj.constant.ScannerType.AmountRank, #指定所要抓取的排行類型
count = 5, #抓排行前5名
date='2021-09-17' #抓2021/09/17當天的排行
)
VolumeRank是以total_volume總成交量做排行
抓取範例如下:
volume_rank = api.scanners(
scanner_type = sj.constant.ScannerType.VolumeRank,
count = 5,
date='2021-09-17'
)
ChangePriceRank是以change_price漲(跌)金額做排行,排序方式即為上漲金額由高(漲最多)到低(跌最多)
抓取當日上漲金額前五名的個股範例如下:
change_price_rank_up = api.scanners(
scanner_type = sj.constant.ScannerType.ChangePriceRank,
count = 5,
date='2021-09-17'
)
若要抓取當日下跌金額前五名的個股,則在呼叫scanners時,在參數中傳入ascending=False,即可依下跌金額抓取。範例如下:
change_price_rank_up = api.scanners(
scanner_type = sj.constant.ScannerType.ChangePriceRank,
count = 5,
date='2021-09-17',
ascending=False #遞增排序設為False,表示以反向排序方式抓取
)
ChangePercentRank當日漲(跌)幅排行,是以當日上漲(下跌)幅度做排行,而幅度計算方式即為change_price上漲(下跌)金額/reference前一交易收盤價。
抓取當日上漲幅度前五名的個股範例如下:
change_percent_rank_up = api.scanners(
scanner_type = sj.constant.ScannerType.ChangePercentRank,
count = 5,
date='2021-09-17'
)
若要抓取當日下跌幅度前五名的個股,則在呼叫scanners時,在參數中傳入ascending=False,即可依下跌幅度抓取。範例如下:
change_percent_rank_up = api.scanners(
scanner_type = sj.constant.ScannerType.ChangePercentRank,
count = 5,
date='2021-09-17'
ascending=False #遞增排序設為False
)
DayRangeRank是以price_range價格變動區間做排行
抓取範例如下:
day_range_rank = api.scanners(
scanner_type = sj.constant.ScannerType.DayRangeRank,
count = 5,
date='2021-09-17'
)
透過前面的範例,我們可以依自己的需求抓取每日排行的個股相關資料。所抓到的個股資料也可以透過Pandas將資料匯出成csv檔,完整範例如下:
from dotenv import load_dotenv
import os
import shioaji as sj
import pandas as pd
load_dotenv('D:\\python\\shioaji\\.env')
api = sj.Shioaji()
api.login(
person_id=os.getenv('YOUR_PERSON_ID'),
passwd=os.getenv('YOUR_PASSWORD')
)
# 取得當日價格變動範圍排行前五名個股資料
day_range_rank = api.scanners(
scanner_type = sj.constant.ScannerType.DayRangeRank,
count = 5,
date='2021-09-17'
)
day_range_rank_df = pd.DataFrame(day_range_rank) #將day_range_rank資料轉換為DataFrame
day_range_rank_df.ts = pd.to_datetime(day_range_rank_df.ts)
# 透過to_csv將DataFrame匯出為csv檔
day_range_rank_df.to_csv('day_range_rank.csv', index=False, encoding="utf_8_sig")
在這裡說明一下,to_csv的第一個參數是指定要匯出csv檔案的路徑及檔名,在上面這個範例中,只有傳入檔名而沒有路徑,Pandas就會在該python程式檔案的同一個資料夾底下建立csv檔並將資料匯出。而index=False,指的是在匯出檔案時,不產生index這個欄位,若要保留這個欄位資料,可以不傳入這個參數。
最後,Pandas在匯出csv時,預設的編碼字元是Unicode(UTF-8),若使用Excel未指定字元直接開啟的話,會因為Excel無法辨識到正確的編碼字元而產生亂碼或資料錯誤的情形。
若要讓Excel可以直接開啟csv檔,可在參數中加入「encoding="utf_8_sig"」,將檔案的編碼字元設定為Unicode(UTF-8含BOM),這樣Excel即可辨識到正確的編碼字元。