濾網在程式交易裡的所扮演的重要地位

By | 2016-06-02

有一些大家耳熟能詳的老方法,實際回測下來,效果並不好,但如果透過一些過濾條件,把那些可能出現的假訊號濾掉,就變成一個可以實戰的策略,我們今天就來探討濾網在制定策略時所扮演的腳色。

先來舉個大家都很容易了解的策略:當週線突破月線買進

這個策略的腳本只有兩行

if average(close,5)cross over average(close,20)
then ret=1;

我們直接拿這腳本去跑那些資料長度超過一年的所有普通股,回測報告如下:

060101

 

真的是再多錢都不夠賠。

我們仔細去看看那些失敗的操作,最大的盲點就是很多股票均線出現黃金交叉,不是來自本身多空均勢的改變,而是源自於大盤帶動下隨波逐流的結果,這種結果自然無法拉動一波較大的上昇走勢。

為了判斷均線黃金交叉是否源自於個股本身的多空均勢改變,我試著透過一段語法來判斷,這段語法就是先前介紹過的股性綜合分數,這個指標的腳本如下:

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);

用這個指標來畫圖,畫出來的圖形就像下圖

060103

從上面的圖我們可以發現,週線與月線黃金交叉, 如果加上這個濾網,我們就可以濾掉那些股價隨大盤而上漲,本身股性並沒有變化的買進訊號。

 

這時候我們就可以看到回測的數字更是漸入佳境

060104

從這個回測報表,我們會發現,一樣是週線突破月線,加了股性綜合分數當濾網,勝率及報酬率都高出很多。

但在空頭市場,這些股性翻多的個股還是會受大盤拖累,最後還是大多以停損收場,所以我們再把順勢操作的概念加進來,也就是只有在大盤多頭排列時才啟動多方策略,這樣合起來的腳本如下:

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%停損。

這樣的策略適合那些常常需要作交易,能嚴格執行停損,但空頭市場又能忍住不進場的朋友。

060106

當然這樣單純的交易策略,如果只回測一年,大家一定覺得可能只是這一年是多頭,所以回測的數字比較好看,下面是過去三年的回測報告

060201

 

從上圖可以發現,除了2014年九月到十月中那次從9600點急殺到8550的那段空頭走勢,這策略的淨值有很明顯的下調之外,其餘只要大盤有時間作頭,這策略對於空頭的抵抗能力是相當強的,三年下來,細積的報酬率也很可觀。

這當中的差別在於,一般人的作法是週線過月線就進場,而這個交易策略作了兩道過濾機制

第一道是只拿來應用在有量的中小型股票上

第二道是設計了一個股性變化的綜合觀察指標,然後只有在三個以上的觀察點出現翻多的情況才真的觸發買進訊號

我們用真實的例子跟大家說明,股票的程式交易,設制與原始策略條件相搭配的過濾條件,是一個可以提高勝率的好方法,也是一個更符合市場現實狀況的方法。