昨天取得九月的加權指數資料,但是時間太短,看不出來量與價格的關係,所以就要取得更遠的資料囉。取得後才能觀察量與指數的關係。
本日程式碼使用:
首先我們要取得資料,但是在open data平台上只有當月的,這時候只能去證交所一個月一個月的抓(大家都罵翻了XD)。
前往每日市場成交資訊:
首頁 > 交易資訊 > 盤後資訊 > 每日市場成交資訊
那邊就有搜尋表單可以填寫,選擇年份和月份,一次可以抓一個月。現在範例是抓今年的份,也就是1~9月,因此會有至少八份CSV,因為九月的這幾天已經有收到。
這邊是先純手動抓,如果以後有時間,再寫如何用爬蟲的方式取得資料。
接著要匯入資料庫,這邊可以參考Day9,不過不太一樣的是,資料格式不相同,需要調整「日期」和「數字」。
在日期方面,從API取得的會是1100901,這種純數字沒有標點符號的版本,但是如果是從網頁下載下來,會是110/09/01這樣的格式,方便閱讀,但是進入資料庫時候需要調整,因為無法直接匯入。
首先在日期的部分,要改成略過標點符號:
f"{str(int(row[0][:3])+1911)}-{str(row[0])[4:6]}-{str(row[0])[7:]}"
接著數字的話用replace
的方式,因為資料格式為str
直接用replace
,不用轉換,因此匯入的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 StockTransactionInfo
(TradeDate,
TranscationQty, TranscationAmount, TranscationCount,
Taiex, ChangePoint)
VALUES('{trade_date}',
{row[1].replace(',', '')}, {row[2].replace(',', '')},
{row[3].replace(',', '')}, {row[4].replace(',', '')},
{row[5].replace(',', '')});"""
cursor.execute(cmd)
conn.commit()
當匯入後,就製作成我們要的圖表吧!時間就是從2021年1月1日開始。
在這次做圖時,練習設定X軸與Y軸的刻度,這時使用.gca()
取得當下的軸(Axes)(可參考文章)。接著設定xaxis使用來設定X軸的資訊,並且用matplotlib.ticker.MaxNLocator來設定要有幾個區塊,這邊設定為五個;同樣的道理,Y軸則是使用yasis的方式。因此程式碼會修改成這樣:
# 畫圖
plt.plot(df["TradeDate"], df["Taiex"],"r") # (x軸資料, y軸資料, 線的顏色)
plt.title("Taiex", {"fontsize":15}) # 設定圖的標題及文字大小
# 設定X軸刻度
ax = plt.gca()
ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(5))
# 設定y軸刻度
ax.yaxis.set_major_locator(matplotlib.ticker.MaxNLocator(10))
圖片中就可以看到X軸和Y軸的跟昨天看起來不一樣,
同樣的,把這樣的概念,放在疊圖中也能達成目標,因此會從:
變成:
仔細在有大行情的時候,如果量有大量出現,就好像圖中間的那幾根長條,之後有幾天會繼續下跌,這個現象非常明顯。而跌一段時間之後,量會變少,這時開始指數往上跑,雖然上漲不明顯,但也是個訊號。
所以我們的訊號可以說最近的加權指數的狀況,當有大跌的時候提醒自己,這時如果量也大量出來,就制作一個告警的訊號,說現在價格跌且大量,這幾天不適合進場,買股票可能會被大盤拖累。
這樣我們就有初步的加權指數與量的訊號燈構想。