0. upbit 어플 이용해서 원화 입금

upbit 에서 코인을 거래 할 수 있는 환경을 구성하는 단계이다. 업비트 계좌, 케이뱅크 등등의 ai 투자 자동화를 하는 것을 떠나서 손으로 코인 거래를 할 수 있는 환경을 구성해놓으면 된다.

1. UPbit API key

링크 <- 링크에 들어가서 api key 를 발급 받는다

image

ip 주소는
google 의 “what is my ip” 를 검색하거나
네이버에 “내 아이피 주소 확인” 을 검색하거나
윈도우 시작에서 cmd 를 눌러서 명령 프롬프트를 키고 ipconfig 를 치고 enter 를 누르면 된다.

마지막으로 key 를 발급 받아서 메모장에 저장해두고 절대 유출하지 않도록 한다.

2. chat GPT api key ( 나중에 Llama 로 대체)

링크 <-

오른쪽 상단의 자신의 아이콘을 눌러 “your profile” 에 들어간다

image 1
image 2

우리는 아래에서 llama 로 대체할 것이므로 우선은 최소 금액만을 충전한다.

image 3
image 4

create project 를 눌러서 새로운 프로젝트를 생성한다.

image 6

dashboard 로 이동해서

image 7

api keys 를 생성한다

image 8

key 를 받아서 메모장에 저장해두고 절대 유출하지 않도록 한다.

3. python 환경 구성

당연하게도 python 코딩을 해본적이 있다면 아래에서 설치해야할 라이브러리만 설치 해주고 다음 단계로 넘어가면 된다

https://www.python.org/ 에서 python 을 설치하고

구글에 vscode 를 검색하여 설치한다.

image 9

vscode 를 설치하면 위와 같은 프로그램이 실행된다.

python 라이브러리로는 (pip install ~)
python-dotenv
openai
pyupbit
이 3개를 설치해야 한다.

pip install python-dotenv openai pyupbit

4. AI 자동 매매 프로그램 개발

4.1. upbit 데이터 읽기

image 11

자신의 프로젝트 폴더에 “.env” 파일을 생성한다.

image 13

이 안에 위와 같이 우리의 key 들을 복사해서 넣어주면 된다. 위에 1. 2. 과정에서 얻은 key 들이다.

image 14

위 코드를 통해 현재 가격을 얻어 올수 있다.

4.2. chat GPT 설정

image 15

이 창에서 기본적이 GPT 의 정체성(역할) 을 결정해준다.
영어로 ” 너는 비트코인 전문가다. 제공해준 차트 데이터로 현재 코인을 buy, sell, hold 할지 판단해” 를 입력해 넣어주면 된다.
그와 동시에 아래에
response Example:
{“decision”: “buy”, “reason”: “some technical reason”}
{“decision”: “sell”, “reason”: “some technical reason”}
{“decision”: “hold”, “reason”: “some technical reason”}
와 같이 응답의 형식을 정해주는 좋다.

import os
from dotenv import load_dotenv
import time
load_dotenv()

# print(os.getenv("UPBIT_ACCESS_KEY"))
import pyupbit
df=pyupbit.get_ohlcv("KRW-BTC", count=30, interval="day")
print(df.to_json())

코드를 위와 같이 작성하고 그 응답을 chat GPT 에서 user message 에 입력하면 그 결과를 볼 수 있다.

image 16

이제 이 과정을 코드로 구현한다.

image 18

code 버튼을 누르고 팝업된 code 를 복사한다.

image 19

코드에서 화살표로 표시된 user text 부분을 대체하면 된다.

image 20

지금까지의 전체코드를 실행하면 아래와 같이 결과를 얻을 수 있다.

image 21

4.3. bitcoin 매수 매도 코드 포함하기

image 23

위와 같이 chat GPT 의 판단에 따라 매수와 매도를 하는 코드를 포함해준다.

현재까지 전체코드는 다음과 같다.

import os
from dotenv import load_dotenv
import time
import pyupbit
import json
import pyupbit
load_dotenv()


def ai_trading():
    # print(os.getenv("UPBIT_ACCESS_KEY"))

    df=pyupbit.get_ohlcv("KRW-BTC", count=30, interval="day")

    from openai import OpenAI
    client = OpenAI()

    response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
        "role": "system",
        "content": [
            {
            "type": "text",
            "text": "you are an expert in Bitcoin investing. Tell me whether to buy, sell, or hold at the moment based on the chart data provided. response in json format. do not include ```json\n\nresponse Example:\n{\"decision\": \"buy\", \"reason\": \"some technical reason\"}\n{\"decision\": \"sell\", \"reason\": \"some technical reason\"}\n{\"decision\": \"hold\", \"reason\": \"some technical reason\"}"
            }
        ]
        },
        {
        "role": "user",
        "content": [
            {
            "type": "text",
            "text": df.to_json()
            }
        ]
        }
    ],
    response_format={
        "type": "text"
    }
    )
    result=response.choices[0].message.content
    print(result)

    result = json.loads(result)
    access= os.getenv("UPBIT_ACCESS_KEY")
    secret = os.getenv("UPBIT_SECRET_KEY")

    upbit= pyupbit.Upbit(access,secret)
    
    print("### AI DECISION: ",result["decision"].upper(),"###")
    print(f"### Reason: {result['reason']} ###")

    if result['decision'] == "buy":
        my_krw=upbit.get_balance("KRW")
        if my_krw*0.9955 > 5000:
            print("### Buy Order Executed ###")
            print(upbit.buy_market_order("KRW-BTC", upbit.get_balance("KRW")/3))
            
        else:
            print("### Buy Order Failed: Insufficient KRW (less than 5000 KRW) ###")
        
    elif result['decision'] == "sell":
        my_btc=upbit.get_balance("KRW-BTC")
        current_price=upbit.get_orderbook(ticker="KRW-BTC")['orderbook_units'][0]["ast_price"]
        if my_btc*current_price > 5000:
            print("### Sell Order Executed ###")
            print(upbit.sell_market_order("KRW-BTC", upbit.get_balance("KRW-BTC")))
            print(result["reason"])
        else:
            print("### Sell Order Failed: Insufficient BTC (less than 5000 KRW worth) ###")

    elif result['decision'] == "hold":
        print(result["reason"])
        
# while True:
#     time.sleep(10)
#     ai_trading()

ai_trading()

5. chat GPT (유료) -> facebook 라마 3.1 (무료) 모델로 대체

5.1. 라마 3.1. 설치

링크 <-

image 24

올라마를 설치한다.

image 25

라마를 설치하고

cmd 를 열고 아래 사진에서 처럼 ollama 가 설치가 잘 되었는지 확인 할 수 있다.

image 28

그 다음에는 llama3.1 모델을 설치하자

링크 <-

image 27
image 29

cmd 에 링크에서 알려주는 명령어 “ollama run llama3.1” 을 해주면 자동으로 설치가 된다.

아래 사진과 같이 설치한 cmd 창에서 같은 명령어로 llama3.1 을 테스트 해볼 수 있다.

image 30
image 34

이렇게 모델이 설치된 것을 확인 할 수 있다.

5.2. llama 3.1 python 으로 실행

먼저 python 라이브러리를 추가로 설치해준다.

langchain, langchain_community, langchain-ollama

$pip install langchain 와 같이 설치하면 된다.

from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_ollama import OllamaLLM


llm = OllamaLLM(model="llama3.1:latest")


template = "{country}의 수도는?"

prompt = PromptTemplate.from_template(template=template)
chain = prompt | llm | StrOutputParser()

result = chain.invoke({"country", "한국"})
print(result)

위의 코드로 python 으로 llama3.1 을 사용할 수 있게 되었다.

image 35

6. 구현 마무리, 최종 코드

from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain_ollama import OllamaLLM
from langchain_core.output_parsers import StrOutputParser
import os
from dotenv import load_dotenv
import pyupbit
import json

# Load environment variables
load_dotenv()


def ai_trading():
    # print(os.getenv("UPBIT_ACCESS_KEY"))

    input_data=pyupbit.get_ohlcv("KRW-BTC", count=25, interval="day")
    print(input_data)

    # Define the system message template to instruct the model clearly
    system_template = """
    You are an expert in Bitcoin investing. Based on the provided chart data, determine whether to buy, sell, or hold.
    ONLY respond in JSON format with keys "decision" and "reason". No additional explanations, just JSON.

    Format Example:
    {{"decision": "buy", "reason": "some technical reason"}}
    {{"decision": "sell", "reason": "some technical reason"}}
    {{"decision": "hold", "reason": "some technical reason"}}
    """

    # Create the system and user message templates
    system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
    user_message_prompt = HumanMessagePromptTemplate.from_template("{input}")

    # Define the chat prompt template with system and user messages
    chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, user_message_prompt])

    # Initialize the LLM model
    llm = OllamaLLM(model="llama3.1:latest")

    # Create the chain with prompt and output parser
    chain = chat_prompt | llm | StrOutputParser()

    # Execute the chain with the input data
    result = chain.invoke({"input": input_data})

    # Print the formatted result
    print(result)

    result = json.loads(result)
    access= os.getenv("UPBIT_ACCESS_KEY")
    secret = os.getenv("UPBIT_SECRET_KEY")

    upbit= pyupbit.Upbit(access,secret)
    
    print("### AI DECISION: ",result["decision"].upper(),"###")
    print(f"### Reason: {result['reason']} ###")

    if result['decision'] == "buy":
        my_krw=upbit.get_balance("KRW")
        if my_krw*0.9955 > 5000:
            print("### Buy Order Executed ###")
            print(upbit.buy_market_order("KRW-BTC", upbit.get_balance("KRW")/3))
            
        else:
            print("### Buy Order Failed: Insufficient KRW (less than 5000 KRW) ###")
        
    elif result['decision'] == "sell":
        my_btc=upbit.get_balance("KRW-BTC")
        current_price=upbit.get_orderbook(ticker="KRW-BTC")['orderbook_units'][0]["ast_price"]
        if my_btc*current_price > 5000:
            print("### Sell Order Executed ###")
            print(upbit.sell_market_order("KRW-BTC", upbit.get_balance("KRW-BTC")))
            print(result["reason"])
        else:
            print("### Sell Order Failed: Insufficient BTC (less than 5000 KRW worth) ###")

    elif result['decision'] == "hold":
        print(result["reason"])
        
# while True:
#     time.sleep(10)
#     ai_trading()

ai_trading()

이렇게 위와 같이 페이스북 llama3.1 을 사용하여 비트코인을 자동 매매 하는 프로그램을 개발해 보았다.

실제 수익을 위해서는 llama3.1 중에서도 높은 용량의 모델을 사용하고 경우에 따라서 fine tuning 을 진행하여야 할 것이다.

또한, system message 를 활용해서 자신이 원하는 투자 전략을 모델에게 알려주어 모델이 그 전략대로 buy, sell, hold 를 판단하도록 할 수도 있을 것이다.

다음번엔 이번 코드를 기반으로 “변동성 돌파 전략” 그리고 인공지능 모델 적용 과 같은 추가적인 알고리즘들을 코드에 포함하여 실제 수익을 낼 수 있는 최종 프로그램을 만들 예정이다.




0 Comments

Leave a Reply