앞서 소개했던 심리선 (Psychological Line)과 비슷하게 매수강도와 매도강도를 측정하는 지표 중 하나인 BOP (Balance of Power)를 소개한다. BOP는 이고르 레브신(Igor Levshin)이 2001년에 만든 비교적 역사가 오래되지 않은 지표이다. BOP는 종가와 시가의 차이를 고가와 저가의 차이로 나눠 표현하는 지표이다. 캔들 차트의 몸통을 캔들차트의 꼬리까지 포함하여 나눈 개념. 종가와 시가는 당연히 시가와 고가 사이에 있게 되므로 자연스레 -1과 1 사이의 값으로 표현된다. BOP가 양수일 때는 구매자의 힘(Power)이 더 강하다고 판단하며(Bull), BOP가 음수일 경우에는 판매자의 힘이 더 강하다고 판단한다(Bear). 개념적으로는 꼬리가 없이 봉이 꽉 차서 한 방향으로 움직이고 마무리된 봉의 파워가 더 강하다고 판단하는 것이라고 볼 수 있으나 꼬리가 없다면 봉이 짧으나 기나 상관없이 최대 값을 갖게 되는 단점은 있다.
BOP은 매일매일의 종가와 시가의 차이를 고가와 저가의 차이로 나눠 표현하기 때문에 일별 별동이 엄청나게 심하고 이 자체로는 사용하기 힘들다. 따라서 BOP를 통상 9일 단순 이동 평균(Simple Moving Average)하여 표현한 값을 사용하는 경우가 많다.
매매 전략은 두개두 개 라인의 크로스를 이용할 경우에는 매매빈도가 너무 잦아지고 허위시그널이 많아 어렵다. 물론 서로 다른 길이, 혹은, 서로 다른 이동 평균 유형을 이용한 를 가진 두 개의 이동평균선의 교차를 이용하여 매매하는 방법을 이용할 수는 있으나 수익률이 잘 나오지 않을 것이다.
이 외에 밴드를 설정해서 하단에서 상향 돌파 시 매수하고 상단 밴드를 하향 돌파 시 매도하는 방법도 있으나, 종목별 변동이 다 다르기 때문에 통상적으로 사용되는 밴드의 값은 제시하기 어렵고, 과거 데이터를 관찰하여 종목별로 적당한 값을 정해 적용할 수 있다.
가장 일반적으로 적용되는 매매 방법은 BOP의 이동평균이 0을 기점으로 상향 돌파하는 경우 매수하고 하향 돌파하는 경우 매도하는 방법이다. 적용하는 종목에 따라 다르겠으나, 이 경우에도 적중률이나 수익률이 엄청 잘 나오는 편이 아닌긴 하나 개발된 지 얼마 되지 않는 지표이기 때문에 좀 더 개선될 여지는 있다.
마지막으로 BOP (Balance of Power) 트레이딩 뷰 파인 스크립트 소스와 pandas-ta 소스를 공유하며 마친다.
- BOP (Balance of Power) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Balance of Power", shorttitle="BOP", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
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)
legnthInput = input.int(defval=9, title="Signal Line Length")
maTypeInput = input.string("SMA", title="MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], display = display.data_window)
bop = (close - open) / (high - low)
bopMA = ma(bop, legnthInput, maTypeInput)
bopPlot = plot(bop, title="BOP", color=color.purple)
bopMAPlot = plot(bopMA, title="BOP MA", color=color.yellow)
hline(0, color=color.gray, linestyle=hline.style_dotted)
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(bopMAPlot, midLinePlot, 0.3, 0, top_color=color.green, bottom_color=color.new(color.green, 100))
fill(bopMAPlot, midLinePlot, 0, -0.3, top_color=color.new(color.red, 100), bottom_color=color.red)
- BOP (Balance of Power) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
strategy(title="Balance of Power", shorttitle="BOP", margin_long=100, margin_short=100, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, commission_value=0.2, pyramiding=0)
import TradingView/ta/7 as ta7
import blackcat1402/pandas_ta/7 as pta
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)
legnthInput = input.int(defval=9, title="Signal Line Length")
maTypeInput = input.string("SMA", title="MA Type", options = ["SMA", "EMA", "DEMA", "TEMA", "FRAMA", "T3", "TRIMA", "RMA", "WMA", "HMA", "VWMA", "ALMA", "JMA", "SINWMA", "FWMA", "LINREG", "SWMA", "VIDYA", "VWAP", "ZLMA"], display = display.data_window)
bop = (close - open) / (high - low)
bopMA = ma(bop, legnthInput, maTypeInput)
bopPlot = plot(bop, title="BOP", color=color.purple)
bopMAPlot = plot(bopMA, title="BOP MA", color=color.yellow)
hline(0, color=color.gray, linestyle=hline.style_dotted)
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(bopMAPlot, midLinePlot, 0.3, 0, top_color=color.green, bottom_color=color.new(color.green, 100))
fill(bopMAPlot, midLinePlot, 0, -0.3, top_color=color.new(color.red, 100), bottom_color=color.red)
startDate = input.time(defval=timestamp("01 Jan 1970 00:00 +0000"), group = "Test Range")
finishDate = input.time(defval=timestamp("31 Dec 2025 24:00 +0000"), group = "Test Range")
time_condition = time >= startDate and time <= finishDate
if(time_condition)
if ta.crossover(bopMA, 0)
strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
if ta.crossunder(bopMA, 0)
strategy.close_all('매도')
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)
- BOP (Balance of Power) 트레이딩 뷰 파인 스크립트 지표 소스
import pandas as pd
import pandas_ta as ta
import FinanceDataReader as fdr
data = fdr.DataReader('005930')
bop = ta.bop(open_=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])
data = pd.concat([data, bop], axis=1)
data.dropna(inplace=True)