發表文章

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

圖片
上一篇 我們處理了CoinGlass的資料,只保留了Binance、OKX、Bybit、Bitget、BingX,5間交易所的資訊,並且將幣種只有一間交易所有上架的刪除。 這時我們要做的是找到各個交易對中最大以及最小的資金費率,相加減後做排序,即是找到的最大套利機會幣種,我們可以用以下程式:

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

圖片
加密貨幣永續合約中的資金費率是一個關鍵的概念,它是用來平衡合約交易價格和標的資產市場價格之間的差異的機制。這個機制的目的是確保合約的價格與標的資產市場價格保持一致,防止合約出現巨大的價格差異。(以上資訊由ChatGPT生成)  資金費率每8個小時計算一次,資金費率為負,空頭合約持有者支付資金費率給多頭合約持有者,反之資金費率為正,多頭合約持有者支付資金費率給空頭合約持有者,因為交易所的資金費率不同,當差距較大時,我們可以在兩間不同交易所各開一個價格數量相同但是多空不同的倉位,這樣會讓我們多空單的盈虧總合為0,但是在結算資金費率時套利出資金費率。 可以藉由觀察CoinGlass中的 資金費率套利頁面 ,查詢現在有套利空間的交易對,

使用證交所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達成影像形態學處理(不使用Opencv函式庫)

圖片
  1.    研究動機 在進入專題實驗室時,觀看 DeltaMOOCx 的線上課程,看到形態學的操作,覺得使用函式可以快速的達成功能,但是我不禁思考如果不使用函式,自己是否可以完成,本研究使用 opencv 的 cv2.getStructuringElement() 、 cv2.erode() 、 cv2.dilate() 、 cv2.morphologyEx() 函式當作對照組與不使用函式之結果進行比較。 2.    研究步驟 2.1 結構元素 (Structures Element) 結構元素為型態學的必備元素,結構元素的大小可以使用者自訂, opencv 函式中可以自訂為交叉 、 長方形 、 橢圓形 ,本研究對照組的 opencv 函式中使用的結構元素為 3x3 的交叉區塊,因此不使用 opencv 函式的實驗組的結構元素也為 3x3 的交叉區塊。 2.2 膨脹 (Dilation) 膨脹操作是將結構元素逐個像素的由上而下 、由左至右的掃描,假如結構元素的原點與被掃描圖像該點像素值相同,則將整個結構元素覆蓋至該圖像。 圖一 形態學膨脹操作 2.3 侵蝕 (Erosion) 侵蝕操作是將結構元素逐個像素的由上而下 、由左至右的掃描,假如整個結構元素與被掃描圖像像素值相同,則將結構元素的原點覆蓋至該圖像。 圖二 形態學侵蝕操作 2.4 斷開 (Open) 先侵蝕,接著再膨脹。 圖三 形態學斷開操作 2.5 閉合 (Close) 先膨脹,接著再侵蝕。 圖四 形態學閉合操作 3.    實驗結果 以下是實驗組與對照組的結果表格 : 4.    結論 經過了形態學的練習,不管事程式亦或是觀念都有一定的提升,我覺得可以把結構元素跟      圖像做捲積,再做加減運算,或許可以達成更快的速度。線上課程中,還有教到濾波,邊緣偵測等影像處理的方法,也是日後挑戰的題目。

使用YOLOV3達成物件偵測功能(使用IDE輸出)

圖片
  1. 研究動機 在人工智慧概論中,老師介紹了數種的深度學習算法,例如 VGG16 、 ResNe t ,物件偵測的算法 Mask-Rcnn 、 Yolo 等,我對物件偵測非常的有興趣,在網路上搜尋作法時,發覺 Yolo 是一個包裝好的套件,舉凡預測影片圖片,都需要使用 Yolo 的指令,因此我想將 Yolo 的功能,搬移到用一般的 IDE 也可以使用 Yolo 。 2. 研究步驟 2.1 獲得 yolo 之預測輸出 Yolo 演算法的 darknet 資料夾中,有一個名為 darknet.py 的 python 檔案,為作者讓使用者自行使用的 python 接口,不過由於該檔案預測目標的座標是輸出錯誤的,因此需要先更改檔案使其預測正確,以下為使用更改後的 darknet.py 預測輸出結果之截圖,該檔案會回傳預測之陣列,內含預測之類別以及該類別之座標 3. 實驗結果      以下為單張圖片之範例, 獲得座標之後即可依照座標使用 opencv 函式庫標出方框,這樣的輸出結果跟 yolo 指令的輸出結果一模一樣,但是藉由獲得預測的輸出座標,可以產生更多的運用。 圖一 Yolo 執行畫面 、 程式動態影片 4. 結論 在把 yolo 搬移到 IDE 上執行後,更多可能的應用例如 : 即時影片馬賽克 、計算物體的出現次數等等,相信在未來需要使用到目標檢測的算法時,可以更為得心應手。

使用DLIB函式庫達成即時人臉辨識功能

圖片
  1. 研究動機 在大二上學期時,想要做出一個人臉門禁系統,在網路搜尋時,搜尋到 Dlib 這個函式庫,他提供了眾多的預訓練模型, 本作品使用 Dlib 函式庫搭配 tkinter 套件製作 GUI ,並且用到了本課程教的陣列運算,達成即時人臉辨識的功能。 2. 研究步驟 2.1 系統流程圖 圖一 系統流程圖 2.2 獲得人臉位置 在一張圖像中,我們要先辨識圖片中的人臉及其位置,在 Dlib 函式庫中,是以 CNN 的方法來獲得人臉的位置, Dlib 提供了已經訓練好的模型,在程式中只要使用 dlib.cnn_face_detection_model_v1 函式即可使用此模型,在該步驟中,此函式可以回傳檢測到人臉的數量以及座標。 圖二 獲得人臉位置功能圖例 2.3 獲得人臉關鍵點 在獲得人臉的數量以及座標之後,由於人臉有許多的器官,例如鼻子、眉毛等等, Dlib 規範了 68 個人臉的關鍵點,使用 dlib.shape_predictor 函式可以得到人臉 68 點關鍵點的座標,以更好的辨識人臉。 圖三 獲得人臉關鍵點 功能圖例 2.4 獲得人臉特徵向量 在人臉辨識中,最後需要將所辨識到的人臉轉成特徵向量,才可以快速地比較,如果是將人臉以圖像的方式比對,將會耗費很多的資源,在 Dlib 中作者提供了使用 29 層 ResNet 訓練而成的模型,在輸入了圖片以及關鍵點後 dlib.face_recognition_model_v1 這個函示會輸出 128 維的特徵向量,用來跟資料庫的特徵向量做比對。 圖四 獲得人臉特徵向量 功能圖例 2.5 比對相似人臉 獲得人臉特徵相量後,必須與資料庫的特徵向量比對,比對方法為先將人臉特徵向量減去資料庫的向量再取歐式距離,擁有最小歐式距離並且歐式距離小於自訂閾值的人臉標籤即是系統辨識出之人臉。 3. 實驗結果 在 GTX1050 顯示卡運算下,在 640x480 的尺寸中,將 1 幀畫面辨識出其中人臉,耗時僅 0.1 秒,是可以達到串流功能的,以下是靜態的執行畫面。 圖五程式執行畫面 、 程式動態影片 (google 雲端 ) 4. 結論 Dlib 中,使用 CNN 作為人臉偵測的方法, CNN 的方法雖然精度很高,但是需要的運算效能非常多,在像是樹梅派 嵌入式系統,是不能達成即時的

cv2.Laplacian

圖片
仔細看一下這個 3×3 kernel,有沒有注意到該 kernel 的九個值全部加起來為 0(-1×8+8=0)?也就是說,當影像區域的色彩一致時(可能為背景),kernel 計算出的平均值為 0,代表輸出值(kernel anchor)等於 0(黑色),而倘若影像區域的中間顏色比周圍亮(代表可能為物體的交界處),此時 kernel 中間的數值 8 便會強化加大該交界值而變得更亮,-1 則淡化了周圍非物件邊緣的像素強度,使得整體算出的輸出值(kernel anchor)更大。 程式碼: import cv2 img=cv2.imread("8.png",0) gray_lap = cv2.Laplacian(img, cv2.CV_16S, ksize=3) """ 即Sobel函式求完導數後會有負值,還有會大於255的值。 而原影象是uint8,即8位無符號數,所以Laplacian建立的影象位數不夠,會有截斷。 因此要使用16位有符號的資料型別,即cv2.CV_16S。 """ dst = cv2.convertScaleAbs(gray_lap) # 轉回uint8 """ convertScaleAbs函數是一個位深轉化函數,可將任意類型的數據轉化為CV_8UC1。具體數據處理方式如下: (1). 對於src*alpha+beta的結果如果是負值且大於-255,則直接取絕對值; (2). 對於src*alpha+beta的結果如果大於255,則取255; (3). 對於src*alpha+beta的結果是負值,且小於-255,則取255; (4). 對於src*alpha+beta的結果如果在0-255之間,則保持不變; """ print(dst) cv2.imshow("orign", img) cv2.imshow('laplacian', dst) cv2.waitKey(0) cv2.destroyAllWindows() 結果: 參考: https://blog.csdn.net/u013230291/article/details/100557267