程式交易在基金投資上的應用之九~K值交易法則

By | 2017-07-28

有位高手說,他用K值跌破20進場,K值突破80出場的交易策略去投資台灣50,結果大賺了一筆,這算是一種很簡單易學的投資方法,所以我就跑程式把這個邏輯拿到各個市場去試,發現這樣的方法,具有可操作性,但有些眉角要留意,今天就跟大家分享我的研究結果。

首先當然是先寫出進場策略及出場策略,腳本分別如下

input: Length_D(5, "日KD期間");
variable:rsv_d(0),kk_d(0),dd_d(0);
stochastic(Length_D, 3, 3, rsv_d, kk_d, dd_d);
if kk_d crosses under 20
then ret=1;

上面是K值跌破20進場,下面是K值突破80出場

input: Length_D(9, "日KD期間");
variable:rsv_d(0),kk_d(0),dd_d(0);
stochastic(Length_D, 3, 3, rsv_d, kk_d, dd_d);
if kk_d crosses over 80
then ret=1;

把這兩個腳本拿去用台灣50跑回測,過去七年的回測報告如下

2017072801

七年來一共有27次交易的機會,其中20次可以獲利出場,勝率很高。

如果去分析虧損的情況,會發現,這個策略正常的情況下,是急跌後才會出買進訊號,急漲才會出賣出訊號,所以通常是可以買在低點,賣在高點,但如果在大空頭市場,急跌後出現買進訊號,但行情出現大崩跌,就算後來反彈急漲,出現賣出訊號,但這時候的賣點也已經比進場點低。下面這張圖就是一個很好的例子

2017072804

所以要使用這個策略,需要一個過濾大空頭市場的過濾器,所以我就把進場程式改寫成下面這個程式

input: Length_D(5, "日KD期間");
variable:rsv_d(0),kk_d(0),dd_d(0);
stochastic(Length_D, 3, 3, rsv_d, kk_d, dd_d);
if kk_d crosses under 20
and GetSymbolField("tse.tw","收盤價","W")
>average(GetSymbolField("tse.tw","收盤價","W"),13)
then ret=1;

拿加權指數週線站上13週均線作為進場的前提。結果回測報告如下

 

2017072806

雖然交易次數從27次減少為9次,但其中有8次賺錢,虧錢的一次,也只虧了0.6%。

加了這個過濾器之後,雖然策略勝算很大,但缺點就是交易的次數不多,如果只用來盯住特定市場,進場的次數很有限,例如拿這個策略去跑台股及美股,這幾年大多頭,能進場的次數十分有限

2017072802

 

2017072803

要解決這個問題,方法就是交易更多的指數型商品,於是,我把更多的ETF都用這個策略來回測,回測的結果如下

 

2017072807

勝率有維持在76%,七年的交易次數有737次,算是克服了交易次數太少的問題,但麻煩的是空頭市場一樣會虧大錢,因為各種ETF的同質性高,踫到大空頭市場大家都一起掛,所以使用這個策略還是把它用在固定的股債比架構下,去挑急跌的標的會比較合適。