Day 05 - Scanners

本篇重点

  • 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即可辨识到正确的编码字元。


<<:  DAY8-PHP和MYSQL(二)

>>:  [Day05] 团队无杂事,只有混乱的讯息流

Day.4 「CSS 基础中的基础!」 —— CSS 盒模型 box-model & 距离单位

人是视觉动物 当网页架构用得差不多了,想自己安排布局,会开始想办法把网页变得更漂亮。 Google...

#27 做点 GUI 吧!

今天就来做些 GUI 吧! 用 HTML + CSS 先把结构弄出来 app.html <ht...

Day 29 - Learned Index测试&比较

今天要来测试并比较我们实作出的 Learned Index 与单一 Model(SLR、NN) 的分...

Javascript 执行环境、作用域 - 执行绪与同步、非同步

function eatBreakfast () { console.log('吃早餐'); } f...

【C#】Number Random

这次我们来看到C#乱数的实务应用拉~ Random.Next()~ 它又分为三种方向~ 分别是 Ne...