[기술적 분석] 지표 : 궤양 지수 (UI, Ulcer Index)

반응형

 

  궤양 지수, 얼서 지수라고 하는 이 지표는 본디 포트폴리오 리스크를 평가하는 데 사용하는 지표이다. 이를 주식이나 개별 종목에 접목시킨 게 오늘 소개하는 얼서 지수이다. 얼서 지수는 피터 마틴(Peter Martin)이 만든 지수로 이름이 Ulcer(궤양)인 이유는 스트레스 때문에 위궤양을 유발하는 하방 리스크를 측정하는 지표이기 때문. 이와 세트로 얼서 지수로 측정한 리스크를 헷징 하는 성과를 측정하는 UPI(Ulcer Performance Index)라는 것도 있다.

 

  궤양 지수는 관찰 기간 내 최고 종가를 기준으로 그 차이를 수집한다. 소위 되돌림이라고 하는 값, 혹은 Max Drawdown을 측정하여 그 값을 가지고 하방 리스크를 점친다. 단, 이 지표는 본디 포트폴리오 리스크 측정 지표이다 보니 지표의 값을 가지고 진입 시점이나 매도 시점을 점치기보다는 종목의 특정 기간의 변동성을 측정하는 데 사용하는 게 좋다.  궤양 지수의 값이 높으면 하방으로 하락이 이뤄진 후 값이 반영된 상태, 낮으면 상승 중인 상태로 이해해도 좋다.

 

궤양 지수 (UI, Ulcer Index)

 

  마지막으로 트레이딩 뷰 파인 스크립트 소스와 pandas-ta 소스를 공유하며 마친다.

 

반응형

 

  • 궤양지수 (Ulcer Index) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Ulcer Index", shorttitle="UI", overlay=false)
import TradingView/ta/7 as ta7 
import blackcat1402/pandas_ta/7 as pta

length = input.int(title="Length", defval=14)
smoothLength = input.int(title="Smoothing Length", defval=14)
breakout = input.float(title="Breakout Level", step=0.1, defval=1.5)
signalType = input.string("SMA", title="Signal Smoothing Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"])
signalLength = input.int(title="Signal Smoothing Length", defval=52)
src = input(close, title="Source")
showSignal = input.bool(title="Show Signal ?", defval=true)
highlightCrossovers = input.bool(title="Highlight Signal Crossovers ?", defval=true)
applyRibbonFilling = input.bool(title="Apply Ribbon Filling ?", defval=true)

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "DEMA" => ta7.dema(source,length)
        "TEMA" => ta7.tema(source,length)
        "FRAMA" => ta7.frama(source,length)
        "T3" => ta7.t3(source,length)
        "TRIMA" => ta7.trima(source,length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "HMA" => ta.hma(source, length)
        "VWMA" => ta.vwma(source * volume, length)
        "ALMA" => pta.alma(source, length)
        "JMA" => pta.jma(source, length)
        "SINWMA" => pta.sinwma(source, length)
        "FWMA" => pta.fwma(source, length)
        "LINREG" => pta.linreg(source, length)
        "SWMA" => pta.swma(source)
        "YIDYA" => pta.vidya(source, length)
        "VWAP" => pta.vwap(source)
        "ZLMA" => pta.zlma(source, length)

highest = ta.highest(src, length)
drawdown = 100 * (src - highest) / highest
ulcer = math.sqrt(ta.sma(math.pow(drawdown, 2), smoothLength))
signal = ma(ulcer, signalLength, signalType)

trendColor = ulcer > signal ? #0ebb23 : color.red
ulcerColor = applyRibbonFilling ? trendColor : (ulcer >= ulcer[1] ? #0ebb23 : color.red)
signalColor = applyRibbonFilling ? trendColor : #1155cc

ulcerPlot = plot(ulcer, title="Ulcer", linewidth=2, color=ulcerColor, transp=0)
signalPlot = plot(showSignal ? signal : na, title="Signal", color=signalColor, transp=0)

ribbonFillColor = applyRibbonFilling ? trendColor : na
fill(ulcerPlot, signalPlot, title="Ribbon", color=ribbonFillColor, transp=70)

plotshape(ta.crossover(ulcer, signal) and highlightCrossovers ? signal : na, title="Crossover", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(ta.crossunder(ulcer, signal) and highlightCrossovers ? signal : na, title="Crossunder", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)

hline(breakout, title="Breakout Level", linestyle=hline.style_dotted, linewidth=2)
breakoutFillColor = ulcer > breakout ? #ff9800 : na
bgcolor(breakoutFillColor, transp=90)

 

 

  • 궤양지수 (Ulcer Index) pandas-ta 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr

data = fdr.DataReader('005930')
ui = ta.ui(close = data['Close'], length=14, scalar=100)
data = pd.concat([data, ui], axis=1)
data.dropna(inplace=True)
반응형