不論您操作的是股票 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 項進行設計,同樣也可以發展出另一新的價格走勢,這部分未來有時間設計好後,另發文章分享了!
總結
文中總共介紹了三種價格變化類型,包含 (1) 基本 OHLC 平均型、(2) 收盤價校正型、(3) 迭代式價格型,下圖將它們分別標示在圖上做觀察。
可發現 (2) 型速度最快緊貼著原收盤價 Close,甚至有時比 Close 還快展顯預測的效果,(3) 型則因為採用 t – 1 的落後一根 Bar 運算,所以是三型當中最慢的,(1) 型則介於二者之間,快者可以提前進場增加獲利,慢者則是確認方向明確才進場,快慢皆有優缺點,何者較好,還是取決於整體策略進出場邏輯,所以三種型都很值得在策略開發時來嘗試看看!
橘色: High, Close, Low、黃線: 文中提到的 4 種 (1) 型、藍線: 文中提到的 2 種 (2) 型、白線: 文中提到的 2 種 (3) 型