iT邦幫忙

2021 iThome 鐵人賽

DAY 2
9
永豐金融APIs

從零開始使用python打造簡易投資工具系列 第 2

[Day2] 抓取每日收盤價

本日目標為抓取0050的收盤價,以下分為抓取1分K資料的部分和轉換成每日收盤價的部分

抓取每日收盤價

抓到的每日收盤價之後拿來做一些指標以及做回測,使用方法參考以下兩個永豐金的shioaji官方連結
https://sinotrade.github.io/tutor/login/
https://sinotrade.github.io/tutor/market_data/historical/

這邊是匯入程式庫
from shioaji.data import Kbars
import pandas as pd
import shioaji

這邊是登入的部分,以下是用測試帳號,如果是永豐金證券的客戶要用正式帳號登入就把simulation改False,ID改身分證字號,密碼用永豐金證券的密碼
api = shioaji.Shioaji(simulation=True)
person_id='PAPIUSER01'
passwd='2222'
api.login(
    person_id=person_id,
    passwd=passwd,
    contracts_cb=lambda security_type: print(f"{repr(security_type)} fetch done.")
)
這邊可以抓取K棒,以0050當作範例,資料輸出到df,他最後面可以輸入k棒的起始和結束日期
kbars = api.kbars(api.Contracts.Stocks["0050"], start="2010-01-01", end="2021-09-02")
df = pd.DataFrame({kbars})
df.ts = pd.to_datetime(df.ts)

用print輸出df的內容,裡面有開高低收跟成交量,可以抓到將近3年內的1分K歷史資料,還滿佛的
print(df)
ts Low High Close Volume Open
0 2018-12-07 09:01:00 75.60 75.60 75.60 115 75.60
1 2018-12-07 09:02:00 75.60 75.60 75.60 46 75.60
2 2018-12-07 09:03:00 75.55 75.60 75.60 53 75.60
3 2018-12-07 09:04:00 75.60 75.70 75.65 104 75.60
4 2018-12-07 09:05:00 75.70 75.75 75.75 55 75.70
... ... ... ... ... ...
169109 2021-09-02 13:26:00 139.95 139.95 139.95 0 139.95
169110 2021-09-02 13:27:00 139.95 139.95 139.95 0 139.95
169111 2021-09-02 13:28:00 139.95 139.95 139.95 0 139.95
169112 2021-09-02 13:29:00 139.95 139.95 139.95 0 139.95
169113 2021-09-02 13:30:00 139.90 139.90 139.90 150 139.90

用以下指令可以抽取其中收盤價的部分
close=df['Close']
close.index=df.ts

接下來轉換為每日收盤價

轉成每日收盤價的做法就是從一分K的第一天LOOP到最後一天,然後把每一天的收盤價都抓出來湊成一個pandas.series

如果要抽取特定日期的分線資料可以用這個指令
close['2021-09-02']

用以下兩個指令可以抓取第一天和最後一天的日期
date_begin=close.index[0].date()
date_end=close.index[-1].date()
delta = datetime.timedelta(days=1)

用以下指令可以創建一個series,index是日期,數值放收盤價,先用create_PairForSeries把第一天的series做出來
def create_PairForSeries(date,close):
    val=close[str(date)][-1]
    return pd.Series({date:val})
dayclose=create_PairForSeries(date_begin,close)

這邊可以把後面的資料用同樣的function做成series,然後像人體蜈蚣一樣接在第一天的series後面,這邊的try except是用來處理假日沒有價格的問題用的
date_begin += delta
while date_begin <= date_end:
    try:
        append=create_PairForSeries(date_begin,close)
        dayclose=dayclose.append(append)
    except:
        pass
    date_begin += delta

print(dayclose)

2021-05-21 132.35
2021-05-24 132.15
2021-05-25 134.40
2021-05-26 100.00
2021-05-27 133.30

2021-08-24 134.85
2021-08-30 139.50
2021-08-31 140.35
2021-09-01 141.00
2021-09-02 139.90
Length: 68, dtype: float64
今天就到這邊為止,接下來的兩大課題是回測跟指標,明天沒意外應該會先弄個簡單的均線指標吧
題外話就是markdown排版有點難度,接下來可能還是把程式碼用圖片的方式貼上來


上一篇
[Day1] 基本工具安裝
下一篇
[Day3] 使用ta-lib製作指標
系列文
從零開始使用python打造簡易投資工具43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
hungfu
iT邦新手 5 級 ‧ 2021-09-06 15:02:36

Hi 樓主

我複製您的程式碼進去測試
跑到 df = pd.DataFrame({kbars}) -> 出現TypeError: unhashable type: 'Kbars'
如果把大掛號 {} -> 中掛號 [],可以Pass 這行,但是下一行To_datetime又卡住了
希望您能夠撥空指點一下
https://ithelp.ithome.com.tw/upload/images/20210906/20141589U6IT3QU3TV.jpg

看更多先前的回應...收起先前的回應...

先用
import pandas as pd
pd.show_versions()
看看pandas的版本,我這邊是pandas:1.3.2,如果比較舊的話可能需要更新,如果更新後還是無法用的話,把pandas版本貼上來我再研究看看,我這一段也是從shiaoji的文件看來的

hungfu iT邦新手 5 級 ‧ 2021-09-07 12:25:14 檢舉

Hi 樓主
我原本跑版本是1.2.4,所以我有更新Pandas 版本到1.3.2,如下圖

目前跑起來的狀況是一樣的

測試了三個開發環境,Jupyter, VS Code 跟Colab 都是同一行停下來, 希望您能幫忙看一下
感謝

https://ithelp.ithome.com.tw/upload/images/20210907/20141589FaDXjWm6ui.jpg

hungfu iT邦新手 5 級 ‧ 2021-09-07 13:35:17 檢舉

Hi 樓主,

我回去找了永豐金的說明,他的寫法是

df = pd.DataFrame({**ticks})

所以原本的程式碼我從
df = pd.DataFrame({kbars})
改寫成
df = pd.DataFrame({**kbars})

就正常了~!

了解,看來是直接貼程式碼的時候**被轉成奇怪的東西了

1
hungfu
iT邦新手 5 級 ‧ 2021-09-07 14:09:35

Hi 樓主
抱歉,又是我有問題了

我解決掉DataFrame的問題後

跑到要把收盤價抓出來的迴圈

您的程式碼date_begin += delta

執行的結果是delta 未被定義

需要您在替我解惑

謝謝你的幫忙

我漏了一行,已經加進去了,多謝提醒
delta = datetime.timedelta(days=1)

hungfu iT邦新手 5 級 ‧ 2021-09-08 10:49:01 檢舉

感謝樓主,其實我的兩個問題在您的Day 4 函式打包過程中就都是正確了

ok

0
雜食性的貓
iT邦新手 3 級 ‧ 2021-10-17 15:42:15

Hi 版主,看到你文章提到 markdown 會有困擾,給個小小的建議
如果要放 code 的話,可以嘗試用用 markdown 的 codeblock

** like this then star wont be eatten **

用三個```這樣開頭跟結尾,中間的程式碼就不會被影響,相較圖片,閱讀者也會比較好複製。開頭的地方可以寫```python 來暗示這段 markdown 的內容,有時候會有對應的highLight。

了解,我之後試試看

我要留言

立即登入留言