從零開始,如何用邏輯打造程式交易策略 (1)
NEWS 2018/11/09

程式交易的重點,是在交易行為的本身,而並非程式。但透過程式,我們可以去觀察並找出交易邏輯合理與不合理處來進行修正。本篇文章希望用一個簡單的例子,除了介紹程式的基本寫法與用法外,也能提供一個打造策略的思維,而並非靠參數最佳化來找尋策略。

這裡我們使用市場上常見的RSI指標來做為一個發想,再利用Multichart軟體來幫助我們做一簡單的驗證與處理。要打造完整的策略,需要設計進場與出場的條件。以此例來說,根據RSI的用法我們定義出一個簡單的交易策略( 台指日盤,15分K)如下:

  1. 當RSI大於70 就在市場上買進一口多單
  2. 當RSI小於30 就在市場上買進一口空單
  3. 停損200點
  4. 結算出場

程式交易對於新手來說,要學習的就是如何將想法轉為程式,這一點只需要花時間看書自修或是上課,就可以達到這目的。初期基本功就是熟悉常用的開發架構與關鍵字。Multichart內建的編譯軟體powerlanage,即是主要撰寫交易邏輯的地方。我們可以將上述邏輯轉換成以下程式碼:

 

 

由上段範例程式碼可以得知程式策略開發的主要架構,我們就各區來一個一個說明:

【1. 數值定義】- Input , Vars

input:RSIlen(14),fliter(20);

input 是我們可以從外部去修正的值,此例中代表RSIlenfliter這兩個值個可以從交易圖表中變動或最佳化。初始值目前預設為RSIlen=14,fliter=20。

如果我們想知道交易邏輯下最好的週期,可以將這個週期設為參數,讓multicharts幫我們做參數最佳化的動作,如下圖:

 

在此例中,RSIlen是我們要用來找RSI指標的最佳週期,因此我們必須代入內建的rsi函數來計算,寫法為rsi(c,RSIlen),此值會傳回RSI指標的計算值。

vars:RSIvalue(0);

vars 的意思是指變數,是程式內部溝通所用的數值,上述CODE裡RSIvalue的預設值是0。RSIvalue=rsi(c,RSIlen);代表設定RSIvalue為RSI指標的計算結果。

 

【2. 主邏輯濾網條件區】

condition1~ condition99 他的意思如同英文為條件,而condition10為內建的布林變數,初始值為False,達成我們給予的條件後轉為True。,condition10 = RSIvalue>50+fliterfliter為參數設定值為20 (此例運算為:50+20=70),多方當RSIvalue大於70的時候condition10達成條件,

空方則相反50-20=30,RSIvalue小於30 condition20空單條件達成。實務上,condition愈多代表濾網愈多,一般建議多空單方向的濾網不要超過4個,且最好是對稱的情況。

 

【3. 入口區】 

marketpositon 是程式內建關鍵字,可以傳回目前程式的市場部位為何:

 

因此,

if marketposition=0 then begin 

     (進出場訊號)

end;

代表如果目前部位為0,我們可以根據(進出場訊號)做買入,賣出的動作。

IF...begin ....  end; 這樣的語法,在multichart中是常常使用到的,大家可以多熟悉練習。

接著,我們再說明此範例中如何做進出場的動作:

if condition10 then buy next bar at market;

意思為如果達成condition10(RSI>70) ,

按上例為:condition10=RSIvalue>50+fliter”這個條件下,即在下一根K棒以market單(市價單)買進多單1口。

這裡為大家簡單整理一下進出部位的關鍵字(之後會很常用到要熟記):

 

【4. 出口區】 

有了進場,如何出場也是我們在寫策略時的重點之一。在這個例子裡,我們採用簡單停損200點來做為一個波段策略的出場點。範例中的entryprice是內建的關鍵字,意思為進場價。因此這樣的語法代表若持有多單,目前期貨的價格低於進場價200點時,程式會自動幫你出場。

在執行程式交易的過程,使用限價單(limit)單,通常會造成執行上無法成交的情況。所以在開發架構上,盡可能的我們會下停損單(stop)單或市價單來進行交易。以下用多單進場與多單停損來說明其中的差異,以供大家參考: 

 

【5. 結算出場】

 

期貨商品與現貨不同的地方,是有所謂的到期結算日。因此在撰寫策略時要考慮結算加出場,出來的績效損益才會正確。台指期貨的結算日為每個月的第三個星期三。因此我們需要在結算日當天將部位清掉(此寫法是簡易做法,直接參與結算。因為台指結算時間點為結算日1:30分,而一般日盤交易時間則是到1:45分。)

LastTradeDay   這個函數是我們建構出來,專門來尋找結算日的函數。

Setexitonclose 這個關鍵字,意思是使用當天最後一根K棒的收盤價格作出場。

 

上面5步就是最簡單且基本的程式架構寫法,接下來我們就可以利用Multichart來產生績效報表,以檢驗自己的想法是否正確?

【績效表現】

....... 相信測出來的結果是這樣,各位心中現在應該在罵我吧。這畢竟只是雛形,只能代表這樣的交易方式無法長期在市場獲利。但可以注意到的是,2012年是正績效21萬,如果一個投資人正好在2012年使用了這套方法,這肯定會讓投資人對此邏輯深信不已。但從長期的立場來看,卻是虧損的。所以程式交易也是為了讓我們發現這些盲點,來進行改造。任何交易順勢交易邏輯,都有辦法在市場獲利。所以在下一篇文章中,我們將帶著大家一步一步用觀察到的現象與邏輯,來修正策略績效。