AI.

업비트 거래 자동화 AI 만들기 4편

From.h 2024. 10. 29. 17:07
728x90
반응형

 

 

비트코인 자동 매매 AI (자동매매 구현)

 

비트코인 거래소 업비트에서 등락 추세를 분석하여, 자동으로 매매하는 파이썬 프로그램을 만들어보자.

 

Feat. 조코딩

 

 

 

 

 

 

 

 

조코딩 님의 유튜브를 보며 따라해보았습니다.

자세한 내용은 유튜브를 참조하세요.

 

 

 

 

1편 : 준비과정

2편 : VSCode (파이썬) 설정

3편 : MVP 만들기

4편 : 자동매매 구현

 

 

 

 

 

1. AI결과값 반영

2. 업비트 로그인

3. 매매 실행

4. 결과 출력

5. 예외처리

6. 인터벌 처리

 

 

 

 

 

 

 

1. AI 결과값 반영

 

  매매를 하게끔 결정해주는 요인 즉, 결과물은 buy, sell, hold 이 세가지입니다.

  지난 작업에서 print로 출력을 했다면, 이제 살 것인지, 팔 것인지, 유보할 것인지를 알려줘야 합니다.

  그래서 결과가 string 으로 나오는 것을 json 형식으로 바꿔줍니다

 

a. 출력> 결과값으로 정의해 줍니다.

 

지난 작업 (출력)

print(type(response.choices[0].message.content))

 

수정 (결과값 정의)

result = response.choices[0].message.content

 

 

 

b. string 타입의 결과물을 json 형식으로 바꿔줍니다.

import json
result = json.loads(result)

print(result)
print(type(result))
print(result["decision"])

 

이렇게 하면 결과값을  json 형식으로 변형됩니다.

출력해보면 hold라고 결과값만 따로 출력되며, 데이터 타입이 바뀐 것을 볼 수 있습니다.

 

(하루만에 buy에서 hold로 바뀌었네요. 밤 사이 코인이 너무 오르긴 했어요.)

 

 

 

 

 

 

 

 

 

2.  업비트 로그인 (깃허브 참조)

https://github.com/sharebook-kr/pyupbit

 

 

 

위 문서의 로그인 부분을 참고했으며, 아래와 같이 key값은 미리 설정해둔 .env에서 가져오는 방식으로 처리합니다.

access = os.getenv("UPBIT_ACCESS_KEY")
secret = os.getenv("UPBIT_SECRET_KEY")       
upbit = pyupbit.Upbit(access, secret)

 

 

 

 

 

 

 

 

 

3. 매매 실행

 

조건문으로 각 결과값에 대한 매매를 진행하도록 해줍니다.

 

 a. 각 조건에 대한 정의

if result("decision") == "buy" :
elif result("decision") == "sell" :
elif result("decision") == "hold" :

 

 

 

 

b.  조건문 buy, sell, hold에 각각 해당 구문을 적용

 

*시장가 (현재가)에 사고 팔 수 있는 주문을 자동으로 할 수 있도록 합니다.

 

 

 

*위 예제의 리플(XRP)를 비트코인(BTC)으로 수정했습니다. 
*hold는 pass라고 해두었습니다.

#조건문
if result["decision"] == "buy" : #매수
    print(upbit.buy_market_order("KRW-BTC", 10000))

elif result["decision"] == "sell" : #매도
    print(upbit.sell_market_order("KRW-BTC", 30))

elif result["decision"] == "hold" : #홀드
    pass

 

 

 

 

c. 잔고 만큼 전액 매수, 매도하도록 처리

 

*예를 들어 잔고100만원이 있다면. 이 씨드를 가지고 전액 트레이드하면서 수익률을 평가하는 방식이죠.

 

 

 

 

아래와 같이 수량이 있던 자리에 각각 구문을 복사해서 넣어줍니다.

#조건문
if result["decision"] == "buy" : #매수
    print(upbit.buy_market_order("KRW-BTC", upbit.get_balance("KRW")))

elif result["decision"] == "sell" : #매도
    print(upbit.sell_market_order("KRW-BTC", upbit.get_balance("KRW-BTC")))

elif result["decision"] == "hold" : #홀드
    pass

 

*모든 현금(KRW) 잔액을 조회해서, 전량 BTC를 매수해라. (첫 번째 조건문의 매수 수량)

*모든 비트코인(BTC) 잔액을 조회해서, 전량 매도해라. (두 번째 조건문의 매도 수량)

 

이 두가지 명령을 조건문에 적용했습니다.

 

 

 

d. 매수, 매도, 홀드 할 때, 그 사유도 함께 출력하도록 합니다.

 

#조건문
if result["decision"] == "buy" : #매수
    print(upbit.buy_market_order("KRW-BTC", upbit.get_balance("KRW")))
    print(result["reason"])

elif result["decision"] == "sell" : #매도
    print(upbit.sell_market_order("KRW-BTC", upbit.get_balance("KRW-BTC")))
    print(result["reason"])

elif result["decision"] == "hold" : #홀드
    print(result["reason"])

 

 

 

 

4. 예외처리 (수수료 및 최소 주문 금액)

* 매수 시, 수수료를 제외한 금액을 가지고 매매할 수 있도록 처리해 줍니다.

* 매도 시에는 체결금액에서 수수료를  제외하고 정산되기 때문에 별도 수수료 계산 과정이 필요없습니다.

* 잔액이 최소 주문 가능 금액이 넘을 때에만 주문이 이뤄지도록 합니다.

참조 : 업비트 고객센터 /거래 이용 안내 페이지

 

 

 

 

 

a.  내 잔액을 재정의해 줍니다.

my_krw = upbit.get_balance("KRW")

 

 

b. 조건문에 수량을 아래와 같이 '내 잔액의 0.05%를 제외한 0.9995'를 가지고 매수하도록 합니다.

print(upbit.buy_market_order("KRW-BTC", my_krw*0.9995))

 

 

c. 매수시,  내 잔액이 '최소 주문 가능 금액인 5000원'을 넘을 경우에만 실행되도록 앞에 조건을 붙입니다. 

if my_krw > 5000:

 

 

d. 매도 시, 내 잔액이 원화로 5000원이 넘는 지 확인한 후 매도하도록 합니다.

*현재 BTC가격에 내 보유 BTC를 곱하여, 원화로 환산, 5000원이 넘는지 확인하는 과정이 필요합니다.

*orderbook 함수를 통해 '매도호가'를 가져와 처리합니다.

 

 

* 내 보유 BTC의 원화 가치 = 내 BTC 잔액 * BTC 매도호가 > 5000 일 때 조건문을 추가합니다.

my_btc = upbit.get_balance("KRW-BTC")
current_price = pyupbit.get_orderbook(ticker="KRW-BTC")['oderbook_unit'][0]["ask_price"]
if my_btc*current_price > 5000:

 

current_price :  현재 BTC 호가

pyupbit.get_orderbook(ticker="KRW-BTC") ['orderbook_unit'] : 업비트 orderbook에서 가져온다.

[0] : 첫번째 가격(최신의)

[ask_price] : 매도호가

 

 

 

 

d. '결과'를 함께 출력하도록 합니다.

 

print("buy:",result["reason"])

 

 

 

e. 실패했을 경우 잔액 부족을  출력하도록 합니다.

 

    else:
        print("krw 5000원 미만")

 

 

 

 

 

 

최종적으로 수정된 조건문입니다.

#2.조건문
if result["decision"] == "buy" : #매수
    my_krw = upbit.get_balance("KRW")
    if my_krw > 5000:
    print(upbit.buy_market_order("KRW-BTC", my_krw*0.9995))
    print("buy:",result["reason"])
    else:
        print("krw 5000원 미만")

elif result["decision"] == "sell" : #매도
    my_btc = upbit.get_balance("KRW-BTC")
    current_price = pyupbit.get_orderbook(ticker="KRW-BTC")['oderbook_unit'][0]["ask_price"]
    if my_btc*current_price > 5000:
    print(upbit.sell_market_order("KRW-BTC", my_btc))
    print("sell:",result["reason"])
    else:
       print("btc 5000원 미만")

elif result["decision"] == "hold" : #홀드
    print("hold:",result["reason"])

 

 

 

 

 

 

 

 

 

5. 인터벌 처리

 

 이 프로그램을 실행할 때마다 OpenAI API를 호출하여 이용하게 되며, 비용이 매번 발생하게 됩니다.

 따라서 적정한 인터벌을 두지 않으면 API비용이 수익을 초과하게 될 지도 모릅니다.

 

 

 

1) 함수로 만들기

 

작성한 코드, 차트 가져오기 이하 전체 선택하여 tab 한칸 들여쓰기한 후, ai_trading이라는 함수에 넣어줍니다.

def ai_trading():

 

 

2) 반복 시키기

시간 라이브러리를 사용. sleep 메소드를 이용, 10초 쉬었다가  ai_trading 함수를 실행하는 것을 반복합니다.

while True:
   import time
   time.sleep(10)
   ai_trading

 

 

여기에서 sleep 시간을 조절, 1시간이든 4시간이든 12시간이든 간격을 조정, API 비용이 너무 많이 발생하지 않도록 주의!

API 비용 참조>

 

 

 

 

 

 

 

 

6. 잔액 확인 후, 실행

본인 업비트의 BTC잔액을 확인한 후, 실행해봅니다.

저는 현재 10만원 정도 원화를 보유하고 있고, 이미 보유한 BTC가 절반정도 차지합니다.

총 자산이 20만원 정도인 상태이고, 자동매매를 통해 어떻게 변하는지 살펴보도록 하겠습니다. 

 

 

사실 보유 원화를 전액 사고 팔고 하는 것 보다는 분할매수, 분할매도 하는 게 나을텐데...

일단은 전액을 매수, 매도 하는 방식으로 테스트 겸 해보겠습니다.

 

 

 

 

*API 비용이 얼마나 빠져나가는 지 확인하면서 진행하겠습니다. 현재 잔액 확인!

 

 

실행시켜보니 이렇게 떴습니다.

 

10초 단위로 계속 실행되면서 메시지를 던집니다.

홀드, 매수, 매수, 홀드, 매수, 매수,...

이유도 각각 나오고 있죠.

 

 

업비트 보면 보유 krw이 0원이되었으니

처음 홀드 후, 두 번째에서 매수가 나와서 보유krw을 소비했으므로,

매도 신호가 나와서 팔지 않는 이상, 계속 잔액부족으로 buy가 나와도 매수는 안되고 있습니다.

 

 

 

대 여섯번 돌린 결과 API 비용이 0.1불 정도 나갔네요.

 

 

결론!

1/ API 비용 :

조코딩 님 설명으로 볼때, 4시간에 한 번씩 돌리게 하면, 1일 6회 정도 돌리는 셈이니까, 약 하루에 2~300원 정도 소비될 것 같다 했던 거 같은데 (최종 유료 강의 버전용), 이 mvp버전은 데이터 사용량이 적어서 그런지 6회 돌리니 약 140원 정도 드는 셈이니, 그 말씀이 맞는 것 같네요. 한 달에 9,000원 미만으로 소비해서 1만원 이상만 벌면 수익인데, 수수료도 생각해야죠.

2/ 거래수수료 비용:

거래 수수료는 건당 0.05% 발생합니다.

20만원을 씨드로 하고 있고 매수할 때 발생하는 수수료 생각하면, 1회당 100원 소비, 하루에 6회, 월 180회 거래하는 동안 절반 90회 정도 매수를 한다고 가정할 경우, 수수료가 한 달에 9,000원 가량 듭니다.

3/ 수익성

그러니 20만원 정도 투자하면 월 1만8천원 수익이 나면 본전입니다. 물론 20만원 이상 투자할 경우에는 수수료 계산을 해봐야 할 것입니다. 그래서 업비트 상의 평가손익으로 따지면 안되고, 보유자산 금액에서 위 두 가지 비용을 제외한 금액을 따져보면 될 것 같습니다.

 

 

 

 

 

 

이상 MVP 버전 테스트까지 마칩니다.

MVP버전으로 한 달을 돌리려면 계속 켜놓고 있어야 되는 건데, 전기료가 더 들 것 같으니, 컴퓨터 켜져있는 동안 4시간 간격으로 알람 맞춰놓고 실행시켜보면 어떨까 하는 생각이 드네요. 아무쪼록 영상을 따라해보며 많은 공부가 된 것 같습니다.

조코딩 님에게 감사드리며 마무리합니다.

 

 

 

 

 

최종 코드는 조코딩 님 유튜브 채널을 참조하세요.

바로가기>

 

 

 

 

 

 

 

BR.h

 

 

 

728x90
반응형