2014年2月3日 星期一

自適應性震盪指標 - The Sinewave Indicator

    以下介紹Sinewave 指標,Sinewave指標有好幾種版本,在John F. Ehlers的著作中就有兩個版本。各種版本其實都大同小異,差異的地方主要在數值近似的手法。

(1)Rocket Science For Traders - John F. Ehlers -2001
(2)Cybernetic Analysis for Stocks and Futures - John F. Ehlers -2004
(3)E-mini watchBetter Sinewave



      個人覺得Rocket Science For Traders的版本比Cybernetic Analysis for Stocks and Futures好,而且Rocket這本講解比較詳細,而E-mini watch的版本與Rocket Science For Trader版本類似。


Ø  前言
    作者先假設一個市場走勢的簡單模型:   

       走勢 = 趨勢(Trend)與盤整(Cycle)的加總。



     在趨勢(Trend Mode)時,價格持續往同一個方向移動,價格走勢移動方向變動不大。因此可以把Trend想像成一個低頻的訊號。均線其實就是一種簡單的低通濾波器(low pass filter),因此大部分的均線策略在trend mode時績效很好。

    而在盤整盤(Cycle mode)時,價格移動方向的時常變動,因此可以把Cycle想像成一個高頻的訊號,而一般的震盪指標其實都是簡單的高通濾波器(high pass filter),所以在一般區間盤整的時候,大部分的震盪指標都好像很準。

    作者假設市場為一個動態週期的cycle,嘗試繼續使用數學的方法,取出目前市場走勢cycle的週期。計算出市場目前的週期後,接著發展出Sinewave 指標。


Ø  Hilbert Transform
    作者使用複數的觀念phasor去描述一個cycle

e = cos(θ)+jsin(θ)

A Phasor Can Represent a Cycle

    作者一開始使用Hilbert Transform從少量價格的資料近似出一個cyclephasor 型式,接著進行一些平滑處理的動作,取出 QuadratureInPhase

Smooth = (4*Price + 3*Price[1] + 2*Price[2] + Price[3]) / 10;
Detrender = (.0962 * Smooth + .5769 * Smooth[2] - .5769 * Smooth[4] - .0962*Smooth[6]) * (.075 * Period[1] + .54);

{Compute InPhase and Quadrature components.}
Q1 = (.0962 * Detrender + .5769 * Detrender[2] - .5769 * Detrender[4] - .0962 * Detrender[6]) * (.075 * Period[1] + .54);
I1 = Detrender[3];


Ø  Homodyne Discriminator
取出QuadratureInPhase後,作者以此為基礎,使用Homodyne Discriminator近似出目前cycle的週期(period)

HomodyneDiscriminator的概念為,將這根bar的複數訊號與前一根bar的共軛複數相乘。如下式,可以得到angular frequency(角頻率)amplitude

angular frequency(角頻率) = (2π/Period),由此可得目前cycle的週期(period)

{Homodyne Discriminator}
Re = I2 * I2[1] + Q2 * Q2[1];
Im = I2 * Q2[1] - Q2 * I2[1];
Re = .2 * Re + .8 * Re[1];
Im = .2 * Im + .8 * Im[1];

If Im <> 0 and Re <> 0
    then Period = 360 / ArcTangent (Im/Re);



Ø  The SineWave Indicator
    Sinewave指標概念以下圖為基礎。假設走勢如同一個完美的cycle- sinewave走勢,若已知目前的週期(period)及目前的phase

因此只要將角度往前shift一個量,即可達到一個領先的效果,從下圖中可以觀察到LeadSine的走勢領先Sine走勢。但事實上價格走勢不是一個完美的cycle,以及在近似計算時有些平滑動作已經有產生延遲(lag)了。因此作者說其實他只是想盡量讓lag變少。

Plot1(Sine(DCPhase), "Sine");
Plot2(Sine(DCPhase + 45), "LeadSine");




    得到了價格走勢的動態週期(Period)後,下一步要取出目前市場的phase。若有cycle mode的話,看現在市場的狀態是在一個cycle中走到哪一個位置。

        Cycle mode:  phase會一直從0度增加到360度。
        Trend mode: 走勢往同方向一直持續,而phase不會增加。

    取出phase後取sine(phase)sine(phase+45),即為一個範圍從+1~ -1的震盪指標。下圖為使用完美cyclesinewave指標做測試,中間為sinewave,下面為phase。可以看到下圖中sinewave指標的交叉轉折點比cycle的轉折點還快。


Ø  The SineWave Indicator觀察
    Sinewave跟一般的震盪指標比起來有兩個優點

(1)若在cycle mode的話轉折點可以抓的比較快。

(2)可以分辨cycle mode trend mode:
  若在trend modephase不會持續往前,而作者有提到說,若在上升的trend中,phase       會持續在180度左右。而在下降的trend中,phase會持續在0度左右。




Ø  辨認Cycle mode與Trend mode
        下圖大約為2012/08~2013/02的台指期走勢,對應sinewave指標與phase圖,可以觀察出cycle modetrend mode。而up tremdphase大都在180度、down trendphase大都在0度。

    下圖還把sine指標死亡交叉與黃金交叉的價格點標出來,形成壓力與支撐。死亡交叉為灰點,表示在cycle mode的壓力。黃金交叉為紅點,表示在cycle mode的支撐。在up trend時可以觀察到價格都在灰點之上,表示一個往上突破cycle mode壓力的動作。而在down trend時,可以觀察到價格都在紅點之下,表示一個往下跌破cycle mode支撐的動作。



Ø  The SineWave Indicator程式碼(Rocket Science For Traders)

Inputs: Price((H+L)/2);

Vars: Smooth (0),Detrender (0) , I1 (0), Q1 (0), jI (0), JQ (0), I2 (0), Q2 (0), Re (0), Im (0), Period (0), SmoothPeriod (0), SmoothPrice (0), DCPeriod (0), RealPart (0),
Imagpart (0), count (0), DCPhase (0), DCSine (0), LeadSine (0), Itrend (0), Trendline (0),
Trend (0), DaysinTrend (0);

If CurrentBar > 5 then begin
Smooth = (4*Price + 3*Price[1] + 2*Price[2] + Price[3]) / 10;
Detrender = (.0962 * Smooth + .5769 * Smooth[2] - .5769 * Smooth[4] - .0962*Smooth[6]) * (.075 * Period[1] + .54);


{Compute InPhase and Quadrature components.}
Q1 = (.0962 * Detrender + .5769 * Detrender[2] - .5769 * Detrender[4] - .0962 * Detrender[6]) * (.075 * Period[1] + .54);
I1 = Detrender[3];

{Advance the phase of I1 and Q1 by 90 degrees}
jI = (.0962 * I1 + .5769 * I1[2] - .5769 * I1[4] - .0962 * I1[6]) * (.075 * Period[1] + .54);
JQ = (.0962 * Q1 + .5769 * Q1[2] - .5769 * Q1[4] - .0962 * Q1[6]) * (.075 * Period[1] + .54);

{Phasor addition for 3 bar averaging)}
I2 = I1 - JQ;
Q2 = Q1 + jI;

{Smooth the I and Q components before applying the discriminator}
I2 = .2 * I2 + .8 * I2[1];
Q2 = .2 * Q2 + .8 * Q2[1];

{Homodyne Discriminator}
Re = I2 * I2[1] + Q2 * Q2[1];
Im = I2 * Q2[1] - Q2 * I2[1];
Re = .2 * Re + .8 * Re[1];
Im = .2 * Im + .8 * Im[1];

If Im <> 0 and Re <> 0 then Period = 360 / ArcTangent (Im/Re);
If Period > 1.5 * Period[1] then Period = 1.5 * Period[1];
If Period < .67 * Period[1] then Period = .67 * Period[1];
If Period < 6 then Period = 6;
If Period > 50 then Period = 50;
Period = .2 * Period + .8 * Period[1];
SmoothPeriod = .33 * Period + .67 * SmoothPeriod[1];

{Compute Dominant Cycle Phase}
SmoothPrice = (4 * price + 3 * Price[1] + 2 * Price[2] + Price[3]) / 10;
DCPeriod = IntPortion(SmoothPeriod + .5);
RealPart = 0;
ImagPart = 0;


For count = 0 To DCPeriod - 1 begin
       RealPart = RealPart + sine (360 * count / DCPeriod) *
       (SmoothPrice[count]);
       ImagPart = imagPart + CoSine (360 * count / DCPeriod) *
       (SmoothPrice[count]);
End;

If AbsValue(ImagPart) > 0
       then DCPhase = Arctangent(RealPart / ImagPart);
If AbsValue(ImagPart) <= .001
        then DCPhase = DCPhase + 90 * Sign(RealPart);

DCPhase = DCPhase + 90;

{Compensate for one bar lag of the Weighted Moving Average}
DCPhase = DCPhase + 360 / SmoothPeriod;

If ImagPart < 0 then DCPhase = DCPhase + 180;
If DCPhase > 315 then DCPhase = DCPhase - 360;

Plot1(Sine(DCPhase), "Sine");
Plot2(Sine(DCPhase + 45), "LeadSine");

end;

8 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 把DCPhase 獨立畫出來就可以了

      Plot1(DCPhase, "DCPhase");
      Plot2(0, "0");
      Plot3(180, "180");

      刪除
    2. 作者已經移除這則留言。

      刪除
  2. JC大您好
    感謝您分享這篇文章
    有個問題想要請教,觀看程式碼後發現:
    當計算 Detrender 值時,需要用到 Period[1] 值,但 Period 值要在後面才會計算到,此時 Period[1] 值要用哪個值代入呢?

    感謝

    回覆刪除
    回覆
    1. If CurrentBar > 5 then begin
      Detrender =
      一開始計算Detrender的Period[1] 應該是沒有值的 (0),但之後的Detrender就會帶入上一根bar計算出的Period[1],所以只會對圖表最前面幾根bar會有些許影響,後面的計算應該都沒問題 (Code是直接抄書上的XD)

      刪除
  3. 有趣的東西,今天來細細品嘗一番

    回覆刪除
  4. 感覺很棒的指標,今天來試試看,謝謝

    回覆刪除
  5. JC大對這本評價有更高嗎??
    Cycle Analytics for Traders: Advanced Technical Trading Concepts

    回覆刪除