在這篇文章中,我們將介紹如何使用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函數
步驟五:定義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幫我畫了隻可愛貓咪在裡面
實際執行畫面
它顯示出一隻可愛貓咪
告訴我現在為看漲然後告訴現在時間是幾點
之後幫我下了一單多單,還成功成交
之後我要做的事情就是確保網路不要斷線,電腦不要掛掉
就可以免去人為的感情因素由程式自動化幫我買進賣出
我的文章到此結束如果您喜歡這篇文章歡迎訂閱按讚
或是請我喝杯咖啡
感謝你的收看😃
完整代碼連結: