之前我們學會了如何用talib計算一分K技術指標,也學會了如何用line發送通知。因為shioaji目前提供的分K是一分K,如果要計算五分K的技術指標、30分K的技術指標或是其它頻率K棒的技術指標,該怎麼辦呢? 以下介紹如何將一分K轉換為其它週期的K棒。
首先,利用api.kbars取得一分K
kbars = api.kbars(api.Contracts.Stocks['2330'], start='2021-10-04', end='2021-10-06')
df = pd.DataFrame({**kbars})
df.ts = pd.to_datetime(df.ts)
df.set_index('ts',inplace=True) ##將時間設為index
df
ts | Volume | Low | High | Close | Amount | Open |
---|---|---|---|---|---|---|
2021-10-04 09:01:00 | 2094 | 573 | 575 | 575 | 1.20199e+09 | 574 |
2021-10-04 09:02:00 | 155 | 574 | 575 | 574 | 8.9051e+07 | 574 |
2021-10-04 09:03:00 | 91 | 574 | 575 | 575 | 5.2296e+07 | 575 |
2021-10-04 09:04:00 | 157 | 574 | 575 | 575 | 9.0233e+07 | 574 |
2021-10-04 09:05:00 | 141 | 574 | 575 | 575 | 8.1055e+07 | 575 |
接下來要寫一個函數,將一分K丟進去後,希望它能回傳特定頻率的分K出來,因此引數會是一分K的dataframe與預期它回傳的K棒週期,函數的程式碼如下,
from datetime import timedelta
def kbars_set_interval(kbars_df,interval='5Min'):
return_df=pd.DataFrame()
kbars_df.index = kbars_df.index + timedelta(minutes = -1) #api的一分K是從9:01開始,調成9:00開盤
if interval=='1Min': #如果輸入的引數是'1Min'則直接回傳
return kbars_df
else:
return_df['Open'] = kbars_df['Open'].resample(interval).first()
return_df['High'] = kbars_df['High'].resample(interval).max()
return_df['Low'] = kbars_df['Low'].resample(interval).min()
return_df['Close'] = kbars_df['Close'].resample(interval).last()
return_df.dropna(inplace=True)
return return_df
其中resample()依照輸入的週期對一分K的dataframe重新取樣,再利用first(),max(),min(),last()取得開、高、低、收。定義完函數後,將一分K的資料丟進kbars_set_interval(),且interval設定為’5Min’,即可將一分K轉為五分K,如以下結果
kbars_set_interval(df,'5Min').head()
ts | Open | High | Low | Close |
---|---|---|---|---|
2021-10-04 09:00:00 | 574 | 575 | 573 | 575 |
2021-10-04 09:05:00 | 575 | 575 | 572 | 572 |
2021-10-04 09:10:00 | 572 | 574 | 572 | 574 |
2021-10-04 09:15:00 | 573 | 574 | 573 | 573 |
2021-10-04 09:20:00 | 574 | 574 | 572 | 573 |
不僅可以轉換為5分K,轉為30分K與日K也都沒問題喔!
轉換為30分K
kbars_set_interval(df,'30Min').head()
ts | Open | High | Low | Close |
---|---|---|---|---|
2021-10-04 08:30:00 | 574 | 575 | 573 | 575 |
2021-10-04 09:00:00 | 574 | 575 | 572 | 572 |
2021-10-04 09:30:00 | 573 | 573 | 569 | 571 |
2021-10-04 10:00:00 | 570 | 573 | 570 | 572 |
2021-10-04 10:30:00 | 573 | 573 | 570 | 570 |
轉換為日K
kbars_set_interval(df,'D').head()
ts | Open | High | Low | Close |
---|---|---|---|---|
2021-10-04 00:00:00 | 574 | 575 | 569 | 572 |
2021-10-05 00:00:00 | 562 | 572 | 560 | 572 |
2021-10-06 00:00:00 | 573 | 574 | 565 | 571 |
得到特定週期的分K後,再搭配如何用shioaji搭配Ta-Lib計算技術指標: 應用篇 即可計算不同週期的技術指標了。