Day 07 - Ticks

本篇重点

  • Ticks 介绍及属性说明
  • 使用 Pandas 将 Ticks 资料转换为 DataFrame

Ticks 介绍及属性说明

官方说明文件:https://sinotrade.github.io/tutor/market_data/historical/#ticks-data
所谓的tick,就是看盘软件中的成交明细资料,而证交所也从2020年3月23日实施逐笔交易,不再是以前盘中每五秒才撮合一次。
Imgur
也因为成交明细的资料会较多,所以Tick资料一次只能抓一个交易日的资料。
api.ticks参数说明

api.ticks(
        contract: BaseContract, #传入所要抓取ticks资料的Contract
        date: str = dt.date.today().strftime("%Y-%m-%d"), #交易日期,预设为程序执行当下的日期
        query_type: TicksQueryType = TicksQueryType.AllDay, #预设为抓当天一整天的资料
        time_start: typing.Union[str, dt.time] = None, #资料开始时间,预设为None,即不指定开始时间
        time_end: typing.Union[str, dt.time] = None, #资料结束时间,预设为None,即不指定结束时间
        last_cnt: int = 0, #仅回传最後X笔资料,预设为0,即回传所有的资料
        timeout: int = 30000, #timeout时间,预设为30000ms
        cb: typing.Callable[[Ticks], None] = None
    )

使用范例如下:

# TicksQueryType.AllDay 抓交易日期全天tick资料
ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"], #指定要抓ticks资料的Contract
    date="2021-09-17", #交易日期
)

若只要抓取交易日期中,特定时间区间的资料,可以在参数中指定开始时间及结束时间,范例如下:

# TicksQueryType.RangeTime 抓交易日期,特定时段tick资料
ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"], #指定要抓ticks资料的Contract
    date="2021-09-17", #交易日期
    query_type=sj.constant.TicksQueryType.RangeTime, #指定QueryType为RangeTime
    time_start="09:10:00", #开始时间
    time_end="09:20:00" #结束时间
)

若只要抓取最後5笔tick资料,范例如下:

# TicksQueryType.LastCount 抓交易日期最後X笔tick资料
last_5_ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"], #指定要抓ticks资料的Contract
    date="2021-09-17", #交易日期
    query_type=sj.constant.TicksQueryType.LastCount, #指定QueryType为LastCount
    last_cnt=5 #指定要抓最後5笔tick资料
)

TicksQueryType,只有AllDay、RangeTime及LastCount这三种,使用方式就如同上面的这三个范例,但请注意这三种方式无法混用,因为api.ticks主要是依照query_type这个参数,去决定要抓哪些资料。
例如:

ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"], #指定要抓ticks资料的Contract
    date="2021-09-17", #交易日期
    query_type=sj.constant.TicksQueryType.RangeTime, #指定QueryType为RangeTime
    time_start="09:10:00", #开始时间
    time_end="09:20:00", #结束时间
    last_cnt=5 #指定要抓最後5笔tick资料,但指定TicksQueryType.RangeTime会忽略此参数
)

因为在query_type这个参数,已经指定QueryType为RangeTime,虽然有指定last_cnt=5,但回传的资料其实跟第二个范例TicksQueryType.RangeTime一样。

所回传的资料为shioaji.data.Ticks物件,属性说明如下:

属性 说明
ts [1631889000000000000] 时间戳
close [600.0] 收盘价,即成交价格
volume [57] 成交量
bid_price [600.0] 委买价(买进)
bid_volume [1107] 委买量
ask_price [601.0] 委卖价(卖出)
ask_volume [3] 委卖量

跟之前抓到的资料不同的地方在於,所回传的资料是一个shioaji.data.Ticks物件而非List,也就是把所有的tick资料存在一个物件中,而物件中的属性内容为List,用来放每一个tick的资料。
若你用上面的范例并执行print(last_5_ticks),会看到以下的资料内容。

Ticks(
ts=[1631885096148332000, 1631885098755243000, 1631885098967648000, 1631885400000000000, 1631889000000000000],
close=[609.0, 609.0, 608.0, 600.0, 600.0],
volume=[1, 1, 1, 22082, 57],
bid_price=[608.0, 608.0, 608.0, 600.0, 600.0],
bid_volume=[298, 298, 297, 1107, 1107],
ask_price=[609.0, 609.0, 609.0, 601.0, 601.0],
ask_volume=[164, 164, 162, 3, 3])

使用 Pandas 将 Ticks 资料转换为 DataFrame

使用api.ticks取得资料,若未经过处理,在阅读上较为困难,此时可以先把tick资料转换为DataFram。但因为资料内容格式与之前的格式不同,所以在转换前要先将物件内容先转换为Dict
程序范例如下:

df = pd.DataFrame({**last_5_ticks}) #先将Ticks物件转换为Dict,再传入DataFrame做转换
df.ts = pd.to_datetime(df.ts) #将原本的ts栏位中的资料,转换为DateTime格式并回存
print(df) #将DataFrame的资料输出至console中

在执行print(df)後,原本的资料内容,已变成下列比较方便阅读的格式

   close  bid_price  ask_volume  ask_price                         ts  bid_volume  volume
0  609.0      608.0         164      609.0 2021-09-17 13:24:56.148332         298       1
1  609.0      608.0         164      609.0 2021-09-17 13:24:58.755243         298       1
2  608.0      608.0         162      609.0 2021-09-17 13:24:58.967648         297       1
3  600.0      600.0           3      601.0 2021-09-17 13:30:00.000000        1107   22082
4  600.0      600.0           3      601.0 2021-09-17 14:30:00.000000        1107      57

<<:  [Angular] Day22. Common Routing Tasks(二)

>>:  Day 7:设定你的 Hexo 布景主题:Next(下)

DAY16: 实作浏览器采取想访问的HTML

今天会结合上一篇的DAY15:HTTP GET请求的观念,并且加入一些不一样的东西,除了Nodejs...

[番外] 来个 Weather App (序)

前言 遥想(?) N 年前看着官方文件认识 Angular 时,充满回忆的 Heros 范例!  认...

【day26】Span翻转TextView

好的,连假最後一天,我们来个小篇章,就是Span啦,Span可以做到的事情有很多,如 *更改特定位...

台南的空气是甜的吧

本篇来分享笔者打比赛的经验! 第一次打比赛 我参加的第一个资讯竞赛是由成大协办的 ITSA Geek...

关於 position 属性

position 属性可以设定元素在网页中的位置,属性值有以下: static ( 预设值 ) re...