[가상화폐] Bollinger Band 계산

LONGNEW·2024년 1월 16일
0

자동화

목록 보기
1/4

볼린져 밴드는 해당 물건의 "종가"를 모아서 만드는 통계 지표로 계산 하려는 기간동안의 평균, 표준 편차를 구하여 계산할 수 있다.

과거의 price 가져오기

BingX를 이용하기 때문에 주 API는 BingX이다.

def get_prices(symbol, interval, which):
    payload = {}
    path = '/openApi/swap/v3/quote/klines'
    method = "GET"

	# 현재 기준으로 20일 전의 시간을 밀리초로 나타낸다.
    now = datetime.now()
    ten_days_ago = now - timedelta(days=20)
    milliseconds = int((ten_days_ago - datetime(1970, 1, 1)).total_seconds() * 1000)

	# API에서 요구하는 파라미터의 값을 선언해준다.
    paramsMap = {
    "symbol": symbol,
    "interval": interval,
    "limit": "1000",
    "startTime": str(milliseconds)
}
    paramsStr = temp_bingx.praseParam(paramsMap)
    res = json.loads(temp_bingx.send_request(method, path, paramsStr, payload))

	# 바이낸스와 동일한 형태로 뒤집어준다.
    data = []
    for item in res["data"][::-1]:
        data.append(float(item[which]))
    return data

함수가 주는 정보처럼 symbol, interval, which 세 가지의 매개변수를 받아 함수를 실행한다.
binance에서는 idx가 커질 수록 현재 시간과 가깝지만, BingX에서는 idx가 작을 수록 현재와 가깝다.

현재 기준으로 20일전의 시간 까지의 데이터를 가져오게 설정하였고 이전에 binance에서 가져온 값을 이용해 MACD를 구하는 코드를 작성하였기에 binance 기준으로 bingX에서 가져온 데이터를 뒤집어 주었다.

평균, 표준편차 구하기

원래는 np에 있는 rolling과 mean, std API를 쓰려 했는데 계속 결과값이 이상하게 나왔다.
manual 하게 반복문을 돌면서 window_size만큼의 값들에 대해서 연산을 수행하였다.

   prices = get_prices(symbol, interval, "close")

    df = pd.DataFrame({'Close': prices})
    # 평균을 계산한다.
    df['MA'] = np.round(df['Close'].rolling(window=20).mean(), decimals=1)

    # 분산, 표준편차 구하기
    window_size = 20
    rolling_means = []
    rolling_stds = []

    for i in range(len(prices) - window_size + 1):
        window_data = prices[i:i + window_size]
        mean_value = sum(window_data) / window_size
        std_value = (sum((x - mean_value) ** 2 for x in window_data) / window_size) ** 0.5
        rolling_means.append(mean_value)
        rolling_stds.append(std_value)

    # 볼린져 밴드의 위 아래 값
    Upperband = [mean + (2 * std) for mean, std in zip(rolling_means, rolling_stds)]
    LowerBand = [mean - (2 * std) for mean, std in zip(rolling_means, rolling_stds)]

볼린져 밴드와 비교할 값 가져오기

현재 기준으로 확인하고 싶은 주가의 값을 가져온다.

def only_1_prices(symbol):
    payload = {}
    path = '/openApi/swap/v3/quote/klines'
    method = "GET"

    now = datetime.now()
    # 날짜를 현재로 지정하면 현재 값만을 준다. 여기선 4시간 전의 값을 가져오기 위해 날짜를 바꿨다.
    one_days_ago = now - timedelta(days=1)
    milliseconds = int((one_days_ago - datetime(1970, 1, 1)).total_seconds() * 1000)

    paramsMap = {
    "symbol": symbol,
    "interval": "4h",
    "limit": "10",
    "startTime": str(milliseconds)
}
	# parseParm은 BingX에서 사용하는 API 예제에 존재하는 것 그대로이다.
    paramsStr = praseParam(paramsMap)
    res = json.loads(temp_bingx.send_request(method, path, paramsStr, payload))

    return res["data"]

0개의 댓글