[台指期][策略] 電金價差 + 迭代式價格的 WAverage 和 RSI 指標

商品配置

  • 主商品
    • 台指期 30-min K
  • 相依商品
    • 電子期 30-min K
    • 金融期 30-min K
  • 交易時段
    • 日盤 08:45 ~ 13:45
  • 交易成本
    • 500 TWD (i.e., 來回成本 1000 TWD)
  • 回測週期
    • IS 2000/1/1 ~ 2019/12/31
    • OOS 2020/1/1 ~ now

主要邏輯

  • 使用 電子期 / 金融期 之 Spread 作為多空方向濾網
  • 使用兩條迭代式價格的 Weighted Average 之快、慢線
  • 使用兩條迭代式價格的 RSI 之快、慢線
  • 使用市價單 (market order) 多空對翻進場
  • 使用固定 Bar 直接出場
  • 使用固定點數停損和停利出場
  • 使用移動停利出場
  • 使用台指結算日自然結算出場

策略說明

這篇已有詳細地介紹「迭代式價格」,此篇策略採用的是「使用價格速度來更新」的方式,基於 High 和 Low 作為目標價來進行新價位 (nPrice) 的計算。另外,值得注意得部分還有權重部分,在這使用了 RSI 做為權重動態調整。

vars: nPrice(0), Vel(0);
Vel = 0.2*Vel[1] + (1-RSI(C[1],33)/100)*(L[0]-nPrice[1]) + (RSI(C[1],33)/100)*(H[0]-nPrice[1]);
nPrice = iff(currentbar < 5, C[0], nPrice[1] + 0.6*Vel);

如此一來,再將 nPrice 代入 Weighted Average 和 RSI 作為策略的主要多空進場邏輯,詳見如下。

多方進場
WAverage(nPrice, lWAvgLen1) > WAverage(nPrice, lWAvgLen2)
RSI(nPrice, lRSILen1) > RSI(nPrice, lRSILen2)
空方進場
WAverage(nPrice, sWAvgLen1) < WAverage(nPrice, sWAvgLen2)
RSI(nPrice, sRSILen1) < RSI(nPrice, sRSILen2)

策略績效

歡迎聯繫交換策略

交易價格不是只有 Open, High, Low, Close 可用,還有 …

不論您操作的是股票 Stocks, 期貨 Futures 或 匯率 Forex, 等各類型的金融商品,K 線圖 (Candlestick Chart) 通常是被用來觀看價格走勢的首選方式,其中它一根K棒所涵蓋的 Open, High, Low, Close (OHLC) 四種數值便會延伸作為各種分析方法或技術指標的輸入依據,以 MultiCharts 程式交易軟體的 2 個內建指標舉例:

  • BollingerBand(Close, 20, 2): 此使用 Close 作為布林通道指標的 Price 輸入
  • Average(High, 9): 此使用 High 作為均線指標的 Price 輸入

基本 OHLC 平均型 #

在程式交易的開發中你一定會為了提升你程式策略邏輯變化,因而嘗試替換指標的 Price 部分,一些經典的 Price 變化是使用 Weighted Close Price, Typical Price, Average Price, Median Price 四種變形之一取代之,那麼同一種指標的值則會產生出不同的輸出結果,進而展現不一樣多空或進出場的邏輯特性。

所提及的四種價格基本上可歸納為 OHLC 進行各種組合與平均計算而得,它們的實際計算方式與 MultiCharts 對應函數如下:

WeightedClose; // (2C + H + L) / 4
TypicalPrice;  // (H + L + C) / 3
AvgPrice;      // (H + L + O + C) / 4
MedianPrice;   // (H + L) / 2

除了上述四種經典的變化之外,你以為就沒了嘛?! 以下將提供你兩大數學模型,基於模型你可在自由地開發出各種千變萬化的價格形式。

收盤價校正型 #

此類型簡單來說,就是將當根 Bar 的收盤價 (Close) 加上一個或多個變動量 Delta 來實現對收盤價的校正,每一變動量可同時賦予它適當的權重 w 值來控制它的校正影響力,如下一簡單數學模型表示:

其中,變動量 Delta 可為正與負值,並有多樣的變化可能性,變動量設計原則上都會基於 OHLC 來組成實現,以確保其量的大小加至收盤價上後,新收盤價 (nClose) 不會過度偏離原收盤價導致變成無意義新值;權重值 w 建議介於 0 ~ 1 之間,主要還是根據變動量的值域與其期望的影響力控制來決定。

使用上、下影線做校正 #

這裡舉一實際例子,利用上影線具壓力和下影線具支撐的概念來設計變動量部分,其公式如下,有 Low 和 High 的那 2 項,則分別是下影線和上影線的長度計算,然後希望它們具有相同的校正影響,故權重值皆為 0.5:

以下提供 MultiCharts 的程式供直接貼上執行 😀

vars: nClose(0);
nClose = C[0] + 0.5*(minlist(O[0],C[0])-L[0]) + 0.5*(maxlist(O[0],C[0])-H[0]);
plot1(nClose, "nClose");

如下圖,藍色區域顯示多根 K 棒具有明顯下影線,所以新收盤價則會較原收盤價的位置還來的較上方 (因為下影線代表有向上支撐力道)。

白線: 原收盤價、黃線: 新收盤價、細線: 取原/新收盤價的 5-bar 移動平均
指標調適權重 #

在剛「使用上、下影線做校正」的舉例中,權重配置都採用 0.5,那我們來稍作修改則可以讓他更智慧更 Adaptive,這我使用 Relative Strength Index (RSI) 作為舉例,意味著你也可以嘗試各種類型震盪指標 (Oscillator) 來做替換:

vars: nClose(0), vRSI(0);
vRSI = RSI(C,14);
nClose = C[0] + (1 - vRSI/100)*(minlist(O[0],C[0])-L[0]) + (vRSI/100)*(maxlist(O[0],C[0])-H[0]);
plot1(nClose, "nClose");

當 RSI 呈現過買時,如有上影線出現,其造成向下壓力道會越強烈,讓校正後的 nClose 會比實際 Close 來得低,以預測價位其實不應該這麼高,反之, RSI 在過賣時,如有下影線出現,造成的向上支撐會越強烈,以預測價格不應這麼低。

迭代式價格型 #

如下公式,乍看和「收盤價校正型」長得很像,都是加上一或多個權重變化量,但其最主要的差異是在這邊具有「迭代」的特性也就是 t – 1 部分,簡單來說,每一新 Bar 的價格都會是基於前一 Bar 的價格運算得出

使用目標價來更新 #

以下為一具體範例,展示如何實現迭代地更新獲得新的價格,從公式的第1行得知,只要決定數個目標價格 (Target),並讓前一 Bar 的價格朝它們更新即可,第2行式子就是拿當根 Bar 的 Low 和 High 為目標價來算得當根 Bar 新的價格:

注意!上式所有的權重值之總和不可為 1 (即: w1 + w2 ≠ 1),否則會使左右的迭代價格項剛好被抵銷,使迭代的特性消失。

以下提供 MultiCharts 的程式供直接貼上執行 😀

vars: nPrice(0);
nPrice = iff(currentbar = 1, C[0], nPrice[1] + 0.4*(L[0]-nPrice[1]) + 0.4*(H[0]-nPrice[1]));
plot1(nPrice, "nPrice");
使用價格速度來更新 #

以下的第1條公式就是「迭代式價格型」的標準型式,並只採用一組權重變化量 w*V。第2條公式是受 Particle Swarm Optimization (PSO) 的更新方式啟發,將目標價的機制改變成「價格速度更新 (Price Velocity Update)」之概念,將一或多個目標價的權重變化量累加在被衰減的原價格速度,並在將每一 Bar 的價格速度加上前一 Bar 的價格得出新一 Bar 的價格:

其中,w 亦被解釋為學習率,eta 是對原價格的衰減係數,phi 是目標價變動量的權重控制參數。

以下提供 MultiCharts 的程式供直接貼上執行 😀

vars: nPrice(0), Vel(0);
Vel = 0.2*Vel[1] + 0.5*(L[0]-nPrice[1]) + 0.5*(H[0]-nPrice[1]);
nPrice = iff(currentbar < 5, C[0], nPrice[1] + 0.6*Vel);
plot1(nPrice, "nPrice");

如下圖,w 稱為學習率,所以圖中可發現 w 大者 (白線) 學習 H 和 L 速度較快,反之,w 小者 (藍線) 學習 H 和 L 速度較慢,類似短均線較敏感、長均線較不敏感,那不妨大家可以試試看當白線黃金/死亡交叉藍線時作為多空進出場訊號,是否會有不錯的績效呢?

在 AI 和 ML 領域中,有許多更新公式可套用在這,除了剛介紹的 PSO 之外,強化學習的 Q-learning 也是一可研究方向,將 Q 的部分視為 nPrice,然後針對 reward 項與 max Q 項進行設計,同樣也可以發展出另一新的價格走勢,這部分未來有時間設計好後,另發文章分享了!

{\displaystyle Q^{new}(s_{t},a_{t})\leftarrow \underbrace {Q(s_{t},a_{t})} _{\text{old value}}+\underbrace {\alpha } _{\text{learning rate}}\cdot \overbrace {{\bigg (}\underbrace {\underbrace {r_{t}} _{\text{reward}}+\underbrace {\gamma } _{\text{discount factor}}\cdot \underbrace {\max _{a}Q(s_{t+1},a)} _{\text{estimate of optimal future value}}} _{\text{new value (temporal difference target)}}-\underbrace {Q(s_{t},a_{t})} _{\text{old value}}{\bigg )}} ^{\text{temporal difference}}}

總結

文中總共介紹了三種價格變化類型,包含 (1) 基本 OHLC 平均型、(2) 收盤價校正型、(3) 迭代式價格型,下圖將它們分別標示在圖上做觀察。

可發現 (2) 型速度最快緊貼著原收盤價 Close,甚至有時比 Close 還快展顯預測的效果,(3) 型則因為採用 t – 1 的落後一根 Bar 運算,所以是三型當中最慢的,(1) 型則介於二者之間,快者可以提前進場增加獲利,慢者則是確認方向明確才進場,快慢皆有優缺點,何者較好,還是取決於整體策略進出場邏輯,所以三種型都很值得在策略開發時來嘗試看看!

橘色: High, Close, Low、黃線: 文中提到的 4 種 (1) 型、藍線: 文中提到的 2 種 (2) 型、白線: 文中提到的 2 種 (3) 型

MACD 偷偷告訴你的程式交易變化技巧

Moving Average Convergence Divergence (MACD) 是一個非常地常見且歷史悠久的技術指標,但你知道他其實偷偷告訴了我們 3 招可以用於程式交易的變化技巧嗎?這可能是你已經在用一種指標變形方式,亦可能是沒嘗試過的方式,那就可以趕快來試試看!

首先,先來快速複習下 MACD 教學文中必備的 3 個公式:

1) DIF = EMA(Close,12) - EMA(Close, 26)
2) DEM (亦稱 MACD) = EMA(DIF,9)
3) OSC = DIF - DEM

第一招 快慢線 DIF 法 (雙均線指標法)

從公式 1) 可知,DIF 是將 Close 值的快均線與慢均線進行相差 (DIFF) 而得,這告訴我們可將是將某指標的值分別取其快和慢的均線相差後,即可是一個新的指標或是一個濾網條件。

New Indicator = Average(Indicator, M) - Average(Indicator, N)

簡單舉例,假設現在你要採用 RSI 進行策略開發,大部分的人都會是利用 RSI 值是否大於 80 或 小於 20,判定是過買或是過賣後,進行多單或空單的進場。但如根據這一招,則可將 RSI 值分別取其快和慢的均線並相差後,即可變化出一新的指標,此指標便可用做多空進場的條件,如下:

vRSI = RSI(9);
if Average(vRSI,12) - Average(vRSI,26) > 0 then
   buy next bar at market;
if Average(vRSI,12) - Average(vRSI,26) < 0 then
   sellshort next bar at market;

第二招 指標取其平均法

從公式 2) 可知,是將 DIF 取其均線做為 DEM/MACD 值的使用,這部分在第一招其實就已說明,只要將某一指標取其平均一次即可產生一新的指標,並同樣可做一濾網條件來使用。

New Indicator = Average(Indicator, X)

這邊要強調的是 MACD 的均線都是採用 Exponential Moving Average (EMA),代表我們也可以嘗試各種均線類型來取代,進而產生多種具新特性的指標,常見可用的均線有 Simple Moving Average (SMA), Weighted Moving Average (WMA), Cumulative Moving Average (CMA) 等,更多進階的均線可參考 Moving Average Smoothness Benchmark

第三招 單一均線指標法

最後公式 3) 可知,是將 DIF 值和 DIF 自己的均線 (DEM/MACD) 做相減,這招在常見不過,就是所謂的單一均線指標法,只要你曾用過均線那你早就用過這招了!

如下只要把 DIF 換成 Close 就是你常見使用方式:

  • OSC = DIF – DEM = DIF – EMA(DIF,9) => Close – Average(Close,Y)
if Close - Average(Close,Y) > 0 then
   buy next bar at market;
if Close - Average(Close,Y) < 0 then
   sellshort next bar at market;

這不就是當收盤價大於均線就做多,反之,小於就做空嘛!

瞭解了這 3 招後,是不是發現有開發不完的指標組合來研發你的程式交易策略呢?!

[台指期][策略] 電金價差 + OBV指標

商品配置

  • 主商品
    • 台指期 30-min K
  • 相依商品
    • 電子期 30-min K
    • 金融期 30-min K
  • 交易時段
    • 日盤 08:45 ~ 13:45
  • 交易成本
    • 500 TWD (i.e., 來回成本 1000 TWD)
  • 回測週期
    • IS 2000/1/1 ~ 2019/12/31
    • OOS 2020/1/1 ~ now

主要邏輯

  • 使用 電子期 / 金融期 之 Spread 作為多空方向濾網
  • 使用 OBV 的 Average 快線與 OBV 的 Average 慢線觀察成交量趨勢
  • 使用市價單 (market order) 多空對翻進場
  • 使用固定 Bar 直接出場
  • 使用固定點數停損和停利出場
  • 使用移動停利出場
  • 使用台指結算日自然結算出場

策略說明

OBV (On Balance Volume) 是一個成交量累積指標,會根據商品價格動能方向來決定該Bar的成交量是「累加 or 累減」至累積成交量中,其公式如下:

如 MultiCharts 內建的 OBV Function,標準 OBV 的 Price 會是採用收盤價 (Close) 做計算,建議可嘗試將 Price 用不同的價格帶入會有不同效果,例如: TypicalPrice, WeightedPrice, MedianPrice, AvgPrice 等)。

多方進場

OBV 會在短時間有明顯賣方量,且量能趨勢仍是成長時,會有進場多單的機會。

空方進場

OBV 會在非常明確賣方量主導市場趨勢下有價格拉回升時,才會有進場空單的機會,這可解釋為一種量價背離,OBV 明確賣方但價格卻拉升,代表高機率拉高後續跌一段。

策略績效

OBV 指標

從上圖績效可看出單純使用 OBV 進場,損益圖已有45度並創新高的結果,以下則更進一步加入電金價差濾網與適當優化調整,使策略達到可上線交易的等級。

電金價差 + OBV指標

加入電金價差濾網後,雖每年平均交易次數減少快一半,但整體績效非常突出,Profit Factor 約在 3 左右,空單部分還達到 5.92,是非常少見的優秀策略。

歡迎聯繫交換策略

Drawdown 和 MDD

圖(一): Drawdown 和 MDD

網路上翻了很久,實在找不到一個適合 Drawdown (DD) 的中文翻譯,所以文中就以 Drawdown 或縮寫 DD 來稱呼吧!

DD 簡單來說就是權益曲線上,從當前歷史中最高峰權益值(Peak)到當前權益之間的差值,如上圖標示的垂直紅線,DD 值有大有小,其中在圖中(給定的時間區間)內,最大 DD 又稱為 Maximum DD (MDD),如橘色線。

值得注意的是圖上任何一個時間點都有其對應的一個 DD 值,從 Wiki 對於 Drawdown (economics) 的數學公式,我們可以看到當下時間點 T 的 DD 值表示如下:

其中 (0,T) 代表從交易一開始到當下時間點 T。時間點 T 的 DD 值為 0 和 [過去權益值 X(t) – 當下權益值 X(T)] 之間取最大值,如果當下權益值大於過去前一個權益值 (權益曲線向上) ,那彼此相減是負值,所以0和負數取最大值就是 0,如圖中綠色箭號,此時因為權益值向上創新高所以 DD 的值是 0,反之,權益值向下時,公式就會得到一個非 0 的 DD 值。

另外,計算當下時間點 T 的 MDD 值的公式如下:

其中 [max 權益值(t) – 權益值(τ)] 代表當時間 τ 時的 MDD,而整個公式代表從比較過去發現的所有 MDD 當中取最大的作為當下時間點 T 的 MDD,換句話說,在過程物中會不斷有新的 MDD 被發現,如上圖中的橘色圓圈,這些 DD 在過去都曾經都當過 MDD。

延伸閱讀
https://www.investopedia.com/terms/m/maximum-drawdown-mdd.asp