자동 매매

이슈 기반 자동매매 크롤러 제작해보기(코드 포함)

1goldkyu 2025. 7. 30. 16:16

암호화폐 시장에서 자동매매를 구현하려면 단순히 차트나 지표만을 기반으로 하는 전략으로는 부족한 경우가 많습니다. 특히 급등락을 유발하는 외부 이벤트, 즉 뉴스나 공시, 상장, 소각, 락업 해제와 같은 **'이슈 트리거'**가 발생하는 순간, 시장은 순식간에 방향을 정하고 크게 움직입니다.

따라서 알고리즘 트레이딩의 전략 중 하나는, 이슈 발생 시점을 빠르게 감지하고 매매 조건에 반영하는 것입니다. 이번 글에서는 필자가 직접 만든 **"이슈 기반 자동매매 크롤링 시스템"**에 대해 소개하고자 합니다.


✅ 유동성 종목을 먼저 추리는 이유

시장의 모든 코인을 대상으로 크롤링을 하게 되면, 데이터양이 너무 많아지고 속도도 느려집니다. 무엇보다 "이슈가 발생해도 거래가 활발하지 않은 종목"은 실제 매매로 연결되지 않기 때문에 비효율적입니다.

그래서 필자는 자체적으로 개발한 유동성 검색기를 통해, 거래량과 거래대금이 일정 기준 이상인 종목만 선별하여 .csv 파일로 저장합니다. 이 리스트에는 보통 하루 기준 상위 20~30개의 종목이 포함됩니다.


✅ CSV 기반 검색 키워드 자동 조합

 

이슈 기반 자동매매 크롤러 제작해보기(코드 포함)

오늘자 기준 이 .csv 파일에는 종목의 심볼(B3, HOME, REZ, ORDER 등)이 들어 있으며, 해당 파일을 자동으로 읽어서 각 코인 심볼에 대해 아래와 같은 핵심 이슈 키워드를 조합합니다:

  • 업비트 상장
  • 바이낸스 상장
  • 코인 소각
  • 락업 해제
  • unlock
  • burn
  • listing

각 티커에 대해 이 7가지 키워드를 조합하면 하나의 검색 쿼리가 생성되며, 이 쿼리를 바탕으로 뉴스나 공시 사이트를 검색합니다.


✅ 주요 뉴스 출처 지정 (업비트, 토큰포스트, 코인니스 등)

필자는 수많은 뉴스 사이트 중에서도 가장 신속하고 신뢰할 수 있는 한국 중심의 세 곳을 먼저 지정했습니다.

구글 검색 쿼리에서는 site: 키워드를 사용해 위 세 도메인에 대해서만 검색되도록 제한하고 있습니다. 이렇게 하면 크롤러가 엉뚱한 사이트를 뒤지지 않고 정확하고 빠르게 원하는 뉴스만 추출할 수 있습니다.


✅ 실제 검색 자동화 코드 흐름

Python을 기반으로 다음과 같은 구조로 코드를 설계했습니다:

  1. tickers.csv 파일에서 종목 심볼 리스트를 읽는다.
  2. 각 종목에 대해 7개의 핵심 키워드를 조합해 총 7개의 검색어를 만든다.
  3. 각 검색어에 대해 구글 검색을 실행하며, 주요 뉴스 출처에 대해서만 검색되도록 필터링한다.
  4. 검색 결과 URL을 시간, 종목명, 키워드와 함께 issue_results.csv 파일에 저장한다.
  5. 티커당 검색 시 일정 간격(10초)을 두어 구글 차단을 방지한다.

이 방식은 단순하면서도 강력하며, 다음과 같은 장점이 있습니다:

  • 이슈 탐지가 빠르다 (업비트 상장 등은 1시간 전부터 공지됨)
  • 검색 범위를 통제할 수 있어 노이즈가 적다
  • 확장성도 뛰어나며 텔레그램 연동이나 자동매매 연동도 가능하다

✅ 실행 결과


✅ 다음 확장 방향

이 크롤러는 다음과 같은 방식으로 쉽게 확장할 수 있습니다:

  • 주요 글로벌 뉴스 사이트 추가 (CoinDesk, Cointelegraph 등)
  • 영문 키워드 필터 강화 (airdrop, partnership, mainnet launch 등)
  • 트위터 API와 연동하여 상장 루머나 소각 소식 빠르게 탐지
  • 크롤링 결과를 텔레그램이나 디스코드로 실시간 알림
  • 자동매매 시스템에 직접 연동하여 뉴스 기반 자동 진입 트리거 구현

✅ 마무리

단순한 지표 매매를 넘어, 시장에 직접적인 영향을 주는 뉴스 이슈를 감지하여 자동매매에 활용하는 구조
트레이딩 알고리즘의 수준을 한 단계 끌어올리는 핵심 요소입니다.

이번에 만든 이슈 크롤러는 실전에서 바로 활용 가능하며, 실제 상장 공지와 같은 이벤트도 정확히 탐지함으로써
실효성이 높은 전략 도구로 발전할 수 있는 잠재력을 지녔습니다.

만약 여러분도 자동매매에 이슈 기반 필터를 도입하고자 한다면,
단 한 줄의 뉴스가 수익률을 결정짓는 변수임을 기억하세요.

 

 

 

전체코드 참고

 

# ticker_loop_crawler.py
import pandas as pd
from googlesearch import search
import datetime
import time
import csv

# 🔧 설정
csv_input_file = "results.csv"  # 티커 목록이 있는 CSV 파일
csv_output_file = "issue_results.csv"  # 결과 저장 파일
keywords = ["업비트 상장", "바이낸스 상장", "코인 소각", "락업 해제", "unlock", "burn", "listing"]
search_sites = "site:upbit.com OR site:tokenpost.kr OR site:coinness.com"
search_interval = 30  # 티커당 검색 간격 (초)
max_results = 3       # 키워드당 최대 검색 결과 수

# 📅 날짜 기준
today = datetime.date.today()
print(f"🟢 전체 크롤링 시작일: {today}")

# 📁 CSV 불러오기
df = pd.read_csv(csv_input_file)
tickers = df['symbol'].tolist()

# 📄 결과 CSV 헤더 생성
with open(csv_output_file, mode='w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(["datetime", "ticker", "keyword", "url"])

# 🔁 티커 순회 크롤링
for ticker in tickers:
    print(f"\n🔍 {ticker} 검색 시작")

    for keyword in keywords:
        query = f"{ticker} {keyword} {search_sites}"
        print(f"  ⏳ 검색어: {query}")

        try:
            results = search(query, num_results=max_results, lang="ko")
            now_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            # 결과 저장
            with open(csv_output_file, mode='a', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                for url in results:
                    print(f"    🔗 {url}")
                    writer.writerow([now_str, ticker, keyword, url])
        except Exception as e:
            print(f"    ❌ 검색 오류: {e}")

        time.sleep(search_interval)  # 🔄 10초 대기