以下介紹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 watch的Better 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。
ejθ
= cos(θ)+jsin(θ)
A Phasor Can Represent
a Cycle
作者一開始使用Hilbert Transform,從少量價格的資料近似出一個cycle的phasor 型式,接著進行一些平滑處理的動作,取出 Quadrature、InPhase。
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
取出Quadrature、InPhase後,作者以此為基礎,使用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變少。
得到了價格走勢的動態週期(Period)後,下一步要取出目前市場的phase。若有cycle mode的話,看現在市場的狀態是在一個cycle中走到哪一個位置。
Cycle mode: phase會一直從0度增加到360度。
Trend mode: 走勢往同方向一直持續,而phase不會增加。
取出phase後取sine(phase)及sine(phase+45),即為一個範圍從+1~ -1的震盪指標。下圖為使用完美cycle對sinewave指標做測試,中間為sinewave,下面為phase。可以看到下圖中sinewave指標的交叉轉折點比cycle的轉折點還快。
Ø The SineWave Indicator觀察
Sinewave跟一般的震盪指標比起來有兩個優點
(1)若在cycle mode的話轉折點可以抓的比較快。
(2)可以分辨cycle mode 、trend mode:
若在trend mode時phase不會持續往前,而作者有提到說,若在上升的trend中,phase 會持續在180度左右。而在下降的trend中,phase會持續在0度左右。
Ø 辨認Cycle mode與Trend mode
下圖大約為2012/08~2013/02的台指期走勢,對應sinewave指標與phase圖,可以觀察出cycle mode與trend mode。而up tremd的phase大都在180度、down trend的phase大都在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;
作者已經移除這則留言。
回覆刪除把DCPhase 獨立畫出來就可以了
刪除Plot1(DCPhase, "DCPhase");
Plot2(0, "0");
Plot3(180, "180");
作者已經移除這則留言。
刪除JC大您好
回覆刪除感謝您分享這篇文章
有個問題想要請教,觀看程式碼後發現:
當計算 Detrender 值時,需要用到 Period[1] 值,但 Period 值要在後面才會計算到,此時 Period[1] 值要用哪個值代入呢?
感謝
If CurrentBar > 5 then begin
刪除Detrender =
一開始計算Detrender的Period[1] 應該是沒有值的 (0),但之後的Detrender就會帶入上一根bar計算出的Period[1],所以只會對圖表最前面幾根bar會有些許影響,後面的計算應該都沒問題 (Code是直接抄書上的XD)
有趣的東西,今天來細細品嘗一番
回覆刪除感覺很棒的指標,今天來試試看,謝謝
回覆刪除JC大對這本評價有更高嗎??
回覆刪除Cycle Analytics for Traders: Advanced Technical Trading Concepts