分類
投資觀念與交易策略

設計交易策略

交易策略是可以也應該要寫出來的。因為科技的發達,現在的我們能快速的透過程式與回測了解交易策略是否可以獲利。發明一個新的策略是簡單的,電視上與書籍上都有許多相關的資料可以提供靈感。一個現代的交易者應該善用科學的計算能力,在許挑選出自己的投資偏好後,持續進行交易策略的設計、回測、優化。

Summary

泰德·威廉斯在大聯盟保持了61年的打擊率紀錄,在《擊球的科學》(The Science of Hitting)一書中解釋了他的心得。他將棒球場的擊球區劃分成77塊小格子,每塊格子只有棒球那麼大。他只選擇自己擅長的球出棒,落在其他格子的好球也絕不打。交易就像一場數十年的棒球打擊賽,要提高自己的打擊率(獲利),除了練習揮棒(交易),也要懂得選球(選擇機會)。透過不斷的練習與改進,變成自己擅長的技巧。

定義理想交易

在棒球打擊的領域,理想的結果就是等待中間偏高快速直球用力揮出全壘打,爭取一次獲得4分,並穩定的練習擅長的打擊方式,以保持長時間的高打擊率。在交易的領域,一樣可以分成兩個步驟,1)挑選好的投資機會, 2)設計交易系統。

挑選風險低與可預測性高的標的,在轉折開始買入,趨勢確認後加碼,趨勢結束才離場,讓資產三年賺一倍。

更具體用數字來說,我想要找1:4風險報酬比以上的投資機會,初次進場停損點8%以內,期待報酬30%以上的投資機會。我想使用勝率>40%的交易系統,期待值為0.92×0.6+1.3×0.4 = 0.552 + 0.52 = 1.072 (7.2%)。若每次投資機會使用資產的20%資金,則期待值為7.2%/5=1.44%。若一年目標為獲利33%,以複利情況下需要交易20次可達成目標。

第一步,挑選好的投資機會

在《股市的科學煉金術》書中提出了4種行情的分類。並指出,對於有系統的交易(如程式交易),最適合的是”有趨勢+低波動”的行情。這種一波到底的趨勢,系統不會誤判、不會在半路被洗出去,交易訊號清晰明瞭,資金效率高,風險最低,是投資人夢寐以求的。

有趨勢低波動的行情有如大力水手中的波菜行情,一定要吃到,我們永遠不知道何時會發生,但我們的交易模組之中一定要有這種基本配備。

高波動的含意

波動率就是股價的標準差Standard Deviation (Volatility) – 一段時間內價格與均值的距離。高波動率並非代表股票不好,而是應該了解對交易的影響是什麼:

  • 高波動率 = 投機屬性:高波動率代表短線交易人頻繁進出,造成助漲助跌,更大的波動,又吸引更多人來炒作,形成一種投機的循環。
  • 股票大漲也會拉高波動率:對於高成長股來說,股票大漲也會拉高波動率,所以不能完全排除高波動率較高的績優股。
  • 高波動率 = 高交易成本:對波段交易系統來說,高波動率需要高的容錯率,在初始買入時的停損區間會較大,上漲過程觸發停利後又向上時,追買成本也會墊高。
  • 波動率具有週期性:個股具有各自的波動率特性,且波動率是變動的,在極端高/低點時,波動率會放大。當股價盤整、均線糾結時,波動率會變低。
  • 高波動率 = 高風險:股票價格下跌時,會提高波動率,下跌速度更快,並引發恐慌,甚至達到超跌。

結論就是,股價上漲時高波動率是好的,若你想持有高波動的高成長績優股,應長期持有,或選擇在大跌之後買入,才能享受高波動股票暴漲的優點。 股票下跌時高波動率是危險的,你的股票會跌得比大盤還多。在中短線波段趨勢交易系統之下,高波動率股票較難以預測、交易成本較高,應該予以避免。

觀察個股的波動

了解一檔股票在上漲趨勢的波動最仔細的方法就是使用Regression Line工具,從MACD(88,144)向上穿越0軸為起始,跌破0軸為終止。一個不好的投資標的會有很寬的Regression 通道,上漲趨勢較短且破碎,並且時常在月線上下來回穿梭。對於使用20wma來判斷趨勢的交易系統會頻繁觸動交易訊號,有些行情看的到卻吃不到。

ROKU從60漲到180,但價格走法波動太大,屬於難交易的標的。

NQ 期貨是理想的交易標的,Regression Line相對窄而長,趨勢較為明顯,一波到底都在20wma之上。雖然漲幅的絕對值較低,但這是看得倒也賺的到的錢。

NQ的Regression Line窄而長,一波到底穩定在60wma之上

可以使用Bias這個指標來觀察股價與短中長期均線(20, 60, 200)的乖離,從下圖OKTA股價可以發現有規律的週期。每次周期結束均線糾結是波動最小的時候,都是很好的買點。而當綠線(200sma)乖離最大時,就是風險最高的時候。

第二步,設計交易系統

程式交易的好處是穩定與即時,我們處在的世代極為方便使用程式建構我們的交易系統。例如在Tradingview.com與Multicharts上面都可以進行回測或自動交易。而趨勢交易最入門的就是均線系統,透過股價與5ma, 20ma的狀態,來判讀趨勢的行程。這屬於右側交易,是等待市場告訴我們該怎麼做。優點是風險較小、時間效率較好。

轉折的特徵

波段交易最理想的狀況就是盡量賺到完整的趨勢,所以買在起漲點很重要。起漲點前會有底部型態關鍵轉折,型態的判斷較難以量化與程式化,所以程式交易會著重在轉折,而最常用來觀察這些特徵的就是均線的變化。轉折的特徵依照順序為1)破線彎頭、2)長短均線交叉、3)多頭排列。雖然不是每次都能順利從1發展到3。但一個成功上漲趨勢,就必定依序發生這些特徵。

介紹一位著名的日本股市職人-相場師朗,台灣有多本以他教授的技術線型書籍。他的書其實教的就是透過均線判讀轉折與行情。每一個特徵都重新被他以有趣的形容詞來命名。1)破線彎頭 = 下半身, 2)長短均線交叉 = 鳥嘴, 3)多頭排列 = 高中生時間, PPP

資料來源:技術線圖投資法

相場師朗的短線趨勢判讀,主要用的就是5日線與20日線。
第一:破線彎頭(下半身)的條件為1) 5日線持平或開始向上,2)紅K突破5日線。請注意,如果使用Weighted Moving Average (WMA) 或 Exponential Moving Average (EMA)時,只要當日收盤價格高於5 WMA,5 WMA就會向上彎,因為WMA有較高權重在最近的收盤價。所以建議使用WMA或EMA,只要確定收盤價突破5WMA即可符合破線彎頭(下半身),此時可以買入測試多單。
失敗條件:當破線彎頭後,未能進入下一個階段(長短均線交叉),5WMA又往下翻,則判斷為失敗,多單停損。
進場資金:25%

第二,長短均線交叉(鳥嘴),當5WMA以陡峭的角度向上穿越20MA,通常20MA也會呈現”略為朝上”。而一個好的鳥嘴就在於5日線向上的角度夠陡峭,其背後的意義是買盤動力大,讓股價以極快的速度突破了20日的成本,隨後可吸引更多的買盤。此時可以買入加碼多單。
失敗條件:當5WMA向上穿越20WMA後,未能進入下一階段(多頭排列),則5WMA向下穿越20WMA即為失敗,多單停損。
加碼資金:50%

第三,多頭排列(高中生時間),也就是5WMA與20MA已經進入一個上升軌道。此時可增加一個長期均線60MA,而20MA向上穿越60MA,會形成第二個鳥嘴。同時5WMA>20MA>60MA,就算是一個多頭排列,上升趨勢確定。
出場條件:20MA向下穿越60MA時賣出
進場資金:25%

停利停損策略
使用Trailing ATR(x3) (period 10) 當作移動停利。

製作交易程式

tradingview的script功能可以把交易寫成程式,並進行回測。透過回測來了解交易的策略是否有效。程式的內容如下:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinTasticTrading
//@version=4
strategy(“Trend Reversal”, overlay=true, pyramiding=3, default_qty_type=strategy.cash, default_qty_value=10000)
s_len = input( 5 )
m_len = input( 20 )
l_len = input( 60 )
//Draw WMAs
s_ma = wma(close,s_len)
m_ma = sma(close,m_len)
l_ma = sma(close,l_len)
plot(s_ma, color=color.yellow, linewidth=2)
plot(m_ma, color=color.orange, linewidth=2)
plot(l_ma, color=color.blue, linewidth=2)

//ATR Stop loss
Periods = input(title=”ATR Period”, type=input.integer, defval=10)
src = input(hl2, title=”Source”)
Multiplier = input(title=”ATR Multiplier”, type=input.float, step=0.1, defval=3.0)
sl=src-(Multiplier*atr(Periods))
sl1 = nz(sl[1], sl)
sl := close[1] > sl1 ? max(sl, sl1) : sl
plot(strategy.position_size > 0 ? sl:na, title=”Stop Loss”, style=plot.style_linebr, linewidth=2, color=color.green)

//Trading backtest since
condition100 = year>=2018

//Long Entry Step 1 Cross Up short ma
condition1 = s_ma[1] == lowest(s_ma,3)
condition2 = close>open and close>s_ma
condition3 = s_ma<m_ma
condition10 = condition1 and condition2 and condition3 and condition100
plotshape(condition10, style = shape.arrowup, text= “下半身”, location=location.belowbar, color=color.lime, size=size.tiny)
//Enter Long Position
strategy.entry(“LE_1”, strategy.long, qty = strategy.equity*0.25/close, when = strategy.position_size == 0 and condition10)

//Long Entry Step 2 short ma crossup long ma
condition21 = crossover(s_ma,m_ma) and condition100
step2_qty = (strategy.equity*0.75 – strategy.position_size/close)>0 ? (strategy.equity*0.75 – strategy.position_size*close)/close : 0
strategy.entry(“LE_2”, strategy.long, qty = step2_qty, when = condition21)
plotshape(condition21, style = shape.arrowup, text= “鳥嘴”, location=location.belowbar, color=color.lime, size=size.tiny)

//Long Entry Step 3 PPP
condition31 = s_ma>m_ma and m_ma>l_ma
condition32 = condition31[1]==false and condition31 == true and condition100
step3_qty = (strategy.equity – strategy.position_size/close)>0 ? (strategy.equity – strategy.position_size*close)/close : 0
strategy.entry(“LE_3”, strategy.long, qty = step3_qty, when = condition32)
plotshape(condition32, style = shape.arrowup, text= “PPP”, location=location.belowbar, color=color.lime, size=size.tiny)

//Step 1 Exit
condition51 = s_ma[1] == highest(s_ma,4)
condition52 = close<open and close<s_ma
condition59 = condition51 and condition52 and condition3
strategy.close(“LE_1”, when = condition59)

//Step 2 Exit
condition61 = crossunder(s_ma,m_ma) and strategy.openprofit/strategy.position_size/close < 0.05
strategy.close(“LE_1”, when = condition61)
strategy.close(“LE_2”, when = condition61)

//Step 3 Exit
condition71 = crossunder(m_ma, l_ma)
strategy.close_all(when = condition71)

//Stop Loss Exit
strategy.close_all(when = close<sl, comment = “SL”)

搜尋理想回測標的

透過tradingview的screener功能,我們可以得知NQ的 Volatility M(月波動率)是2.44%,一年的回報率是40%。而為了達成超越NQ的投資績效,我們可以放大Screener的Volatility M到5%,一年的回報率>60%,詳細搜尋條件如下:

可以搜尋到大約50~100個投資標的,若以一年漲幅排序,可以發現不少SaaS股票名列其中,例如VEEV, HUBS, OKTA, NOW。

回測結果

回測時,可以從下面幾個條件來評估交易策略的好壞:

  • 獲利能力:獲利、賺賠比(profit factor)、勝率
  • 風險程度:Max Drawdown 最大回檔
  • 交易頻率:交易次數
  • 穩定性:觀察損益曲線是否穩健向上

此策略僅回測2018年至今(2020/9/29)的績效,簡單先以獲利與風險程度來看結果:
QQQ: 獲利71.82%,勝率42.55%,Profit Factor 3.887,最大回檔11.09%
OKTA: 獲利231.52%,勝率37.5%,Profit Factor 1.865,最大回檔30.29%
VEEV: 獲利75.58%,勝率34.09%,Profit Factor 2.023,最大回檔20.17%
NOW: 獲利125.15%,勝率42.55%,Profit Factor 3.441,最大回檔21.35%
總體來看,此策略是可以獲利的,尤其是當市場出現大漲的時候,往往能夠抓住趨勢主升段。勝率可以達到40%,賺賠比也能達到3以上。但這樣的獲利績效仍然不夠,例如QQQ從2018年初到9/28的Buy & Hold獲利為75%。所以忙了那麼多,頻繁的交易並無法提供更好的獲利回報。從K線圖上也可以看到很明顯的缺點就是當股市盤整與下跌時,會因為重複的測試進場而造成損失。而以Max Drawdown風險程度來看是可以接受的,與已知的股票中期回檔程度差不多,在10%~30%。策略的優點是,資金在股價下跌時並不持有股票,所以投資人較能睡得安穩。在多標的Portfolio設計中,這些資金是可以運用在其他有上漲機會的股票上,所以資金效率會比較高。

接下來的工作…

在完成了以上的工作之後,基本上能判斷一個策略是否值得進行優化。在普遍已知的趨勢策略中,勝率>40%,賺賠比>1.5是可以接受的底線。而以上的策略是明顯達標得。但這種績效拿來投入實際操作還是太過陽春。而接下來的工作就是優化策略。我認為可以改善的方向為:

  • 減少交易:增加Filter,減少在盤整與下跌中交易。
  • 優化參數:針對標的找出更有效率的短、中、長期均線
  • 空單策略:在大跌的市場中加入放空策略。

總結,交易策略是可以也應該要寫出來的。因為科技的發達,現在的我們能快速的透過程式與回測了解交易策略是否可以獲利。發明一個新的策略是簡單的,電視上與書籍上都有許多相關的資料可以提供靈感。一個現代的交易者應該善用科學的計算能力,在許挑選出自己的投資偏好後,持續進行交易策略的設計、回測、優化。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *