使用證交所csv資料應用至 LINE Notify執行收盤買賣超回報
import wget wget.download('https://www.twse.com.tw/fund/TWT38U?response=csv&date=20210118')這時下載完成的檔案會是CSV檔,檔名是法人編號+日期.csv,打開此3個CSV檔可以發現前3行跟倒數後7行都是無用的資料,如下圖:
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建立連接
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伺服器上雲端執行程式
$ 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檔案名稱
- https://engineering.linecorp.com/zh-hant/blog/using-line-notify-to-send-stickers-and-upload-images/
- https://engineering.linecorp.com/tw/blog/detail/88/
- http://pythonorz.blogspot.com/2017/12/python-line-notify-line-notify-line.html
- http://pythonorz.blogspot.com/2017/12/python-line-notify_18.html
- https://yeeinhole.github.io/2020/03/20/heroku-trelloXline/
留言
張貼留言