程式交易在基金投資上的應用之二~Q指標

By | 2017-07-13

坊間主要是把程式交易用在期指當沖上,我個人對這個領域非常不熟悉,我的期貨操作方式,主要都是在在波段出現作多或放空訊號時,進場買進價外的PUT或CALL,看錯了輸的不多,看對了有時會有意外的驚喜,這個做法的壞處是,沒有天天有行動,有時好久才下一次,好處是我累積了不少波段操作指數的交易策略,其中有一些應用在基金的波段操作上,也有不錯的效果,今天要跟大家介紹的Q指標,就是這樣的一個例子。

Q 指標是一個很單純的指標,我們先來看它的計算腳本

input:t1(10,"計算累積價格變動的bar數");
input:t2(5,"計算價格累積變化量移動平均的期別");
input:t3(20,"計算雜訊的移動平均期別");
value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
value3=average(value2,t2);
value4=absvalue(value2-value3);//雜訊
value5=average(value4,t3);//把雜訊移動平均
variable:Qindicator(0);
if value5=0
then Qindicator=0
else
Qindicator=value3/value5*5;
plot1(Qindicator,"趨勢值");

這指標的計算步驟是

1。先算出每天的收盤價跟前一天的差值。

2。把近十日的差值加總起來。

3。把加總的數字取五日移動平均值。

4。然後算出加總數字減去平均值的絕對值

5。再把這每一天的絕對值取20日移動平均,這代表價格波動跟趨勢間的差,差愈大代表雜訊愈多。

6。最後計算累積價格變化的五日平均跟雜訊之間的比率。這個數字愈大,代表指數的方向愈明確,雜訊愈小。

這樣的運算結果如果跟指數對照來看,會如下圖

2017071303

我們可以發現,當Q指標上昇的角度很陡時,就代表指數展開了新的多頭走勢。

於是可以運用這樣的概念,開始寫腳本

針對台指,我寫的腳本如下:

input:t1(10,"計算累積價格變動的bar數");
input:t2(5,"計算價格累積變化量移動平均的期別");
input:t3(20,"計算雜訊的移動平均期別");
 
value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
value3=average(value2,t2);//累積價格變化的移動平均
value4=absvalue(value2-value3);//雜訊
value5=average(value4,t3);//把雜訊移動平均
variable:Qindicator(0);
if value5=0
then Qindicator=0
else
Qindicator=value3/value5*5;
if linearregangle(qindicator,5)>30
and barslast(linearregangle(qindicator,5)>45)[1]>10
then ret=1;

在這個腳本裡,我用linearregangle這個函數,在Q指標的上昇仰角超過30度時,觸發買進訊號。

用這個腳本去跑加權指數回測,出場我設為進場後40天,回測報告如下

2017071304

在過去五年裡,一共出現23個交易訊號,其中只有5個輸錢,勝率達到78%。

這策略用在台期指上的優點是很精準的找到進場點,缺點是出現交易的訊號並不多,平均一年不到五次。

我把這個腳本拿來用在基金投資上,把腳本稍稍改了一下,主要是把條件設的苛一點,仰角要陡一點,然後只有在市場多頭時才進場

 

input:t1(10,"計算累積價格變動的bar數");
input:t2(5,"計算價格累積變化量移動平均的期別");
input:t3(20,"計算雜訊的移動平均期別");

value1=close-close[1];//價格變化
value2=summation(value1,t1);//累積價格變化
value3=average(value2,t2);//累積價格變化的移動平均
value4=absvalue(value2-value3);//雜訊
value5=average(value4,t3);//把雜訊移動平均
variable:Qindicator(0);
if value5=0
then Qindicator=0
else
Qindicator=value3/value5*5;
if linearregangle(qindicator,5)>45
and barslast(linearregangle(qindicator,5)>45)[1]>20
and GetSymbolField("tse.tw","收盤價","W")
>average(GetSymbolField("tse.tw","收盤價","W"),13)
then ret=1;

 

,回測的結果如下
2017071305基本上就算經歷了2015年的空頭市場,還是可以維持三戰兩勝的成績。

這種用單純的兩日收盤差值來計算的指標,有其在應用上的優秀之處與侷限,特別是對那種非經濟性因素所帶來的價格扭曲是完全沒有抵抗性的,使用這種指標時,大家要心裡有數,局勢不清,消息面多空紛呈時,就別用這種指標來當 唯一根據了。