用Python投資加密貨幣:用AWS Lambda即時更新交易訊號 (Part 11)

thumbnail 6 4

上一個單元中,大家都已經操作好了 AWS Lambda,建立一個簡單的 Hello World。接下來,我們就可以開始建構,比特幣的交易系統了!

首先,可以先在 local 端架設環境,方便我們確認程式可以跑,之後再把它複製到雲端即可。

首先在本地端先安裝 python-binance,用來收報價與下單:

pip install python-binance

再來,撰寫交易系統的程式碼:

from binance.client import Client

# get price from binance api
client = Client()
klines = client.get_historical_klines("BTCUSDT", Client.KLINE_INTERVAL_4HOUR, "two week ago")

# function to calculate sma value
def sma(n):
    return sum([float(k[4]) for k in klines[-n-1:-1]])/n

# function to calculate previous sma value
def prev_sma(n):
    return sum([float(k[4]) for k in klines[-n-2:-2]])/n

# calculate sma 5 and 65
sma60 = sma(65)
sma5 = sma(5)

# calculate previous sma 5 and 65
psma60 = prev_sma(65)
psma5 = prev_sma(5)

# golden cross
if sma5 > sma60 and psma5 < psma60:
    print('flip to long')
    
# dead cross
if sma5 < sma60 and psma5 > psma60:
    print('flip to short')

# hold for short
if sma5 < sma60 and psma5 < psma60:
    print('hold short')

# hold for long
if sma5 > sma60 and psma5 > psma60:
    print('hold long')

以上,我們建構一個簡單的程式碼,每次執行,都可以產生出當前的訊號!這個策略,就是我們在前個單元中,經過優化後的均線策略,這邊我們用不同的方式撰寫一次。

接下來,就是將以上的程式碼,移到 AWS Lambda 上!

首先,跟剛剛一樣,在 Lambda 上,我們可以先來安裝:Binance 的 API,來獲取報價跟下單!

之前,我們只需要使用:
pip install python-binance
就可以安裝了。

但 AWS 上要安裝 package 呢?AWS 沒有一台 server 可以下安裝指令,所以我們可以先自己下載:「python-binance」這個 package。

壓縮成壓縮檔,這個檔案以AWS的術語,叫做 AWS Layer ,我已經幫大家打包好了,可以點此下載,並將 AWS Layer 上傳上去,方法如下圖:

layer1
layer2 1

就等於是安裝完畢了!

剩下就簡單了!
我們可以到上個單元創建的 Lambda 函數:

lambda select helloworld

並在這個 lambda 函數中,新增我們剛剛上傳的layer:

lambda add layer 1
lambda add layer2

最後,我們點選 Hello Lmabda 並往下拉到程式碼編輯視窗:

lambda editor 1

複製到下方的程式碼,到程式碼編輯視窗之中:

import json
from binance.client import Client

def lambda_handler(event, context):
    
    client = Client()
    
    klines = client.get_historical_klines("BTCUSDT", Client.KLINE_INTERVAL_4HOUR, "two week ago")
    
    def sma(n):
        return sum([float(k[4]) for k in klines[-n-1:-1]])/n
    
    def prev_sma(n):
        return sum([float(k[4]) for k in klines[-n-2:-2]])/n
    
    sma60 = sma(65)
    sma5 = sma(5)
    
    psma60 = prev_sma(65)
    psma5 = prev_sma(5)
    
    ret = ''
    
    if sma5 > sma60 and psma5 < psma60:
        ret = 'flip to long'
        
    if sma5 < sma60 and psma5 > psma60:
        ret = 'flip to short'
        
    if sma5 < sma60 and psma5 < psma60:
        ret = 'hold short'
    
    if sma5 > sma60 and psma5 > psma60:
        ret = 'hold long'

    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('btc-trading-signal: ' + ret)
    }

點選「測試」按鈕後,可以用了!

result 3 1

上圖中,顯示「hold short」代表我們現在是持續偏空的狀態,每次按一下 test ,
就可以顯示目前的訊號喔!

目前我們要登入AWS,並且執行 lambda 才能看到訊號,有點麻煩呀!

所以在下一個單元,我們將會分享:
怎麼樣從手機上看到交易訊號
以及把這個交易訊號實際下單的方法!
可以到粉專按讚追蹤,才不會錯過我們每週的更新喔!

如果喜歡我們的文章,也歡迎參考我們最新募資的線上課程「用 Python 理財:打造加密貨幣實戰策略」,在線上課程中,我們會更有系統、更完整地教您如何從無到有,打造10種加密貨幣實戰策略,並且能夠自動化雲端交易!有興趣的話,可以點此觀看課程介紹影片喔!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!