選擇權獲取tick/kbar歷史資料範例

回覆文章
elsonly
文章: 18
註冊時間: 2021-09-01, 14:02

選擇權獲取tick/kbar歷史資料範例

文章 elsonly »

國內選擇權代號
以TXO17000V1(臺指選擇權10月 17000P)為例
TXO 17000 V 1
選擇權的代號由4個部分組成
1. 第1~3碼:商品代號(TXO)
2. 第4~8碼:履約價(17000)
3. 第9碼:月份(V:10月)
4. 第10碼:年份(1:2021年)

國內選擇權月份代號
Call:
A:01 B:02 C:03 D:04 E:05 F:06 G:07 H:08 I:09 J:10 K:11 L:12
Put:
M:01 N:02 O:03 P:04 Q:05 R:06 S:07 T:08 U:09 V:10 W:11 X:12

Example:
TXO17000V1,V即表示10月的Put
TXO13400C2,C即表示03月的Call

選擇權歷史資料範例 ticks
獲取ticks (2021/08/19~2021/09/15)
TXO 9月份(月份代號I1, U1)
履約價範圍14400~20400

代碼: 選擇全部

import shioaji as sj
import pandas as pd
import time

collector = {}
commodity_code = 'TXO'
year_code = '1'
start_date = pd.to_datetime('2021/08/19')
end_date = pd.to_datetime('2021/09/15')

# get ticks
while start_date <= end_date:
    start_date_str = start_date.strftime('%Y-%m-%d')
    for month_code in ['I', 'U']: # call/put
        for strike_price in range(14400, 20400, 100):
            code = commodity_code + f"{strike_price}{month_code}{year_code}"
            
            contract = sj.contracts.BaseContract(
                security_type=sj.constant.SecurityType.Option,
                exchange=sj.constant.Exchange.TAIFEX,
                code=code
            )
            ticks = api.ticks(
                contract=contract,
                date=start_date_str
            )
            df = pd.DataFrame({**ticks})
            
            if not df.empty:
                if code not in collector:
                    collector[code] = []
                collector[code].append(df)

            print(f"{start_date.date()} | {code} | {strike_price} | {df.shape[0]}")
            time.sleep(0.25)

    start_date += pd.offsets.BDay()


# concat dfs
dfs = {}
for code in collector.keys():
    dfs[code] = pd.concat(collector[code], axis=0).reset_index(drop=True)
    dfs[code].ts = pd.to_datetime(dfs[code].ts)

print(dfs['TXO17000I1'])

選擇權歷史資料範例 kbars
獲取kbars(2021/08/19~2021/09/15)
TXO 9月份(月份代號I1, U1)
履約價範圍14400~20400

代碼: 選擇全部

import shioaji as sj
import pandas as pd
import time

collector = {}
commodity_code = 'TXO'
year_code = '1'
start_date = '2021-08-19'
end_date = '2021-09-15'

for month_code in ['I', 'U']: # call/put
    for strike_price in range(14400, 20400, 100):
        code = commodity_code + f"{strike_price}{month_code}{year_code}"
        
        contract = sj.contracts.BaseContract(
            security_type=sj.constant.SecurityType.Option,
            exchange=sj.constant.Exchange.TAIFEX,
            code=code
        )
        kbars = api.kbars(
            contract=contract,
            start=start_date,
            end=end_date
        )
        df = pd.DataFrame({**kbars})
        
        if not df.empty:
            if code not in collector:
                collector[code] = []
            collector[code].append(df)

        print(f"{start_date} ~ {end_date} | {code} | {strike_price} | {df.shape[0]}")
        time.sleep(0.25)

# concat dfs
dfs = {}
for code in collector.keys():
    dfs[code] = pd.concat(collector[code], axis=0).reset_index(drop=True)
    dfs[code].ts = pd.to_datetime(dfs[code].ts)


print(dfs['TXO17000I1'])

各合約結算價/日可參考期交所-指數選擇權-最後結算價
taipeialpha
文章: 1
註冊時間: 2021-10-08, 13:30

Re: 選擇權獲取tick/kbar歷史資料範例

文章 taipeialpha »

thank you very much !
回覆文章