2014年2月26日 星期三

這樣應用也可以 - 標準差 [程式碼]

EasyTrader ArtNo 114
標準差是一種表示分散程度的統計觀念。標準差已廣泛運用在股票以及共同基金投資風險的衡量上,主要是根據基金凈值於一段時間內波動的情況計算而來的。一般而言,標準差愈大,表示凈值的漲跌較劇烈,風險程度也較大。實務的運作上,可進一步運用單位風險報酬率的概念,同時將報酬率的風險因素考慮在內。所謂單位風險報酬率是指衡量投資人每承擔 一單位的風險,所能得到的報酬,以夏普指數最常為投資人運用。

 標準差是一組數值自平均值分散開來的程度的一種測量觀念。一個較大的標準差,代表大部分的數值和其平均值之間差異較大;一個較小的標準差,代表這些數值較接近平均值。

 例如,兩組數的集合 {0, 5, 9, 14} 和 {5, 6, 8, 9} 其平均值都是 7 ,但第二個集合具有較小的標準差。

 標準差可以當作不確定性的一種測量。例如在物理科學中,做重覆性測量時,測量數值集合的標準差代表這些測量的精確度。當要決定測量值是否符合預測值,測量值的標準差佔有決定性重要角色:如果測量平均值與預測值相差太遠(同時與標準差數值做比較),則認為測量值與預測值互相矛盾。這很容易理解,因為值都落在一定數值範圍之外,可以合理推論預測值是否正確。
標準差在股市分析中的應用
 股票價格的波動是股票市場風險的表現,因此股票市場風險分析就是對股票市場價格波動進行分析。波動性代表了未來價格取值的不確定性,這種不確定性一般用方差或標準差來刻畫,最常見到的布林通道 Bollinger Channel 的上下軌就是使用標準差來衡量一段時間內的股價波動範圍。而過去在部落格中介紹的T指標也是含有標準差的運算元在其中,本篇從另一角度來闡述 - 將最高價與最低價的短期價格波動標準差與的長期價格波動的標準差作比較,並將之作為是否進場的依據,再搭配 ATR的變化作成交易策略

基本設定 台指期 日K 回測週期 2001/1 ~ 2014/2 交易成本 1200
測試程式碼
Inputs: NL1(10),NL2(12),NS1(5),NS2(9),NoATR_Stop(16),
Shift_L1(10),NoATR_L(7),Entry_RL(1.52),NoATR_TL(10),Ratio_TL(1.52),Ratio_PL(57),LStopRatio(1.1),NBarL(8),
Shift_S1(12),NoATR_S(3),Entry_RS(1.66),NOATR_TS(10),Ratio_TS(1),RAtio_PS(50),SStopRatio(1.12),NBarS(2);

Var:ATREnL(0),ATRTrailL(0),ATRMML(0),ATREnS(0),ATRTrailS(0);
Var: UBuy(0),USell(0),BuyStop(0),NewBuyStop(0),LTrailOn(false),SellStop(0),NewSellStop(0),STrailOn (false);
Var:VarL1(0),VarL2(0),VarS1(0),VarS2(0),EntCondL(false),EntCondS(false),IsBalanceDay(False),MP(0);

MP = MarketPosition ;

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

ATREnL = Average(TrueRange, NoATR_L);
ATRTrailL = Average(TrueRange, NoATR_TL);
ATRMML = Average(TrueRange, NoATR_Stop);
ATREnS = Average(TrueRange, NoATR_S);
ATRTrailS = Average(TrueRange, NoATR_TS);

UBuy = Low + Entry_RL * ATREnL;
USell = High - Entry_RS * ATREnS;

VarL1 = StdDev(Low, NL1);
VarL2 = StdDev(Low, NL2)[Shift_L1];
VarS1 = StdDev(High, NS1);
VarS2 = StdDev(High, NS2)[Shift_S1];
EntCondL = VarL1 < VarL2;
EntCondS = true;
EntCondS = VarS1 < VarS2;

{ Entry orders }

If EntCondL and EntriesToday(date) < 1 then begin
   Buy next bar at UBuy stop;
end;

If EntCondS and EntriesToday(date) < 1 then begin
   Sell next bar at USell stop;
end;

If MP > 0 then begin
   If BarsSinceEntry = 0 then begin
       BuyStop = EntryPrice - LStopRatio * ATRMML;
   LTrailOn = false;
end;

If Close - EntryPrice > Ratio_TL * ATRTrailL then LTrailOn = true;

If LTrailOn then begin
   NewBuyStop = EntryPrice + Ratio_PL * (Close - EntryPrice)/100.;
   BuyStop = MaxList(BuyStop, NewBuyStop);
end;

ExitLong next bar at BuyStop stop;

{ If BarsSinceEntry > NBarL then
ExitLong next bar at Lowest(Low,3) stop {market};}

end;

{ Exit orders, short trades }
If MP < 0 then begin
{ If BarsSinceEntry = 0 then begin
      SellStop = EntryPrice + SStopRatio * ATRMML;
  STrailOn = false;
end;

If EntryPrice - Close > Ratio_TS * ATRTrailS then STrailOn = true;
If STrailOn then begin
   NewSellStop = EntryPrice - Ratio_PS * (EntryPrice - Close)/100.;
   SellStop = MinList(SellStop, NewSellStop);
end;

ExitShort("ExStop-S") next bar at SellStop stop;}

If BarsSinceEntry > NBarS then
   ExitShort next bar at Highest(High,3) stop {market};
end;
if IsBalanceDay then setexitonclose ;



從績效曲線來看,是一個可以應用的元素,此例在多單部份的績效明顯的好,空單部份讀者可以再作修正
MagicQS043

2 則留言:

  1. E大你好
    請教一下,如果我想改成 10 or 30 分線,要如何修改呢

    回覆刪除
  2. 將週期設為 10分/ 30分 ,然後針對 input 參數再跑過最佳化找合適參數

    回覆刪除