2022年9月7日 星期三

Python 學習筆記 : 用 yfinance 套件取得股票資料 (一)

七月時曾小試一下 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
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

沒有留言 :