就跟昨天的加權指數一樣,我們之前的取得的CSV都是「每日」的資訊,但是我們需要歷史資料才能歸納與分析我們的策略是否正確,所以今天就要說明如何從證交所取得股票歷史資料。
前往個股日成交資訊:
首頁 > 交易資訊 > 盤後資訊 > 個股日成交資訊
並在日期中選擇要下載的年與月份,然後輸入要查詢的股票,接著按【查詢】,就會出來該年月的交易資訊,然後點擊旁邊【CSV下載】,把資料下載到本機。
也是一樣的,把我們想要抓下來的範圍全部都下載(至少需要2021的資訊)。這邊的紀錄是從民99年1月4日起開始提供。要注意的是,這邊的交易內容,是包含:一般、零股、盤後定價、鉅額交易,所以交易的量會跟盤中的不一樣。
然後要匯入資料庫。
同樣的,這邊也有遇到標題與尾巴有一些說明,我們不需要這個部分,只要每日的交易資訊,因此也適用判斷第一個欄位長度是否為日期的9碼,當不是9碼的時候就繼續這個for
迴圈,直到是日期9碼的時候才執行匯入作業:
if len(row[0]) != 9:
continue
當然在日期的部分也要修改::
f"{str(int(row[0][:3])+1911)}-{str(row[0])[4:6]}-{str(row[0])[7:]}"
而不太一樣的地方是在。加權指數的資料沒有商品代碼,因其不是可以交易的商品,但今天我們是搜尋台積電的歷史交易資訊,所以在一開始的搜尋條件就把台積電加入,這時候就可以用帶入參數的方式,把台積電的代碼帶入程式中。而我的作法就是直接帶入,不解CSV的字串:
def insert_mysql(self, symbol) -> bool:
因此在跑寫入資料庫的for
迴圈,就可以填入這些交易資料是哪個標的物。
for row, _ in self.df.iterrows():
if len(row[0]) != 9:
continue
# data: yyy/mm/dd to yyyy-mm-dd,
# e.g. 110/08/02 to 2021-08-02
trade_date = f"{str(int(row[0][:3])+1911)}-{str(row[0])[4:6]}-{str(row[0])[7:]}"
cmd = f"""INSERT IGNORE INTO DailyPrice
(Symbol, TradeDate, OpenPrice, HighPrice,
LowPrice, ClosePrice, Volumn)
VALUES('{symbol}',
'{trade_date}', {row[3].replace(',', '')},
{row[4].replace(',', '')}, {row[5].replace(',', '')},
{row[6].replace(',', '')}, {row[1].replace(',', '')});"""
cursor.execute(cmd)
conn.commit()
最後把我們要的範圍資料(2021年開始)全部匯入,就大功告成。