七月時曾小試一下 Python 網頁爬蟲, 用 requests 與 BeautifulSoup 爬取美國 Yahoo Finance 網站上的台股資料, 然後透過 LineNotify 發出即時訊息, 參考 :
用 Python 寫爬蟲實在好方便, 比十年前我用 PHP 的 cURL 寫爬蟲程式要容易太多了. 但透過網頁 URL 去抓一段時間的報價資料得一頁頁抓, 這樣太麻煩, 更方便的方式是利用第三方套件 yfinance, 可用來串接 Yahoo Finance API 下載股票的價量資訊. 而且拿到的資料就是 Pandas 的 DataFrame, 不論是要做資料分析還是繪圖都能馬上套用, 參考 :
yfinance 的前身是 fix_yahoo_finance 套件, 因為 Yahoo Finance 在 2017 年 5 月停止歷史股價數據 API, 使得許多依賴它做為資料源的金融程式停擺, 但後來有人對此 API 進行修補, 並提供 fix_yahoo_finance 套件來串接 API, 使資料源重新復活, 這在下面這本書的第 6-3 節有描述 :
# Python 程式設計入門與運算思維 (新陸 2017, 曹祥雲)
PyPi 網站上目前還找得到 fix_yahoo_finance 套件的介紹 :
不過它建議改用新版的 yfinance 套件.
yfinance 的原始碼寄存於 GitHub :
本篇測試參考了下面的文章 :
根據第二篇與第三篇的說明, Yahoo Finance API 的限制是 :
- 每個 IP 每小時的請求上限是 2000 次
- 每個 IP 單日請求上限是 48000 次
比較務實的做法是自己建立資料庫, 利用 yfinance 擷取資料後儲存於資料庫, 以後就只要抓當日的新資料添加到資料庫中即可.
1. 在 Windows 上安裝 yfinance :
Windows 的安裝指令如下 :
pip install yfinance
C:\Users\User>pip install yfinance
Collecting yfinance
Using cached yfinance-0.1.74-py2.py3-none-any.whl (27 kB)
Requirement already satisfied: multitasking>=0.0.7 in c:\python37\lib\site-packages (from yfinance) (0.0.11)
Requirement already satisfied: numpy>=1.15 in c:\python37\lib\site-packages (from yfinance) (1.19.4)
Requirement already satisfied: lxml>=4.5.1 in c:\python37\lib\site-packages (from yfinance) (4.9.1)
Requirement already satisfied: pandas>=0.24.0 in c:\python37\lib\site-packages (from yfinance) (1.2.5)
Requirement already satisfied: requests>=2.26 in c:\python37\lib\site-packages (from yfinance) (2.28.1)
Requirement already satisfied: pytz>=2017.3 in c:\python37\lib\site-packages (from pandas>=0.24.0->yfinance) (2018.9)
Requirement already satisfied: python-dateutil>=2.7.3 in c:\python37\lib\site-packages (from pandas>=0.24.0->yfinance) (2.7.5)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\python37\lib\site-packages (from requests>=2.26->yfinance) (1.24.1)
Requirement already satisfied: certifi>=2017.4.17 in c:\python37\lib\site-packages (from requests>=2.26->yfinance) (2018.11.29)
Requirement already satisfied: charset-normalizer<3,>=2 in c:\python37\lib\site-packages (from requests>=2.26->yfinance) (2.1.1)
Requirement already satisfied: idna<4,>=2.5 in c:\python37\lib\site-packages (from requests>=2.26->yfinance) (2.8)
Requirement already satisfied: six>=1.5 in c:\python37\lib\site-packages (from python-dateutil>=2.7.3->pandas>=0.24.0->yfinance) (1.12.0)
Installing collected packages: yfinance
Successfully installed yfinance-0.1.74
用 pip show 指令查詢 yfinance 相關資訊 :
C:\Users\User>pip show yfinance
Name: yfinance
Version: 0.1.74
Summary: Download market data from Yahoo! Finance API
Home-page: https://github.com/ranaroussi/yfinance
Author: Ran Aroussi
Author-email: ran@aroussi.com
License: Apache
Location: c:\python37\lib\site-packages
Requires: lxml, multitasking, numpy, pandas, requests
Required-by:
可見 yfinance 是建立在 requests,lxml, numpy 與 Pandas 等套件的基礎上.
2. 在樹莓派上安裝 yfinance :
由於程式最終是要在樹莓派上奔跑, 所以也要在 Raspbian 上安裝看看, 安裝指令要用 pip3, 因為 pip 是給內建的 Python 2 用的 :
pi@raspberrypi:~ $ pip3 install yfinance
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting yfinance
Downloading https://files.pythonhosted.org/packages/da/6a/2c1bf2a0fd8ce7f30ff3af041a27118b4b56d69cdb809dccf1ce84971940/yfinance-0.1.74-py2.py3-none-any.whl
Collecting lxml>=4.5.1 (from yfinance)
Downloading https://www.piwheels.org/simple/lxml/lxml-4.9.1-cp37-cp37m-linux_armv7l.whl (2.3MB)
Collecting requests>=2.26 (from yfinance)
Downloading https://files.pythonhosted.org/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c0441b5cda699c90f618b6f8a1b42/requests-2.28.1-py3-none-any.whl (62kB)
Requirement already satisfied: pandas>=0.24.0 in ./.local/lib/python3.7/site-packages (from yfinance) (1.2.4)
Collecting multitasking>=0.0.7 (from yfinance)
Downloading https://files.pythonhosted.org/packages/3e/8a/bb3160e76e844db9e69a413f055818969c8acade64e1a9ac5ce9dfdcf6c1/multitasking-0.0.11-py3-none-any.whl
Requirement already satisfied: numpy>=1.15 in ./.local/lib/python3.7/site-packages (from yfinance) (1.20.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib/python3/dist-packages (from requests>=2.26->yfinance) (1.24.1)
Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests>=2.26->yfinance) (2.6)
Collecting charset-normalizer<3,>=2 (from requests>=2.26->yfinance)
Downloading https://files.pythonhosted.org/packages/db/51/a507c856293ab05cdc1db77ff4bc1268ddd39f29e7dc4919aa497f0adbec/charset_normalizer-2.1.1-py3-none-any.whl
Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests>=2.26->yfinance) (2018.8.24)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/lib/python3/dist-packages (from pandas>=0.24.0->yfinance) (2.7.3)
Requirement already satisfied: pytz>=2017.3 in ./.local/lib/python3.7/site-packages (from pandas>=0.24.0->yfinance) (2021.1)
Installing collected packages: lxml, charset-normalizer, requests, multitasking, yfinance
Successfully installed charset-normalizer-2.1.1 lxml-4.9.1 multitasking-0.0.11 requests-2.28.1 yfinance-0.1.74
基本上不會有問題, 有的話可能是其相依套件例如 requests 等之版本匹配問題.
3. 在 Colab 上安裝 yfinance :
在 Colab 也可以安裝 yfinance, 指令如下 :
!pip install yfinance
在 Colab 上跑 Python 的一個好處是列印格式很整齊. 關於 Colab 用法參考 :
4. 檢視 yfinance 的內容 :
先來檢視 ylfinance 套件的內容, 以下使用一個自訂模組 members, 其 list_members() 函式會列出模組或套件中的公開成員 (即屬性與方法), 參考 :
# Python 學習筆記 : 檢視物件成員與取得變數名稱字串的方法
使用 yfinance 前須先用 import 匯入, 通常取別名為 yf :
>>> import yfinance as yf
>>> import members
>>> members.list_members(yf)
Ticker <class 'type'>
Tickers <class 'type'>
base <class 'module'>
download <class 'function'>
multi <class 'module'>
pdr_override <class 'function'>
shared <class 'module'>
ticker <class 'module'>
tickers <class 'module'>
utils <class 'module'>
version <class 'module'>
其中 download() 函式與 Ticker 類別是最常用的, 利用 download() 函式可取得股票的歷史價量資料; 而使用 Ticker 類別則不僅可取得歷史價量資料, 還可取得股票更詳細的金融資訊, 例如公司基本資訊, 大戶與法人持股比例, 損益表, 資產負債表, 現金流量表等財報資料.
5. 用 yf.download() 下載股票日收盤價量資料 :
呼叫 yf.download() 函式可取得 Yahoo Finance 提供的股票歷史日收盤價量資訊, 其傳回值為一個 Pandas 的 DataFrame 物件, 這對進行技術分析與線圖繪製非常方便, 語法如下 :
df=yf.download(symbol [, start, end] [, period, interval])
其參數說明如下表 :
download() 參數 | 說明 |
symbol | 股票代號 (字串), 美股例如 'AMD' (超微), 台股後面要加 '.tw', 例如 '0050.tw' |
start | 起始日期 YYYY-MM-DD (字串), 例如 '2022-08-22' |
end | 結束日期 YYYY-MM-DD (字串), 例如 '2022-09-06', 注意, 不包含此日資料 |
period | 期間, 可用 d (日), mo(月), y(年), ytd, max(全部), 例如 5d (5 天), 3mo(三個月) |
interval | 頻率, 可用 m(分), h(小時), d(日), wk(周), mo(月), 例如 1m(一分線) |
必要參數 symbol 表示商品名稱代號, 例如特斯拉是 'TSLA', 微軟是 'MSF' 等, 如果是台股, 必須在台股股票代號後面要加上 '.TW' 或 '.tw' (大小寫均可), 例如台積電是 '2330.TW', 台灣五十是 '0050.TW' 等等.
四個備選參數有三個使用模式, 第一組是 [start, end] 用於指定特定起迄日期的日收盤資料 (end 不含); 第二組是 [period, interval] 用來指定最近一段時間內某個頻率的歷史資料 (ticker); 第三組是 [start, end, interval] 用來指定特定起迄日期內特定頻率的資料.
如果只傳入 symbol 參數, 則會傳回該股票所有的歷史日收盤價量資料之 DataFrame 物件, 例如 :
>>> import pandas as pd
>>> import yfinance as yf
>>> df=yf.download('TSLA') # 下載特斯拉 TSLA 全部歷史價量資料
[*********************100%***********************] 1 of 1 completed
>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> df
Open High ... Adj Close Volume
Date ...
2010-06-29 1.266667 1.666667 ... 1.592667 281494500
2010-06-30 1.719333 2.028000 ... 1.588667 257806500
2010-07-01 1.666667 1.728000 ... 1.464000 123282000
2010-07-02 1.533333 1.540000 ... 1.280000 77097000
2010-07-06 1.333333 1.333333 ... 1.074000 103003500
... ... ... ... ... ...
2022-08-30 287.869995 288.480011 ... 277.700012 50541800
2022-08-31 280.619995 281.250000 ... 275.609985 52107300
2022-09-01 272.579987 277.579987 ... 277.160004 54287000
2022-09-02 281.070007 282.350006 ... 270.209991 50752200
2022-09-06 272.679993 275.989990 ... 274.420013 55762000
[3069 rows x 6 columns]
可見 yf.download('TSLA') 會傳回特斯拉自 2010-06-29 上市以來的全部歷史價量資料 (10 年來股價上漲 200 多倍, 嚇鼠), 但因資料總欄寬與總列數超過 Pandas 的預設值, 故會用 ... 表示隱藏省略掉的欄位. 總資料筆數共 3069 筆, 但只會顯示頭尾各五筆. 若要顯示全部欄位須要用下列 Pandas 的 set_option() 函式設定 :
pd.set_option('display.max_columns', None) # 顯示全部欄位
pd.set_option('display.width', 1000) # 設定總欄寬為 1000 px
注意,總欄寬若設得太小, 後面超出的欄位會反折, 故可能需要嘗試將 display.width 再放寬.
參考 :
例如 :
>>> pd.set_option('display.max_columns', None)
>>> pd.set_option('display.width', 1000)
>>> df
Open High Low Close Adj Close Volume
Date
2010-06-29 1.266667 1.666667 1.169333 1.592667 1.592667 281494500
2010-06-30 1.719333 2.028000 1.553333 1.588667 1.588667 257806500
2010-07-01 1.666667 1.728000 1.351333 1.464000 1.464000 123282000
2010-07-02 1.533333 1.540000 1.247333 1.280000 1.280000 77097000
2010-07-06 1.333333 1.333333 1.055333 1.074000 1.074000 103003500
... ... ... ... ... ... ...
2022-08-30 287.869995 288.480011 272.649994 277.700012 277.700012 50541800
2022-08-31 280.619995 281.250000 271.809998 275.609985 275.609985 52107300
2022-09-01 272.579987 277.579987 266.149994 277.160004 277.160004 54287000
2022-09-02 281.070007 282.350006 269.079987 270.209991 270.209991 50752200
2022-09-06 272.679993 275.989990 265.739990 274.420013 274.420013 55762000
[3069 rows x 6 columns]
這樣就能顯示全部欄位了, 可見 yf.download() 所下載的資料總共包含七個欄位 :
- Date (日期)
- Open (開盤價)
- High (最高價)
- Low (最低價)
- Close (收盤價)
- Adj Close (調整後之收盤價)
- Volumn (成交量 : 股數)
這些資料可以直接拿來繪製技術分析線圖.
頭尾五筆也可以用 pd.head() 與 pd.tail() 顯示 (也可傳入筆數) :
>>> df.head()
Open High Low Close Adj Close Volume
Date
2010-06-29 1.266667 1.666667 1.169333 1.592667 1.592667 281494500
2010-06-30 1.719333 2.028000 1.553333 1.588667 1.588667 257806500
2010-07-01 1.666667 1.728000 1.351333 1.464000 1.464000 123282000
2010-07-02 1.533333 1.540000 1.247333 1.280000 1.280000 77097000
2010-07-06 1.333333 1.333333 1.055333 1.074000 1.074000 103003500
>>> df.tail()
Open High Low Close Adj Close Volume
Date
2022-08-30 287.869995 288.480011 272.649994 277.700012 277.700012 50541800
2022-08-31 280.619995 281.250000 271.809998 275.609985 275.609985 52107300
2022-09-01 272.579987 277.579987 266.149994 277.160004 277.160004 54287000
2022-09-02 281.070007 282.350006 269.079987 270.209991 270.209991 50752200
2022-09-06 272.679993 275.989990 265.739990 274.420013 274.420013 55762000
如果使用 JupyterLab 或 Colab 會完整顯示所有欄位, 不需要設定 Pandas :
yf.download() 可以傳入的備選參數來指定資料期間或頻率, 這些參數的用法分成 [start, end], [period, interval], 與 [start, end, interval] 三個模式 :
(1). Start-end 模式 :
呼叫 yf.download() 時傳入起始 start 與結束 end 日期兩個參數, 這會傳回該期間日收盤之價量資料 (注意, 所下載的資料不含 end 那天, 只到其前一天), 例如指定下載 2022-08-24 至 2022-09-07 的歷史資料 :
>>> import yfinance as yf
>>> df=yf.download('0050.tw', start='2022-08-24', end='2022-09-07')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-08-24 118.800003 118.949997 117.650002 117.900002 117.900002 7063478
2022-08-25 118.500000 119.449997 118.449997 119.000000 119.000000 4893719
2022-08-26 119.849998 120.099998 119.449997 119.599998 119.599998 9959737
2022-08-29 116.250000 116.949997 116.000000 116.550003 116.550003 15775738
2022-08-30 116.550003 117.199997 116.199997 116.750000 116.750000 12155353
2022-08-31 115.949997 117.599998 115.800003 117.599998 117.599998 7045914
2022-09-01 115.500000 115.599998 114.750000 115.150002 115.150002 21061579
2022-09-02 115.099998 115.099998 113.849998 113.900002 113.900002 13994058
2022-09-05 114.099998 114.750000 113.699997 114.150002 114.150002 8878179
2022-09-06 114.800003 115.400002 114.250000 114.900002 114.900002 6476116
因為 end='2022-09-07' 這天的資料不包含, 故只會抓 '2022-08-24' 至 '2022-09-06' 的資料. 一般來說, 當日台股資料大約 16:00 左右就可以抓到了.
也可以搭配 datetime 模組來設定 start 與 end 參數, 例如下載過去 60 天的資料 :
>>> import datetime
>>> import yfinance as yf
>>> start=datetime.datetime.now() - datetime.timedelta(days=60)
>>> end=datetime.date.today()
>>> df=yf.download('2330.tw', start, end)
[*********************100%***********************] 1 of 1 completed
>>> df.head()
Open High Low Close Adj Close Volume
Date
2022-07-18 495.5 498.5 488.5 495.5 492.661224 39179575
2022-07-19 487.5 493.0 486.5 491.0 488.186981 19874865
2022-07-20 502.0 503.0 491.5 495.0 492.164062 35436652
2022-07-21 496.0 501.0 494.0 501.0 498.129700 22285593
2022-07-22 505.0 505.0 500.0 503.0 500.118256 25216400
此處使用 datetime.timedelta() 來設定過去一段時間間隔以取得那時的時戳.
(2). Period-interval 模式 :
此模式是傳入 period 與 interval 兩個參數, period 是一個表示最近的一段期間的字串, 由一個整數與單位字串組成, 可用的單位如下 :
- 'd' : 天數, 例如 '5d' 表示近五日, '20d' 表示近 20 日
- 'mo' : 月數, 例如 '1mo' 表示近一個月, '3mo' 表示近 3 個月
- 'y' : 年數, 例如 '1y' 表示近一年, '3y' 表示近 3 年
- 'ytd' : 今年以來, 即自年初第一個交易日至今
- 'max' : 所有時間資料
而 interval 則是用來指定資料的頻率, 也是由一個整數與單位字串組成, 可用的單位如下 :
- 'm' : 每幾分鐘, 例如 '1m' 為每一分鐘
- 'h' : 每幾小時, 例如 '3h' 為每三小時
- 'd' : 每幾天, 例如 '1d' 為每天
- 'wk' : 每幾周, 例如 '1wk' 為每周
- 'mo' : 每幾月, 例如 '1mo' 為每個月
例如要抓過去十天每日價量資料 :
>>> df=yf.download('0050.TW', period='10d', interval='1d') # 過去 10 天, 每天
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-08-25 118.500000 119.449997 118.449997 119.000000 119.000000 4893719
2022-08-26 119.849998 120.099998 119.449997 119.599998 119.599998 9959737
2022-08-29 116.250000 116.949997 116.000000 116.550003 116.550003 15775738
2022-08-30 116.550003 117.199997 116.199997 116.750000 116.750000 12155353
2022-08-31 115.949997 117.599998 115.800003 117.599998 117.599998 7045914
2022-09-01 115.500000 115.599998 114.750000 115.150002 115.150002 21061579
2022-09-02 115.099998 115.099998 113.849998 113.900002 113.900002 13994058
2022-09-05 114.099998 114.750000 113.699997 114.150002 114.150002 8878179
2022-09-06 114.800003 115.400002 114.250000 114.900002 114.900002 6476116
2022-09-07 113.099998 113.150002 112.099998 112.199997 112.199997 17218263
這與 start='2022-08-25', end='2022-09-08' 的結果一樣, 例如 :
>>> df=yf.download('0050.tw', start='2022-08-25', end='2022-09-08')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-08-25 118.500000 119.449997 118.449997 119.000000 119.000000 4893719
2022-08-26 119.849998 120.099998 119.449997 119.599998 119.599998 9959737
2022-08-29 116.250000 116.949997 116.000000 116.550003 116.550003 15775738
2022-08-30 116.550003 117.199997 116.199997 116.750000 116.750000 12155353
2022-08-31 115.949997 117.599998 115.800003 117.599998 117.599998 7045914
2022-09-01 115.500000 115.599998 114.750000 115.150002 115.150002 21061579
2022-09-02 115.099998 115.099998 113.849998 113.900002 113.900002 13994058
2022-09-05 114.099998 114.750000 113.699997 114.150002 114.150002 8878179
2022-09-06 114.800003 115.400002 114.250000 114.900002 114.900002 6476116
2022-09-07 113.099998 113.150002 112.099998 112.199997 112.199997 17218263
如果要取得今年以來的月收盤歷史資料, period 可用 'ytd', interval 則用 '1mo' :
>>> df=yf.download('0050.TW', period='ytd', interval='1mo')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-02-01 141.550003 145.050003 137.850006 138.500000 138.500000 167881702
2022-03-01 139.050003 140.800003 131.000000 138.100006 138.100006 310811068
2022-04-01 136.600006 136.949997 125.949997 128.750000 128.750000 249274389
2022-05-01 128.750000 129.800003 121.199997 129.800003 129.800003 169768531
2022-06-01 129.300003 130.050003 115.500000 115.800003 115.800003 213894763
2022-07-01 115.650002 118.500000 108.449997 118.000000 118.000000 317571855
2022-08-01 118.099998 122.300003 115.099998 117.599998 117.599998 208948196
2022-09-01 115.500000 115.599998 113.699997 114.900002 114.900002 50409932
2022-09-07 113.099998 113.150002 112.099998 112.199997 112.199997 17218263
如果將 interval 設為 '1m' 則可取得每分鐘報價 (即一分 K 線), 不過 Yahoo Finance 只提供近七日內的一分 K 高頻交易數據, 例如 :
>>> df=yf.download('0050.TW', period='1d', interval='1m')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Datetime
2022-09-07 09:00:00+08:00 113.099998 113.150002 113.000000 113.150002 113.150002 0
2022-09-07 09:01:00+08:00 113.099998 113.150002 113.000000 113.000000 113.000000 222000
2022-09-07 09:02:00+08:00 113.050003 113.099998 113.000000 113.050003 113.050003 349000
2022-09-07 09:03:00+08:00 113.050003 113.050003 112.849998 112.900002 112.900002 145000
2022-09-07 09:04:00+08:00 112.900002 112.949997 112.849998 112.849998 112.849998 145000
... ... ... ... ... ... ...
2022-09-07 13:21:00+08:00 112.349998 112.349998 112.300003 112.300003 112.300003 26000
2022-09-07 13:22:00+08:00 112.349998 112.349998 112.250000 112.300003 112.300003 66897
2022-09-07 13:23:00+08:00 112.349998 112.349998 112.250000 112.300003 112.300003 57000
2022-09-07 13:24:00+08:00 112.300003 112.300003 112.199997 112.250000 112.250000 133351
2022-09-07 13:30:00+08:00 112.199997 112.199997 112.199997 112.199997 112.199997 0
[266 rows x 6 columns]
若試圖下載超過 7 天的一分 K 資料會被拒絕 :
>>> df=yf.download('0050.TW', period='8d', interval='1m')
[*********************100%***********************] 1 of 1 completed
1 Failed download:
- 0050.TW: 1m data not available for startTime=1661902806 and endTime=1662594006. Only 7 days worth of 1m granularity data are allowed to be fetched per request.
(3). Start-end-interval 模式 :
其實 Start-end 模式也可以傳入 interval 參數來指定期間內的資料頻率, 例如下載 2022-09-06 與 2022-09-07 這兩天的五分 K 資料 (interval='5m') 可以這麼做 :
>>> df=yf.download('0050.TW', start='2022-09-06', end='2022-09-08', interval='5m')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Datetime
2022-09-06 09:00:00+08:00 114.800003 115.250000 114.800003 115.250000 115.250000 0
2022-09-06 09:05:00+08:00 115.300003 115.400002 115.099998 115.150002 115.150002 150000
2022-09-06 09:10:00+08:00 115.150002 115.150002 115.050003 115.050003 115.050003 95084
2022-09-06 09:15:00+08:00 115.050003 115.150002 114.900002 114.900002 114.900002 247440
2022-09-06 09:20:00+08:00 114.849998 114.900002 114.650002 114.800003 114.800003 197527
... ... ... ... ... ... ...
2022-09-07 13:05:00+08:00 112.250000 112.300003 112.150002 112.250000 112.250000 923845
2022-09-07 13:10:00+08:00 112.250000 112.250000 112.150002 112.199997 112.199997 496071
2022-09-07 13:15:00+08:00 112.199997 112.300003 112.099998 112.300003 112.300003 251061
2022-09-07 13:20:00+08:00 112.300003 112.349998 112.199997 112.250000 112.250000 292248
2022-09-07 13:30:00+08:00 112.199997 112.199997 112.199997 112.199997 112.199997 0
[107 rows x 6 columns]
如果要取得周收盤資料可以用 interval='1wk', 傳回資料的列索引會以周一那天為代表, 開盤價取周一的 Open, 收盤價取周五那天的 Close, 最高價取周一至周五的 High 中最大的, 最低價取周一至周五的 Low 中最小的, 而周成交量則是周一至周五成交量總和.
例如 2022-07-04 到 2022-09-08 的周收盤資料 :
>>> df=yf.download('0050.TW', start='2022-07-04', end='2022-09-09', interval='1wk')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-07-04 111.250000 113.900002 108.449997 113.250000 113.250000 81880198
2022-07-11 113.650002 115.650002 109.150002 115.500000 115.500000 76837034
2022-07-18 114.650002 117.199997 113.599998 116.800003 116.800003 76713181
2022-07-25 116.300003 118.500000 115.150002 118.000000 118.000000 47421882
2022-08-01 118.099998 119.500000 115.099998 119.500000 119.500000 51198262
2022-08-08 119.000000 121.000000 117.500000 120.800003 120.800003 42950852
2022-08-15 121.449997 122.300003 120.900002 121.550003 121.550003 42572516
2022-08-22 120.000000 120.250000 117.650002 119.599998 119.599998 37249561
2022-08-29 116.250000 117.599998 113.849998 113.900002 113.900002 70032642
2022-09-05 114.099998 115.400002 113.699997 114.900002 114.900002 15354295
2022-09-08 113.050003 113.050003 112.500000 112.449997 112.449997 1512761
以其中的第一周 2022-07-04 這列為例, 周開盤價 111.25, 最高價 113.9, 最低價 108.45, 收盤價 113.25, 這可查詢這一周的日收盤價來印證 :
>>> df=yf.download('0050.TW', start='2022-07-04', end='2022-07-09')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-07-04 111.250000 112.199997 110.000000 110.449997 110.449997 26442712
2022-07-05 112.550003 112.949997 109.000000 111.000000 111.000000 16214458
2022-07-06 111.000000 111.050003 108.449997 108.849998 108.849998 15611981
2022-07-07 109.449997 112.150002 108.550003 112.099998 112.099998 13433190
2022-07-08 113.300003 113.900002 112.300003 113.250000 113.250000 10177857
可見周開盤價 111.25 取自周一 (2022-07-04) 的開盤價; 周最高價 113.9 出現在周五 (2022-07-08); 周最低價 118.45 出現在週三 (2022-07-06); 周收盤價 113.25 取自周五 (2022-07-08) 的收盤價; 而周成交量 81880198 則是周一至周五成交量之總和 :
>>> sum(df['Volume'])
81880198
月收盤資料也是類似, 月開盤價是該月第一個交易日的開盤價 (一律以 1 日為索引); 月最高價是該月每日 High 之最大者; 月最低價是該月每日 Low 之最小者; 月收盤價是該月最後一個交易日的收盤價; 月成交量則是該月每日成交量之總和, 以 2022 年七月為例 :
>>> df=yf.download('0050.TW', start='2022-07-01', end='2022-09-01', interval='1mo')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-07-01 115.650002 118.500000 108.449997 118.000000 118.000000 317571855
2022-08-01 118.099998 122.300003 115.099998 117.599998 117.599998 208948196
2022-09-01 115.500000 115.599998 113.699997 114.900002 114.900002 50409932
月收盤資料一律會以該月 1 日當列索引, 以第一列的七月收盤為例, 可從檢視七月的日收盤資料來印證 :
>>> df=yf.download('0050.TW', start='2022-07-01', end='2022-08-01')
[*********************100%***********************] 1 of 1 completed
>>> df
Open High Low Close Adj Close Volume
Date
2022-07-01 115.650002 115.650002 111.199997 111.550003 111.550003 34719560
2022-07-04 111.250000 112.199997 110.000000 110.449997 110.449997 26442712
2022-07-05 112.550003 112.949997 109.000000 111.000000 111.000000 16214458
2022-07-06 111.000000 111.050003 108.449997 108.849998 108.849998 15611981
2022-07-07 109.449997 112.150002 108.550003 112.099998 112.099998 13433190
2022-07-08 113.300003 113.900002 112.300003 113.250000 113.250000 10177857
2022-07-11 113.650002 113.699997 111.849998 112.250000 112.250000 7572953
2022-07-12 110.949997 110.949997 109.150002 109.550003 109.550003 11133444
2022-07-13 113.000000 113.650002 112.599998 113.449997 113.449997 24824897
2022-07-14 112.699997 114.250000 111.800003 114.000000 114.000000 14750428
2022-07-15 114.599998 115.650002 113.750000 115.500000 115.500000 18555312
2022-07-18 114.650002 114.849998 113.949997 114.199997 114.199997 22207344
2022-07-19 113.949997 114.650002 113.599998 114.300003 114.300003 13251365
2022-07-20 115.849998 116.199997 114.699997 115.050003 115.050003 16836288
2022-07-21 115.400002 116.349998 115.000000 116.349998 116.349998 8803270
2022-07-22 116.599998 117.199997 116.300003 116.800003 116.800003 15614914
2022-07-25 116.300003 116.949997 116.000000 116.699997 116.699997 10543360
2022-07-26 116.599998 116.599998 115.300003 115.650002 115.650002 12623932
2022-07-27 115.500000 116.699997 115.150002 116.699997 116.699997 7917050
2022-07-28 117.849998 117.949997 116.900002 116.900002 116.900002 8307208
2022-07-29 118.150002 118.500000 117.650002 118.000000 118.000000 8030332
可見月開盤價 115.65 為七月第一個交易日 2022-07-01 之開盤價; 月最高價 118.5 出現在最後交易日 2022-07-29 的 High; 月最低價 108.45 出現在 2022-07-06 的 Low; 月收盤價 118.0 為七月最後一個交易日 2022-07-29 之收盤價: 月成交量則是七月每個交易日成交量之總和, 可用內建函式 max(), min(), 與 sum() 來求得 :
>>> max(df['High'])
118.5
>>> min(df['Low'])
108.44999694824219
>>> sum(df['Volume'])
317571855
沒有留言 :
張貼留言