2017年4月6日 星期四

開發商品的交易系統 - 進階篇 [8]

EasyTrader ArtNo 294
通常交易系統在開發完成後,大部分的人皆以總績效損益去做衡量,期望總績效損益愈大愈好,或者是將風險納入考量,取得最大報酬風險比。但是不同系統之間(當沖、留倉、不同交易時段、不同商品 ...)只比較總損益意義並不大,而每冒一分風險,可以獲得多少盈利,則是比較具有意義的績效指標。

有些人喜歡用勝率去做考量:賺多賺少無所謂,只要勝率高就好。
有些人會以風險低的策略,MDD小為優先考量。
有些人想的是以期望獲利*交易次數來衡量,考慮長期交易。

投資大師樊恩.薩普博士在《部位規模設定完全手冊》(The Definitive Guide to Position Sizing)中介紹了自創的交易系統衡量法 ⇢ 系統品質分數 SQN (System Quality Number)



在第一版的書籍裡 期望值 = (平均獲利*勝率) - (平均虧損*賠率)
在第二版才作修正如下,將原來的期望值公式,再除上每次交易可能遭受的風險。

期望值 = [ (平均獲利*勝率) - (平均虧損*賠率) ] ÷ 1R
基本上,只要你的交易策略期望值是正的,就是有可能會獲利的交易策略。

如果你不知道如何計算你的初始風險1R?
薩普博士建議,你可將交易記錄的平均虧損,設為你的1R。

SQN公式的影響因子如何看待呢

1. 期望獲利越高,SQN值越大。
2. 標準差越小,代表交易產生的風險越小,當然SQN值越大。
3. 交易次數(N)越多,SQN值越大。

但是交易次數過多,確實也會讓SQN失真,例如你交易了1000次,則根號N = 31.6,這會造成SQN值異常的大。所以薩普博士也建議,在筆數的計算上有個上限,如果每年超過 100 筆交易,就當作 100筆計算。

例如策略的歷史交易資料時間區間是在 2007/1/1~2010/12/31 ,共有 992 個交易日內作了 546 筆交易,則計算出平均一年的交易次數是 546*(252/992) = 138.7次,則以此例超過了一年 100 次,因此計算上每年交易次數直接帶入 100。

對於一般正常交易次數所計算出來的 SQN 要如何評價呢 ?

SQN <= 1 , 可能很難拿來交易
SQN 介於 1.01~2 之間,平均水準系統 (有1.7以上較據統計顯著性)
SQN 介於 2.01~3 之間,好系統
SQN 介於 3.01~5 之間,優秀的系統
SQN 介於 5.01~7 之間,傑出的系統 (很少有)
SQN > 7,
聖杯系統 (Holy Grail System)

當交易次數N太少,SQN也會相對低。薩普博士也給了以下的建議:

1. 交易次數只有十次(N=10),策略的SQN至少要大於3.5。
2. 交易次數只有二十次(N=20),策略的SQN至少要大於3.0。
3. 交易次數只有三十次(N=30),策略的SQN至少要大於2.5。

雖然,我們可以從績效報表裡找到相關SQN計算所需要的數字,用計算機求得策略的 SQN,總是沒有程式自動計算來得方便,所以我把這樣的想法轉成程式碼放入開發出來的策略中,這樣就可以衡量策略每一年的 SQN表現與整體交易期間的總分數

inputs:TradeArray[nn](NumericArrayRef),TradeDays(Numeric) ;
var:NTrades(0),PL(0),Sum(0),SumSq(0),NLoss(0),MeanLoss(0),MeanSqLoss(0),StdDevLoss(0),j(0),k(0),x(0);
vars:Rwin(0),RLoss(0),AvgWin(0),AvgLoss(0),Expectancy(0),AnnualTrades(0),RStdev(0),TradeAdjust(0) ;

NTrades = TradeArray[0];

AvgWin = iff(NumWinTrades <> 0, GrossProfit/NumWinTrades,0) ; { 平均盈利 }
AvgLoss = iff(NumLosTrades <> 0, GrossLoss/NumLosTrades,0) ; { 平均虧損 }
RWin = NumWinTrades/(NumWinTrades+NumLosTrades) ; {盈利筆數比例 }
RLoss = NumLosTrades/(NumWinTrades+NumLosTrades) ; {虧損筆數比例 }

Expectancy = (AvgWin*RWin + AvgLoss*RLoss)/AbsValue(AvgLoss) ; { 期望值 }

{ 統計虧損交易均方根植 }
for j = 1 to NTrades begin
   PL = TradeArray[j];
   if PL < 0 then begin
       NLoss = NLoss + 1;
       Sum = Sum + AbsValue(PL);
       SumSq = SumSq + AbsValue(PL * PL);
   end;
end;

{ minimum of 2 trades needed to calculate standard deviation }
if NLoss >= 2 then begin
    MeanLoss = Sum / NLoss;
    MeanSqLoss = SumSq / NLoss;
    x = MeanSqLoss - MeanLoss * MeanLoss;
end ;

{ 雖然薩普博士建議 SQN 計算方式,當交易筆數大於 100時,以 100 做參考 ,個人是覺得若交易次數很多時,可以同時用年化 & 調整係數來修正 }

{ 年化交易筆數 }
AnnualTrades = (252/TradeDays)*NTrades ;


{ 調整係數 }
TradeAdjust = iff(AnnualTrades > 100 ,SquareRoot(AnnualTrades/100) ,1) ;


if x > 0 then begin
   StdDevLoss = SquareRoot(x);
   RStdev = AbsValue(AvgLoss)/StdDevLoss ; { 平均單筆虧損標準差值 }
   _SQN = TradeAdjust * SquareRoot(MinList(AnnualTrades ,100)) * Expectancy / RStdev;
end else 
   _SQN = 0 ;

最後我將 如意多空網應用策略範例 內的策略也做了 SQN 評分如下











從統計出來的表現,我們也觀察到系統之間在不同的年度中 SQN也會有同質性與差異性的互補性,如果我們再多花些時間研究商品盤勢與 SQN的關係,相信更有助於開發一個優秀的交易系統的 !

PS: 表格內 Year 107 ~116 代表 2007~2016


§ 法人級操盤手~ 就是您 @ 候補中 ⇨⇨⇨ 我想了解


10 則留言:

  1. 您好! 我是看網路上的原文,加上其它中文譯作如 "交易本事:邁向頂尖操盤手的獲利心法",發想寫了這篇文章與測試

    回覆刪除
    回覆
    1. 謝謝分享,請問交易本事這本書也有講到交易系統衡量的方式嗎,例如您這次分享的SQN,
      另外請問CTA模型也是類似的交易系統衡量嗎?

      新手發問,Thanks!

      刪除
    2. Q1 交易本事這本書也有講到 SQN 概念與評價,也有簡單提到部位設定的觀念
      Q2. CTA交易策略說明 https://kknews.cc/zh-tw/finance/6bxoxm.html
      CTA 投資法 https://www.cmoney.tw/notes/note-detail.aspx?nid=45132

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

    回覆刪除
  3. 請問在訊號內要引用這個_SQN,參數要帶甚麼?感謝,可否給一個範例?

    回覆刪除
  4. 您好
    TradeArray[nn](NumericArrayRef),-- 回測期間每筆交易損益
    TradeDays(Numeric) ; --- 總交易天數

    回覆刪除