Video thumbnail for I tried coding a LLM Crypto Trading Bot (to retire early $$$)

用AI打造加密貨幣交易機器人:提早退休不是夢? (附程式碼教學)

Summary

Language:

Quick Abstract

想了解如何打造一個AI驅動的加密貨幣交易機器人,助您提早退休嗎?本影片將逐步教學如何利用AI在波動的加密貨幣市場中獲利。我們將探索使用大型語言模型(LLM)代理來進行自動交易決策的可能性,並測試不同的交易策略,看看它們是否能勝過簡單的「買入並持有」策略。

  • 快速掌握:

    • 建立一個隨機交易機器人作為基礎,並逐步引入AI邏輯。

    • 使用SerpAPI獲取新聞,並用LLM分析情緒來輔助交易決策。

    • 嘗試不同的LLM推薦策略,包括直接推薦買賣信號。

    • 測試不同的加密貨幣(比特幣、Solana、瑞波幣)和交易策略(做多、做空、長線持有)。

    • 探索反向操作策略,即在負面情緒時買入,並調整風險承受度來優化回報。

    • 學習如何設定止盈和止損,以及管理交易規模。

  • 關鍵字: AI加密貨幣交易機器人

建立加密貨幣的AI交易機器人以提早退休

在加密貨幣領域建立一個AI驅動的交易機器人可以幫助你提早退休。加密貨幣有幾個優勢,例如24/7市場開放、潛在的指數級增長以及大量的加密貨幣可供選擇。那麼,如果我們可以利用AI在交易加密貨幣時獲得優勢呢?

準備工作

在開始之前,需要注意的是,加密貨幣交易的文檔不是很好,而且我對加密貨幣也不是很了解。然而,我將嘗試在25分鐘內向你展示如何構建一個交易機器人。

建立一個隨機交易機器人

首先,我將建立一個隨機交易機器人。這是我對模板交易算法的版本。最初,目標是在交易決策中做出隨機選擇,但最終會插入一些AI。

隨機交易機器人有三個關鍵部分:導入依賴項、交易算法和回測。

導入依賴項

最重要的依賴項是Lumiot.strategies.strategy中的策略包裝器,它構成了交易算法的基礎。還需要datetime類來管理日期,Colorama用於終端格式設置,以及random模塊。

交易算法

我將創建一個名為ML Trader的新類,該類將接受我們之前導入的Lumiot策略。在該類中,我將創建三個方法:初始化、頭寸規模和交易迭代。

初始化方法是我們的設置方法。我們將傳遞現金風險(即我們願意承擔的資金量)和我們要交易的加密貨幣。在初始化方法中,我們將設置市場為24/7,睡眠時間為1天(這意味著我們每天只交易一次),設置最後一次交易參數,並設置現金風險和加密貨幣變量。

頭寸規模

頭寸規模框架是良好現金管理框架的一部分。就像在自助餐廳一樣,你不會只吃一種特定的食物。同樣,在我們的交易算法中,我們希望確保將現金或投資組合分散到最佳交易中。

我們可以使用頭寸規模框架來實現這一點。假設我有這麼多現金,我可能只想承擔這麼多風險。但是,我們需要將其轉換為實際要購買的股票數量。因此,我們可以將願意承擔的比例除以股票價格,以計算每次交易要購買的股票數量。

我可以使用self.getcash(Lumiot提供的內置函數)獲取投資組合中的當前現金量。同樣,我可以使用get last price函數獲取特定股票或加密貨幣對的最後價值。我使用之前從Lumbot導入的資產類來定義加密貨幣對。

然後,我所要做的就是獲取現金價值,乘以現金風險(即每次交易願意承擔的金額),並除以最後的加密貨幣價格。同時,我將返回現金、最後價格以及要購買的數量,因為我稍後需要這些數據。

交易迭代

最重要的部分是on trading方法,這是我將納入交易邏輯的地方。首先,我將使用剛剛定義的頭寸規模方法獲取現金、最後價格和數量。如果我有足夠的現金(即現金大於數量乘以最後價格),那麼我將使用random.choice隨機選擇0、1或2。如果是0,我將持有;如果是1,我將買入;如果是2,我將賣出。最終,我將用AI邏輯替換此邏輯。

接下來,我需要下單。讓我們分解一下交易的解剖結構。假設市場開盤,這將為我們提供一組新的加密貨幣價格,即新數據。我要做的下一件事是結束任何方向相反的舊訂單。例如,如果我要下買單,我要結束任何現有的賣單。然後,我需要創建訂單,包括指定我要購買的加密貨幣對、我要購買的價格、我實際要購買的加密貨幣數量,以及是否要指定任何止盈或止損或其他好東西。然後,我所要做的就是將該訂單提交給經紀人並收到確認。我們還將記錄交易。

如果隨機選擇為0,我們將持有。在這種情況下,我們只需要通過pass方法,即什麼都不做。但是,如果我們隨機選擇買入,那麼我將下買單。因此,我要做的是結束任何現有的賣單。然後創建新訂單。在訂單中,我將傳遞資產(即特定的加密貨幣)、數量、是否要買入或賣出、交易類型(在這種情況下是市場交易)。我還可以下括號交易。然後,我需要指定報價類型。這與我們之前視頻中的股票交易略有不同。因此,我必須指定貨幣對的另一半。在這種情況下,是美元。然後,我將使用Colorama打印出來,然後提交訂單。我還將使用self.last trade = buy記錄下來。

我將對賣出側重複完全相同的操作。這一次,如果我們的最後一次交易是買入,那麼我們將結束所有訂單。我們將在創建訂單方法中複製完全相同的操作。唯一的區別是我們將下賣單。然後,我們將提交並記錄我們的最後一次交易。

回測

為了設置回測,我需要指定開始日期和結束日期。然後,我將配置交易所。在這裡,我將其設置為Kraken。如果您查看這裡,我將最小時間步驟設置為1天,這意味著我將每天進行交易。然後,我所要做的就是使用run back test方法啟動回測。我將向該方法傳遞CCXT回測對象、開始日期和結束日期、我要使用的基準資產、報價資產以及我們最初為交易機器人設置的參數,包括現金風險和我要交易的加密貨幣。

現在,我可以通過運行python bot.py來運行交易機器人。這是因為交易機器人嘗試運行的特定日期沒有價格數據。如果我們添加一個條件來雙重檢查並在沒有價格數據時將數量設置為0,以及雙重檢查我們是否有最後價格,那麼也許我們就可以了。

如果我再次嘗試運行它,通過運行Python bot.py,我們就成功了。您可以看到交易機器人已經運行。如果您查看這裡,那就是最終的投資組合價值。

結果

這是詳細的結果集。您可以看到這裡的年回報率為-8.98%。因此,我們從100K開始,現在是83K。我想您可以說事情進展得還不錯,但並非毫無希望,對吧?請記住,這完全基於隨機交易。那麼,如果我實際引入一些邏輯呢?

使用Serpa進行情感分析

我要嘗試做的第一件事是使一個工具工作,該工具接受日期和特定的加密貨幣。我首先要使用的加密貨幣是比特幣,但我們可以在以後擴展它,我們可能會這樣做。然後,我將把它發送到一個工具,該工具允許我搜索互聯網。因此,希望我可以傳遞加密貨幣加上日期並獲得一些新聞。這將允許我將其發送到我正在繪製的美洲駝那裡,理想情況下能夠獲得一些情感回饋。然後,我可以使用此信息來確定是否根據該情感進行交易。

首先,我要導入更多的東西。我要導入time delta,這將幫助我處理日期。然後,我要引入Olama LLM,以便我們可以使用LLM功能並構建我們的代理,以及JSON來幫助我們傳遞一些輸出。我還要引入我已經構建的get web deets實用程序,以及來自我的LLM提示pi文件的提示模板。我稍後會向您展示這個。

然後,我將設置我的LLM。我將使用open Hermes,但我現在傾向於使用Quen 2.514B,但它的效果很好。

我可以使用get datetime方法獲取當前日期。同時,我將使用time delta獲取前一天的日期。這一切都封裝在一個名為get dates的方法中。該方法將以年、月、日格式返回這兩個日期。

現在,我將使用該日期方法獲取特定時期的新聞。因此,大多數交易邏輯最初將封裝在這個下一個函數中,該函數全部與我們為該特定加密貨幣獲得的情感有關。

首先,我將使用self.get dates方法獲取我們要交易或獲取新聞的日期。然後,我將使用get web deets方法。這到底是什麼?我將繼續粘貼這些,但這是我預先定義的一些代碼,它允許您更輕鬆地從LLM代理獲取網絡信息。將其視為網絡搜索工具。

那麼get webds到底是什麼?好吧,如果我們向上滾動,您可以看到那就是方法。因此,它接受新聞開始日期、新聞結束日期以及加密貨幣名稱。如果我傳遞一個特定的加密貨幣名稱,它將搜索該日期附近的新聞。如果我不傳遞名稱,它將搜索比特幣附近的新聞。

回到交易機器人,我將我獲得的新聞數據傳遞到提示模板中,並將其發送到我們的LLM,特別是open Hermes,然後將其作為JSON對象返回。提示模板也可以通過LLM提示文件獲得,這將幫助我實現這個偉大的美洲駝方程,從新聞生成情感以進行交易。

基本上,提示將輸出到我們的LLM的是這個。您是一位有用的金融助理,使用下面的新聞提供有用、無害和誠實的答案。這將是我們要從get web deets工具傳遞的新聞。我們將回應新聞中的情感是正面的還是負面的,並給出情感強度的分數,介於0和1之間。我們將使用關鍵情感和分數進行回應。

因此,這應該允許我們將其提取為JSON對象。因此,我們引入JSON的原因就在這裡。理想情況下,我們應該得到類似這樣的東西。情感為正面,分數為0.2或正面或不是。我們不想回應中性情感或混合情感。我們想要特定的正面或負面。

我所要做的就是運行這個get sentiment函數並從我們設置的JSON對象中提取值。因此,我們現在將在交易循環中擁有情感以及概率。然後,我們將刪除隨機選擇邏輯。

這就是我們的LLM功能發揮作用的地方。因此,如果我們從新聞中獲得正面情感,並且概率超過70%,我們將購買。如果我們有負面情感,我們將賣出。

如果我繼續運行它,錯誤。get web deets工具使用ser來搜索網絡。原來我用完了那些API信用額。所以它失敗了,導致了不夠信用額的問題。很容易解決。我去買了一些。

如果我再次嘗試運行它,看一下。它正在返回新聞,並希望開始進行交易。就是這樣。它正在進行交易。看一下。它實際上正在返回新聞並開始在我們的時間段內進行所有日期的交易。如果我繼續快進,不知何故,這已經賺了幾十萬。我將分享日志,但我認為我們可能運氣不錯。投資比特幣一直是一筆好交易,這也有所幫助。

問題分析

仔細觀察,在這裡左右,交易機器人開始大量做空,這增加了我們可用的現金量。然後,當出現正面買入信號時,它使用該現金餘額來計算交易規模,這使得交易規模非常大。但是,在結束所有做空並進行該筆大額交易後,我們最終得到了負現金餘額。這顯然很糟糕,但我認為有一個簡單的解決方案。與其基於現金確定頭寸規模,我可以基於投資組合價值。如果我將get cash方法更新為get portfolio value方法,那應該就可以了。

如果我再次運行它,我得到了-65.36%的回報。是的,老實說,這並不是很好。它在應該買入時做空,在應該做空或結束時買入。但AI很聰明,對吧?那麼,如果我只是讓代理提供建議,而不是計算情感呢?

代理建議

這一個感覺就像在黑暗中射擊,但為了科學,我們要嘗試一下。在LLM提示文件中,我有一個直接建議的提示模板。

這是直接建議模板。基本上,它將使用下面的新聞生成交易信號。因此,現在我們給代理交易和決定我們做什麼的能力。它應該返回買入、賣出或持有信號,並且仍然會提供0到1之間的信號強度。

現在代理有控制權,因為我們不再獲得情感回饋。我將把這個更新為建議,並把這個更新為買入和賣出。因為記住,我們的代理現在返回買入或賣出信號。

如果我運行它,讓我們看看它的表現如何。所以它說有102%的收益,但如果你仔細看,我們的總回報是-450%。所以回到繪圖板。

嘗試不同的加密貨幣

到目前為止,我們真的只是在交易比特幣。如果我們嘗試一種不同的加密貨幣呢?也許是Solana。好主意。我所要做的就是去更新加密貨幣,並將一個名為coin name的新參數傳遞到我們的初始化方法中。然後,我可以將Solana傳遞給我們的get web deets方法,這將決定我們得到什麼新聞。最後但並非最不重要的是,更新我們傳遞給回測的參數。因此,我們現在的新基準資產是Solana,我們的交易資產也是Solana。

如果我們運行它,看看會發生什麼。好的,-80.36%。所以,我們還沒有達到那裡。

嘗試舊策略

好吧,它在兩種加密貨幣上都不起作用。但是,如果我嘗試我的舊策略,Finnbert ML呢?

因此,我們將引入一個新策略,以便我可以刪除一些舊的東西。因此,Olama LLM、LLM提示、JSON以及Olama LLM類。Finnbert策略與我在原始AI交易機器人視頻中使用的策略相同。所以,希望這次它能奏效。

我將引入alpaca trade API以及我最初在其他視頻中構建的estimate sentiment函數。我將複製代碼。這是GitHub上可用的相同代碼,我將確保所有這些都可用,但總之,它將接受新聞並估計每篇新聞文章的情感,然後創建一個聚合。

我將設置一些alpaca API詳細信息。這允許我們使用他們的新聞API。我將傳遞我的API密鑰、API密碼、基礎URL,將其轉換為字典,然後將其傳遞給我們的packer。為此,我將在我的交易策略類中創建一個新屬性並創建一個休息端點。這個類將允許我們獲取新聞,這意味著我們可以使用它來計算特定加密貨幣的情感,對吧?但我們實際上需要將其烘焙到我們的交易機器人中。到目前為止,我們還沒有這樣做。那麼,讓我們來做吧。

首先,我將更新get dates方法以返回3天的新聞數據,而不是僅僅1天。然後,我將刪除舊的情感代碼。更新日期變量名以引用我們現在返回3天的事實。

然後,我將開始編寫情感代碼。基本上,我們將通過我們的新聞請求將其發送到Alpaka新聞API。然後,我們將傳遞每個標題,以便我們可以提取原始標題到新聞列表中。然後,我們將其發送到我們的estimate sentiment函數,該函數將返回概率和情感,然後我們將其返回給我們的交易機器人以確定如何交易。

on trading iteration方法每個刻度運行一次。因此,我們需要確保更新我們的get sentiment方法以解包我們將獲得概率和情感的事實。

然後,我將將交易邏輯從直接建議反向更改為情感,並將概率提高到0.999,以確保我們有一個非常強的信號。這意味著我們目前相當保守。

與其交易Solana或比特幣(這些加密貨幣有很大的漲幅),我將把它改為瑞波幣,以獲得一個稍微更穩定的加密貨幣進行交易。請記住,我們可以隨時更改回來。因此,如果我們想使用Solana或比特幣重新運行它,我們可以使用該加密貨幣進行回測。也許我們會進行直播。你讓我知道。

如果我們運行它,讓我們更新並擴展我們的日期。讓我們看看會發生什麼。所以我們還在交易。仍然不是很好,對吧?我開始懷疑多空策略是否適合我們。也許我們應該嘗試只做多。

嘗試只做多策略

所以,我不知道。我們將嘗試只做多,看看會發生什麼。

因此,我將刪除所有做空邏輯。因此,基本上,如果我們識別到負面情感,所有觸發的事情。

我需要更改的唯一其他事情是我們如何創建訂單。由於我們不再有效地進行波段交易,我需要確保我們能夠在特定情況下獲取利潤。因此,在這種情況下,我將將止盈設置為購買價格的1.5%,將止損設置為70%。

我將把我的頭寸規模改回get cash,因為我們不再做空,所以我們不應該有之前遇到的問題。

然後我們又開始了。老實說,這看起來好多了。我們仍然沒有盈利。因此,我們的年回報率為-6.5%。但我們沒有像以前那樣損失大量資金。所以也許我們走在正確的軌道上。

反向操作策略

這是我有史以來最偉大的想法。現在,當我有正面情感時,我正在購買。所以我試圖順勢而為。如果我做相反的事情呢?

這將我帶到了最終策略。逆向操作。如果我不是在情感正面時購買,而是在情感負面時購買。所以價格很低。會發生什麼?

為了測試這一點,我所要做的就是在這裡將我們的情感更改為負面。因此,這意味著當情感為負面時,我們的交易將觸發。

讓我們開始吧。提示深潛循環懸念音樂。

好吧,第一次盈利回報。因此,這產生了8.85%的回報,總回報為14%。所以我們成功了。

問題是,這目前是一個相當保守的策略。請記住,我們的概率設置為0.999。所以我們想要一個非常強的指標。如果我們更具侵略性會發生什麼?

我要做兩件事。我將從我們的概率信號中刪除一個9,並將更多的現金風險設置為我們投資組合的50%。因此,這應該做兩件事。這意味著我們將獲得更多的買入信號或更多的負面情感信號。而且由於我們有更多的現金風險,我們將有更大的交易規模。

讓我們開始吧。提示音樂。

好吧,20.04%的回報,總回報為32%。所以,看起來更具侵略性並採取稍大的頭寸規模已經得到了回報。

所有的代碼、交易日志以及所有的幫助函數,所以Finnbert utils以及LLM提示代碼都可以在下面的GitHub上獲得。希望您喜歡這個視頻,我們下期再見。

Was this summary helpful?

Quick Actions

Watch on YouTube

Related Summaries

No related summaries found.

Stay Updated

Get the latest summaries delivered to your inbox weekly.