일목균형표 파이썬 코딩 : 전환선, 기준선, 선행스팬, 후행스팬, 구름
일목균형표(Ichimoku Kinko Hyo)는 추세 분석뿐만 아니라, 균형 잡힌 시세 흐름을 직관적으로 보여주는 종합적인 기술 분석 도구입니다. 일본의 고이치 호소다(Ichimoku Sanjin)가 개발한 이 지표는 ‘한눈에 시세를 파악한다’는 철학을 바탕으로 만들어졌습니다. 이번 포스팅에서는 일목균형표의 구성 요소, 개발자와 그의 철학적 배경, 그리고 일목균형표 파이썬 코드까지 살펴보겠습니다. 일목균형표 파이썬 코드를 따라해 보신다면 이해의 폭이 넓어질 것입니다.
글의 순서
일목균형표란?
고이치 호소다와 일목균형표의 탄생
일목균형표의 철학과 원리
일목균형표 구성 요소 (기본 설정 기준)
일목균형표 파이썬 코딩
일목균형표란?
일목균형표는 단기/중기/장기 추세를 동시에 분석하고, 지지/저항 및 모멘텀까지 함께 확인할 수 있는 강력한 도구입니다. 특히 ‘구름대(Kumo)’를 통해 시각적으로 추세 강도를 표현하며, 추세의 지속 또는 전환 시점을 예측하는 데 자주 사용됩니다. 일목균형표 파이썬 코드에서 fill_between() 함수로 구름대를 표시합니다.
고이치 호소다와 일목균형표의 탄생
일목균형표는 1930년대, 일본의 금융 기자 고이치 호소다에 의해 개발되었습니다. 고이치 호소다(細田吾一, Goichi Hosoda)는 일본의 금융 저널리스트로, 1930년대 후반부터 30여 년에 걸쳐 기술적 분석 도구인 일목균형표(一目均衡表, Ichimoku Kinko Hyo)를 개발하였습니다. 그는 미야코 신문(현 도쿄신문)에서 상업부장을 역임하며 금융 시장에 대한 깊은 통찰을 쌓았고, 이를 바탕으로 시장의 균형 상태를 한눈에 파악할 수 있는 지표를 만들고자 했습니다. 그래서 탄생한 것이 일목균형표이며, 이 하나의 차트를 통해 시장의 추세, 강도, 모멘텀, 지지/저항을 한눈에 파악할 수 있습니다.
이치모쿠는 그의 필명인 ‘일목산인(一目山人)’에서 따 온 것입니다. 일목균형표(Ichimoku Kinko Hyo)는 철학과 기능에 초점이 맞춰진 명칭으로 일본어 원어 그대로 국제적으로 알려져 있습니다.
일목균형표는 단순한 가격 지표를 넘어 시간의 흐름과 시장의 균형 상태를 시각적으로 표현하는 도구입니다. 일목균형표라는 책을 통해 일목균형표를 세상에 알린 1968년 당시로서는 혁신적인 접근이었습니다. 특히, 선행스팬을 통해 미래의 지지와 저항 수준을 예측하는 기능은 기존의 기술적 분석 도구와 차별화되는 특징이었습니다.
일목균형표의 철학과 원리
일목균형표는 시세의 심리를 파악하고자 하는 시각에서 출발했습니다. 핵심원리를 아래의 표에 정리하였습니다. 아래의 일목균형표 파이썬 코딩 부분과 차트를 함께 확인해 보시기 바랍니다.
| 핵심 원리 | 설명 |
|---|---|
| 균형의 시세 | 시세는 항상 과거와 미래 사이에서 균형을 형성하며, 그 균형이 깨질 때 추세가 형성됩니다. |
| 구름대의 힘 | 시세가 구름대 위에 있으면 강한 상승 추세, 아래에 있으면 하락 추세로 해석됩니다. |
| 시간 이동 시각화 | 선행스팬은 미래로, 후행스팬은 과거로 이동하여 시간의 균형 구조를 시각적으로 보여줍니다. |
| 통합적 분석 | 하나의 차트에 추세, 모멘텀, 지지/저항을 모두 담아냄으로써 종합적 해석이 가능합니다. |
| 심리 반영 | 가격은 인간의 행동과 심리를 반영하며, 일목균형표는 이를 시각화한 분석 도구입니다. |
일목균형표 구성 요소 (기본 설정 기준)
일목균형표를 구성하는 각 기술적 지표들은 일본어 그대로 국제적으로 쓰이고 있습니다. 아래 표에 원어와 한국어 설명과 지표 계산방법, 그리고 Trading View라는 사이트에서 보여주고 있는 영문 표기를 함께 비교하였습니다. 이 중 Senkou Span A/B 두 선이 만들어내는 공간이 바로 ‘구름대(Kumo)’이며, 시세가 구름대 위에 있으면 상승, 아래면 하락 추세로 해석합니다.
| 구성 요소 | 설명 | TradingView 표기 |
|---|---|---|
| Tenkan-sen | 전환선: (9일 고가 + 저가) / 2 | Conversion Line |
| Kijun-sen | 기준선: (26일 고가 + 저가) / 2 | Base Line |
| Senkou Span A | 선행스팬1: (전환선 + 기준선) / 2 → 26일 앞 | Leading Span A |
| Senkou Span B | 선행스팬2: (52일 고가 + 저가) / 2 → 26일 앞 | Leading Span B |
| Chikou Span | 후행스팬: 종가를 26일 뒤로 이동 | Lagging Span |

일목균형표 파이썬 코딩
일목균형표의 원리를 더 폭넓게 이해하기 위해 일목균형표 파이썬 코드를 작성해 보았습니다. 실습코드에는 일목균형표, 볼린저밴드 뿐만 아니라 단순이동평균 함수도 포함시켰습니다.
특히 일목균형표의 선행스팬을 나타내기 위해 현재 시간을 26칸 미래로 미는 부분과, 후행스팬을 나타내기 위해 26칸 과거로 당기는 부분을 집중해서 봐주시기 바랍니다. 일봉 뿐만 아니라 여러 종류의 분봉에도 적용하기 위하여 만든 map은 다른 응용분야에서도 유용하게 쓰일 수 있습니다.
또한 단순이동평균 함수는 window_MA라는 리스트를 인자로 넘겨 받아서 여러 시간 구간의 단순 이동평균을 구할 수 있습니다. 여기서는 10, 20, 60 이동평균선을 보여주고 있습니다.
차트에서 일목균형표 구름대의 음영을 처리하는 fill_between() 함수도 쓰임새가 많습니다. 구름 색깔을 달리 표시하기 위해 2개의 구문을 사용한 부분도 유심히 봐 주시기 바랍니다.
|
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
import os import pandas as pd import numpy as np from binance.client import Client import datetime from datetime import datetime, timedelta import matplotlib.pyplot as plt # ────────────────────── # 시장 데이터 가져오기 # ────────────────────── # Binance API api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('\n', '[ BINANCE ACCOUNT ACCESSED ]') # 입력: 데이터 수집 구간 tstt_utc = '2024-12-01 00:00:00' tend_utc = '2025-07-10 23:59:59' t_interval = '1d' symbol = 'BTCUSDT' # 선행스팬, 후행스팬을 차트에 나타내기 위한 준비 interval_map = {'1m': 1, '5m': 5, '15m': 15, '1h': 60, '1d': 1440} minute_interval = interval_map.get(t_interval, 1) # 기본 1분봉 # 그래프에 나타낼 구간 tstt_KST = datetime.strptime('2025-03-15 00:00:00', '%Y-%m-%d %H:%M:%S') tend_KST = datetime.strptime('2025-07-10 11:00:00', '%Y-%m-%d %H:%M:%S') # 파일 저장 경로 time_start_kst_str = tstt_KST.strftime('%y%m%d_%H%M') time_end_kst_str = tend_KST.strftime('%y%m%d_%H%M') file_name_only = f'{symbol}_{t_interval}_{time_start_kst_str}~{time_end_kst_str}_ichimoku.png' file_path = 'C:/_python/' file_name = file_path + file_name_only # 데이터 가져오기 bars = client.get_historical_klines(symbol, t_interval, tstt_utc, tend_utc, limit=1000) for i in bars: del i[6:] df = pd.DataFrame(bars, columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume']) df = df.astype({'Open': 'float', 'High': 'float', 'Low': 'float', 'Close': 'float', 'Volume': 'float'}) df['Date'] = pd.to_datetime(df['Date'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('Asia/Seoul').dt.tz_localize(None) # ────────────────────── # 기술적 분석 함수 정의 # ────────────────────── # 일목균형표 def calculate_Ichimoku(df, t_interval): """ 일목균형표 파이썬 함수 : (Ichimoku Kinko Hyo) 계산 :param df: Pandas DataFrame (필수 열: 'High', 'Low', 'Close', 'Date') :param candle_minutes: 한 캔들의 시간 간격 (예: 일봉은 1440, 5분봉은 5) :return: 일목균형표 구성 요소가 추가된 DataFrame """ df = df.copy() # t_interval → candle_minutes 매핑 interval_map = { '1m': 1, '3m': 3, '5m': 5, '15m': 15, '30m': 30, '1h': 60, '2h': 120, '4h': 240, '6h': 360, '8h': 480, '12h': 720, '1d': 1440 } candle_minutes = interval_map.get(t_interval, 1) # 전환선 (9일 기준) high_9 = df['High'].rolling(window=9, min_periods=9).max() low_9 = df['Low'].rolling(window=9, min_periods=9).min() df['tenkan_sen'] = (high_9 + low_9) / 2 # 기준선 (26일 기준) high_26 = df['High'].rolling(window=26, min_periods=26).max() low_26 = df['Low'].rolling(window=26, min_periods=26).min() df['kijun_sen'] = (high_26 + low_26) / 2 # 선행스팬 A / B (y는 그대로, x축만 이동) df['senkou_span_a'] = (df['tenkan_sen'] + df['kijun_sen']) / 2 high_52 = df['High'].rolling(window=52, min_periods=52).max() low_52 = df['Low'].rolling(window=52, min_periods=52).min() df['senkou_span_b'] = (high_52 + low_52) / 2 # 선행스팬용 x축 (현재 Date + 26개 캔들 만큼) offset = pd.Timedelta(minutes=26 * candle_minutes) df['Date_senkou'] = df['Date'] + offset # 후행스팬용 x축 (현재 Date - 26개 캔들 만큼) df['chikou_span'] = df['Close'] df['Date_chikou'] = df['Date'] - offset return df # 볼린저 밴드 계산 함수 def calculate_bollinger_bands(df, period, sigmas): df['SMA'] = df['Close'].rolling(window=period).mean() df['stddev'] = df['Close'].rolling(window=period).std() for sigma in sigmas: df[f'Upper Band {sigma}'] = df['SMA'] + (df['stddev'] * sigma) df[f'Lower Band {sigma}'] = df['SMA'] - (df['stddev'] * sigma) return df def calculate_SMA(df, windows): for window in windows: df[f'SMA_{window}'] = df['Close'].rolling(window=window).mean() return df # ────────────────────── # 기술적 분석 # ────────────────────── # 10일, 20일, 60일 단순이동평균선 window_MA = [10, 20, 60] df = calculate_SMA(df, window_MA) # 일목균형표 df = calculate_Ichimoku(df, t_interval) # 볼린저밴드 period = 20 sigmas = [1] df = calculate_bollinger_bands(df, period, sigmas) # ────────────────────── # 시각화 # ────────────────────── # 차트의 시간축 범위 # 일반 캔들, 후행스팬 등: 현재 날짜 기준 df = df[(df['Date'] >= tstt_KST) & (df['Date'] <= tend_KST)] fig, axs = plt.subplots(2, 1, figsize=(12, 10), sharex=True) # ------------------------- # axs[0]: 캔들 + 일목균형표 # ------------------------- candle_width = max(0.1, 0.5 * (axs[1].get_window_extent().width / len(df))) for i in range(len(df)): color = 'green' if df['Close'].iloc[i] >= df['Open'].iloc[i] else 'red' axs[0].plot([df['Date'].iloc[i]] * 2, [df['Low'].iloc[i], df['High'].iloc[i]], color=color) axs[0].plot([df['Date'].iloc[i]] * 2, [df['Open'].iloc[i], df['Close'].iloc[i]], color=color, linewidth=candle_width) # ── 일목균형표 선들 ── axs[0].plot(df['Date'], df['tenkan_sen'], label='Tenkan-sen', color='red', linewidth=1.0) axs[0].plot(df['Date'], df['kijun_sen'], label='Kijun-sen', color='blue', linewidth=1.0) axs[0].plot(df['Date_senkou'], df['senkou_span_a'], label='Senkou Span A', color='green') axs[0].plot(df['Date_senkou'], df['senkou_span_b'], label='Senkou Span B', color='orange') axs[0].plot(df['Date_chikou'], df['chikou_span'], label='Chikou Span', color='purple', linestyle='dashed') # ── 구름대 채우기 ── axs[0].fill_between(df['Date_senkou'], df['senkou_span_a'], df['senkou_span_b'], where=(df['senkou_span_a'] >= df['senkou_span_b']), color='lightgreen', alpha=0.3) axs[0].fill_between(df['Date_senkou'], df['senkou_span_a'], df['senkou_span_b'], where=(df['senkou_span_a'] < df['senkou_span_b']), color='lightcoral', alpha=0.3) axs[0].set_title(f'{symbol} Ichimoku Kinko Hyo', fontsize=16) axs[0].set_xlim([tstt_KST, tend_KST]) axs[0].legend(loc='best') axs[0].set_ylabel('Price (USDT)', fontsize=14) axs[0].grid(True) # ------------------------- # axs[1]: 캔들 + 볼린저밴드 + 이동평균선 # ------------------------- for i in range(len(df)): color = 'green' if df['Close'].iloc[i] >= df['Open'].iloc[i] else 'red' axs[1].plot([df['Date'].iloc[i]] * 2, [df['Low'].iloc[i], df['High'].iloc[i]], color=color) axs[1].plot([df['Date'].iloc[i]] * 2, [df['Open'].iloc[i], df['Close'].iloc[i]], color=color, linewidth=candle_width) # ── 볼린저밴드 및 이동평균선 ── axs[1].plot(df['Date'], df['Upper Band 1'], label='Upper BB (1σ)', linestyle='--') axs[1].plot(df['Date'], df['Lower Band 1'], label='Lower BB (1σ)', linestyle='--') axs[1].plot(df['Date'], df['SMA'], label='SMA (20-day)', color='black', linewidth=1.2) axs[1].plot(df['Date'], df['SMA_10'], label='SMA 10', color='orange') axs[1].plot(df['Date'], df['SMA_20'], label='SMA 20', color='green') axs[1].plot(df['Date'], df['SMA_60'], label='SMA 60', color='purple') axs[1].set_title(f'{symbol} Bollinger Bands & SMAs', fontsize=16) axs[1].legend(loc='best') axs[1].set_xlim([tstt_KST, tend_KST]) axs[1].set_ylabel('Price (USDT)', fontsize=14) axs[1].grid(True) axs[1].tick_params(axis='x', rotation=15) # 저장 및 출력 plt.tight_layout() plt.savefig(file_name, dpi=150) plt.show() |
마치며 …
“가격은 모든 것을 반영한다. 그러나 그 가격이 균형을 이루고 있는가?” ? 일목균형표의 시작은 바로 이 질문에서 출발합니다.
이번 포스팅에서는 일목균형표가 가진 철학적 배경과 5가지 핵심 요소를 살펴보고, 일목균형표 파이썬 코드를 구현해 보았습니다. 일목균형표는 과거-현재-미래의 시세 구조를 시각화해서 시장 상황을 한눈에 파악할 수 있게 해줍니다. 일목균형표 파이썬 코드에서 map을 사용해서 선행스팬과 후행스팬을 처리하는 부분, 구름을 표시하는 부분, 색깔로 구분하는 부분은 응용분야가 많은 것들입니다. 파이썬 코드를 통해 일목균형표의 원리를 더 확실하게 이해하셨길 기대합니다.
함께 참고하면 좋은 글
▶ ATR 파이썬 코딩: 평균진폭범위를 활용한 변동성 측정
▶ 거래량 지표, 이동평균, 피봇포인트 비교: 기술적 분석 활용법
▶ 거래량 가중 이동평균, VWMA 파이썬 코딩
▶ 거래량 가중 평균값, VWAP 파이썬 코딩
▶ 한국투자증권 API, 3분봉, 5분봉, 10분봉… 원하는 분봉 자유롭게 만드는 방법
▶ 한국투자증권 API로 1분봉 OHLCV 데이터 가져오기
▶ 한국투자증권 REST API로 시계열 데이터를 가져오는 파이썬 코드
▶ 한국투자증권 API로 주가를 가져오는 파이썬 프로그래밍
▶ 한국투자증권 API 신청 방법
참고자료
Almeida, L., & Vieira, E. (2023).
Technical Analysis, Fundamental Analysis, and Ichimoku Dynamics: A Bibliometric Analysis, Risks, 11(8), 142.