程式交易的重點,是在交易行為的本身,而並非程式。但透過程式,我們可以去觀察並找出交易邏輯合理與不合理處來進行修正。本篇文章希望用一個簡單的例子,除了介紹程式的基本寫法與用法外,也能提供一個打造策略的思維,而並非靠參數最佳化來找尋策略。
這裡我們使用市場上常見的RSI指標來做為一個發想,再利用Multichart軟體來幫助我們做一簡單的驗證與處理。要打造完整的策略,需要設計進場與出場的條件。以此例來說,根據RSI的用法我們定義出一個簡單的交易策略( 台指日盤,15分K)如下:
程式交易對於新手來說,要學習的就是如何將想法轉為程式,這一點只需要花時間看書自修或是上課,就可以達到這目的。初期基本功就是熟悉常用的開發架構與關鍵字。Multichart內建的編譯軟體powerlanage,即是主要撰寫交易邏輯的地方。我們可以將上述邏輯轉換成以下程式碼:
由上段範例程式碼可以得知程式策略開發的主要架構,我們就各區來一個一個說明:
input:RSIlen(14),fliter(20);
input 是我們可以從外部去修正的值,此例中代表RSIlen與fliter這兩個值個可以從交易圖表中變動或最佳化。初始值目前預設為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指標的計算結果。
condition1~ condition99 他的意思如同英文為條件,而condition10為內建的布林變數,初始值為False,達成我們給予的條件後轉為True。,condition10 = RSIvalue>50+fliter,fliter為參數設定值為20 (此例運算為:50+20=70),多方當RSIvalue大於70的時候condition10達成條件,
空方則相反50-20=30,RSIvalue小於30 condition20空單條件達成。實務上,condition愈多代表濾網愈多,一般建議多空單方向的濾網不要超過4個,且最好是對稱的情況。
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口。
這裡為大家簡單整理一下進出部位的關鍵字(之後會很常用到要熟記):
有了進場,如何出場也是我們在寫策略時的重點之一。在這個例子裡,我們採用簡單停損200點來做為一個波段策略的出場點。範例中的entryprice是內建的關鍵字,意思為進場價。因此這樣的語法代表若持有多單,目前期貨的價格低於進場價200點時,程式會自動幫你出場。
在執行程式交易的過程,使用限價單(limit)單,通常會造成執行上無法成交的情況。所以在開發架構上,盡可能的我們會下停損單(stop)單或市價單來進行交易。以下用多單進場與多單停損來說明其中的差異,以供大家參考:
期貨商品與現貨不同的地方,是有所謂的到期結算日。因此在撰寫策略時要考慮結算加出場,出來的績效損益才會正確。台指期貨的結算日為每個月的第三個星期三。因此我們需要在結算日當天將部位清掉(此寫法是簡易做法,直接參與結算。因為台指結算時間點為結算日1:30分,而一般日盤交易時間則是到1:45分。)
LastTradeDay 這個函數是我們建構出來,專門來尋找結算日的函數。
Setexitonclose 這個關鍵字,意思是使用當天最後一根K棒的收盤價格作出場。
上面5步就是最簡單且基本的程式架構寫法,接下來我們就可以利用Multichart來產生績效報表,以檢驗自己的想法是否正確?
....... 相信測出來的結果是這樣,各位心中現在應該在罵我吧。這畢竟只是雛形,只能代表這樣的交易方式無法長期在市場獲利。但可以注意到的是,2012年是正績效21萬,如果一個投資人正好在2012年使用了這套方法,這肯定會讓投資人對此邏輯深信不已。但從長期的立場來看,卻是虧損的。所以程式交易也是為了讓我們發現這些盲點,來進行改造。任何交易順勢交易邏輯,都有辦法在市場獲利。所以在下一篇文章中,我們將帶著大家一步一步用觀察到的現象與邏輯,來修正策略績效。