4. 투자 자동화 완성하기

2022. 2. 13. 21:42기타공부/[Block Chain] Python 비트코인 투자 자동화

1. 백테스팅

백테스팅이란?

과거 데이터로 전략을 테스트 해보는 것

https://wikidocs.net/book/1665 이 사이트에서 제공하는 Github를 들어가면 예제 백테스팅 코드가 나와있다.

 

2. vscode로 돌아와서 backtest.py 파일을 만들어준다.

backtest.py 예제

import pyupbit
import numpy as np

#OHLCV(open, high, low, close, volume)으로 당일 시가, 고가, 저가, 종가, 거래량에 대한 데이터
df = pyupbit.get_ohlcv("KRW-BTC", count=7) #upbit기준으로 7일간의 원화시장 BTC애 대한 OHLCV를 불러오는 코드
df['range'] = (df['high'] - df['low']) * 0.5
df['target'] = df['open'] + df['range'].shift(1)


df['ror'] = np.where(df['high'] > df['target'],
                     df['close'] / df['target'],
                     1)

df['hpr'] = df['ror'].cumprod()
df['dd'] = (df['hpr'].cummax() - df['hpr']) / df['hpr'].cummax() * 100
print("MDD(%): ", df['dd'].max())
df.to_excel("dd.xlsx")

위 코드대로 실행하면 처음에 ModuleNotFoundError: No module named 'openpyxl'이라는 에러가 뜬다.

이 에러는 openpyxl이라는 모듈이 설치가 안되어있어서 나오는 에러이다.

 

터미널창에 아래 코드를 입력해서 다운로드 받아준다.

pip install openpyxl

 

설치가 완료되고 실행해보면 실행이 되고 파일창에 엑셀 파일이 하나 생기는 것을 확인할 수 있다.

파일창에 우클릭 - Reveal in File Explorer를 눌러서 엑셀파일을 열어보면 일주일간 백테스팅 결과를 알 수 있다.

 

backtest.py 주석

import pyupbit
import numpy as np

#OHLCV(open, high, low, close, volume)으로 당일 시가, 고가, 저가, 종가, 거래량에 대한 데이터
df = pyupbit.get_ohlcv("KRW-BTC", count=7) #upbit기준으로 7일간의 원화시장 BTC애 대한 OHLCV를 불러오는 코드

#변동성 돌파 기준 범위 계산 : 변동폭 * k계산 = (고가, 저가) * k값
df['range'] = (df['high'] - df['low']) * 0.5

#target(매수가), range 컬럼을 한칸씩 밑으로 내린다.(.shift(1))
df['target'] = df['open'] + df['range'].shift(1)

#ror(수익율), np.where(조건문, 참일때 값, 거짓일 때 값)
df['ror'] = np.where(df['high'] > df['target'],
                     df['close'] / df['target'],
                     1)
# 누적 곱 계산(cumprod) => 누적 수익률
df['hpr'] = df['ror'].cumprod()
#Draw Down 계산(누적 최대 값과 현재 hpr 차이/누적 최대값 * 100)
df['dd'] = (df['hpr'].cummax() - df['hpr']) / df['hpr'].cummax() * 100
#MDD 계산
print("MDD(%): ", df['dd'].max())
#엑셀로 출력
df.to_excel("dd.xlsx")

 

3. 코인 매매를 할 때

k값에 따라 매수 시점이 달라지기 때문에 수익률이 변동된다.

따라서 k값을 최대한 잘맞는 쪽으로 설정해줘야한다.

가장 best의 k값을 과거 데이터에서 찾기 위한 코드이다.

 

bestk.py

import pyupbit
import numpy as np


def get_ror(k=0.5):
    df = pyupbit.get_ohlcv("KRW-BTC", count=7)
    df['range'] = (df['high'] - df['low']) * k
    df['target'] = df['open'] + df['range'].shift(1)

    fee = 0.0032
    df['ror'] = np.where(df['high'] > df['target'],
                         df['close'] / df['target'] - fee,
                         1)

    ror = df['ror'].cumprod()[-2]
    return ror


for k in np.arange(0.1, 1.0, 0.1):
    ror = get_ror(k)
    print("%.1f %f" % (k, ror))

* 백테스팅은 과거에 데이터로 k값을 구하는 것이기 때문에 미래에 예측을 할 때 반드시 설정한 best k 값이 되지 않을 수 있고, 수수료도 별도 포함이다.

 

4. 자동매매 코드

bitcoinAutoTrade.py

import time
import pyupbit
import datetime

access = "access-key"
secret = "secret-key"

def get_target_price(ticker, k):
    """변동성 돌파 전략으로 매수 목표가 조회"""
    df = pyupbit.get_ohlcv(ticker, interval="day", count=2)
    target_price = df.iloc[0]['close'] + (df.iloc[0]['high'] - df.iloc[0]['low']) * k
    return target_price #변동성을 파악하여 조건과 맞으면 return해준다.

def get_start_time(ticker):
    """시작 시간 조회"""
    df = pyupbit.get_ohlcv(ticker, interval="day", count=1)
    start_time = df.index[0]
    return start_time

def get_balance(ticker):
    """잔고 조회"""
    balances = upbit.get_balances()
    for b in balances:
        if b['currency'] == ticker:
            if b['balance'] is not None:
                return float(b['balance'])
            else:
                return 0
    return 0

def get_current_price(ticker):
    """현재가 조회"""
    return pyupbit.get_orderbook(ticker=ticker)["orderbook_units"][0]["ask_price"]

# 로그인
upbit = pyupbit.Upbit(access, secret)
print("autotrade start")

# 자동매매 시작
while True:
    try:
        now = datetime.datetime.now()
        start_time = get_start_time("KRW-BTC") #시작시간 9:00로 설정
        end_time = start_time + datetime.timedelta(days=1) #9:00 + 1일 마감시간
		# 9:00 < 현재가 < 8:59:50
        if start_time < now < end_time - datetime.timedelta(seconds=10): #9시부터 9시까지 설정에서 10초를 빼줌으로써 8시59분50초까지 돌아가게 한다.
            target_price = get_target_price("KRW-BTC", 0.5)#target_price를 직접 구해도 됨. k값도 직접 설정할 수 있음.
            current_price = get_current_price("KRW-BTC")
            if target_price < current_price:
                krw = get_balance("KRW") #원화 잔고 조회
                if krw > 5000: #원화 잔고가 최소 거래 금액 5000원보다 많으면
                    upbit.buy_market_order("KRW-BTC", krw*0.9995) #코인을 매수
        else:
        	#9시부터 8시59분50초 사이 10초에 비트코인 전량 매도.
            btc = get_balance("BTC")
            if btc > 0.00008:
                upbit.sell_market_order("KRW-BTC", btc*0.9995) #수수료 0.05를 고려
        time.sleep(1)
    except Exception as e:
        print(e)
        time.sleep(1)

 

5. AWS 클라우드 활용해보기

컴퓨터 서버에서 돌릴 수 있지만, 24시간 켜놔야하기 때문에 클라우드를 활용해본다.

AWS에서 제공하는 프리티어(첫 가입시 12개월 무료)를 사용해본다.

 

단계

  • 아마존 AWS에 가입해준다.(https://aws.amazon.com/ko/free/?trk=fa2d6ba3-df80-4d24-a453-bf30ad163af9&sc_channel=ps&sc_campaign=acquisition&sc_medium=ACQ-P|PS-GO|Brand|Desktop|SU|Core-Main|Core|KR|KR|Text&ef_id=EAIaIQobChMI8fjkzM389QIVshrnCh0gnwjeEAAYASAAEgIrV_D_BwE:G:s&s_kwcid=AL!4422!3!563761819834!e!!g!!aws&ef_id=EAIaIQobChMI8fjkzM389QIVshrnCh0gnwjeEAAYASAAEgIrV_D_BwE:G:s&s_kwcid=AL!4422!3!563761819834!e!!g!!aws&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all)
  • 계정 생성 후 컴퓨팅 - EC2 - 인스턴스- 인스턴스 시작(주황색 버튼)을 클릭한다.
  • Ubuntu Server 20.04 LTS (HVM), SSD Volume Type을 누르고 프리티어에서 사용 가능한 서비스를 선택해준다.
  • 새 키 페어 생성(기존에 가입이 안되어있다면)을 해준다. 키 페어 이름을 설정해주고 잊지 않게 메모해준다.
  • 인스턴스 시작을 눌러 서버를 생성해준다.
  • 서버에 들어가서 퍼블릭 IP4 주소를 복사해서 업비트 Open API에 자신의 IP주소 옆에 추가해준다.

 

이 주소를
변경 눌러서 추가해준다.
변경을 선택하고 자신의 아이피 옆에 콤마(,)서버ip4를 입력해준다.&nbsp;

 

7) AWS 서버가 잘 만들어졌는지 "연결"을 눌러 접속한 후 화면이 나오면 python3라고 쳐준다

 

 

8) vscode에 있는 코드를 깃허브에 push하고, 우분투로 돌아와서 

git clone "깃허브 주소"

를 입력하여 적용해준다.

 

9) 제대로 적용이 되었는지 확인해준다.

ls -al

 

cd "깃허브 폴더"

ex) cd python_auto_bitcoin로 경로를 지정해주고 ls -al을 해주면 폴더에 있는 파일 위치가 나온다.

 

10) 만약 파일을 수정하고 싶다면

vim [파일이름]

을 쓰고 insert 버튼을 눌러주면 편집모드로 들어가서 편집할 수 있다.

편집이 끝나면 ESC - :wq!로 편집한 파일을 저장해준다.

 

11) 서버에는 아무 라이브러리도 설치되어있지 않기 때문에 아래 코드를 하나씩 입력하여 설치해준다.

sudo apt update
sudo apt install python3-pip
pip3 install pyupbit

 

12) 서버 시간을 한국 시간으로 맞춰준다

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

13) nohup으로 백그라운드에서 실행시켜주고 ps ax | grep을 통해 잘 돌아가는지 확인한다.

nohup python3 bitcoinAutoTrade.py > output.log&
ps ax | grep .py

14) 프로세스를 종료하고 싶으면 kill -9을 쓴다.

kill -9 PID

 

15) 만약 종료가 안된다면 ps ax | grep .py를 사용해 PID번호를 알아내

PID대신 하나 하나 직접 꺼준다.

 

참고 : https://wikidocs.net/book/1665

 

파이썬을 이용한 비트코인 자동매매 (개정판)

이 책은 최근 인기 있는 프로그래밍 언어인 파이썬을 사용하여 국내 3대 거래소(코빗, 빗썸, 업비트) 및 국외 거래소(바이넨스)에서 비트코인을 자동매매하는 프로그램을 개발하 ...

wikidocs.net

 

반응형