돈키언 채널(Donchian Channel) (작성중)

Updated:

Prelude : 추세 추종 전략이란?

추세 추종 전략이란 차트 상의 데이터를 가지고 주가의 이동 방향에 대해 판단해 진입하는 트레이딩 방법 중 하나다. 주가가 중장기적인 저항대를 뚫고 올라갈 때 매수에 동참해 추세가 꺾일 때까지 보유하는 중장기적인 트레이딩 전략이다. 이 전략의 핵심은 비쌀 때 사서, 더 비싸지기를 기다리는 것이라고 할 수 있다.

추세 추종 전략의 단점은 시장의 $\frac{2}{3}$ 이상은 추세적이지 않다는 것이다. 즉, 이 전략의 핵심은 오르면 떨어지고, 떨어지면 다시 반등하는 횡보장의 리스크를 어떻게 처리해주냐에 달려있다. 따라서, 장기 추세 추종 전략의 경우, 한 번 트레이딩에서 큰 수익을 얻어 전체적인 수익을 챙기는 방향으로 전략을 구사해야한다.
(일반적으로 추세 추종 전략의 승률은 30%대로 상당히 낮은 편이다)

1. 돈키언 채널

정의

일정 기간 N 동안의 고점의 최대값을 상선, 저점의 최소값을 하선으로 그린 채널 지표다. 채널이란, 특정 중심선을 기준으로 상하단에 일정한 폭의 범위를 설정해놓은 구간을 말한다.

코드

기본 구조

  • 시간 t의 돈키언 채널값 : 시간 t에서 t-N에서 t-1까지의 데이터 사용

a. 반복문을 활용한 함수 정의

def donchian_max(df,t,N):   # t 는 시점 (건들지 말 것!)
  max=df.iloc[(t-N),2]      # N은 기간 (N을 조정할 것!)
  for i in range(1,N):
      if df.iloc[(t-N+i),2] >= max:
          max = df.iloc[(t - N + i), 2]
  return max

def donchian_min(df,t,N):
  min=df.iloc[(t-N),3]
  for i in range(1,N):
      if df.iloc[(t-N+i),3] <= min:
        min = df.iloc[(t-N+i),3]
  return min

b. List에 담아서 Max / min 함수 처리하기

def donchian_max(df,t,N):   # t 는 시점 (건들지 말 것!)
  box=[]    # N은 기간 (N을 조정할 것!)
  max_value=0
  for i in range(0,N):
    box.append(df.iloc[(t-N+i),2]) # 데이터 프레임 카운팅 주의
  max_value=max(box)
  return max_value

def donchian_min(df,t,N):
  box=[]
  min_value=0
  for i in range(0,N):
      box.append(df.iloc[(t-N+i),3]) # 데이터 프레임 카운팅 주의
  min_value=min(box)
  return min_value

연산 속도 비교 결과

Bitcoin 2월 1분봉 데이터를 가지고 10회 연산 평균값을 비교했을 때 방법 b의 함수가 속도가 더 빠르므로 사용하기로 결정했다.

  • a : 21.84초 / 1회
  • b : 18.22초 / 1회

2. 돈키언 채널 돌파

정의

돈키언 채널 돌파는 특정 기간의 최고가를 갱신했다는 점이 상승 추세를 반영해준다는 개념에서 시작한다. 실 적용에 있어 매수 포지션만 가능하므로 상단 돌파 추세와 관련된 필터를 적용하는 경우가 많다. 대표적으로 이동평균선을 활용한 추세 포트폴리오 필터가 사용된다.

일반적으로 20일선을 기준으로 상단 돌파시 매수, 하단 돌파시 매도를 하는 원칙이다. 하지만 거래 대상이 암호화폐 1분봉을 기준으로 하고 있으므로 시간 간격을 여러 수치를 대입해보면서 해석을 진행해보려고 한다. 추가로 일정 시간 간격 동안 상선이 같은 값을 유지하고 있는 조건을 추가하려고 한다.

코드

기본 구조

  • 60분 이상 상선 유지
  • 60분, 240분 정배열
    # 카운팅 쉽게 하기 위해 앞뒤 각각 100개 잘라내버리기
      for i in range(100, num_index-100):
          if df.iloc[i,5]>df.iloc[i,6] and df.iloc[i,5]>df.iloc[i-1,5] and df.iloc[i,6]>df.iloc[i-1,6]:
              if df.iloc[i-1,7]<df.iloc[i,4]:
                  target_value = df.iloc[i - 1, 7]
                  target_percent_list=[]
              else:
                  pass
          else:
              pass
    

결과값 (그래프)

아직 Valuation에 대한 이해와 코드 공부가 부족하여 Target 가격에 대한 앞뒤 60분에 대한 움직임을 그래프화해서 표현해보려고 했다.

for k in range(0,31):
                    target_percent_value=df.iloc[i-60+4*k,4]/target_value
                    target_percent_list.append(target_percent_value)
                new_dict[df.iloc[i,0]]=target_percent_list

시가총액 상위 중 5개

  1. Bitcoin bitcoin_feb_ma%Donchian
  2. ChainLink chainlink_feb_ma%Donchian

  3. Litecoin litecoin_feb_ma%Donchian
  4. Ethereum Ethereum_feb_ma%Donchian
  5. Polkadot polkadot_feb_ma%Donchian

시가총액 하위 중 3개

  1. Chiliz chiliz_feb_ma%Donchian

  2. Refereum Refereum_feb_ma%Donchian
  3. ThetaFuel ThetaFuel_feb_ma%Donchian

피드백

시가총액이 높은 암호화폐 5종과 시가총액이 낮은 3종을 비교해본 결과 유의미한 결과값을 보이지 않아서 고민해봐야할 것 같다. 단기 추세를 나타내주기에는 돈키언 채널 자체가 어려움이 있지 않나 채널의 성격에 대해 다시 한 번 생각해봐야겠다.

물론 Chilliz같은 케이스에서 유의미한 결과를 보여줬다. 그래서 펌핑이 나오는 순간을 캐치할 수 있는 알고리즘에 대해 공부를 해봐야할 것 같다.

일반적으로 장기적 추세에 사용되는 돈키언 채널과 관련해서 시가총액이 높은 암호화폐에 대해 일봉으로 다시 한 번 비교 분석해봐야겠다.