FinTastic.Trading Body Wrapper

《實測》用ChatGPT執行策略開發、生成程式碼

《實測》用ChatGPT執行策略開發、生成程式碼

上一篇文章中,實測了《使用ChatGPT做美股分析》,有興趣的人可以點擊看一下。ChatGPT的分析挺令人失望的。這次則是要用ChatGPT來進行交易策略開發,並選擇一個方向後要求生成Tradingview的Pinescript程式碼,實際執行歷史回測。在網路上看到有人測試完成後,對這個功能是非常期待的。完成後分享我對ChatGPT幫助生成策略的感想。

以下”Q”為我輸入ChatGPT prompt的問句,下面接續的內容為ChatGPT未經修改的內容。個人看法寫在ChatGPT回答下面,以綠底標示。

Q: 介紹tradingview內的熱門的交易策略

TradingView 是一個流行的交易社區,其中許多交易策略都可以在平台上找到。以下是一些 TradingView 內熱門的交易策略:

  1. 均線交叉:這是一個基本的交易策略,利用兩條移動平均線(一條短期的和一條長期的)的交叉來進行交易。當短期均線上穿長期均線時,通常被視為買入信號;相反,當短期均線下穿長期均線時,通常被視為賣出信號。
  2. RSI:相對強弱指標(RSI)是一種用於衡量股票或其他資產是否超買或超賣的技術指標。RSI 通常在 0 到 100 的範圍內波動。當 RSI 超過 70 時,通常被視為超買信號,因此可能是賣出股票或其他資產的好時機;相反,當 RSI 跌破 30 時,通常被視為超賣信號,因此可能是買進股票或其他資產的好時機。
  3. MACD:移動平均收斂/發散指標(MACD)是一個趨勢追蹤指標,可以用於股票或其他資產的日益增長或日益下降。MACD 線是一條短期指數移動平均線減去一條長期指數移動平均線,而信號線則是 MACD 線的九日移動平均線。當 MACD 線上穿信號線時,通常被視為買入信號;相反,當 MACD 線下穿信號線時,通常被視為賣出信號。
  4. 布林帶:布林帶是一種基於移動平均的技術指標,它由三條線組成:中心線和上下兩條“帶”。中心線是一條移動平均線,上下兩條帶是該移動平均線的標準差。當價格在布林帶的上側時,通常被視為過高,可能

ChatGPT答案算非常基本,雖然無誤,但這些都是非常基本的指標與用法。我想要聽到稍微更複雜一點的交易策略。

Q: 介紹RSI指標

相對強弱指標(RSI)是一種用於衡量股票或其他資產是否超買或超賣的技術指標。RSI 通常在 0 到 100 的範圍內波動。RSI指標可以幫助交易者判斷股票或其他資產是否已經達到了短期過度買入或過度賣出的水平。

RSI 的計算方式是基於過去一段時間內的平均漲幅和平均跌幅來計算的。通常情況下,RSI 以 14 個交易日為計算周期。

當 RSI 超過 70 時,通常被視為超買信號,因此可能是賣出股票或其他資產的好時機;相反,當 RSI 跌破 30 時,通常被視為超賣信號,因此可能是買進股票或其他資產的好時機。

當 RSI 的值超過 50 時,通常被視為股票或其他資產處於上漲趨勢中;相反,當 RSI 的值低於 50 時,通常被視為股票或其他資產處於下跌趨勢中。

需要注意的是,RSI 指標的使用應該結合其他技術指標和基本面分析,不應該只單獨依賴 RSI 指標進行交易。因為 RSI 指標也存在一些缺陷,例如在強勢市場中 RSI 可能會一直維持在高位,因此需要綜合考慮多方面的因素來做出交易決策。

RSI的計算方式解釋不正確,以底線標示。但解讀RSI指數的方法是對的。

Q: 建議使用RSI指標時,搭配哪個技術指標來確認趨勢?

建議使用移動平均線(Moving Average)指標來搭配 RSI 指標來確認趨勢。

移動平均線指標可以幫助交易者識別出股票或其他資產的長期趨勢,並且在與 RSI 指標結合使用時可以提供更多的交易信號。例如,當 RSI 值超過 70 且股票價格高於其移動平均線時,可能是賣出股票或其他資產的好時機。相反,當 RSI 值低於 30 且股票價格低於其移動平均線時,可能是買進股票或其他資產的好時機。

另外,也可以使用其他技術指標,如相對強弱指數(Relative Strength Index,RSI)的變化率(Rate of Change,ROC)指標或是移動平均匯聚背馳(Moving Average Convergence Divergence,MACD)指標,來增強對趨勢的確認。最終的交易決策應該綜合考慮多個技術指標和基本面分析,而非只單獨依賴一種指標。

建議使用移動平均線搭配RSI算相當合理,一個趨勢指標+一個震盪指標。但ChatGPT所舉例的部分不正確(以底線標示)。若我來舉例,我會說:”當股價高於長天期移動平均線,代表趨勢向上,可以做多,而RSI向上穿越30,可以買入”。但是交易策略沒有正確答案,只有回測結果才是王道。這題算ChatGPT過關。

Q: 介紹使用RSI指標的交易策略

以下是使用 RSI 指標的一些常見的交易策略:

  1. 超買超賣策略:當 RSI 值超過 70 時,股票或其他資產可能已經超買,因此可能是賣出的好時機;相反,當 RSI 值低於 30 時,股票或其他資產可能已經超賣,因此可能是買進的好時機。但需要注意的是,超買超賣信號只是提示,並不一定代表一定會發生轉折。
  2. 正反轉策略:當 RSI 值從超買區域回落至 50 以下時,可能代表趨勢可能發生轉折,這時可以考慮進行賣出;相反,當 RSI 值從超賣區域反彈至 50 以上時,可能代表趨勢可能發生轉折,這時可以考慮進行買進。
  3. RSI 背馳策略:當股票或其他資產的價格呈現新高或新低,但 RSI 值並未隨著股票或其他資產的價格一起形成新高或新低,這時可以考慮進行反向交易。
  4. RSI 轉折點策略:當 RSI 值由上升轉為下降,或由下降轉為上升時,可能代表趨勢發生轉折,可以考慮進行相應的交易操作。

需要注意的是,以上策略都只是交易參考,並不一定適用於所有市場和所有情況。交易者還需要綜合考慮其他因素,如市場趨勢、基本面分析等,來做出更為全面的交易決策。

ChatGPT提出的1~3點都算可以理解,其中RSI”背馳”通俗講法是RSI”背離”。第4點:RSI轉折點策略應該是掰出來的。第1與第2點策略應該很容易寫,在tradingview的程式庫中已經有官方寫好的strategy。我對ChatGPT是否能寫出RSI背離策略比較感興趣。

Q: 具體說明RSI背馳策略,只做多單

RSI 背馳策略是一種基於 RSI 指標的技術分析方法,它可以用於識別市場轉折點。背馳現象發生在當股票或其他資產價格在創造新高或新低時,但 RSI 指標沒有跟隨著形成新的高或新的低時。這可能意味著市場開始出現趨勢上的疲軟,並且可能會反轉。

下面是使用 RSI 背馳策略進行做多單的具體步驟:

  1. 確認趨勢:首先,需要確認市場的趨勢。如果市場處於上升趨勢,那麼我們只考慮做多單的交易機會。反之,如果市場處於下降趨勢,我們只考慮做空單的交易機會。
  2. 等待信號:當股票或其他資產的價格創造了新高時,需要等待 RSI 指標出現背馳信號。背馳信號的形成要求 RSI 指標的變化率低於價格變化率。也就是說,當股票或其他資產的價格創造新高時,RSI 指標應該是在創造較低的高點。如果 RSI 指標仍然在創造新高,那麼背馳信號並未形成,需要繼續等待。
  3. 確認信號:當 RSI 指標出現背馳信號時,需要確認市場趨勢是否正確。如果市場處於上升趨勢,並且 RSI 指標出現背馳信號,那麼可以考慮進行做多單的交易操作。
  4. 設定止損:當交易操作進行後,需要設定止損。止損可以幫助交易者在市場逆轉時減少損失。一般來說,止損的設置應該基於股票或其他資產的波動性和風險承受能力。
  5. 設定止盈:最後,需要設定止盈。止盈可以幫助交易者在市場上漲時獲利。一般來說,

ChatGPT文字上敘述的策略,開始有點怪怪的了。”2. 等待信號”提到”背馳信號的形成要求 RSI 指標的變化率低於價格變化率。“嚴格來說沒有錯,但從過去交手的經驗,ChatGPT開始把簡單的話講成複雜的形式,大概就是開始要編故事了。這部分我之後會用我的文字重新要求,但現在想先確認一下止損與止盈的方法。

Q: 建議設定止損或止盈的具體方法

設定止損和止盈是交易中非常重要的部分,可以幫助交易者管理風險並確保交易的成功。以下是一些建議的止損和止盈設置方法:

  1. 固定比例法:這種方法是根據資產價值的一定比例來設置止損和止盈。例如,交易者可以設置止損在資產價值下跌到交易額的2%以下,同時設置止盈在資產價值上漲到交易額的4%以上。這種方法可以確保交易者的風險控制在一個固定的比例之內。
  2. 技術指標法:使用技術指標(例如移動平均線或支撐/阻力水平)來設置止損和止盈。例如,在一個上漲趨勢中,交易者可以將止損設置在移動平均線下方的一個固定距離內,將止盈設置在支撐/阻力水平上方的一個固定距離內。這種方法可以使交易者更有信心地在市場上交易,因為他們已經基於技術指標對市場的分析來制定止損和止盈。
  3. 追蹤止損法:這種方法是根據市場價格的實際變化來設置止損。當市場價格朝著交易者預期的方向移動時,交易者可以根據一個固定的距離保持止損位置,隨著市場價格的變化而調整止損。這種方法可以使交易者在市場上漲時隨時保持風險控制,並獲得更多的利潤。

無論使用哪種方法,止損和止盈都應該基於個人風險承受能力和市場分析來進行制定。交易者應該在進行交易前制定計劃,遵循交易計劃,以確保交易的成功。

這部份ChatGPT的回答算不錯,介紹了三種止盈的方式,我只要決定用哪種方式即可。
接下來,我把需求重新明確的寫一遍,尤其是之前有疑慮的”RSI背離”條件,並要求ChatGPT寫出策略。

Q: 幫我設計一個交易策略: 1. 用長天期移動平均線來確認是否為多頭趨勢 2. 當股價與RSI出現低檔背馳,且處於多頭趨勢時,買入多單 3. 多單進場後設定固定5%停損點 4. 使用supertrend指標停利

以下是一個符合您需求的交易策略:

  1. 用長天期移動平均線(例如200日線)來確認是否為多頭趨勢。如果價格在200日線上方,則確認為多頭趨勢。
  2. 當股價與RSI出現低檔背馳,且處於多頭趨勢時,買入多單。低檔背馳指的是股價在下跌的過程中,RSI指標卻出現上升的趨勢。
  3. 多單進場後設定固定5%停損點,如果交易出現5%以上的虧損,則自動止損。
  4. 使用Supertrend指標來確定停利點。當Supertrend指標出現反轉信號時,則平倉獲利。

總結來說,這個交易策略是基於趨勢追踪和技術指標交易的結合。在確定趨勢後,使用RSI指標來判斷進入點,同時設置固定的止損點來管理風險。使用Supertrend指標來確定平倉點,以便獲取最大利潤。請注意,任何交易策略都需要經過反覆的回測和評估,以確保交易策略的有效性和可靠性。

ChatGPT大致理解我的需求,並且會加上自己的註解。果然在低檔背離的解釋有點怪怪的。在要求用pinescript寫出後,果然”RSI背離”寫的方式錯了好幾次,regenerate按了好幾次都沒有辦法出現正確的程式。後來決定回頭再將第2點寫更精準一些。

Q: 修改第2點。 RSI低檔背馳 = 當前一個low是近期最低點,而前一個rsi卻不是近期最低點時,而RSI<50
買入條件 = RSI低檔背馳 and 多頭趨勢

好的,我來修改第二點:

  1. 定義RSI低檔背馳為當前一個低價是近期最低價,而前一個RSI不是近期最低價時,RSI指標小於50。在這樣的條件下,確認當前市場為多頭趨勢,並進入多單。

這樣的修改,可以讓交易策略更加符合RSI指標的應用原則,同時提高交易的有效性和可靠性。請記得在使用交易策略前,要進行反覆的回測和評估,並對策略進行調整和優化,以確保交易策略的有效性和可靠性。

確認好策略在文字敘述上非常精準後,經過數次的重新詢問後,ChatGPT終於能用pinescript寫出一個較接近正確的程式碼。如下:

Q: 請將上述完整交易策略用pinescript寫出

以下是用PineScript編寫的符合您需求的交易策略:

scssCopy code//@version=5
strategy("Moving Average RSI Backtest", overlay=true)

// 定義長天期移動平均線
long_ma = input(200, "Long MA")

// 定義Supertrend指標參數
st_period = input(10, title="Period")
st_multiplier = input(3.0, title="Multiplier")

// 計算移動平均線
ma = sma(close, long_ma)

// 計算RSI指標
rsi_length = input(14, "RSI Length")
rsi = rsi(close, rsi_length)

// 計算Supertrend指標
atr_length = input(10, title="ATR Length")
atr_multiplier = input(3.0, title="ATR Multiplier")
[upperband, lowerband, st] = supertrend(high, low, close, st_period, atr_multiplier)

// 定義進場條件
enter_long = close > ma and rsi < 50 and rsi[1] > lowest(rsi, rsi_length) and close[1] > lowest(low, rsi_length)

// 設置進場
if enter_long
    strategy.entry("Enter Long", strategy.long)

// 設置停損
stop_loss = input(5, "Stop Loss (%)")
strategy.exit("Stop Loss", "Enter Long", loss=close * (1 - stop_loss / 100))

// 設置停利
strategy.exit("Take Profit", "Enter Long", limit=st)

// 繪製移動平均線、Supertrend指標和RSI指標
plot(ma, "MA", color.blue)
plot(st, "Supertrend", color.green)
plot(50, "RSI 50", color.gray)
plot(rsi, "RSI", color.orange)

這個交易策略包含了您所需求的所有功能。它使用了長天期移動平均線來確認趨勢,RSI指標來找到低檔背馳進入點,Supertrend指標來確定停利點,以及固定的5%停損點來管理風險。

在這個策略中,進入條件是close > ma and rsi < 50 and rsi[1] > lowest(rsi, rsi_length) and close[1] > lowest(low, rsi_length),也就是符合多頭趨勢、RSI低檔背馳的股票。

當進入交易後,如果交易出現5%以上的虧損,則自動觸發停損。當Supertrend指標出現反轉信號時,則平倉獲利。同時,這個策略還繪製了移動平均線、Supertrend指標和RSI指標,

我在經過約10次的重新詢問後放棄了,了解了ChatGPT寫的code通常會出現的問題:
1. 版本錯誤: ChatGPT時常會寫出version=4的舊版語法,例如新版function前面要ta, 例如ta.rsi(close, rsi_length),但是ChatGPT會寫rsi(close, rsi_length)
2. function的parameter數量錯誤:例如[upperband, lowerband, st] = supertrend(high, low, close, st_period, atr_multiplier),supertrend的input只有2個,output也只有兩個。他他卻寫出5個input + 3個output的語法。
3. “RSI背離”買入條件邏輯錯誤: 這個才是最根本的問題。文字上提供了明確的需求後,生成的程式碼經常是邏輯錯誤但語法正確的程式。如果不懂pinescript就可能被誤導他依照需求寫好程式了。但實際上他寫的程式與文字需求不相符。
在經過約10多次測試也無法產生正確的程式碼後,只能手工排錯,修改程式碼。但ChatGPT的程式的優點是說明寫得很清楚。與ChatGPT共同開發交易策略程式碼,有點像是在交代新手小白助理工作,而他的工作雖然標示得很清楚,但錯誤很多,要逐行檢查。

//@version=5

strategy(“Moving Average RSI Backtest”, overlay=true)

// 定義長天期移動平均線
long_ma = input(200, “Long MA”)

// 計算移動平均線
ma = ta.sma(close, long_ma)

// 計算RSI指標
rsi_length = input(14, “RSI Length”)
rsi = ta.rsi(close, rsi_length)

// 計算Supertrend指標
Periods = input.int(title=”ATR Period”, defval=21, group=”Supertrend”)
Multiplier = input.float(title=”ATR Multiplier”, step=0.2, defval=4.0, group=”Supertrend”)
atr = ta.atr(Periods)
up = hl2-(Multiplier*atr)
up1 = nz(up[1],up)
up := strategy.position_size > 0 ? math.max(up,up1) : up
upPlot = plot(strategy.position_size > 0 ? up : na, title=”Up Trend”, style=plot.style_linebr, linewidth=2, color=color.green)

// 定義進場條件
enter_long = close > ma and rsi < 50 and rsi[1] == ta.lowest(rsi, rsi_length) and close[1] > ta.lowest(low, rsi_length)

// 設置進場
if enter_long
    strategy.entry(“Enter Long”, strategy.long)

// 設置停利
strategy.exit(“Supertrend”, “Enter Long”, stop = up)

結論

結論顯而易見的,ChatGPT並無法代替人為開發或人為撰寫程式。雖然我試過能夠成功請ChatGPT寫出”均線向上交叉買入多單”這種簡單的策略。但是稍微變化過、選項更複雜一些的,就比較難成功。以上面的例子來看,若沒有基礎pinescript的解讀能力,其實並不知道ChatGPT到底幫你寫了什麼策略。當你放入tradingview又發生錯誤時,也需要pinescript的撰寫知識才能知道如何修改。就算程式沒有出現錯誤,歷史回測可能會出現”怪異的出場”、”大幅虧損”,你仍然需要有解讀能力才能知道程式是否與交易邏輯相同。說到底,你就是必須學會Pinescript,而且你要幫他改功課。

從這次測試,大概能夠猜出ChatGPT是從生成文字中找出關鍵字,再用關鍵字搜尋網路上的公開程式碼。從關鍵字匹配最相近的程式組裝而成。所以ChatGPT並不懂程式,而是一個擁有大量網路程式資料庫的模仿高手。所以他常常會用資料庫中”舊的”語法來回答。而如果你需要寫的程式邏輯比較複雜,公開網路上很少有人寫過。那ChatGPT錯的機率就很高了。所以,要ChatGPT幫你完成策略開發還有一段路要走。