본문 바로가기
블록체인/블록체인이란?

[비트코인 자동매매] 하이킨 아시, 파이썬으로 구현하기

by 제이제이_은재 2022. 6. 26.
반응형

 

💡하이킨 아시 (Heikin Ashi)

 

하이킨 아시는 1700년대에 오사카의 쌀 무역 상인인 Munehisa Homma가 개발한 지표이다. 당시 오사카 쌀 시장은 물품 교환권을 사용해서 마치 현대의 선물 거래처럼 초기 형태의 선물 시장이 운영되었는데, 이를 통해 투자 수익을 추구할 수 있었다고 한다. Homma는 투자 심리가 거래에 미치는 영향을 분석해 탐욕이나 공포로 수익을 낼 수 있는 방법에 대해서 연구했고, 이를 시각화해서 알기 쉽게 추세를 파악할 수 있는 지표를 개발했다고 한다.

 

하이킨 아시 캔들의 기존의 캔들과는 달리 캔들몸통이 시가, 고가, 저가, 종가 들의 평균값을 활용해 형성이 되는데, 가격 변동성을 보다 더 평균화시켜 매끄럽게 시각화해주는 캔들 차트이다. 기존 캔들차트를 사용했을 때보다 추세 중간중간 나오는 노이즈들을 잘 처리해주기 때문에 추세의 정도를 더 명확하게 파악할 수 있을 뿐더러 추세의 변곡점 또한 효과적으로 캐치할 수 있다는 장점이 있다.

 

[일반 캔들 차트]

 

[하이킨아시 차트]

 

위 두 차트는 같은 종목, 같은 기간의 캔들 차트와 하이킨 아시 차트이다. 캔들차트로 보는 것보다 하이킨아시 차트로 보는 것이 추세변화를 더 시각화해주기 때문에 상승이냐 하락이냐의 추세를 더 단 번에 확인할 수 있는 것을 확인할 수 있다.

 

 

✓ 하이킨 아시 차트의 공식

시가 = 이전 하이킨 아시 캔들 시가와 종가의 평균값  [1/2(이전 막대의 시가 + 이전막대의 종가) -> 이전 막대의 중간값]

종가 = 현 캔들스틱의 시가, 고가, 저가, 그리고 종가의 평균값 [1/4(시가 + 종가 + 저가 + 종가)]

고가 = 현 캔들스틱의 가장 높은 값 [최대값[고가, 시가, 종가]]

저가 = 현 캔들 시가의 가장 낮은 값 [최저값[고가, 시가, 종가]]

 

 

✓ 파이썬으로 구현한 하이킨 아시

def GetHeikenAshi (ohlcv) :
    ohlcv['ha_close'] = (ohlcv['open'] + ohlcv['high'] + ohlcv['low'] + ohlcv['close'] ) / 4
    idx = ohlcv.index.name
    ohlcv.reset_index(inplace=True)
    for i in range(0, len(ohlcv)):
        if i == 0:
            ohlcv._set_value(i, 'ha_open', ((ohlcv._get_value(i, 'open') + ohlcv._get_value(i, 'close')) / 2))
        else:
            ohlcv._set_value(i, 'ha_open', ((ohlcv._get_value(i - 1, 'ha_open') + ohlcv._get_value(i - 1, 'ha_close')) / 2))
    if idx:
        ohlcv.set_index(idx, inplace=True)
    ohlcv['ha_high'] = ohlcv[['ha_open','ha_close','high']].max(axis=1)
    ohlcv['ha_low'] = ohlcv[['ha_open','ha_close','low']].min(axis=1)
    ohlcv['ha_range'] = ohlcv['ha_close'] - ohlcv ['ha_open']
    return ohlcv

 

고가, 저가, 종가는 어렵지 않게 구할 수 있었지만, 가장 첫번째 시가를 정확하게 구현하는 것이 이 하이킨 아시 구하기의 포인트였다.

 

종가 = 현 캔들스틱의 시가, 고가, 저가, 그리고 종가의 평균값 [1/4(시가 + 종가 + 저가 + 종가)]

ohlcv['ha_close'] = (ohlcv['open'] + ohlcv['high'] + ohlcv['low'] + ohlcv['close'] ) / 4

 

고가 = 현 캔들스틱의 가장 높은 값 [최대값[고가, 시가, 종가]]

ohlcv['ha_high'] = ohlcv[['ha_open','ha_close','high']].max(axis=1)

 

저가 = 현 캔들 시가의 가장 낮은 값 [최저값[고가, 시가, 종가]]

ohlcv['ha_low'] = ohlcv[['ha_open','ha_close','low']].min(axis=1)

시가 = 이전 하이킨 아시 캔들 시가와 종가의 평균값  [1/2(이전 막대의 시가 + 이전막대의 종가) -> 이전 막대의 중간값]

여기서 문제는 가장 첫 번째 캔들의 경우는 이전 막대의 시가가 없다는 것이었다. 그렇기 때문에 가장 첫번째 값을 구하는 경우와 그렇지 않은 경우를 분리해서 코드를 구현하였다. 첫 번째 캔들의 경우는 그날의 시가와 종가를 이용해서 값을 유추해낼 수 있다.

for i in range(0, len(ohlcv)):
    if i == 0:
        ohlcv._set_value(i, 'ha_open', ((ohlcv._get_value(i, 'open') + ohlcv._get_value(i, 'close')) / 2))
    else:
        ohlcv._set_value(i, 'ha_open', ((ohlcv._get_value(i - 1, 'ha_open') + ohlcv._get_value(i - 1, 'ha_close')) / 2))

 

✓ 실행결과

쥬피터를 이용해서 위 코드를 실행한 결과와 우리가 업비트에서 흔히 보는 차트를 비교해보면 아래와 같다. 시각화되는 색만 다를 뿐 차트의 모양은 똑같이 구현되는 것을 확인할 수 있다.

 

직접 작성한 코드

 

업비트 차트

반응형

댓글