퀀트 찍먹기

퀀트찍먹기(1) - 업비트 만지작대기

앜지 2024. 1. 29. 23:12

요즘 방구석에서 배를 긁고 있다가 유튜브 알고리즘이 한 영상을 던져주었다

https://www.youtube.com/watch?v=Mvixia9iUWs&t=519s

해외 유튜버가 다양한 유명한 투자자들에 대해 설명을 해주는건데 여기서 한 사람이 눈에 띄었다.

'짐 시몬스'

이 아저씨이다. 미국의 수학자인데 버클리,mit에서 다양한 통계학자, 컴퓨터 과학자를 모아서 르네상스 테크놀러지를 설립했다.

이 르네상스 테크놀러지는 퀀트 헤지펀드로 수학에 근거해서 거래를 하는데 30년 간 60퍼의 수익을 냈다고 알려져 있다.

한번 쓱 보고 생각을 곰곰이 해봤다

나도 프로그래밍,수학 할줄 아는데 퀀트 찍먹 해볼까?

해서 한번 해볼까 한다.

우선 주식은 api불어오기 귀찮기 때문에 조금더 편한 비트코인을 써서 시험만 해보겠다.

우선 api 키를 받아야 한다.

업비트에 로그인을 한 후에 MY페이지에 들어가서  Open API관리 에 들어가면 

원하는 허용기능과 ip주소를 넣으면 api key를 받을수가 있다.

나는 주문하고 결과를 보려고 자산조회,주문조회,주문하기 정도만 해줬다.

그러면 이제 내 계좌 조회랑 코인 종목들을 조회할수 있다.

일단 pyupbit를 설치해주고

pip install pyupbit

 

예시코드를 하나 돌려보면

import pyupbit

access = "----------------------------------------"          # 본인 값으로 변경
secret = "----------------------------------------"          # 본인 값으로 변경
upbit = pyupbit.Upbit(access, secret)

print("your krw-xrp is")
print(upbit.get_balance("KRW-XRP"))     # KRW-XRP 조회
print("your KRW balance is")
print(upbit.get_balance("KRW"))         # 보유 현금 조회

# 기본 요청시 200일 (최대)
df = pyupbit.get_ohlcv("KRW-BTC", count=2) #비트코인 가격 정보 조회
print(df)

현재 잔고랑 오늘,어제의 비트코인 가격을 알수 있다.

출력값을 본다면

 

작성자가 개 거지인것을 알수 있다.(그리고 1/27,1/28의 비트코인 정보를 알수가 있다.)

일단 시도 해볼 전략은 변동성 돌파이다.

변동성 돌파는 퀀트를 할때 종종 사용한다는 전술인데

이렇게 일봉이 있다면 

전날 (고가-저가)를 변동폭이라고 두고 오늘 어제 변동폭의 k배 만큼 상승을 한다면 매수를 해서 그날 종가에 바로 매도하는 거다.

꽤 단순하다! 

그래도 바로 들어가기 전에는 전략에 대해서 백 테스팅을 해봐야 하지 않겠냐.

어차피 백테스팅은 api키도 필요 없으니까 한번 해봤다.

import pyupbit
import numpy as np

# open(시작가) high(고가) low(저가) close(종가) volume(거래량) value(거래금액) 을 조회함
df = pyupbit.get_ohlcv("KRW-BTC", count=60)
#count=20라는 것은 최근 20일 동안이라는 뜻

#range=즉 변동폭, 고가-저가로 정한다. 거기에 얼만큼 오르면 매수를 할지 k값은 임의로 정하도록 한다
df['range'] = (df['high'] - df['low']) * 0.3

#어제 range+ 오늘 시작가를 목표 매수가로 잡는다
df['target'] = df['open'] + df['range'].shift(1)

#업비트의 수수로 0.25%를 적어놓는다
fee = 0.0025

# 만약에 고가가 목표 매수가보다 높다면 수익을 종가/매수가로 기록한다
df['ror'] = np.where(df['high'] > df['target'], df['close'] / df['target'] - fee , 1)

#누적 수익률을 계산한다
df['hpr'] = df['ror'].cumprod()

# 최종 누적 수익률을 출력한다
final_return = df['hpr'].iloc[-1]
print(f"Final Cumulative Return: {final_return:.2%}")

예시코드에서 조금 변경시켜서 테스트 해보았다.

최근 20일 동안 k값을 0.5로 하니까

누적 수익률 -4.56%가 나왔다.

어라?

그러면 최근 3주 동안 차트를 한번 보자

 

하락장이라고 치자 고가에서 물려서 바이앤 홀드를 했으면 12퍼 손실인데 변동성 돌파 써서 손실을 막았다.

그렇다면 상승장에서는 어떨까

파멸적인 상승을 했던 2달을 k값을 다양하게 줘서 백테스트를 해봤는데

막 그렇게 좋은 수익률이 나오지는 않았던거 같다.

뭐가 잘못된거 같기도 하고.

일단 다음에는 다른 다양한 전략 갖고와서 백테스트를 해보겠습니다