2014年9月15日 星期一

●成交量反轉策略 [程式碼 ]

EasyTrader ArtNo 201
《QUANTITATIVE TRADING STRATEGIES》書內有一個這樣的策略是 Michael Cooper (Purdue University )金融學教授所做的論文研究。庫珀從 1962 年到 1993 年的股票收益率進行了研究。他發現單周報酬率走勢如果伴隨著萎縮成交量,通常會在隔周反轉。我在網路上找到了這份原始資料Real Estate Securities and a Filter-based,Short-term Trading Strategy
進場策略的基本想法
  1. 五天期的價格變動絕對值大於100天期價格變動的標準差
  2. 五天期的平均成交量低於十天前的五天期平均成交量的 75%
  3. 當近五天期價格變動是負值時多單進場
  4. 當近五天期價格變動是正值時空單進場
  5. 所有部位進場後第五天離場
For entries, we require that the five-day absolute price change be greater than the 100-day standard deviation of price changes and the five-day average volume be less than 75 percent of the five-day average volume beginning 10 days prior.

These conditions identify significant price movement accompanied with a decrease in trading volume. We enter long if the most recent five-day price change is negative while we enter short if the five-day price change is positive. All entries are exited on the fifth day of the trade.
首先當然是作成指標來觀察

指標 1 (價格變動比)
input:FastLen(5),SlowLen(100),HB(2),LB(2) ;
Vars:PriceChange(0), SlowDev(0),PriceRatio(0) ;
PriceChange = Absvalue(Close-Close[FastLen]) ; { 五日變動量 }
SlowDev = StdDev(Close-Close[1],SlowLen) ; { 100 日價格變動標準差 }
if SlowDev <> 0 then PriceRatio = PriceChange/SlowDev ; { 變動量比值 }
PriceRatio = Sign(Close-Close[FastLen])*PriceRatio ; { 取正負號判斷方向 }

*** Sign(N) 是一個內建函數 ,取正負值使用 ***

Plot1(PriceRatio,"PR",iff(PriceRatio>=0,Red,Green),Black,2) ;
Plot2(HB,"HB") ;
Plot3(-LB,"LB") ;

指標 2 (成交量比)
input:Length(5),Ratio(75),N(2) ;
Vars:NearVol(0),FarVol(0),RatioVol(0) ;
NearVol = Average(Volume,Length)[1] ;
FarVol = Average(Volume,Length)[Length*N+1] ;
if FarVol <> 0 then RatioVol = NearVol/FarVol ;
Plot1(RatioVol,"RV") ;
Plot2(Ratio/100,"Level") ;


原始概念的程式碼
input:HB(2),LB(2),RatioL(75) ,NBarL(5);
Vars:PriceChangeL(0),SlowDevL(0),PriceRatioL(0),NearVolA(0),FarVolA (0),RatioVolA(0),MP(0);
PriceChangeL = Absvalue(Close-Close[5]) ;
SlowDevL = StdDev(Close-Close[1],100) ;
if SlowDevL <> 0 then PriceRatioL = PriceChangeL/SlowDevL ;
PriceRatioL = Sign(Close-Close[5])*PriceRatioL ;

NearVolA = Average(iff(DataComPression > 1,Volume,ticks),5)[1] ;
FarVolA = Average(iff(DataComPression > 1,Volume,ticks),5)[10+1] ;
if FarVolA <> 0 then RatioVolA = NearVolA/FarVolA ;

if PriceRatioL < -LB and RatioVolA < RatioL/100 then buy next bar at market ;
if PriceRatioL > HB and RatioVolA < RatioL/100 then sell next bar at market ;

if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarL then ExitShort next bar at Market ;

台指期 日K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200


如果我們將程式碼變更如下(將條件變數都改為多空雙向皆不同)
input:FastLenL(5),SlowLenL(100),RatioL(75),FastLenS(5),SlowLenS(100),RatioS(75),HB(2),LB(2),N(2) ,NBarL(5),NBarS(5);
Vars:PriceChangeL(0), SlowDevL(0),PriceRatioL(0),NearVolA(0),FarVolA(0),RatioVolA(0);
Vars:PriceChangeS(0), SlowDevS(0),PriceRatioS(0),NearVolB(0),FarVolB(0),RatioVolB(0);
vars: IsBalanceDay(False),MP(0),PF(0),PL(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 ;

{ 計算多方進場條件 }
PriceChangeL = Absvalue(Close-Close[FastLenL]) ;
SlowDevL = StdDev(Close-Close[1],SlowLenL) ;
if SlowDevL <> 0 then PriceRatioL = PriceChangeL/SlowDevL ;
PriceRatioL = Sign(Close-Close[FastLenL])*PriceRatioL ;

{ 成交量變化 }
NearVolA = Average(Volume,FastLenL)[1] ;
FarVolA = Average(Volume,FastLenL)[FastLenL*N+1] ;
if FarVolA <> 0 then RatioVolA = NearVolA/FarVolA ;

{ 計算空方進場條件 }
PriceChangeS = Absvalue(Close-Close[FastLenS]) ;
SlowDevS = StdDev(Close-Close[1],SlowLenS) ;
if SlowDevS <> 0 then PriceRatioS = PriceChangeS/SlowDevS ;
PriceRatioS = Sign(Close-Close[FastLenS])*PriceRatioS ;

{ 成交量變化 }
NearVolB = Average(Volume,FastLenS)[1] ;
FarVolB = Average(Volume,FastLenS)[FastLenS*N+1] ;
if FarVolB <> 0 then RatioVolB = NearVolB/FarVolB ;

{ 當價格變動比例 < -LB 且 成交量比 < RatioL 時 ,多單進場 }
if PriceRatioL < -LB and RatioVolA < RatioL/100 then buy next bar at market ;

{ 當價格變動比例 > HB 且 成交量比 < RatioS 時 ,空單進場 }
if PriceRatioS > HB and RatioVolB < RatioS/100 then sell next bar at market ;

{ 固定持有 K棒數出場 }
if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;

if IsBalanceDay then setExitonClose ;

台指期 日K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200

同樣也是以多單為主 ~ 蠻合適作股票多單的判斷喔!

0 留言:

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------