有一些大家耳熟能詳的老方法,實際回測下來,效果並不好,但如果透過一些過濾條件,把那些可能出現的假訊號濾掉,就變成一個可以實戰的策略,我們今天就來探討濾網在制定策略時所扮演的腳色。
先來舉個大家都很容易了解的策略:當週線突破月線買進
這個策略的腳本只有兩行
if average(close,5)cross over average(close,20) then ret=1;
我們直接拿這腳本去跑那些資料長度超過一年的所有普通股,回測報告如下:
真的是再多錢都不夠賠。
我們仔細去看看那些失敗的操作,最大的盲點就是很多股票均線出現黃金交叉,不是來自本身多空均勢的改變,而是源自於大盤帶動下隨波逐流的結果,這種結果自然無法拉動一波較大的上昇走勢。
為了判斷均線黃金交叉是否源自於個股本身的多空均勢改變,我試著透過一段語法來判斷,這段語法就是先前介紹過的股性綜合分數,這個指標的腳本如下:
input:day(20); input:ratio(10); var:count(0),x(0); value1=GetField("總成交次數","D"); value2=average(value1,day); value3=GetField("強弱指標"); value5=GetField("外盤均量"); value6=average(value5,day); value7=GetField("主動買力"); value8=average(value7,day); value9=GetField("開盤委買"); value10=average(value9,day); value11=GetField("資金流向"); value12=average(value11,day); value13=countif(value3>1,day); value14=average(value13,day);//比大盤強天數 value16=GetField("法人買張"); count=0; if value1>value2*(1+ratio/100) then count=count+1; if value13>value14*(1+ratio/100)//比大盤強的天數 then count=count+1; if value5>value6*(1+ratio/100) then count=count+1; if value7>value8*(1+ratio/100) then count=count+1; if value9>value10*(1+ratio/100) then count=count+1; if truerange> average(truerange,20)//真實波動區間 then count=count+1; if truerange<>0 then begin if close<=open then value15=(close-low)/truerange*100 else value15=(open-low)/truerange*100;//計算承接的力道 end; if value15>average(value15,day)*(1+ratio/100) then count=count+1; if volume<>0 then value17=value16/volume*100;//法人買張佔成交量比例 if value17>average(value17,10)*(1+ratio/100) then count=count+1; if value11>average(value11,10)*(1+ratio/100) then count=count+1; x=0; value18=summationif(close>=close[1]*1.02,x,5); if value18>=2 then count=count+1;//N日來漲幅較大的天數 value19=GetField("融資買進張數"); value20=GetField("融券買進張數"); value21=(value19+value20); value22=average(value21,day); if value21<value22*0.9 //散戶作多指標 then count=count+1; plot1(average(count,3),"股性綜合分數指標"); plot2(3);
用這個指標來畫圖,畫出來的圖形就像下圖
從上面的圖我們可以發現,週線與月線黃金交叉, 如果加上這個濾網,我們就可以濾掉那些股價隨大盤而上漲,本身股性並沒有變化的買進訊號。
這時候我們就可以看到回測的數字更是漸入佳境
從這個回測報表,我們會發現,一樣是週線突破月線,加了股性綜合分數當濾網,勝率及報酬率都高出很多。
但在空頭市場,這些股性翻多的個股還是會受大盤拖累,最後還是大多以停損收場,所以我們再把順勢操作的概念加進來,也就是只有在大盤多頭排列時才啟動多方策略,這樣合起來的腳本如下:
input:day(20); input:ratio(10); var:count(0),x(0); value1=GetField("總成交次數","D"); value2=average(value1,day); value3=GetField("強弱指標"); value5=GetField("外盤均量"); value6=average(value5,day); value7=GetField("主動買力"); value8=average(value7,day); value9=GetField("開盤委買"); value10=average(value9,day); value11=GetField("資金流向"); value12=average(value11,day); value13=countif(value3>1,day); value14=average(value13,day);//比大盤強天數 value16=GetField("法人買張"); count=0; if value1>value2*(1+ratio/100) then count=count+1; if value13>value14*(1+ratio/100)//比大盤強的天數 then count=count+1; if value5>value6*(1+ratio/100) then count=count+1; if value7>value8*(1+ratio/100) then count=count+1; if value9>value10*(1+ratio/100) then count=count+1; if truerange> average(truerange,20)//真實波動區間 then count=count+1; if truerange<>0 then begin if close<=open then value15=(close-low)/truerange*100 else value15=(open-low)/truerange*100;//計算承接的力道 end; if value15>average(value15,day)*(1+ratio/100) then count=count+1; if volume<>0 then value17=value16/volume*100;//法人買張佔成交量比例 if value17>average(value17,10)*(1+ratio/100) then count=count+1; if value11>average(value11,10)*(1+ratio/100) then count=count+1; x=0; value18=summationif(close>=close[1]*1.02,x,5); if value18>=2 then count=count+1;//N日來漲幅較大的天數 value19=GetField("融資買進張數"); value20=GetField("融券買進張數"); value21=(value19+value20); value22=average(value21,day); if value21<value22*0.9 //散戶作多指標 then count=count+1; value23=average(count,3); if average(close,5)cross over average(close,20) and value23>3 and GetSymbolField("tse.tw","收盤價","D") >average(GetSymbolField("tse.tw","收盤價","D"),10) then ret=1;
用這個腳本再重跑一次一年期的回溯測試,勝率超過五成,總報酬率也很可觀,一年交易了五百次,平均一個月交易四十次,等於平均一天有兩個交易機會,其中一個賺錢,一個虧錢,但賺的12%才停利,虧的6%停損。
這樣的策略適合那些常常需要作交易,能嚴格執行停損,但空頭市場又能忍住不進場的朋友。
當然這樣單純的交易策略,如果只回測一年,大家一定覺得可能只是這一年是多頭,所以回測的數字比較好看,下面是過去三年的回測報告
從上圖可以發現,除了2014年九月到十月中那次從9600點急殺到8550的那段空頭走勢,這策略的淨值有很明顯的下調之外,其餘只要大盤有時間作頭,這策略對於空頭的抵抗能力是相當強的,三年下來,細積的報酬率也很可觀。
這當中的差別在於,一般人的作法是週線過月線就進場,而這個交易策略作了兩道過濾機制
第一道是只拿來應用在有量的中小型股票上
第二道是設計了一個股性變化的綜合觀察指標,然後只有在三個以上的觀察點出現翻多的情況才真的觸發買進訊號
我們用真實的例子跟大家說明,股票的程式交易,設制與原始策略條件相搭配的過濾條件,是一個可以提高勝率的好方法,也是一個更符合市場現實狀況的方法。