使用證交所csv資料應用至 LINE Notify執行收盤買賣超回報

證交所皆有提供收盤資料至網站中,這次要研究的是三大法人(外資投信自營商)的收盤買賣超資料,詳細的資料在此頁面的右下角:


這時點進外資及陸資買賣超彙總表可以發現該頁面有提供CSV檔案下載,將滑鼠移至CSV下載的按鈕之後,瀏覽器的左下角會出現一行網址:


此行網址代表可以讓使用者像伺服器發出請求下載這個檔案,因此只要複製這個網址在任何瀏覽器搜尋,會直接下載這個檔案,這時可以通過觀察外資投信自營商各自頁面的CSV下載按鈕,發現各自的網址是:

外資:https://www.twse.com.tw/fund/TWT38U?response=csv&date=20210118
投信:https://www.twse.com.tw/fund/TWT44U?response=csv&date=20210118
自營商:https://www.twse.com.tw/fund/TWT43U?response=csv&date=20210118

經由觀察發現只要修改網址後面的"date="參數以及/fund之後的三大法人編號,即可下載當日三大法人的買賣超資料,我們可以使用Python的wget套件下載資料,範例如下:
import wget
wget.download('https://www.twse.com.tw/fund/TWT38U?response=csv&date=20210118')
這時下載完成的檔案會是CSV檔,檔名是法人編號+日期.csv,打開此3個CSV檔可以發現前3行跟倒數後7行都是無用的資料,如下圖:




我們可以用python讀入csv檔,再將上圖紅框處的無用資料慮除。
number=[] #建立number陣列
f = open(csvfilename, newline='', encoding='cp950') #csvfilename是檔名
rows = csv.reader(f, delimiter=',')
for row in rows:
    number.append(row) #將row讀入number陣列


我們可以發現三大法人的資料有很多列,但是我們只需要證券代號以及買賣超股數,我們還需要對csv做處理才能讀進python的陣列,因此:
number=number[2:-7] #將number陣列前3行跟倒數後7行刪除
stock_name=[] #建立stock_name陣列
stock_vol=[] #建立stock_vol陣列
stock_name=[x[2] for x in number] #將number的第2列(證券代號)存入stock_name陣列
stock_vol=[x[5] for x in number] #將number的第5列(買賣超股數)存入stock_vol陣列


我們就可以判斷stock_vol陣列的成交股數,找出買賣超的前五檔股票了,觀察陣列後發現證交所已經將資料排列好了,因此直接提取陣列前五行就是今天買超的股票了,那賣超的資料呢?賣超的資料是排在所有買超的資料後的,因此我們只須判斷當stock_vol的值是負的之後,再讀5筆資料,就是賣超前五名了。
def Findbestfive(stock_name,stock_vol):
    temp=0
    buyselltop5=[] #建立buyselltop5陣列
    buyselltop5_name=[] #建立buyselltop5_name陣列
    for i in range(len(stock_vol)):
        if i<5:
            buyselltop5.append(stock_vol[i]) #讀取買超前五筆資料並寫入buyselltop5以及buyselltop5_name
            buyselltop5_name.append(stock_name[i])
        if stock_vol[i][0]=="-":
            buyselltop5.append(stock_vol[i])#讀取賣超前五筆資料並寫入buyselltop5以及buyselltop5_name
            buyselltop5_name.append(stock_name[i])
            if temp==4:
                break
            temp+=1
    return buyselltop5,buyselltop5_name #回傳買超賣超前五筆(共10筆)股號及成交量


接著我們獲得buyselltop5,buyselltop5_name這兩個陣列,就可依序讀值並且畫圖

def Drawimage(allbuyselltop5,allbuyselltop5_name): img = np.zeros((450, 1200, 3), np.uint8) img[:] = (255, 255, 255) fontPath = "./TaipeiSansTCBeta-Bold.ttf" font = ImageFont.truetype(fontPath, 30) imgPil = Image.fromarray(img) draw = ImageDraw.Draw(imgPil) draw.text((30, 0),"投信", font = font, fill = (0, 0, 0)) for j in range(len(allbuyselltop5)): for i in range(5): draw.text((30+j*400, (i+1)*30),str(allbuyselltop5[j][i][:-4])+str(allbuyselltop5_name[j][i]), font = font, fill = (0, 0, 255)) draw.text((30, 190),"投信", font = font, fill = (0, 0, 0)) for k in range(len(allbuyselltop5)): for l in range(5,10): draw.text((30+k*400, (l+2)*30+10),str(allbuyselltop5[k][l][:-4])+str(allbuyselltop5_name[k][l]), font = font, fill = (0, 117, 0)) draw.text((30, 420),datestring+"法人買賣超統計", font = font, fill = (0, 0, 0)) img = np.array(imgPil) im=Image.fromarray(img) #im.show() #顯示圖片 im.save( "result.jpg" )




這時本地端的程式就完成了,接下來是與LINE Notify建立連接
建立LINE Notify token以及申請請看
發送圖片請看
以下是發送訊息以及圖片的程式:
import requests, os
def lineNotify(token, msg, picURI):
    
    url = "https://notify-api.line.me/api/notify"
    headers = {
        "Authorization": "Bearer " + token
    }
    payload = {'message': msg}
    files = {'imageFile': open(picURI, 'rb')}
    r = requests.post(url, headers = headers, params = payload, files = files)
    print("傳送成功!")    
    return r.status_code
lineNotify("你的token","hello","result.jpg")


畫圖程式以及發送LINE Notify完成,接下來是push到heroku伺服器上雲端執行程式
首先先建立新的app



建立完app後我們必須使用git套件上傳你的程式:
$ heroku login
$ heroku git:clone -a appname #appname跟你的heroku app名稱是一樣的
$ cd stockbeta1  #cd到你的專案資料夾
$ git add .
$ git commit -am "make it better"  
$ git push heroku master


接著至more-run console輸入python filename.py 注意!filename是你的python檔案名稱
如果沒有報錯就是成功執行


接著要執行自動排程請參考這裡
接著就等到時間一到就可以收到相對應的資料了!


參考資料:

留言

這個網誌中的熱門文章

以dlib實現人臉辨識打卡系統

以python讀取yolo的輸出-darknet.py

使用CoinGlass API及Google Cloud Platform(GCP)結合 LINE Notify執行資金費率套利回報Part.1