Oracle Sentiment Project - revenge for my stock -
-
프로젝트 계기 오라클 주식을 샀는데 계속 떨어졌다. 주식이 궁금해서 시작한지 약 일주일.. 파란색으로 뜨는 마이너스밖에 보이지 않는다. 뉴스에는 오라클의 빛과 계약과 실망 등등 말이 많다. 그러다가 문득 인터넷에 보이는 뉴스와 주식의 상관관계가 얼마나 맞아 떨어질까 궁금했다. 아마도 비슷하겠지만, 그래도 ‘얼마나’ 비슷할까? 2026년 1월부터 시작해 앞으로 몇 개월 정도 꾸준히 데이터를 모으고 분석해보는 시간을 가져보고 싶다.
-
데이터 파이프라인 아키텍처
-
과거 데이터 (Backfill): 지금은 3월이고, 지난 1, 2월의 오라클 뉴스가 궁금해서 찾아보다가 Common Crawl(CC-NEWS)의 WARC 파일을 활용하는 방법도 있다는 걸 알게 되었다. AWS S3 에 있으므로, 접근은 쉽기만 무거운 파일이라 과연 잘 다룰수 있을지 걱정이 된다. 이 수천만 개의 웹페이지 중 오라클 관련 뉴스만 추출해야 한다. (Spark on AWS Glue 사용)
-
실시간 데이터: 3월부터 앞으로 여름, 가을, 겨울까지의 데이터는 AWS Lambda와 Google News RSS를 활용하여 매일 아침 최신 뉴스를 자동으로 수집할 예정이다.
-
분석 및 시각화: S3에 적재된 JSON 데이터를 TextBlob으로 감성 분석하고, 주가 데이터와 매칭하여 상관관계를 도출할 예정이다.
-
이번 프로젝트는 AWS 를 활용해서 진행하고 있다.
진행하다가 맞닥뜨린 어려움은 다음과 같았다.
- Glue의 notebook 을 처음 사용해봤는데, 아뿔싸, interactive session이 이렇게 비쌀 줄 몰랐다. 게다가 나는 Free Tier 인 줄 알았는데 아니었다. 결과적으로 그저께 통장에서 8천원가량이 빠져나갔다. 당황스러웠다.
- Glue의 notebook 은 작업 없이 켜두기만 해도 비용이 발생한다. 그래서 이후에는 로컬 (VS Code) 에서 실험하고 완벽히 돌아갈 때만 Glue Job의 Script 로 넘겼다. 훨씬 쌌다.
- 계속해서 필터링에서 문제를 겪고 있다. warz 파일은 잘 가져오지만, 필터링 과정에서 계속해서 예외가 발생한다. 이렇게 job 을 자주 돌리다보면 또다시 내 생활비가 부족해질 것이다. 해결책을 찾고 있다.
지금까지 진행한 내용:
로컬에서 테스트 한 후에, Glue Job 에게 시키고, 연결된 S3 버킷에 json 파일로 저장하고 있다. 현재는 필터링 작업을 수정중이다. 처음에는 연관성이 낮은 가십성 사이트 (예를 들어 hindustantimes, livemint 등)을 url 기반으로 1차 차단했다. 그리고 오라클과 비슷한 이름을 가진 공인들도 제외해야 했다. Obi 같은 이름이었다.
모든 웹페이지를 BeautifulSoup으로 파싱하면 CPU 부하가 커져서, 이를 방지하기 위해 가벼운 문자열 검사를 파싱 앞에 배치하도록 했다. 로직: HTML 전체 텍스트를 소문자로 변환 후, oracle이라는 단어가 아예 존재하지 않으면 무거운 파이싱 과정을 생략하고 즉시 다음 레코드로 넘어가기 -> glue job 처리 속도 높임
또한, 단순히 뉴스에 관련 단어가 포함되었는지를 넘어, 해당 기사가 “진짜 오라클 주식 관련 뉴스인가?”를 판정하는 점수제를 도입했다.
하지만… 아무리 가점이나 검사를 줘도 json 에 오라클 기사만 깔끔하게 넘어오지 않는다. 7할은 관련이 없는 내용이다. 영어가 아닌 독일어나 일본어로 된 기사가 들어오기도 한다.
고민하다가 이래저래 찾아보니 아래와 같은 해결책이 도움이 된다고 한다.
- Sampling 과 Local Fast-Feedback
- 전체 레코드 중 랜덤하게 1만개만 따로 추출해 로컬의 작은 테스트용 DB에 적재한다.
- 그리고 이걸 대상으로 필터를 돌려보며 정밀도를 올린다.
- 로컬 샘플에서 완벽하게 작동하는 게 확인되면 Glue Job으로 코드를 옮긴다.
- Bronze, Silver, Gold
- raw -> cleansed -> curated 에 해당하는 각각의 폴더를 만들어서 주가와 비교할 데이터는 Gold 데이터랑만 비교하게 한다.