피봇 매매 전략 파이썬 코딩
피봇은 가격의 전일 데이터를 기반으로 오늘의 지지선(Support Levels)과 저항선(Resistance Levels)을 계산해 매매 타이밍을 결정하는 기술적 분석 도구입니다. 이 전략은 단기 투자자나 스캘퍼들에게 특히 유용하며, 시장의 전환점을 예측해 진입, 손절, 익절 타이밍을 설정하는 데 도움을 줍니다. 이번 포스팅에서는 Pivot이 무엇인지와 Pivot Point를 파이썬으로 구현하는 방법을 알아보겠습니다.
글의 순서
피봇 포인트(Pivot Point)
피봇 포인트 계산 방법
피봇 포인트 구현 : 파이썬 코드
피봇 포인트의 개념
Pivot Point는 전일 고가, 저가, 종가의 평균값으로 계산하며, 이를 기준으로 지지선과 저항선이 형성됩니다.
▶지지선(Support): 하락 중인 가격이 멈추거나 반등할 가능성이 있는 가격대
▶저항선(Resistance): 상승 중인 가격이 멈추거나 하락할 가능성이 있는 가격대
Pivot 매매 전략은 이 지지선과 저항선을 활용해 시장의 가격 전환점을 식별합니다.
피봇 선 구성
▶중심선: 피봇 포인트(Pivot Point, PP)
▶저항선 1, 2 (R1, R2): 중심선 위의 선 2개
▶지지선 1, 2 (S1, S2): 중심선 아래의 선 2개
피봇 포인트 계산법
피봇 포인트와 각 선의 계산 공식은 다음과 같습니다.
▶피봇 포인트(Pivot Point, PP)
PP = (고가(High) + 저가(Low) + 종가(Close)) / 3
▶저항선 1 (R1)
R1 = (PP*2) – 저가(Low)
▶지지선 1 (S1)
S1 = (PP*2) -고가(High)
▶저항선 2 (R2)
R2 = PP + (고가(High) – 저가(Low))
▶지지선 2 (S2)
R2 = PP – (고가(High) – 저가(Low))
Pivot Point 구현 : 파이썬 코드
아래의 실습코드는 피봇 포인트를 자동으로 계산하고, 지지선 이탈 및 저항선 돌파를 알리는 파이썬 코드입니다. 실습코드에서는 한국투자증권 API로 전일의 데이터를 가져와서 피봇포인트를 계산합니다.
실습코드의 핵심은 피봇 포인트, 지지선 1, 2, 저항선 1, 2를 계산하는 부분입니다. pivot이라는 변수가 피봇 포인트, resistance가 저항선, supprot가 지지선을 나타냅니다. 이들은 모두 어제의 고가, 저가, 종가로부터 위의 계산 방법대로 구합니다.
API로 받아온 Response인 res.json() 중 일자별 주식데이터가 들어있는 배열이 output입니다. 또한 output의 첫 번째 데이터 묶음이 오늘의 ohlcv 데이터이며, 두 번째 데이터 묶음이 어제의 ohlcv 데이터입니다. data[1]이 바로 어제의 데이터인데, [1]인 이유는 한국투자증권 API로 받아오는 output의 최신 데이터가 첫 번째 요소에 위치하기 때문입니다. 한국투자증권 API 문서에서 확인할 수 있듯이 ‘stck_hgpr’, ‘stck_lwpr’, ‘stck_clpr’은 각각 고가, 저가, 종가를 나타냅니다.
코드 실행결과도 나타내었습니다. 다만 이 코드의 실행시점은 시장이 마감된 후였습니다. 만약 장 중이라 가격이 변동되고 있다면, 매 3초마다 이 가격이 피봇 포인트를 기준으로 어느 부분에 위치하고 있는지 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
import os import requests import json import time import datetime # KIS API 설정 api_key = os.getenv('KIS_APP_KEY') api_secret = os.getenv('KIS_APP_SECRET') # KIS API 기본정보 (실전 Domain) URL_BASE = "https://openapi.koreainvestment.com:9443" # 액세스 토큰 발급 함수 def get_access_token(): """KIS API를 위한 액세스 토큰 발급""" headers = {"content-type": "application/json"} body = { "grant_type": "client_credentials", "appkey": api_key, "appsecret": api_secret } PATH = "/oauth2/tokenP" URL = f"{URL_BASE}{PATH}" res = requests.post(URL, headers=headers, data=json.dumps(body)) if res.status_code == 200: access_token = res.json()["access_token"] return access_token else: print(f"Failed to get access token: {res.json()}") return None def calculate_target_price_pivot(access_token, code): # 한국투자증권 API 문서 [국내주식] 기본시세 - 국내주식기간별시세(일/주/월/년) """Pivot 기반 목표가 계산""" PATH = "/uapi/domestic-stock/v1/quotations/inquire-daily-price" URL = f"{URL_BASE}{PATH}" headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "FHKST01010400" } params = { "FID_COND_MRKT_DIV_CODE": "J", # 시장 분류 코드 "FID_INPUT_ISCD": code, # 종목 코드 "FID_PERIOD_DIV_CODE": "D", # 기간 분류 코드 (일봉) "FID_ORG_ADJ_PRC": "1" # 수정주가 여부 } res = requests.get(URL, headers=headers, params=params) if res.status_code != 200: print(f"Pivot 계산 실패: {res.json()}") return None data = res.json()['output'] high = int(data[1]['stck_hgpr']) # 어제 고가 low = int(data[1]['stck_lwpr']) # 어제 저가 close = int(data[1]['stck_clpr']) # 어제 종가 pivot = (high + low + close) / 3 resistance_1 = (2 * pivot) - low # 첫 번째 저항선 support_1 = (2 * pivot) - high # 첫 번째 지지선 resistance_2 = pivot + (high - low) # 두 번째 저항선 support_2 = pivot - (high - low) # 두 번째 지지선 return pivot, resistance_1, support_1, resistance_2, support_2 # 특정 주식 종목의 현재가 정보를 조회 def get_stock_data(access_token, code): """특정 주식 종목의 현재가 정보를 조회""" PATH = "/uapi/domestic-stock/v1/quotations/inquire-price" URL = f"{URL_BASE}{PATH}" # Request headers = { "Content-Type": "application/json", "authorization": f"Bearer {access_token}", "appKey": api_key, "appSecret": api_secret, "tr_id": "FHKST01010100" # 현재가 조회용 거래 ID } params = { "fid_cond_mrkt_div_code": "J", # 시장 구분 (J: 유가증권, Q: 코스닥 등) "fid_input_iscd": code # 주식 종목 코드 } # Response res = requests.get(URL, headers=headers, params=params) if res.status_code == 200: data = res.json()['output'] price_current = int(data['stck_prpr']) # 현재가 return price_current else: print(f"종목 정보 조회 실패: {res.json()}") return None # ================================================================================== def main(): access_token = get_access_token() if access_token: print("[ KIS ACCOUNT ACCESSED ]") # 피봇 포인트, 저항선, 지지선 계산 code_stock_krx = '373220' pivot, resistance_1, support_1, resistance_2, support_2 = calculate_target_price_pivot(access_token, code_stock_krx) while True: try: # 현재 시각, 주가 가져오기 text_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') price_current = get_stock_data(access_token, code_stock_krx) # Pivot과 비교하여 현재가 상태 출력 print(f'[{text_now}]') print(f'현재가(원) = {price_current:7.0f}') print(f'Resistance 2(원) = {resistance_2:7.0f}') print(f'Resistance 1(원) = {resistance_1:7.0f}') print(f'Pivot(원) = {pivot:7.0f}') print(f'Support 1(원) = {support_1:7.0f}') print(f'Support 2(원) = {support_2:7.0f}', '\n') if price_current > resistance_1: print("Buy Signal: 가격이 첫 번째 저항선을 돌파했습니다.") elif price_current < support_1: print("Sell Signal: 가격이 첫 번째 지지선을 이탈했습니다.") elif price_current > resistance_2: print("Strong Buy Signal: 가격이 두 번째 저항선을 돌파했습니다.") elif price_current < support_2: print("Strong Sell Signal: 가격이 두 번째 지지선을 이탈했습니다.") time.sleep(3) # 3초 대기 후 재시도 except Exception as e: print("예외 발생:", str(e)) time.sleep(3) # 예외 발생 시 3초 대기 후 재시도 # main 함수 실행 if __name__ == "__main__": main() |
1 2 3 4 5 6 7 8 9 |
[2024-12-11 17:31:28] 현재가(원) = 378000 Resistance 2(원) = 400000 Resistance 1(원) = 392500 Pivot(원) = 388500 Support 1(원) = 381000 Support 2(원) = 377000 Sell Signal: 가격이 첫 번째 지지선을 이탈했습니다. |
마치며 …
피봇은 단순하면서도 강력한 기술적 분석 도구이며, 단기 투자자들에게 특히 유용합니다. 피봇 포인트와 지지선, 저항선을 통해 시장의 전환점을 식별하고 매매 결정을 내릴 수 있습니다. 이번 포스팅에서는 피봇 포인트의 개념과 계산 방법을 알아본 후 이를 파이썬 코드로 구현하였습니다.
피봇은 과거 데이터를 활용한 예측 도구로서, 다른 기술적 지표와 함께 활용하면 더 강력한 매매 시그널을 제공할 수 있습니다. 하지만 시장은 항상 예측 불가능한 요소가 있으므로, 손절 및 익절 기준을 명확히 설정하고 리스크를 관리하는 것이 중요합니다. 피봇 포인트를 구현하고, 이를 실제 매매 전략에 적용함으로써 시장에서 더 나은 결정을 내릴 수 있으시길 바랍니다.
함께 참고하면 좋은 글
▶ 한국투자증권 API로 1분봉 OHLCV 데이터 가져오기
▶ 한국투자증권 REST API로 시계열 데이터를 가져오는 파이썬 코드
▶ CCI (Commodity Channel Index) 파이썬 코딩
▶ 호크아이 거래량 지표 (HawkEye Volume Indicator) 파이썬 코딩
▶ 볼린저밴드, BBW, 파이썬 pyplot 캔들스틱 차트에 표시 방법
▶ 파이썬 pyplot 캔들스틱 차트, 스토캐스틱 RSI 차트
▶ 바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
▶ 캔들 차트의 의미와 파이썬 pyplot으로 그리는 캔들스틱 차트
▶ 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
▶ 파이썬 바이낸스 비트코인 투자 백테스팅 : 볼린저 밴드 추세 추종 매매 기법
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 시계열 데이터 분석 : 추세분석 지표 6가지
참고자료
Investopedia, Pivot Points Trading Strategy