用不到150行python代碼打造專屬你自己的自動化binance自動下單交易程式

2023/03/01閱讀時間約 12 分鐘
  • 文內如有投資理財相關經驗、知識、資訊等內容,皆為創作者個人分享行為。
  • 有價證券、指數與衍生性商品之數據資料,僅供輔助說明之用,不代表創作者投資決策之推介及建議。
  • 閱讀同時,請審慎思考自身條件及自我決策,並應有為決策負責之事前認知。
  • 方格子希望您能從這些分享內容汲取投資養份,養成獨立思考的能力、判斷、行動,成就最適合您的投資理財模式。
在這篇文章中,我們將介紹如何使用Python來創建自動化的Binance交易程式。我們將利用Binance API,這是一個允許我們通過程式訪問Binance交易所的接口。這樣,我們就可以在程式中設定交易策略和條件,自動下單交易。
在開始之前,您需要先申請一個Binance交易所帳戶。
可以掃我的QR CODE來建立binance帳戶,這樣我們都會取得價值100美金的手續費反現卷。
接下來,請按照以下步驟進行操作:

步驟1:安裝必要的庫

在Python中,有一些庫可以用來訪問Binance API,這裡我們會使用Binance API庫。您可以使用以下命令在終端中安裝該庫:
pip install python-binance

步驟2:設置API密鑰

要訪問Binance API,您需要在Binance交易所中創建一個API密鑰。在Binance中,請前往“帳戶設置”>“API管理”,並創建一個新的API密鑰。請注意,請務必保護好您的API密鑰,以防止濫用。

步驟3:創建Python腳本

現在,讓我們開始創建Python腳本。以下是一個簡單的範例程式碼,它可以幫助您開始使用Binance API進行交易:
主程式
沒錯主程式就只有15行,定義了一個while迴圈讓他持續執行,並且在每一次迴圈
做以下幾件事情:
1.利用get_signal函數取得漲跌方向,BUY,SELL,PASS
2.取得當前時間
3.將多空方向和當前時間打印在屏幕上
4.若有出現BUY或SELL的訊號則發送此訊號至telegram
同一時間利用place_order函數串接binance api光速下單
5.這裡設定60*15是因為我的交易頻率是15分鐘,因此等待下一根k棒出現
6.刷新屏幕

步驟4:定義place_order函數

其中api_key和api_secret可以到binance api官方網站取得

步驟五:定義send_to_telegram函數

其中apiToken跟chatID的取得方式如下:
首先手機安裝telegram然後打開telegram搜索好友輸入bot
尋找一個叫做BotFather和IDBot的傢伙

跟BotFather聊天

輸入/newbot

之後他會問你要取什麼名字,注意名字要用bot結尾,之後如果沒有跟別人撞名
應該就會新建好一個bot同時他會告訴你該bot的apiToken
chatID取得:
這個更簡單了跟IDBot聊天輸入:/start
IDBot就會回覆你一個chatID

步驟六:定義get_signal函數

這邊我們可以使用finlab_crypto套件幫忙製作
import numpy as np
import finlab_crypto
from finlab_crypto import Strategy
pairs = ['BTCUSDT'] #交易對
freq = '15m' # 資料頻率
n1n2 = {}
for i in pairs:
    n1n2[i] = []
def Optimization(pair,freq):
    # 歷史價格數據
    ohlcv = finlab_crypto.crawler.get_nbars_binance(pair,freq,10000,client)
    #定義策略
    @Strategy(sma1=20, sma2=60)
    def sma_strategy(ohlcv):
    # 定義均線策略進出場條件
        close = ohlcv.close
        sma1 = close.rolling(sma_strategy.sma1).mean()
        sma2 = close.rolling(sma_strategy.sma2).mean()
        entries = (sma1 > sma2) & (sma1.shift() < sma2.shift())
        exits = (sma1 < sma2) & (sma1.shift() > sma2.shift())
        figures = {'overlaps': {'sma1': sma1,'sma1': sma2}}
    return entries, exits, figures
    # 策略超參數
    variables = {
    'sma1': np.arange(5, 100, 5),
    'sma2': np.arange(5, 200, 5),
    }
    #回測及優化
    portfolio = sma_strategy.backtest(ohlcv, variables=variables, freq=freq ,plot=True)
    temp = portfolio.total_profit()[portfolio.total_profit()==portfolio.total_profit().max()].to_frame().reset_index()
    n1n2[pair] = [temp['sma1'].values[0],temp['sma2'].values[0]]
for pair in pairs:
    portfolio = Optimization(pair,freq)
其中在這一段
#定義策略
@Strategy(sma1=20, sma2=60)
def sma_strategy(ohlcv):
# 定義均線策略進出場條件
close = ohlcv.close
sma1 = close.rolling(sma_strategy.sma1).mean()
sma2 = close.rolling(sma_strategy.sma2).mean()
entries = (sma1 > sma2) & (sma1.shift() < sma2.shift())
exits = (sma1 < sma2) & (sma1.shift() > sma2.shift())
figures = {'overlaps': {'sma1': sma1,'sma1': sma2}}
return entries, exits, figures
定義了一個簡單的雙均線策略,黃金交叉買進死亡交叉賣出,但是問題來了
我們怎麼知道最好的兩條均線參數是多少呢?sma5 sma10 sma20 sma60?
portfolio = sma_strategy.backtest(ohlcv, variables=variables, freq=freq ,plot=True)
temp = portfolio.total_profit()[portfolio.total_profit()==portfolio.total_profit().max()].to_frame().reset_index()
n1n2[pair] = [temp['sma1'].values[0],temp['sma2'].values[0]]
於是上面這一行代碼就是在做backtest回測尋找最佳的均線參數
並且還可以看到回測結果
以及夏普ratio和pbo(策略是overfitting的機率)
一般來說建議pbo小於30%才建議使用sharpe_ratio大於0才建議使用
小知識:
在1976年到2011年期間,波克夏·哈薩威公司的夏普比率為0.76,高於任何其他股票或有超過30年歷史的互惠基金。同期股票市場的夏普比率為0.39。
因此我這個回測結果還算堪用,他幫我找了許多組的雙均線組合
最後發現最好的是[65,95]這一組
於是我們就可以用sma65和sma95來製作一個簡單的雙均線策略基於這個概念
打造一個get_signal函數
def get_signal(
    pair='BTCUSDT',
    freq='15m',
    n_bar = 10000,
    client = client,
    n1 = 65,
    n2 = 95,
    ):
    # get data
    ohlcv = finlab_crypto.crawler.get_nbars_binance(pair,freq,n_bar,client)
    # get signal table
    table = pd.DataFrame()
    table['close'] = ohlcv.close
    table['n1'] = ohlcv.close.rolling(n1).mean()
    table['n2'] = ohlcv.close.rolling(n2).mean()
    table['buy'] = ((table['n1'] > table['n2']) & (table['n1'].shift() < table['n2'].shift())).astype(int)
    table['sell'] = ((table['n1'] < table['n2']) & (table['n1'].shift() > table['n2'].shift())).astype(int)
    table = table.replace(0,np.nan).tail(1)
    if table[['buy','sell']].sum().sum() == 0:
        signal = 'PASS'
    if table[['buy']].values[0][0] == 1:
        signal = 'BUY'
    if table[['sell']].values[0][0] == 1:
        signal = 'SELL'
    return signal,n1,n2
這個函數就是去取得n根k棒(我預設10000根)然後去算兩條均線n1,n2
之後去判斷是黃金交叉還是死亡交叉來return一個signal(BUY,SELL,PASS)
好至此我們先前在步驟3提到所需要的三個函數
1.placer_order
2.send_to_telegram
3.get_signal
全數都完成了
整個資料夾在VSCODE裡面就長這樣
除去README.md就只有兩個檔案其中為了保持main.py清楚明瞭
我把大部分函數都放置在utils.py
包含place_order,send_to_telegram和get_signal
最後怕單純只有cmd的介面太單調了,我請chatgpt幫我畫了隻可愛貓咪在裡面
實際執行畫面
它顯示出一隻可愛貓咪
告訴我現在為看漲然後告訴現在時間是幾點
之後幫我下了一單多單,還成功成交
之後我要做的事情就是確保網路不要斷線,電腦不要掛掉
就可以免去人為的感情因素由程式自動化幫我買進賣出
我的文章到此結束如果您喜歡這篇文章歡迎訂閱按讚
或是請我喝杯咖啡
感謝你的收看😃
完整代碼連結:
為什麼會看到廣告
人工智能工作經驗跟研究
留言0
查看全部
發表第一個留言支持創作者!