본문 바로가기
프로그램

비트코인 프로젝트_타점찾기1

by Dimas 2024. 3. 24.

지금까지 만들어온 프로그램의 방향을 다시 잡아줄 때가 왔다.

이 프로그램을 왜 만들고있고, 어떻게 만들어야 하는지를 다시 생각해야한다.

역시 가장 큰 목적은 돈이다. 이 프로그램을 통해 거래수익을 꾸준히 올리는게 궁극적인 목적이다.

1분단위 거래량이니 종가변화율이니 다 목적을 위한 수단일 뿐이다. 몇 가지의 방법을 찾았으니 이게 정말 타점을 잡는데 도움을 주는지도 확인해야한다. 

하지만 이 역시도 나는 알지 못한다. 알았으면 이미 돈을 벌었겠지,, 이또한 챗지피티에게 물어보기로 했다.

하지만 당연하게도 추상적인 답변 뿐이라 기준을 어떻게 잡아야할지 전혀 모르겠다... 

저번 게시글에 추상적으로 생각해둔 계획이 있었다. 전체 종목에 대해서 1분전 대비 거래량이 급증하는 시간대를 찾고, 그 시간대부터 2분동안 5%이상의 상승을 보인 종목들 중 급등 시점부터 원점 복귀까지 얼마나 걸리는지를 확인하는 것이다. 시간이 좀 걸린다면 그 시간동안 배에서 잡고 어깨에서 파는 것도 나쁘지 않을 것 같다.

갑자기 든 생각은 요즘같은 횡보장에 저점과 고점을 파악해 무릎에서 사고 어깨에서 파는 전략이다. 이건 정말 횡보장에서만 할 수 있는,, 것이긴 하지만,,, 비코가 어느정도 올라가기 전까지 라는 조건을 달아두면 나쁘지 않을 것 같다.

일단 오늘은 1번을 목표로 가보자.

 

1주일간의 과거 데이터를 기반으로

1. 전체종목에 대해 거래금액이 급증(50%이상 상승)하는 시간대 파악 (시간대별로 정렬해서 찾기)

2. 위 시간대부터 2분동안 5% 이상 상승한 종목이 있는지 확인

3. 위 종목들이 다시 원점으로 돌아오기까지 걸린 시간과 고점에 도달할 때까지의 시간 확인 (고점 도달 후엔 하락세로 진입 금지)

이 과정에서 나온 거래금액 변화율이나 가격변화율이 유지시간 등과 관련이 있는지 상관계수로 확인! (하면 좋겠지만 일단 오늘은 3번까지 1번까지)

 

먼저 7~8번의 질문끝에 원하는 답변을 얻어냈다.

내가 원한 내용은 과거 1주일간의 데이터를 1분봉으로 쪼개고, 모든 종목의 거래금액을 합산하여 날짜/시간/합산거래금액 으로 출력하는 것이다.

import pyupbit
from datetime import datetime, timedelta

def get_total_volume_past_week():
    # 현재 시간과 1주일 전 시간 구하기
    end = datetime.now()
    start = end - timedelta(days=7)

    # 모든 상장된 코인 리스트 가져오기
    tickers = pyupbit.get_tickers()

    # 전체 데이터를 담을 빈 리스트 초기화
    all_data = []

    # 1분봉 데이터 받아오기
    for i in range(10080):  # 7일간의 1분마다 데이터
        # 현재 시간 설정
        current_time = end - timedelta(minutes=i)

        # 모든 코인의 거래량 합산
        total_volume = 0
        for ticker in tickers:
            df = pyupbit.get_ohlcv(ticker, interval="minute1", to=current_time, count=1)
            if df is not None:
                total_volume += df['volume'].iloc[0]

        # 날짜, 시간, 거래금액을 리스트에 추가
        all_data.append((current_time.date(), current_time.time(), total_volume))

    return all_data

if __name__ == "__main__":
    all_data = get_total_volume_past_week()
    for data in all_data:
        print(f"날짜: {data[0]}, 시간: {data[1]}, 거래금액: {data[2]:.2f} KRW")

(위 코드는 챗지피티의 답변으로 이 코드를 참고하여 제 개발환경에 맞게 수정할 예정이니 참고만 하셔도 됩니다)

위와 같은 코드를 얻었고, 1번에 맞춰 할 수 있도록 먼저 엑셀에 출력해서 내가 가시적으로 확인할 수 있도록 하고, 그 다음부터는 파이썬 코드에서 자체적으로 시간을 찾을 예정이다.

호기롭게 코드를 수정하고 실행을 했지만 간과한 사실이 있었다. 업비트는 1초당 10회의 틱조회를 지원하고,, 1주일치는 10080틱인데,, 상장된 종목이 몇개더라,,,, 아무튼 1종목당 1008초 즉 16.8분이 걸리고, 40종목이라고 하면 11.2시간이 소요된다.... 뭐 데이터추출이라 당연히 오래걸리는건 이해는 하지만 생각보다 오래 걸린다....

그렇다면 사실 이렇게 오래걸린다면 틱데이터 하나하나가 소중하다. OHLCV의 모든 데이터를 엑셀로 뽑아서 엑셀에서 가공하는 편이 빠를 것 같다. 물론 최종적으로 파이썬에서 가공해야겠지만 내가 이렇게저렇게 만져보려면 2차, 3차 가공을 해야하기 때문에,,, 뭔가를 찾아내기 위해서는 엑셀에 한번 저장해놓고 엑셀에서 수정하는게 빠를 것 같았다.

오늘은 몇분정도 엑셀에 돌려보고 잘 되는지만 확인하고 노트북을 시즈모드 박을 수 있을 때 해야지,,,

아무튼 방향을 바꿔서 모든 종목에 대해서 OHLCV를 모두 엑셀에 저장하는 코드로 수정해야겠다.

    def get_total_volume_past_week_per_minute(self):
        start_time = datetime.now() - timedelta(days=7)
        end_time = datetime.now()

        # 모든 상장된 코인 리스트 가져오기
        tickers = pyupbit.get_tickers(fiat="KRW")

        # 전체 데이터를 담을 빈 리스트 초기화
        all_candles = []

        current_time = start_time
        while current_time <= end_time:
            # 1분봉 데이터 받아오기

            for ticker in tickers:

                candles = pyupbit.get_ohlcv(ticker, interval="minute1", to=current_time, count=1)
                if candles is not None:
                    candles['current_time'] = current_time
                    candles['ticker'] = ticker
                    all_candles.append(candles)
                    print(candles)
                # 다음 1분으로 이동

            current_time += timedelta(days=1)

        # 데이터프레임 생성
        df = pd.concat(all_candles)

        # 엑셀로 저장
        df.to_excel(self.test_path, index=False)

테스트코드는  이렇게 작성하였고, 이건 1분봉을 1일간격으로 7번 뽑는 데이터니까 실제 데이터 수집시에는 

current_time += timedelta(days=1) 을 current_time += timedelta(minutes=1) 로 수정해주면 된다.

오늘 목표는 여기까지가 아니었는데 이 결과로 2, 3번을 할 수 있기 때문에 오늘은 여기까지밖에 진행을 못할 것 같다.

오늘 한 부분은

KRW마켓에 상장된 모든 종목들에 대해서

1주일간의 1분봉 OHLCV를

엑셀로 출력한다.

이 세 줄로 요약할 수 있을 것 같다.. 너무 허무하다... 참 많은 것을 하고싶었으나,,, 실패,,,