2019年7月9日 星期二

[量化狼]順勢交易吧!心理線PSY

  傳統的日線PSY(心理線)邏輯非常簡單,就是一段時間內上漲K棒的比例:

PSY = n日內上漲的天數/ n*100%

        大部分網路上的心理線都是做日線且逆勢,在此我示範怎麼將PSY應用在分K,並且改為順勢。在日線上很少有不漲不跌的日子,因此用二分法(漲or跌)就可以了;但在分K中由於時間較短,常常會有行情沒動的情形發生,因此要將它分為三類(漲、平、跌):
                 改良PSY = (上漲的K棒數*1 + 平盤的K棒數*0.5 + 下跌的K棒數*0) / 總K棒數
        很明顯地,改良PSY還是跟原始的一樣介於0~1之間,而中值為0.5;在Multichart裡我用array運算,大家也可以用countif試試。

策略基本設定:
策略名稱
PSY策略
交易層級
5分
交易成本
來回600
回測期間
2001-2019/6



程式碼:Input :

  L_in(0.65),L_Out(0.3) ,
  S_in(0.3),S_Out(0.55);
Var :
  x(0),PSY(0.5) ;
Array : 
  Array_UorD[30](0) ;
 
for x = array_getmaxindex(Array_UorD) downto 2 begin
  Array_UorD[x] = Array_UorD[x-1] ;
end ;
if c>c[1] then
  Array_UorD[1] = 1
else if c<c[1] then
  Array_UorD[1] = 0
else
  Array_UorD[1] = 0.5 ;
PSY = AverageArray(Array_UorD,array_getmaxindex(Array_UorD)) ;

if marketposition<=0 and PSY>L_in then
  buy 1 share at next bar market ;
if marketposition>=0 and PSY<S_in then
  sellshort 1 share at next bar market ;
if marketposition>0 and PSY<L_out then
  sell all share at next bar market ;
if marketposition<0 and PSY>S_out then
  buytocover all share at next bar market ;

if dayofmonth(date)>14 and dayofmonth(date)<22 and dayofweek(date)=3 then
  setexitonclose ;
 邏輯中文翻譯:

將漲跌值記入array裡
將array平均獲得PSY
當PSY>0.65時,多單進場
當PSY<0.3時,空單進場
當PSY<0.3時,多單出場
當PSY>0.55時,空單出場
結算出場
權益曲線圖:
回測績效檢視:

2019年5月30日 星期四

[量化狼]粉絲的RSI大挑戰


有粉絲私訊我,他看了節目使用了某位老師的RSI策略但效果不彰,想請我們幫他回測看看;RSI的計算方法之前就有寫過了,在這篇就不多說明囉。
  我也去看了一下節目,發現那位老師一開始雖然說RSI多好用多好用,但在不同的例子裡又追加了很多需要參考的條件,像是RSI明明到了他的出場訊號結果又追加了參考五日均線如果沒跌破就不賣,又或者明明說RSI過80已經超賣了就要出場,但有時又要再觀察兩天看是不是鈍化;各種的追加條件想必看節目的人也很困擾到底該不該進出場吧?

  在此將網路老師的邏輯簡化如下:
若收盤價突破5日、10日和20日均線,則多單進場
若收盤價小於5日均線且RSI跌破80(超買區),則多單出場
若收盤價跌破5日、10日和20日均線,則空單進場
若收盤價大於5日均線且RSI突破20(超賣區),則空單出場

2019年5月18日 星期六

[量化狼]ORB 經典日內當沖策略

ORB系統(Open Range Breakout system) 日內當沖策略

ORB策略算是經典交易策略,著名交易者Larry Williams 使用ORB策略,拿下世界期貨交易大賽冠軍(World Cup Championship of Futures),其得獎年分在1997年,有興趣的讀者可以去查查。 網路上其實有很多ORB策略的版本都是經過後人改正,為了還原Larry Williams的系統,這邊採用的都是最原始的參數與最接近國外文獻的語法



其實核心內容非常簡單:
首先算出一個震幅=由昨日的高點-低點
今日開盤價+振幅=突破買點
今日開盤價-振幅=突破賣點
由突破買賣點位去做日內波段當沖

2019年5月9日 星期四

[量化狼]看A做B之噴發策略

大家回測久了,一般研究的應該多屬於線型策略,網路上有很多類似的策略,這邊提供不一樣的角度,看A做B的方式做決策,台灣是科技島,通常電子股可能會有領先起漲或起跌的,我們可以用看A (電子股)率先走強,此時B(台指期)在用簡單均線做確認,就有可能提前買在發動點,且分散純B(台指)價格策略的效果,相關的策略還可以有多種應用喔。
本程式碼短,參數少,邏輯簡單,看年損益就知道是很順勢的作多策略


策略基本設定:
策略名稱
看A做B之A式噴發策略
交易層級
15min
交易成本
來回600
回測期間
2008-2019/4

2019年4月24日 星期三

[量化狼]自定義趨勢確認模型

價格的變動可以視之為趨勢加上雜訊:市場上總有短線的消息在影響走勢,但走勢終究會回到正常趨勢的軌道上,如何《將雜訊消除或析出》這個議題一直都是市場上和學術論文索追求解決的問題之一。我有多種方法去解析價格並確認趨勢,並應用在實戰中,下面我介紹其中一種。 (順道一提,這種方式應對空頭表現也相當出色)
價格 = 趨勢 + 雜訊


2019年4月15日 星期一

[量化狼]打臉網路神棍!20週均線獲利法?


在網路上看到很多投資老師使用20週MA(移動平均線)來操作,宣稱任何只要有”K線”的商品,就能用這套方法來獲利;因此,上班族科學投資來實驗20週MA策略是否能在台指期上取得效果呢?
 在這個策略的邏輯如下:
若每週五收盤價突破MA,則進場做多
若任何一天的收盤價跌破MA,則多單出場
        比較有意思的是,進出場邏輯有分「週」跟「日」不同層級,在程式的撰寫上由於出場是日K,我們必須用日K的資料,並且用「日」收盤價來組成「週」均線;在此我們用array語法,將近20週的收盤價存進array裡,再用array做出週均線。


2019年4月2日 星期二

[量化狼]穩態動能策略



  在一段行情裡,我們常常單憑【趨勢】來操作,在此策略裡我們加入另一個因子【波動】,我們希望在趨勢強、波動小(也就是【動能】強、【穩定】高)的時候進場操作,以下圖舉例:
圖一   趨勢強 、波動小



圖二  趨勢強 、波動大






圖三   趨勢小 、波動小

圖四   趨勢小 、波動大


            顯而易見地,圖1是最好順勢操作的盤勢,也是最穩定的盤勢;因此在程式裡,我們必須先量化出【趨勢】和【波動】這兩個因子,再用雙因子組成【動能】:
          另外,由於大幅跳空會影響到我們的計算,在此策略中只使用當天的價格而不用之前的價格,並且為了有足夠的計算樣本數,在當天的第10根K棒之後才進出場。

2019年3月28日 星期四

[量化狼]MACD 指標科學實驗二部曲

MACD策略
        MACD全名為Moving Average Convergence / Divergence,由名字就可以知道MACD是一個以均線為基礎的指標。

MACD指標只需要使用收盤價就可以計算,在計算上需要先算出兩條長短天期的指數移動平均(EMA),再用兩條均線相減做出DIFF,最後再用DIFF做出指數移動平均值DEA:
EMA_1 = 2/(12+1)*收盤價 + 11/(12+1)*(前日EMA_1)
EMA_2 = 2/(26+1)*收盤價 + 25/(26+1)*(前日EMA_2)
DIFF = EMA_1 - EMA_2
DEA = 2/(9+1)*DIFF + 8/(9+1)*(前日DEA)

        可以發現公式裡有3個參數,分別是EMA_1、EMA_2和DEA取指數平均的天期,在此實測當中我們並不修改預設的參數,來試試看預設版的MACD到底能不能在台指期取得作用。
在這篇文章中,將示範 
1.     基本策略:DIFF向上穿越DEA(黃金交叉)時做多,DIFF向下穿越DEA(死亡交叉)時多單平倉。
2.     改良策略:DIFF>DEA時做多,DIFF<DEA時多單平倉;DIFF向下穿越DEA(死亡交叉)時做空,空單輸50點時停損。





1.    基本策略:

DIFF向上穿越DEA(黃金交叉)時做多,DIFF向下穿越DEA(死亡交叉)時多單平倉。
策略名稱
MACD策略1
交易層級
1日
交易成本
來回600
回測期間
2001-2019/2
程式碼:
Var :
  EMA_1(0) ,
  EMA_2(0) ,
  DIFF(0) ,
  DEA(0) ;
 
EMA_1 = 2/(12+1)*c + 11/(12+1)*EMA_1 ;
EMA_2 = 2/(26+1)*c + 25/(26+1)*EMA_2 ;
DIFF = EMA_1 - EMA_2 ;
DEA = 2/(9+1)*DIFF + 8/(9+1)*DEA ;

if marketposition<=0 and DIFF cross over DEA then
  Buy 1 share at next bar market ;
if marketposition>0 and DIFF cross below DEA then
  sell all share at next bar market ;


if dayofmonth(date)>14 and dayofmonth(date)<22 and dayofweek(date)=3 and time>=1330 and time<=1345 then  begin
  sell("CheckDay Sell") all shares at this bar close ;
  buytocover("CheckDay Buytocover") all shares at this bar close ; 

end ;
權益曲線:
以損益圖就可以明顯看出,在2009年之前此策略表現並不是很好,且有交易次數太少的問題;總體來說,並不是一個很好的策略。