金融大數據分析 巨量資料科學 交易策略建構 量化交易系統 動態槓桿控管
解鎖付費資料-Python實做還原股價
本文將解釋什麼是除權息,以及為什麼股票價格在除權息後會有所調整,以及股價調整後Python,並透過Python來介紹如何進行除權息股價報酬率還原。
先簡單針對還原股價進行幾點介紹:
- 還原股價通常要收費,所以取得上比較麻煩。
- 還原股價並不是真正能交易的價格,它只能跟其他還原股價比較與計算使用。
- 還原股價是一種調整後股價,目的是快速算出報酬率,通常是做量化分析時使用。
- 還原股價排除了除權息的影響,但漲幅基本上都和股價一樣。
介紹台股除權息的概念
在台灣股市中,除權息是一個投資者經常會遇到的現象,對股票價格有重大影響。除權息是指公司在進行盈餘分配時,將部分利潤用於發放現金股利(即除息)或分散流通股數(即除權)。當公司宣布除權息後,股票價格往往會因為這些分配而調整。
除息是指公司按照一定比例將現金分配給股東,以紅利的形式回報股東對公司的支持和投資。股票的價格會因為紅利分配而下跌,反映了公司資金的流出。
另一方面,除權是指公司增加股本,通過向現有股東配發新股,或者向新的股東發行新股,從而增加公司股份的總量。這樣做的目的可能是為了籌集資金以支持業務擴張或資本支出。當公司宣布除權時,通常會將股票的價格調整到反映每股的新價值。
除權息替股價帶來的影響
除權息對股價會產生重大的影響,這些影響主要體現在股價調整上:當公司宣布除權息時,股價會因為這些分配而調整。除權、除息後,股價通常會下跌,反映了紅利分配對公司資金的流失;除權息過後,股價則可能上漲或下跌,取決於新股的發行價格和市場對公司發行新股的看法。
如果我們直接拿股票價格來進行資料分析時,會發現每次除權息都會有一定的落差,如下圖,也因此在使用股價計算報酬率時,會產生偏差,實際上投資者報酬率並沒有變動;但是股價資料顯示下跌,資料上會出現除權息後的報酬率失真,所以這部分在進行金融量化分析時時需要特別注意。
如何解決除權息帶來的股價報酬偏差
投資者可以透過對股票價格進行除權息調整,以消除除權息對股價帶來的影響。這可以透過計算出還原除權息後的股價,或者使用一些金融工具和資料庫中提供的已經調整過的股價來實現報酬率的計算。而本文將介紹如何還原除權息資料,步驟如下:
- 取得股票價格數據:首先,你需要取得包括股票交易日期、開盤價、收盤價等相關數據。你可以使用金融數據API(如Yahoo Finance、一些資料提供商等)或者直接從證券交易所網站取得數據。
- 取得除權息資訊:除權息訊息通常包括除息日期、除權日期、現金股利金額、配股比例等。你可以從公司公告、證券交易所公告或金融數據提供商取得這些訊息。
- 計算除權息對股價的影響:根據除權息的日期和相關訊息,你可以計算出除權息對股價的影響。例如,除息後,股價會減去發放的現金股利金額;除權後,股價會根據配股比例進行調整。
- 應用影響還原公式:根據計算出的除權息影響,你可以應用相應的還原公式來調整股票價格,使其還原到除權息前的水平。這可能涉及將除權息影響納入考慮,並對相應日期的股價進行調整。
- 驗證結果:最後,你需要驗證還原後的股票價格是否符合預期。可以透過與原始股票價格進行比較,或者與其他數據來源進行對比來驗證還原結果的準確性。
計算還原除權息股價的操作
廢話不多說,直接上程式碼,首先載入套件。
import requests
from json import loads
from datetime import datetime
import pandas as pd
import yfinance as yf
from FinMind.data import DataLoader
api = DataLoader()
取得上市除權息數據「https://www.twse.com.tw/zh/announcement/ex-right/twt49u.html」。
date_from = '20030505'
date_to = datetime.now().strftime('%Y%m%d')
dividend_url = f'https://www.twse.com.tw/rwd/zh/exRight/TWT49U?startDate={date_from}&endDate={date_to}&response=json&_=1715399142826'
html = requests.get(dividend_url)
dividend_data = loads(html.text)
dividend_df = pd.DataFrame(dividend_data['data'],columns=dividend_data['fields'])
def Cyear(day):
day2 = day.replace('年','/').replace('月','/').replace('日','')
day_list = day2.split('/')
day_new = '/'.join([str(int(day_list[0])+1911) ,day_list[1],day_list[2] ])
return datetime.strptime(day_new,'%Y/%m/%d')
dividend_df['資料日期'] = dividend_df['資料日期'].apply(Cyear)
取得股票價格,可以至證交所、或一些台灣資訊提供商取得,例如yahoo finance 、Finmind,也可以從證交所直接取得股價資料。
symbol = '1786'
date_from = '2003-05-05'
date_to = datetime.now().strftime('%Y-%m-%d')
stock_price = api.taiwan_stock_daily(
stock_id=symbol,
start_date=date_from,
end_date=date_to
)
stock_price.index = pd.to_datetime(stock_price['date'])
最後進行股價報酬還原除權息,還原的方式是透過向後還原,。
stock_dividend = dividend_df[dividend_df['股票代號']==symbol].copy()
stock_dividend['還原因子'] = stock_dividend['除權息前收盤價'].astype(float)/stock_dividend['除權息參考價'].astype(float)
stock_dividend['累計還原因子'] = stock_dividend['還原因子'].cumprod()
stock_dividend = stock_dividend[['資料日期','累計還原因子']]
stock_dividend.set_index('資料日期',inplace = True)
stock_price = pd.concat([stock_price,stock_dividend],axis=1)
stock_price['累計還原因子'].ffill(inplace=True)
stock_price['累計還原因子'].fillna(1,inplace=True)
stock_price['adjust_price'] = stock_price['close'] * stock_price['累計還原因子']
還原以後,我們進行還原除權息的收盤價調整,如圖。
(stock_price['close'].pct_change()+1).cumprod().plot(label=f'{symbol} 還原除權息前收盤價報酬率',legend=True)
(stock_price['adjust_price'].pct_change()+1).cumprod().plot(label=f'{symbol} 還原除權息後收盤價報酬率',legend=True)
這樣你會了嗎?試試看吧!