Python으로 변동성 스탑 (Volatility Stop) 지표 구현

변동성 스탑 (Volatility Stop)은 ATR을 활용하여 가격 변동성을 기반으로 손절 지점을 설정하는 기술적 지표입니다. 상승 추세에서는 ATR을 이용해 가격 아래에 스탑을 설정하고, 하락 추세에서는 가격 위에 스탑을 설정합니다. 이 지표는 트렌드를 추적하며 스탑이 반전되면 추세 변화의 신호로 해석됩니다. 트레이딩에서 손절 관리 및 추세 확인에 유용하게 활용됩니다.

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))

트레이딩뷰 차트와 비교

2월 12일 22시에 트렌트가 바뀌었고, 2월 13일 00시까지 같은 값을 갖는지 체크해 보겠습니다.