跳转至

歷史行情

歷史資料提供查詢逐筆成交(Ticks)與分 K 線(Kbars)。

注意

歷史資料查詢會佔用流量,請參考使用限制了解每日流量上限。

Ticks

取得方式可以以一整天、某時間區段或是某天的最後幾筆。預設為商品最近交易日的 Ticks

Ticks

api.ticks?

Signature:
    api.ticks(
        contract: shioaji.contracts.BaseContract,
        date: str = '2026-05-18',
        query_type: shioaji.constant.TicksQueryType = <TicksQueryType.AllDay: 'AllDay'>,
        time_start: Union[str, datetime.time] = None,
        time_end: Union[str, datetime.time] = None,
        last_cnt: int = 0,
        timeout: int = 5000,
        cb: Callable[[shioaji.data.Ticks], NoneType] = None,
    ) -> shioaji.data.Ticks
Docstring:
    get contract tick volume

Parameters

contract:    商品檔(由 api.Contracts.* 取得)
date:        交易日(YYYY-MM-DD)
query_type:  查詢類型 {'AllDay', 'RangeTime', 'LastCount'}
time_start:  選填,起始時間,query_type='RangeTime' 時使用
time_end:    選填,結束時間,query_type='RangeTime' 時使用
last_cnt:    選填,取末 N 筆,query_type='LastCount' 時使用
timeout:     逾時毫秒
cb:          選填,callback 函式,timeout=0 時使用

Ticks

$ shioaji data ticks --help

Get tick data for a contract

Usage: shioaji data ticks [OPTIONS] --code <CODE>

Options:
      --code <CODE>                    Security code (e.g. 2330, TXFR1)
      --date <DATE>                    Trading date (YYYY-MM-DD, default: today) [default: 2026-05-18]
      --last <LAST>                    Number of last ticks to return (default: 10) [default: 10]
      --all                            Fetch all ticks for the day (overrides --last)
      --security-type <SECURITY_TYPE>  Security type: STK, FUT, OPT, IND [default: STK]
      --exchange <EXCHANGE>            Exchange: TSE, OTC, TAIFEX [default: TSE]

Parameters

--code:          商品代碼(例如 2330、TXFR1)
--date:          交易日(YYYY-MM-DD)
--last:          選填,取末 N 筆
--all:           選填,取整日所有 ticks(覆蓋 --last)
--security-type: 商品類型 {'STK', 'FUT', 'OPT', 'IND'}
--exchange:      交易所 {'TSE', 'OTC', 'TAIFEX'}

Ticks

POST /api/v1/data/ticks
Content-Type: application/json

{
  "contract":   { "security_type": <SecurityType>, "exchange": <Exchange>, "code": <string> },
  "date":       <string>,
  "query_type": <TicksQueryType>,
  "time_start": <string?>,
  "time_end":   <string?>,
  "last_cnt":   <int>
}

Parameters

contract.security_type: 商品類型 {'STK', 'FUT', 'OPT', 'IND'}
contract.exchange:      交易所 {'TSE', 'OTC', 'TAIFEX'}
contract.code:          商品代碼(例如 2330、TXFR1)
date:                   交易日(YYYY-MM-DD)
query_type:             查詢類型 {'AllDay', 'RangeTime', 'LastCount'}
time_start:             選填,起始時間,query_type='RangeTime' 時使用
time_end:               選填,結束時間,query_type='RangeTime' 時使用
last_cnt:               選填,取末 N 筆,query_type='LastCount' 時使用

屬性

Ticks

ts / datetime:     時間Python  Unix 時間戳其他語言為 ISO 字串
close (float):     成交價
volume (int):      成交量
bid_price (float): 委買價
bid_volume (int):  委買量
ask_price (float): 委賣價
ask_volume (int):  委賣量
tick_type (int):   內外盤別{1: 外盤, 2: 內盤, 0: 無法判定}

範例

取得特定日期 Ticks

In

ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"],
    date="2026-05-18"
)
ticks

Out

Ticks[7171](
    ts=[1779094808306075000, 1779094808342157000, 1779094808368510000, ...],
    close=[2225, 2225, 2225, ...],
    volume=[2166, 47, 50, ...],
    bid_price=[2220, 2220, 2220, ...],
    bid_volume=[692, 693, 696, ...],
    ask_price=[2225, 2225, 2230, ...],
    ask_volume=[97, 50, 104, ...],
    tick_type=[2, 1, 1, ...]
)

轉成 DataFrame(以 polars 示範)

In

import polars as pl
df = pl.DataFrame(ticks.dict()).with_columns(
    pl.col("ts").cast(pl.Datetime("ns"))
)
df.head()

Out

ts close volume bid_price bid_volume ask_price ask_volume tick_type
2026-05-18 09:00:08.306075 2225.0 2166 2220.0 692 2225.0 97 2
2026-05-18 09:00:08.342157 2225.0 47 2220.0 693 2225.0 50 1
2026-05-18 09:00:08.368510 2225.0 50 2220.0 696 2230.0 104 1
... ... ... ... ... ... ... ...

取得特定時間區段 Ticks

In

ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"],
    date="2026-05-18",
    query_type=sj.constant.TicksQueryType.RangeTime,
    time_start="09:00:00",
    time_end="09:20:01"
)
ticks

Out

Ticks[1151](
    ts=[1779094808306075000, 1779094808342157000, 1779094808368510000, ...],
    close=[2225, 2225, 2225, ...],
    volume=[2166, 47, 50, ...],
    bid_price=[2220, 2220, 2220, ...],
    bid_volume=[692, 693, 696, ...],
    ask_price=[2225, 2225, 2230, ...],
    ask_volume=[97, 50, 104, ...],
    tick_type=[2, 1, 1, ...]
)

取得最後數筆 Ticks

In

ticks = api.ticks(
    contract=api.Contracts.Stocks["2330"],
    date="2026-05-18",
    query_type=sj.constant.TicksQueryType.LastCount,
    last_cnt=4,
)
ticks

Out

Ticks[4](
    ts=[1779110696011886000, 1779110697008306000, 1779111000000000000, 1779114600000000000],
    close=[2245.0, 2240.0, 2240.0, 2240.0],
    volume=[2, 6, 4606, 75],
    bid_price=[2240.0, 2240.0, 2240.0, 2240.0],
    bid_volume=[454, 447, 524, 524],
    ask_price=[2250.0, 2250.0, 2245.0, 2245.0],
    ask_volume=[179, 41, 103, 103],
    tick_type=[2, 2, 2, 2]
)

取得特定日期 Ticks

In

shioaji data ticks --code 2330 --date 2026-05-18 --all

Out

[7171]{datetime,close,volume,bid_price,bid_volume,ask_price,ask_volume,tick_type}:
  2026-05-18T09:00:08.306075,2225,2166,2220,692,2225,97,2
  2026-05-18T09:00:08.342157,2225,47,2220,693,2225,50,1
  2026-05-18T09:00:08.368510,2225,50,2220,696,2230,104,1
  ...

取得最後數筆 Ticks

In

shioaji data ticks --code 2330 --date 2026-05-18 --last 4

Out

[4]{datetime,close,volume,bid_price,bid_volume,ask_price,ask_volume,tick_type}:
  2026-05-18T13:24:56.011886,2245,2,2240,454,2250,179,2
  2026-05-18T13:24:57.008306,2240,6,2240,447,2250,41,2
  2026-05-18T13:30:00,2240,4606,2240,524,2245,103,2
  2026-05-18T14:30:00,2240,75,2240,524,2245,103,2

取得特定日期 Ticks

In

curl -X POST http://localhost:8080/api/v1/data/ticks \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": { "security_type": "STK", "exchange": "TSE", "code": "2330" },
    "date": "2026-05-18",
    "query_type": "AllDay"
  }'

Out

{"datetime":["2026-05-18T09:00:08.306075","2026-05-18T09:00:08.342157","2026-05-18T09:00:08.368510",...],"close":[2225.0,2225.0,2225.0,...],"volume":[2166,47,50,...],"bid_price":[2220.0,2220.0,2220.0,...],"bid_volume":[692,693,696,...],"ask_price":[2225.0,2225.0,2230.0,...],"ask_volume":[97,50,104,...],"tick_type":[2,1,1,...]}

取得特定時間區段 Ticks

In

curl -X POST http://localhost:8080/api/v1/data/ticks \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": { "security_type": "STK", "exchange": "TSE", "code": "2330" },
    "date": "2026-05-18",
    "query_type": "RangeTime",
    "time_start": "09:00:00",
    "time_end": "09:20:01"
  }'

Out

{"datetime":["2026-05-18T09:00:08.306075","2026-05-18T09:00:08.342157","2026-05-18T09:00:08.368510",...],"close":[2225.0,2225.0,2225.0,...],"volume":[2166,47,50,...],"bid_price":[2220.0,2220.0,2220.0,...],"bid_volume":[692,693,696,...],"ask_price":[2225.0,2225.0,2230.0,...],"ask_volume":[97,50,104,...],"tick_type":[2,1,1,...]}

取得最後數筆 Ticks

In

curl -X POST http://localhost:8080/api/v1/data/ticks \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": { "security_type": "STK", "exchange": "TSE", "code": "2330" },
    "date": "2026-05-18",
    "query_type": "LastCount",
    "last_cnt": 4
  }'

Out

{"datetime":["2026-05-18T13:24:56.011886","2026-05-18T13:24:57.008306","2026-05-18T13:30:00","2026-05-18T14:30:00"],"close":[2245.0,2240.0,2240.0,2240.0],"volume":[2,6,4606,75],"bid_price":[2240.0,2240.0,2240.0,2240.0],"bid_volume":[454,447,524,524],"ask_price":[2250.0,2250.0,2245.0,2245.0],"ask_volume":[179,41,103,103],"tick_type":[2,2,2,2]}

Kbars

取得 Kbars 可以指定起訖日期區間,預設為商品最近交易日的 Kbars

Kbars

api.kbars?

Signature:
    api.kbars(
        contract: shioaji.contracts.BaseContract,
        start: str = '2026-05-17',
        end: str = '2026-05-18',
        timeout: int = 5000,
        cb: Callable[[shioaji.data.Kbars], NoneType] = None,
    ) -> shioaji.data.Kbars
Docstring:
    get Kbar

Parameters

contract: 商品檔(由 api.Contracts.* 取得)
start:    起始日期(YYYY-MM-DD),預設為昨天
end:      結束日期(YYYY-MM-DD),預設為今天
timeout:  逾時毫秒
cb:       選填,callback 函式,timeout=0 時使用

Kbars

$ shioaji data kbars --help

Get K-bar (OHLCV) data for a contract

Usage: shioaji data kbars [OPTIONS] --code <CODE>

Options:
      --code <CODE>                    Security code (e.g. 2330, TXFR1)
      --start <START>                  Start date (YYYY-MM-DD, default: today) [default: 2026-05-18]
      --end <END>                      End date (YYYY-MM-DD, default: today) [default: 2026-05-18]
      --security-type <SECURITY_TYPE>  Security type: STK, FUT, OPT, IND [default: STK]
      --exchange <EXCHANGE>            Exchange: TSE, OTC, TAIFEX [default: TSE]

Parameters

--code:          商品代碼(例如 2330、TXFR1)
--start:         起始日期(YYYY-MM-DD)
--end:           結束日期(YYYY-MM-DD)
--security-type: 商品類型 {'STK', 'FUT', 'OPT', 'IND'}
--exchange:      交易所 {'TSE', 'OTC', 'TAIFEX'}

Kbars

POST /api/v1/data/kbars
Content-Type: application/json

{
  "contract": { "security_type": <SecurityType>, "exchange": <Exchange>, "code": <string> },
  "start":    <string>,
  "end":      <string>
}

Parameters

contract.security_type: 商品類型 {'STK', 'FUT', 'OPT', 'IND'}
contract.exchange:      交易所 {'TSE', 'OTC', 'TAIFEX'}
contract.code:          商品代碼(例如 2330、TXFR1)
start:                  起始日期(YYYY-MM-DD)
end:                    結束日期(YYYY-MM-DD)

屬性

Kbars

ts / datetime:  時間Python  Unix 時間戳其他語言為 ISO 字串
Open (float):   開盤價
High (float):   最高價
Low (float):    最低價
Close (float):  收盤價
Volume (int):   成交量
Amount (float): 成交額

範例

In

kbars = api.kbars(
    contract=api.Contracts.Stocks["2330"],
    start="2026-05-17",
    end="2026-05-18"
)
kbars

Out

KBars[270](
    ts=[1779094860000000000, 1779094920000000000, 1779094980000000000, ...],
    Open=[2225, 2235, 2225, ...],
    High=[2235, 2235, 2230, ...],
    Low=[2225, 2225, 2220, ...],
    Close=[2230, 2230, 2225, ...],
    Volume=[2565, 377, 296, ...],
    Amount=[5708965000, 840260000, 659090000, ...]
)

轉成 DataFrame(以 polars 示範)

In

import polars as pl
df = pl.DataFrame(kbars.dict()).with_columns(
    pl.col("ts").cast(pl.Datetime("ns"))
)
df.head()

Out

ts Open High Low Close Volume Amount
2026-05-18 09:01:00 2225.0 2235.0 2225.0 2230.0 2565 5.7090e9
2026-05-18 09:02:00 2235.0 2235.0 2225.0 2230.0 377 8.4026e8
2026-05-18 09:03:00 2225.0 2230.0 2220.0 2225.0 296 6.5909e8
... ... ... ... ... ... ...

In

shioaji data kbars --code 2330 --start 2026-05-17 --end 2026-05-18

Out

[270]{datetime,Open,High,Low,Close,Volume,Amount}:
  2026-05-18T09:01:00,2225,2235,2225,2230,2565,5708965000
  2026-05-18T09:02:00,2235,2235,2225,2230,377,840260000
  2026-05-18T09:03:00,2225,2230,2220,2225,296,659090000
  ...

In

curl -X POST http://localhost:8080/api/v1/data/kbars \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": { "security_type": "STK", "exchange": "TSE", "code": "2330" },
    "start": "2026-05-17",
    "end": "2026-05-18"
  }'

Out

{"datetime":["2026-05-18T09:01:00","2026-05-18T09:02:00","2026-05-18T09:03:00",...],"Open":[2225.0,2235.0,2225.0,...],"High":[2235.0,2235.0,2230.0,...],"Low":[2225.0,2225.0,2220.0,...],"Close":[2230.0,2230.0,2225.0,...],"Volume":[2565,377,296,...],"Amount":[5708965000.0,840260000.0,659090000.0,...]}

資料歷史期間

Historical Periods

Start Date End Date
Index 2020-03-02 Today
Stock 2020-03-02 Today
Futures 2020-03-22 Today

連續期貨合約

期貨合約一旦到期,合約即不再有效,亦即他將不會出現在您的api.Contracts裡。為了取得到期的期貨合約歷史資料,我們提供連續期貨合約。R1, R2是近月及次月的連續期貨合約,他們會自動在結算日更換新的合約(即 target_code 會變)。您可以使用R1, R2合約來取得長期的歷史資料,例如api.Contracts.Futures.TXF.TXFR1。以下顯示如何使用R1, R2合約取得到期期貨的歷史TicksKbars

注意

code 必須出現在 api.Contracts 裡才能放入 api.ticks / api.kbars 查詢。例如 TXFE6 是 2026 年 5 月的合約,到了 2026 年 6 月就不再出現在 api.Contracts,此時就無法用 TXFE6 查詢。

Ticks

In

ticks = api.ticks(
    contract=api.Contracts.Futures.TXF.TXFR1,
    date="2026-05-18",
    query_type=sj.constant.TicksQueryType.LastCount,
    last_cnt=4,
)
ticks

Out

Ticks[4](
    ts=[1779111899290000000, 1779111899345000000, 1779111899345000000, 1779111899967000000],
    close=[40803.0, 40799.0, 40798.0, 40807.0],
    volume=[1, 2, 7, 1],
    bid_price=[40803.0, 40799.0, 40799.0, 40800.0],
    bid_volume=[2, 2, 2, 1],
    ask_price=[40808.0, 40807.0, 40807.0, 40807.0],
    ask_volume=[1, 1, 1, 1],
    tick_type=[2, 2, 2, 1]
)

Kbars

In

kbars = api.kbars(
    contract=api.Contracts.Futures.TXF.TXFR1,
    start="2026-05-17",
    end="2026-05-18"
)
kbars

Out

KBars[438](
    ts=[1779093960000000000, 1779094020000000000, 1779094080000000000, ...],
    Open=[40200, 40308, 40276, ...],
    High=[40369, 40342, 40316, ...],
    Low=[40169, 40262, 40251, ...],
    Close=[40310, 40276, 40316, ...],
    Volume=[2051, 704, 443, ...],
    Amount=[82536213, 28372910, 17845729, ...]
)

Ticks

In

shioaji data ticks --code TXFR1 --date 2026-05-18 --security-type FUT --exchange TAIFEX --last 4

Out

[4]{datetime,close,volume,bid_price,bid_volume,ask_price,ask_volume,tick_type}:
  2026-05-18T13:44:59.290000,40803,1,40803,2,40808,1,2
  2026-05-18T13:44:59.345000,40799,2,40799,2,40807,1,2
  2026-05-18T13:44:59.345000,40798,7,40799,2,40807,1,2
  2026-05-18T13:44:59.967000,40807,1,40800,1,40807,1,1

Kbars

In

shioaji data kbars --code TXFR1 --start 2026-05-17 --end 2026-05-18 --security-type FUT --exchange TAIFEX

Out

[438]{datetime,Open,High,Low,Close,Volume,Amount}:
  2026-05-18T08:46:00,40200,40369,40169,40310,2051,82536213
  2026-05-18T08:47:00,40308,40342,40262,40276,704,28372910
  2026-05-18T08:48:00,40276,40316,40251,40316,443,17845729
  ...

Ticks

In

curl -X POST http://localhost:8080/api/v1/data/ticks \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": {"security_type": "FUT", "exchange": "TAIFEX", "code": "TXFR1"},
    "date": "2026-05-18",
    "query_type": "LastCount",
    "last_cnt": 4
  }'

Out

{"datetime":["2026-05-18T13:44:59.290000","2026-05-18T13:44:59.345000","2026-05-18T13:44:59.345000","2026-05-18T13:44:59.967000"],"close":[40803.0,40799.0,40798.0,40807.0],"volume":[1,2,7,1],"bid_price":[40803.0,40799.0,40799.0,40800.0],"bid_volume":[2,2,2,1],"ask_price":[40808.0,40807.0,40807.0,40807.0],"ask_volume":[1,1,1,1],"tick_type":[2,2,2,1]}

Kbars

In

curl -X POST http://localhost:8080/api/v1/data/kbars \
  -H 'Content-Type: application/json' \
  -d '{
    "contract": {"security_type": "FUT", "exchange": "TAIFEX", "code": "TXFR1"},
    "start": "2026-05-17",
    "end": "2026-05-18"
  }'

Out

{"datetime":["2026-05-18T08:46:00","2026-05-18T08:47:00","2026-05-18T08:48:00",...],"Open":[40200.0,40308.0,40276.0,...],"High":[40369.0,40342.0,40316.0,...],"Low":[40169.0,40262.0,40251.0,...],"Close":[40310.0,40276.0,40316.0,...],"Volume":[2051,704,443,...],"Amount":[82536213.0,28372910.0,17845729.0,...]}