ATR定義
ATR指標全名為Average True Range(真實價格區間),指的是股價真實的波動幅度。
其算法是先計算每天的TR(True Range),再以EMA(指數移動平均)之方式計算N日TR平均值以取得ATR。
TR的算法如下:TRt = max((Ht – Lt),abs(Ct-1 – Ht), abs(Ct-1 – Lt))
算法取下列三個數的絕對值中的最大值:
- 當日高低價之差額
- 前日收盤與當日最高價之差額
- 前日收盤與當日最低價之差額
第一點考量當日的波動。第2和第3點的數值將”跳空缺口”的概念考量在內,而不會有只看單一K棒的盲點,反映一個價格序列的真實最大波動。以EMA計算ATR,將TR做趨勢平滑,讓指標不易有暴起暴落的雜訊,也能較SMA (簡單移動平均)更能反應近日價格因子。
ATR如何解讀與使用
ATR指標的重點在只反映波動性,而不指出未來價格方向。須與價格趨勢一起搭配解讀波動動能。
- ATR指標和價格趨勢同步向上,代表向上波動加強,價格甩高機會變大。
- ATR指標和價格趨勢同步向下,代表向下波動加強,價格急跌機會變大。
- ATR指標向下,價格趨勢向上,代表向上動能漸弱,價格高檔震盪走向整理機會變大。
- ATR指標向上,價格趨勢向下,代表向下動能漸弱,價格急跌後出現反彈整理機會變大。
我們可以用finlab套件裡的繪圖程式功能畫出ATR技術指標。
以近期飆股6104創惟來舉例ATR與股價的關係,可見ATR方向與股價不一定趨勢同向:
from finlab import data
from finlab.plot import plot_tw_stock_candles
from finlab.data import indicator
overlay_func={
'ema_10':indicator('EMA',timeperiod=10),
'keltner_up':indicator('EMA',timeperiod=10)+2*indicator('ATR',timeperiod=10),
'keltner_down':indicator('EMA',timeperiod=10)-2*indicator('ATR',timeperiod=10),
}
technical_func={
'atr_10':indicator('ATR',timeperiod=10),
'atr_20':indicator('ATR',timeperiod=20)
}
plot_tw_stock_candles('6104',overlay_func=overlay_func,technical_func=technical_func)
股價波動率
ATR主要應用在停損停利設定與結合通道理論來操作。
每一檔股票的價格曲線當能藉ATR/股價 (波動率) 反應股性,高波動率的股票代表高波動震盪是常態,適合當作短線或當沖的標的,低波動率的股票適合不喜承受短線劇烈波動或尋找逐底期進場的投資人。
停損停利
停損停利改用ATR作為標準,能避免用固定的單一數值統一出場造成的粗糙結果。
例如整個策略統一用10%當停損點,但大波動的股票可能上下動動20%是常態,用10%當停損點會常被洗出場。若改用均線下2倍或其他倍數的ATR來出場,就能依照每支股票波動性設定不同的出場點,做更細膩的出場設定,降低被洗出的可能。
肯特納通道(Keltner Channel)
通道模型利用過去一段時間內的價格訊息,繪製出上下軌的通道,藉此設定股價的相對高、低界線,兩條通道線的距離也呈現股價的震盪幅度,震盪小時,通道窄,震盪大時,通道寬。通道模型將價格高低與波度幅度融合,成為判斷市場趨勢的指標,能過濾均線系統中假突破的訊號。
常見的通道模型為”布林通道”用股價的標準差當作波動頻寬,肯特納通道的概念也非常類似,主要差異在使用ATR當作波動頻寬,並使用EMA當中間線。
肯特納通道 V.S. 布林通道
由上面的比較圖可知,布林通道 (bband) 的缺點在標準差 (std) 收斂和發散快,數值跳動很大,在剛股價剛往上突破、通道剛開始發散時,為明顯訊號,但上軌不適合當趨勢線,由於數值發散快,只要股價動能稍弱,就很容易會跌破上軌,不適合作為抱波段或中途切入的指標。
ATR的波動則相較”標準差”穩定,數值不會太急速跳動,更適合當作抱長波段的指標,減低大飆股太早被洗出場的可能。布林通道標準差的概念可能較適合做逆勢策略,抓價格過高或過低的反轉點。
肯特納通道策略範例
策略條件
- 限定上市櫃普通股股票。
- 收盤價位剛站上肯特納上軌通道為買進條件。
- 收盤價位於肯特納上軌通道之上為持有條件,位於之下則賣出。
- EMA均線多頭排列。
- 換股頻率為兩週(短線)。
- 排除日均成交量過小標地。
from finlab.backtest import sim
from finlab import data
data.set_universe(market='TSE_OTC')
adj_close = data.get('etl:adj_close').loc['2012':]
ema_5=data.indicator('EMA', adjust_price=True, resample='D',timeperiod=5)
ema_10=data.indicator('EMA', adjust_price=True, resample='D',timeperiod=10)
ema_20=data.indicator('EMA', adjust_price=True, resample='D',timeperiod=20)
atr=data.indicator('ATR', adjust_price=True, resample='D',timeperiod=10)
keltner_up=ema_10+2*atr
vol=data.get('price:成交股數')/1000
vol_avg=vol.average(20)
cond1 = (adj_close > keltner_up) & (adj_close.shift() < keltner_up.shift())
cond2 = (ema_5 > ema_10) & (ema_10 > ema_20)
cond3 = vol_avg > 100
entries = cond1 & cond2 & cond3
exits = adj_close < keltner_up
position = entries.hold_until(exits,nstocks_limit=20, rank=vol_avg)
rr=sim(position,resample='2W',position_limit=0.05)
回測結果
效果普通,多頭年份較強。可能要搭配其他指標應用。
結合二次創高策略
融合hahow課程中的二次創高策略,將收盤價位於肯特納上軌通道之上為持有條件,位於之下則賣出,換股頻率改為2週。更加確認股價突破強度。