用Python打造加密貨幣算法交易機器人 原創
大家好,我是橙哥!今天我們來聊一聊Freqtrade,Freqtrade是一個開源的加密貨幣量化交易機器人,用Python編寫。它支持主流的交易所,可以通過Telegram或網頁界面來控制,還提供回測、圖表和資金管理工具,并可以通過機器學習來優化交易策略。
下面我們來了解一下freqtrade的工作原理,看看如何使用命令行工具下載歷史數據,創建新的配置文件和新的策略;如何使用Python和Pandas編寫策略:我們將定義一個簡單的移動平均策略,在以太坊(ETH)和比特幣(BTC)之間進行交易,來增加持有的比特幣數量。我們可以用freqtrade進行以下操作:
開發策略:輕松使用 Python 和 pandas 開發策略。我們將在下面創建一個簡單的策略,freqtrade 有一些示例策略倉庫。
下載市場數據:快速下載你選擇的加密貨幣的歷史價格數據。
回測:查看你的策略在現實世界中是否有盈利機會。
優化:使用 hyperopt 為你的策略找到最佳參數。
選擇交易對:你的選擇可以是靜態的或基于簡單過濾器的動態選擇,例如交易量大于某個數量。
模擬運行:使用模擬錢包在實時數據上測試策略。
實時運行:通過加密貨幣交易所的 API 使用真實資金部署策略。
使用 Telegram 機器人:通過 Telegram 控制和監控你的策略。
分析和可視化交易歷史:利用保存文件或 SQL 數據庫中的交易數據。
Freqtrade 的安裝
讓我們從安裝開始,Docker 是所有安裝方法中最便捷的方式。你需要先安裝 Docker 和 docker-compose,然后通過啟動 Docker Desktop 確保 Docker 正在運行。現在可以通過在你想要的目錄中發出以下命令來設置 freqtrade:
現在應該會有以下目錄結構:
要驗證 freqtrade 是否已正確安裝并準備好使用,請運行幫助命令:
你會看到以下輸出:
幫助命令的輸出列出了所有可用的freqtrade命令。在這一部分,我們將探討最重要的命令及其使用方法。首先是回測。
回測:freqtrade測試交易策略的方法
在下面,我們將創建一個簡單的策略并在歷史數據上進行回測。通過歷史數據測試策略,模擬策略預期的交易行為。雖然這不能保證在實盤中的表現,但它是一個獲勝/虧損策略的參考。
Freqtrade通過以下步驟進行策略回測:
為配置文件中提供的貨幣對(如ETH/BTC、ADA/BTC、XRP/BTC等)加載歷史數據;
調用策略的bot_loop_start()函數一次。這在實時運行中啟動一個新循環,而在回測中只需要一次;
調用populate_indicators()方法計算每個貨幣對的技術指標;
調用populate_buy_trend()和populate_sell_trend()方法計算每個貨幣對的買賣信號;
如果策略實現了,通過調用confirm_trade_entry()和confirm_trade_exit()方法確認買賣交易;
遍歷每個時間段(如5分鐘、1小時、1天等),模擬入場和出場點;
生成回測報告,匯總所有交易及其在指定期間的盈虧情況。
下載數據
要進行回測,我們需要從交易所獲取歷史價格數據。讓我們使用以下命令從Binance下載一些數據:
該命令的參數告訴freqtrade以下內容:
-p ETH/BTC - 下載以太坊(ETH)-比特幣(BTC)對的數據
-t 1d - 下載時間周期為1天的數據
--timerange 20200101-20201231 - 下載2020年1月1日至12月31日的數據
--exchange binance - 從Binance下載數據。在這里,您可以使用freqtrade支持的任何交易所
此命令生成了以下文件:
其中包含多個開盤-最高-最低-收盤-成交量(OHLCV)數據記錄,如下:
列的含義如下:
時間:Unix 時間戳(毫秒)
開盤價:蠟燭圖開盤價最高價:蠟燭圖最高價
最低價:蠟燭圖最低價
收盤價:蠟燭圖收盤價
成交量:交易量,以基礎貨幣顯示,本例中為 ETH。BTC 為報價貨幣。
這些數據可以整齊地顯示在以下蠟燭圖表中:
如何解讀上面的圖表
上面的圖表使用蠟燭圖來表示比簡單線條更多的信息。你可以在下面的圖片中快速了解蠟燭圖的含義。
從上一節中的OHLCV行示例,你可以看到每個蠟燭圖代表每行數據的開盤、最高、最低、收盤部分。
現在我們已經看到了數據的示例并理解了每行的含義,讓我們繼續配置freqtrade以運行策略。
Freqtrade配置
我們已經有了回測策略所需的數據,但我們還需要創建一個配置文件,這將使我們能夠輕松控制策略的幾個參數。
要創建新的配置,我們運行以下命令:
你會看到一些初始問題,回答如下:
下面,我們需要打開配置文件并設置 pair_whitelist = ["ETH/BTC"],這將設定我們關注的貨幣對。然后我們就可以開始了。
實現一個簡單的自定義策略 - 移動平均交叉
這個交易策略其實非常簡單,我們只需要做對兩件事:
低價買入
高價賣出
真的這么簡單嗎?有什么需要注意的嗎?難點在于準確找到實際的低點和高點。移動平均策略背后的想法如下:
你有兩條線:
慢速移動平均線(SMA):長期平均值,代表一般趨勢。
快速移動平均線(FMA):短期平均值,代表當前趨勢。
對于我們的策略,我們將使用以下指標:
當FMA上穿SMA時買入,表示上升趨勢。
當FMA下穿SMA時賣出,表示下降趨勢。
這就是所謂的移動平均交叉策略。
freqtrade 的策略實現
讓我們使用 pandas 實現 freqtrade 中的移動平均交叉策略。
首先,我們需要創建一個新的策略文件,該文件將包含我們買賣信號背后的邏輯。
現在,我們可以在策略文件夾中找到新創建的文件:
SimpleMA_strategy.py
包含一個自動生成的類 SimpleMA_strategy 和幾個我們需要更新的函數。
為了定義我們的簡單策略,我們需要更新以下三個函數:
populate_indicators()
populate_buy_trend()
populate_sell_trend()
讓我們逐一了解這些函數。
- populate_indicators()
在這里,我們計算策略所需的指標,以生成買賣信號。
根據我們的策略,我們計算快線fast_MA(基于最近5根K線圖)和慢線slow_ma(基于前50根K線圖):
2. populate_buy_trend()
此函數生成我們的買入信號,當快速移動平均線(fast_MA)上穿慢速移動平均線(slow_MA)時觸發。
我們可以通過更新 populate_buy_trend() 來加入以下邏輯,以完成這個任務:
使用qtpylib,我們可以輕松找到均線交叉點。本質上,上面的代碼在滿足買入條件(crossed_above)時,將買入列設置為1。
- populate_sell_trend()
與前一個函數類似,此函數生成我們的賣出信號。
根據我們的策略,當fast_MA線低于slow_MA線時的代碼如下。
我們現在使用crossed_below——與crossed_above相反的信號——當我們的賣出條件被觸發時,它會在賣出列中標記為1。
默認情況下,生成的freqtrade策略文件包含更多選項,例如ROI(投資回報率)和止損,后面我們再討論,現在將暫時禁用它們。
既然我們已經制定了一個策略,我們可以測試它在過去數據上的表現。
回測策略定義了我們的簡單策略后,現在我們想使用歷史數據對其進行評估,通過回測,我們可以在過去模擬交易,以評估其表現。
回測并不能完全反映策略在實際市場中的表現,因為在實時市場中,其他因素會影響回報,例如滑點。
要使用freqtrade進行回測,我們可以運行以下命令,利用我們剛剛創建的類和函數:
命令參數如下所示:
-p ETH/BTC - 交易 ETH/BTC 對,用我們的 BTC 換取 ETH
--timerange 20200101-20201231 - 回測 2020 年的數據,從 2020 年 1 月 1 日到 2020 年 12 月 31 日。
c ./user_data/config-learndatasci.json 使用的是本文前面定義的配置文件。
--starting-balance 1 初始余額為 1 BTC。
我們獲得了一份完整的報告,其中包含在指定期間內所有交易的成果。
Freqtrade將報告分為四個部分:
- 回測結果報告:本部分顯示每個幣對的性能報告,在我們的例子中,只有ETH/BTC。列“平均利潤%”顯示所有交易產生的平均利潤,而列“累計利潤%”匯總了所有利潤/虧損。列“總利潤百分比”則顯示相對于初始余額的總利潤百分比。
- 賣出原因分析:該報告向我們展示了賣出原因的性能。根據我們的策略,我們只使用了賣出信號,所以我們只有一行。通常,我們還可以因其他原因賣出,例如接受的回報率(ROI)和止損。我們將在系列的下篇文章中看到這一點。
- 未平倉交易分析:該報告部分顯示在回測結束時未平倉的任何交易。在我們的例子中,我們沒有任何未平倉交易,通常這并不非常重要,因為它代表了回測的結束狀態。
- 總結指標:就我個人而言,這是我通常首先查看的區域。最需要指出的部分如下:
每日交易次數 - 每天平均完成的交易數量。我通常尋找每天大約進行十筆交易的策略。
總利潤百分比 - 以初始余額的百分比表示的利潤。
最大回撤 - 最大連續虧損的金額
市場變動 - 在指定期間內市場增長/縮減的幅度。當交易多個幣對時,此指標是所有幣對從指定期間開始到結束的市場變動的平均值。在我們的例子中,ETH/BTC市場增長了24.93%。在不同的市場條件下測試策略至關重要,而不僅僅是在上漲市場中。
我們可以看到只發生了六筆交易。這些交易產生了5.09%的利潤,初始為1 BTC,最終為1.05086506 BTC。
考慮到涉及的風險,這一結果并不令人印象深刻。然而,這個策略非常簡單,有很大的改進空間:
與買入并持有相比 僅僅持有ETH,即在測試期開始時將我們的全部BTC轉換為ETH,我們將獲得24.93%的收益(市場變動指標),但這并不是我們通??梢灶A期的。我們每次交易只投入了10%的倉位,而不是全部。在不同的條件下測試我們的策略非常重要——不僅在市場上漲時,也在市場下跌時。
交易更多幣對:我們只考慮了以太坊,這是我們可以交易的數百種幣之一。這種限制只允許一次進行一筆交易,這顯然不是最優的。
使用更高級的策略:我們使用了可以說是其中最簡單的策略之一,僅使用簡單移動平均線作為指標。增加復雜性并不一定意味著更好的性能,但我們可以對許多指標組合進行回測,以找到最佳策略。
參數優化:目前,我們尚未嘗試優化任何超參數,例如移動平均周期、回報率和止損。
更短的時間周期:我們只考慮了每日蠟燭圖,這也是為什么機器人每天只找到大約0.02筆交易,遠少于人工交易。機器人通過更頻繁的交易和查看更詳細的蠟燭圖,有可能獲得更多利潤。
繪制結果要使用freqtrade的繪圖命令,我們需要修改docker-compose.yml文件。我們唯一需要做的就是注釋掉一行并取消注釋另一行。請查看示例:
這會指示 docker-compose 拉取包含正確繪圖庫的 freqtrade Docker 鏡像。
現在可以使用 freqtrade plot-dataframe 命令來可視化數據、指標以及買賣信號。
--indicators1 選項定義了我們想要繪制的指標,即 fast_MA 和 slow_MA。這些指標必須在 -s 選項指定的策略內定義。
默認情況下,這會在 plot 目錄中創建一個可用的 plotly html 文件:./user_data/plot/freqtrade-plot-ETH_BTC-1d.html
在圖表上,可以觀察機器人如何按照我們定義的簡單移動平均策略執行操作:
- 當fast_MA上穿slow_MA時買入。
- 當fast_MA下穿slow_MA時賣出。
要了解更多plot-dataframe的功能,請運行docker-compose run --rm freqtrade plot-dataframe -h或訪問相關文檔。
總結
在本文中,我們只是看到了freqtrade可以做的一小部分:
- 使用pandas定義自定義策略。
- 使用歷史數據進行回測并生成相關報告。
- 使用plotly繪制結果并可視化模擬交易。
后面我們將了解更多freqtrade的高級用法,我們將添加更多交易對,討論投資回報率(ROI)和止損,并正確地定義它們。使用hyperopt優化我們的策略,部署一個實時交易機器人,以及討論更多高級改進方法。
本文轉載自公眾號開發者阿橙 ,作者:橙哥
