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即可辨识到正确的编码字元。
人是视觉动物 当网页架构用得差不多了,想自己安排布局,会开始想办法把网页变得更漂亮。 Google...
今天就来做些 GUI 吧! 用 HTML + CSS 先把结构弄出来 app.html <ht...
今天要来测试并比较我们实作出的 Learned Index 与单一 Model(SLR、NN) 的分...
function eatBreakfast () { console.log('吃早餐'); } f...
这次我们来看到C#乱数的实务应用拉~ Random.Next()~ 它又分为三种方向~ 分别是 Ne...