변동성 스탑 (Volatility Stop)은 ATR을 활용하여 가격 변동성을 기반으로 손절 지점을 설정하는 기술적 지표입니다. 상승 추세에서는 ATR을 이용해 가격 아래에 스탑을 설정하고, 하락 추세에서는 가격 위에 스탑을 설정합니다. 이 지표는 트렌드를 추적하며 스탑이 반전되면 추세 변화의 신호로 해석됩니다. 트레이딩에서 손절 관리 및 추세 확인에 유용하게 활용됩니다.
Volatility Stop 구현
import pandas as pd
import ccxt
import pinetopy as pp
import numpy as np
# Binance Futures, BTCUSDT, 1h
bnb = ccxt.binance({'options': { 'defaultType': 'future' }})
ohlcv = bnb.fetch_ohlcv(symbol="BTC/USDT", timeframe="1h", limit=500)
df = pd.DataFrame(ohlcv, columns=['time', 'open', 'high', 'low', 'close', 'volume'])
df['time'] = pp.kst(df['time'])
# TradingView Default Settings
def main(df, length=20, factor=2.0):
src, atr_values = df['close'], pp.atr(df, length) * factor
max_price, min_price = src.copy(), src.copy()
stop, uptrend = np.full_like(src, np.nan), np.full_like(src, True, dtype=bool)
for i in range(1, len(df)):
max_price[i] = max(max_price[i - 1], src[i])
min_price[i] = min(min_price[i - 1], src[i])
if np.isnan(stop[i - 1]):
stop[i] = src[i] - atr_values[i] if uptrend[i - 1] else src[i] + atr_values[i]
else:
stop[i] = max(stop[i - 1], max_price[i] - atr_values[i]) if uptrend[i - 1] else min(stop[i - 1], min_price[i] + atr_values[i])
uptrend[i] = src[i] >= stop[i]
if uptrend[i] != uptrend[i - 1]:
max_price[i] = src[i]
min_price[i] = src[i]
stop[i] = max_price[i] - atr_values[i] if uptrend[i] else min_price[i] + atr_values[i]
df['vstop'], df['uptrend'] = stop, np.where(uptrend, 'green', 'red')
return df[['time', 'vstop', 'uptrend']]
print(main(df))
Check
트레이딩뷰 차트와 비교
2월 12일 22시에 트렌트가 바뀌었고, 2월 13일 00시까지 같은 값을 갖는지 체크해 보겠습니다.


