2014年11月24日 星期一

隨機漫步理論與交易策略 [程式碼]

EasyTrader ArtNo 221
隨機漫步理論(Random Walk Theory)認為,證券價格的波動是隨機的,像一個在廣場上行走的人一樣,價格的下一步將走向哪裡,是沒有規律的。證券市場中,價格的走向受到多方面因素的影響。一件不起眼的小事也可能對市場產生巨大的影響。從長時間的價格走勢圖上也可以看出,價格的上下起伏的機會差不多是均等的。
 隨機漫步理論指出,股票市場內有成千上萬的精明人士,每一個人都懂得分析,而且資料流入市場都是公開的,所有人都可以知道,並無什麼秘密可言。因此,股票現在的價格就已經反映了供求關係,或者離本身價值不會太遠。所謂內在價值的衡量方法就是看每股資產值、市盈率、派息率等基本因素來決定。這些因素亦非什麼大秘密。現時股票的市價根本已經代表了千萬精明人士的看法,構成了一個合理價位。市價會圍繞著內在價值而上下波動。這些波動卻是隨意而沒有任何軌跡可循。
造成波動的原因是:
(1)新的經濟、政治新聞消息是隨意,並無固定地流入市場。
(2)這些消息使基本分析人士重新估計股票的價值,而作出買賣方針,致使股票發生新變化。
(3)因為這些消息無跡可尋,是突然而來,事前並無人能夠預告估計,股票走勢推測這回事並不可以成立。
(4)既然所有股價在市場上的價錢已經反映其基本價值。這個價值是公平的由買賣雙方決定,這個價值就不會再出現變動,除非突發消息如戰爭、收購、合併、加息減息、石油戰等利好或利空等消息出現才會再次波動。但下一次的消息是利好或利空大家都不知道,所以股票現時是沒有記憶系統的。昨日升並不代表今日升。今日跌,明日可以升亦可以跌。每日與另一日之間的升跌並無相關。
(5)既然股價是沒有記憶系統的,企圖用股價波動找出一個原理去戰勝市場,贏得大市,全部肯定失敗。因為股票價格完全沒有方向,隨機漫步,亂升亂跌。我們無法預知股市去向,無人肯定一定是贏家,亦無人一定會輸。

隨機漫步理論對圖表派無疑是一個正面大敵,如果隨機漫步理論成立,所有股票專家都無立足之地。所以不少學者曾經進行研究,看這個理論的可信程度。在無數研究之中,有三個研究,特別支持隨機漫步的論調:
(1)曾經有一個研究,用美國標準普爾指數(Standard&Poor)的股票作長期研究,發覺股票狂升或者暴跌,狂升四五倍,或是跌99%的,比例只是很少數,大部分的股票都是升跌10%至30%不等。在統計學上有常態分配的現象。即升跌幅越大的占比例越少。所以股價並無單一趨勢。買股票要看你是否幸運,買中升的股票還是下跌的股票機會均等。
(2)另外一次試驗,有一個美國參議員用飛鏢去擲一份財經報紙,揀出20只股票作為投資組合,結果這個亂來的投資組合竟然和股市整體表現相若,更不遜色於專家們建議的投資組合,甚至比某些專家的建議更表現出色。
(3)亦有人研究過單位基金的成績,發覺今年成績好的,明年可能表現得最差,一些往年令人失望的基金,今年卻可能脫穎而出,成為升幅榜首。所以無跡可尋,買基金也要看你的運氣,投資技巧並不實際,因為股市並無記憶,大家都只是瞎估估。

隨機漫步理論總的觀點
 買方與賣方兩樣聰明機智,賣方也與買方同樣聰明機智。他們都能夠接觸同樣的情報,因此在買賣雙方都認為價格公平合理時,交易才會完成;股價確切地反應股票實質。結果,股價無法在買賣雙方能夠猜測的單純,有系統情況下變動。
 股價變動基本上是有隨機的說法的真正涵義是,沒有什麼單方能夠戰勝股市,股價早就反映一切了,而且股價不會有系統地變動。天真的選股方法,如對著報紙的股票版丟擲飛鏢,也照樣可以選出戰勝市場的投資組合。
參考 MBA智庫 隨機漫步理論
在網路上找到隨機漫步指標(Random Walk Index) 的定義與計算方式 連結
根據其方法可以作成指標圖如下
指標程式碼
input:FastLen(5),SlowLen(10) ;
Vars:HRWI(0),LRWI(0),Counter(0),SHRWI(0),SLRWI(0) ;

{ 計算短期的 Highs Peak RWI 與 Lows Peak RWI }
HRWI = 0 ;
LRWI = 0 ;
for counter = 1 to FastLen Begin
if (AvgTrueRange(Counter)*SquareRoot(Counter)) <> 0 then Begin
value1 = (High - Low[Counter])/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value1 > HRWI then HRWI = Value1 ;
value2 = (High[Counter] - Low)/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value2 > LRWI then LRWI = Value2 ;
end;
end;

{ 畫短期 RWI 指標 }
Plot1(HRWI ,"HRWI" , Magenta ,Black ,3) ;
Plot2(LRWI ,"LRWI" , Cyan ,Black ,3) ;
Plot3(1 ,"RefLevel" , White ,Black ,3) ;

接下來按照網頁原文所提出的進場邏輯
Below are some rules developed by Poulos for trading stocks and futures with his RWI:

Enter a long (or close short) when the long-term RWI of the highs is greater than 1 and the short-term RWI of lows peaks above 1 
當長期Highs Peak RWI 大於1 且短期 Low Peak RWI 穿越 1 作多

Enter short (or close long) when the long-term RWI of the lows is greater than 1 and the short-term RWI of highs peaks above 1
當長期Lows Peak RWI 大於1 且短期 Highs Peak RWI 穿越 1 作空

原始邏輯的測試
台指期 60 min K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200

我的邏輯測試
台指期 60 min K 多空留倉 交易週期 2004/11/1~ 2014/10/31 交易成本 1200
測試程式碼

input:EntryType(2),ExitType(2) ;
inputs:NBarL(28),NBarS(3),TradeProfit(0.04),TradeStopLoss(0.04),ATRs_L(12.7),ATRs_S(4.6);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0),HLRange(100);
input:FastLen(5),Ratio(3),FastBandL(0.5),SlowBandL(1),FastBandS(2),SlowBandS(0.5) ;
Vars:HRWI(0),LRWI(0),Counter(0),SHRWI(0),SLRWI(0),SlowLen(0) ;
MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

SlowLen = IntPortion(FastLen*Ratio) ;

{ 計算短期的 Highs Peak RWI 與 Lows Peak RWI }
HRWI = 0 ;
LRWI = 0 ;
for counter = 1 to FastLen Begin
if (AvgTrueRange(Counter)*SquareRoot(Counter)) <> 0 then Begin
value1 = (High - Low[Counter])/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value1 > HRWI then HRWI = Value1 ;
value2 = (High[Counter] - Low)/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value2 > LRWI then LRWI = Value2 ;
end;
end;

{ 計算長期的 Highs Peak RWI 與 Lows Peak RWI }
SHRWI = 0 ;
SLRWI = 0 ;
for counter = 1 to SlowLen Begin
if (AvgTrueRange(Counter)*SquareRoot(Counter)) <> 0 then Begin
value3 = (High - Low[Counter])/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value3 > SHRWI then SHRWI = Value3 ;
value4 = (High[Counter] - Low)/(AvgTrueRange(Counter)*SquareRoot(Counter)) ;
if Value4 > SLRWI then SLRWI = Value4 ;
end;
end;

{ 原始邏輯 - 同時使用長短期間 RWI 作參考 High peak 與 Low Peak 同向}
if EntryType = 1 then Begin
if SHRWI > SlowBandL and LRWI Cross over FastBandL then Buy next bar at Highest(High,3) stop ;
if SLRWI > SlowBandS and HRWI Cross over FastBandS then Sell next bar at Lowest(Low,3) stop ;
end;
{ 我的邏輯 - 只使用一個期間參考 ,High peak 與 Low Peak 不同向時進場}
if EntryType = 2 then Begin
if HRWI > SlowBandL and LRWI Cross under FastBandL then Buy next bar at Highest(High,3) stop ;
if LRWI > SlowBandS and HRWI Cross under FastBandS then Sell next bar at Lowest(Low,3) stop ;
end;
{ 主要還是來自於對指標圖的觀察 }

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
if MP > 0 and BarsSinceEntry = NBarL then {Sell } ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then {Buy} ExitShort next bar at Market ;
end;

if IsBalanceDay then setExitonClose ;
MagicQS133

沒有留言:

張貼留言