iT邦幫忙

2021 iThome 鐵人賽

DAY 5
1

本篇重點

  • Scanners介紹
  • 當日成交金額排行
  • 當日成交量排行
  • 當日漲(跌)金額排行
  • 最高/最低價差排行
  • 當日漲(跌)幅排行
  • 透過Pandas將資料匯出成csv檔

Scanners

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是用來指定所要抓取的排行類型,目前提供下列五種:

  • AmountRank
  • ChangePriceRank
  • VolumeRank
  • ChangePercentRank
  • DayRangeRank

執行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 當日成交金額排行

所謂的成交金額,是指 成交數量*成交價格,而AmountRank是以total_amount總成交金額做排行
抓取範例如下:

amount_rank = api.scanners(
            scanner_type = sj.constant.ScannerType.AmountRank, #指定所要抓取的排行類型
            count = 5, #抓排行前5名
            date='2021-09-17' #抓2021/09/17當天的排行
          )

VolumeRank 當日成交量排行

VolumeRank是以total_volume總成交量做排行
抓取範例如下:

volume_rank = api.scanners(
            scanner_type = sj.constant.ScannerType.VolumeRank,
            count = 5,
            date='2021-09-17'
          )

ChangePriceRank 當日漲(跌)金額排行

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 當日漲(跌)幅排行

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 最高/最低價差排行

DayRangeRank是以price_range價格變動區間做排行
抓取範例如下:

day_range_rank = api.scanners(
            scanner_type = sj.constant.ScannerType.DayRangeRank,
            count = 5,
            date='2021-09-17'
          )

透過Pandas將資料匯出成csv檔

透過前面的範例,我們可以依自己的需求抓取每日排行的個股相關資料。所抓到的個股資料也可以透過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即可辨識到正確的編碼字元。


上一篇
Day 04 - Credit Enquires 與 Short Stock Source
下一篇
Day 06 - Snapshots
系列文
深入解析 Shioaji API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言