본문 바로가기

코인/코인 개발

업비트 API와 Python TA-Lib를 이용한 캔들 패턴 인식(Candle Pattern Recognition)

지난 포스팅에서는 업비트 API를 통해 가져온 캔들 데이터를 바탕으로 TA-Lib를 이용해 스토캐스틱, RSI 등의 보조 지표를 활용하는 방법을 설명했습니다.

 

이전에 언급했다시피, TA-Lib는 보조 지표 외에도 캔들 패턴 인식에도 사용할 수 있는데 이번 포스팅에서는 이를 다뤄보려고 합니다. 먼저, 캔들 패턴에 대해서 간단히 설명하자면 캔들 차트에 표현되는 각각의 캔들에 의미를 부여, 패턴을 인식하고 이를 통해 시장 움직임을 파악하고자 하는 분석 방법입니다.

 

예를 들면, 도지(Doji) 패턴이 나타나면 매수/매도세가 중립으로 나타나며 향후 흐름이 바뀔 것이라고 예측하는 것입니다. 아래는 상승 흐름에서의 약세 전환을 나타내는 도지 패턴의 예시입니다.

약세 반전 시에 나타나는 도지 패턴의 예시. 출처: PatternWizard.com

 

이러한 캔들 패턴 분석을 프로그램에 이용할 수 있도록 TA-Lib는 다음과 같은 다양한 캔들 패턴에 대한 함수를 제공하고 있습니다.

CDL2CROWS            Two Crows
CDL3BLACKCROWS       Three Black Crows
CDL3INSIDE           Three Inside Up/Down
CDL3LINESTRIKE       Three-Line Strike
CDL3OUTSIDE          Three Outside Up/Down
CDL3STARSINSOUTH     Three Stars In The South
CDL3WHITESOLDIERS    Three Advancing White Soldiers
CDLABANDONEDBABY     Abandoned Baby
CDLADVANCEBLOCK      Advance Block
CDLBELTHOLD          Belt-hold
CDLBREAKAWAY         Breakaway
CDLCLOSINGMARUBOZU   Closing Marubozu
CDLCONCEALBABYSWALL  Concealing Baby Swallow
CDLCOUNTERATTACK     Counterattack
CDLDARKCLOUDCOVER    Dark Cloud Cover
CDLDOJI              Doji
CDLDOJISTAR          Doji Star
CDLDRAGONFLYDOJI     Dragonfly Doji
CDLENGULFING         Engulfing Pattern
CDLEVENINGDOJISTAR   Evening Doji Star
CDLEVENINGSTAR       Evening Star
CDLGAPSIDESIDEWHITE  Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI    Gravestone Doji
CDLHAMMER            Hammer
CDLHANGINGMAN        Hanging Man
CDLHARAMI            Harami Pattern
CDLHARAMICROSS       Harami Cross Pattern
CDLHIGHWAVE          High-Wave Candle
CDLHIKKAKE           Hikkake Pattern
CDLHIKKAKEMOD        Modified Hikkake Pattern
CDLHOMINGPIGEON      Homing Pigeon
CDLIDENTICAL3CROWS   Identical Three Crows
CDLINNECK            In-Neck Pattern
CDLINVERTEDHAMMER    Inverted Hammer
CDLKICKING           Kicking
CDLKICKINGBYLENGTH   Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM      Ladder Bottom
CDLLONGLEGGEDDOJI    Long Legged Doji
CDLLONGLINE          Long Line Candle
CDLMARUBOZU          Marubozu
CDLMATCHINGLOW       Matching Low
CDLMATHOLD           Mat Hold
CDLMORNINGDOJISTAR   Morning Doji Star
CDLMORNINGSTAR       Morning Star
CDLONNECK            On-Neck Pattern
CDLPIERCING          Piercing Pattern
CDLRICKSHAWMAN       Rickshaw Man
CDLRISEFALL3METHODS  Rising/Falling Three Methods
CDLSEPARATINGLINES   Separating Lines
CDLSHOOTINGSTAR      Shooting Star
CDLSHORTLINE         Short Line Candle
CDLSPINNINGTOP       Spinning Top
CDLSTALLEDPATTERN    Stalled Pattern
CDLSTICKSANDWICH     Stick Sandwich
CDLTAKURI            Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP         Tasuki Gap
CDLTHRUSTING         Thrusting Pattern
CDLTRISTAR           Tristar Pattern
CDLUNIQUE3RIVER      Unique 3 River
CDLUPSIDEGAP2CROWS   Upside Gap Two Crows
CDLXSIDEGAP3METHODS  Upside/Downside Gap Three Methods

 

 

이전 포스팅에서 사용했던 업비트 API를 통해 가져온 데이터를 pandas.DataFrame으로 변환한 `df` 변수를 사용해 위 캔들 패턴 인식을 위한 함수를 사용해보도록 하겠습니다. 다음은 도지(Doji) 패턴을 인식하기 위한 함수 호출 예시입니다.

import pandas as pd

upbit = Upbit(access_key, secret_key)
unit = 240  # 4 hours

candles = upbit.candles('KRW-BTC')
min_candles = candles.minute(unit=unit, count=200)

df = pd.DataFrame(data={
	'open': [x.opening_price() for x in min_candles],
	'close': [x.trade_price() for x in min_candles],
	'high': [x.high_price() for x in min_candles],
	'low': [x.low_price() for x in min_candles],
})

ta.CDLDOJI(high=df['high'], low=df['low'], open=df['open'], close=df['close'])

 

결과는 다음과 같이 나타납니다.

0        0
1        0
2        0
3        0
4        0
      ... 
195      0
196      0
197      0
198      0
199    100

마지막에 나타난 봉을 도지 패턴으로 인식하고 있다.

 

이제 위에 설명한 모든 함수를 한 번에 호출해 개별 캔들이 어떤 패턴으로 인식되는지 다음과 같은 코드로 확인해보도록 하겠습니다.

import numpy as np

pattern_funcs = [
  'CDL2CROWS',
  'CDL3BLACKCROWS',
  'CDL3INSIDE',
  'CDL3LINESTRIKE',
  'CDL3OUTSIDE',
  'CDL3STARSINSOUTH',
  'CDL3WHITESOLDIERS',
  'CDLABANDONEDBABY',
  'CDLADVANCEBLOCK',
  'CDLBELTHOLD',
  'CDLBREAKAWAY',
  'CDLCLOSINGMARUBOZU',
  'CDLCONCEALBABYSWALL',
  'CDLCOUNTERATTACK',
  'CDLDARKCLOUDCOVER',
  'CDLDOJI',
  'CDLDOJISTAR',
  'CDLDRAGONFLYDOJI',
  'CDLENGULFING',
  'CDLEVENINGDOJISTAR',
  'CDLEVENINGSTAR',
  'CDLGAPSIDESIDEWHITE',
  'CDLGRAVESTONEDOJI',
  'CDLHAMMER',
  'CDLHANGINGMAN',
  'CDLHARAMI',
  'CDLHARAMICROSS',
  'CDLHIGHWAVE',
  'CDLHIKKAKE',
  'CDLHIKKAKEMOD',
  'CDLHOMINGPIGEON',
  'CDLIDENTICAL3CROWS',
  'CDLINNECK',
  'CDLINVERTEDHAMMER',
  'CDLKICKING',
  'CDLKICKINGBYLENGTH',
  'CDLLADDERBOTTOM',
  'CDLLONGLEGGEDDOJI',
  'CDLLONGLINE',
  'CDLMARUBOZU',
  'CDLMATCHINGLOW',
  'CDLMATHOLD',
  'CDLMORNINGDOJISTAR',
  'CDLMORNINGSTAR',
  'CDLONNECK',
  'CDLPIERCING',
  'CDLRICKSHAWMAN',
  'CDLRISEFALL3METHODS',
  'CDLSEPARATINGLINES',
  'CDLSHOOTINGSTAR',
  'CDLSHORTLINE',
  'CDLSPINNINGTOP',
  'CDLSTALLEDPATTERN',
  'CDLSTICKSANDWICH',
  'CDLTAKURI',
  'CDLTASUKIGAP',
  'CDLTHRUSTING',
  'CDLTRISTAR',
  'CDLUNIQUE3RIVER',
  'CDLUPSIDEGAP2CROWS',
  'CDLXSIDEGAP3METHODS'
]
    
res = pd.DataFrame(
        data={x: getattr(ta, x)(high=df['high'], low=df['low'],
                                open=df['open'], close=df['close']).replace(0, np.nan)
              for x in pattern_funcs})
res.idxmax(axis=1) # columns

 

DataFrame에서 '0'을 NaN으로 변환해 idxmax 사용 시 모든 함수에 대해 적용되는 결과가 없는 경우 NaN으로 표현되도록 합니다. 다음은 호출 결과와 실제 캔들 차트의 예시입니다.

...
186           CDLBELTHOLD
187          CDLENGULFING
188               CDLDOJI
189                   NaN
190        CDLSPINNINGTOP
191        CDLSPINNINGTOP
192            CDLHIKKAKE
193     CDLINVERTEDHAMMER
194          CDLSHORTLINE
195           CDLBELTHOLD
196                   NaN
197             CDLHAMMER
198          CDLSHORTLINE
199               CDLDOJI

함수 호출 결과와 실제 캔들의 모습

 

이러한 캔들 패턴을 프로그램에 이용하고 싶은 분들에게 도움이 되길 바랍니다.