나만의 블룸버그 터미널을 무료로 만들었다

한국 주식, 미국 주식, 거시경제 지표, 코인, 환율, 뉴스, 트럼프 발언까지
맥미니 한 대, 거실에서, 24시간. 월 운영비: 0원.


솔직히 말하면 나는 금융 앱을 다섯 개쯤 깔아두고 살았다. 코스피 볼 때는 증권사 앱, 나스닥은 인베스팅닷컴, 코인은 업비트, 뉴스는 구글… 이걸 매일 오락가락하는 게 너무 귀찮아서 결국 직접 만들었다.

처음엔 간단한 주식 차트 뷰어로 시작했는데, 어느 순간 나만의 대시보드가 되어 있었다. 지금은 매일 아침 이 화면 하나로 시장을 확인한다. 외부 IP로도 접속되니까 폰에서도 열린다.

이렇게 만들었다.


화면 구성

위에서 아래로 스크롤하면 이렇게 나온다:

경제지표 패널 — 글로벌 주요 지표 20개를 한눈에. 기간 버튼 하나로 20개 지표를 동시에 업데이트.

1. 경제지표 (4×5 그리드)
20개 글로벌 지표를 한 화면에 — 미국 10년물 국채금리, 필라델피아 반도체 지수(SOXX), WTI 원유, VIX 변동성 지수, 다우존스, 코스피, 코스닥, S&P 500, 나스닥, 런던 FTSE, 니케이, 상하이, 달러/원, 달러/엔, 달러/위안, 금, 비트코인, 이더리움, 써클(CRCL), 달러인덱스. 카드마다 미니 스파크라인 차트 + 현재값 + 등락. 기간 버튼(오늘/5일/1주/1개월/3개월/6개월/1년/2년)으로 20개 차트를 한꺼번에 전환.

미국 10년물, 필라델피아 반도체, WTI 원유, VIX, 다우존스, 코스피, 코스닥, S&P 500, 나스닥, 런던 FTSE.
탭 전환 없이 한 화면에.

2. 한국 주식 (4×5 그리드)
방산, 로봇, 반도체, 2차전지, 핀테크, ETF — 내가 보는 20종목. Apple 주식 앱 스타일: 왼쪽 종목명, 가운데 미니 차트, 오른쪽 가격과 등락.

Apple 주식 앱 스타일로 20개 종목을 카드로. 방산, 로봇, 반도체, 2차전지, 핀테크, ETF — 내가 매일 보는 섹터들.

3. 미국 주식 (4×5 그리드)
같은 레이아웃으로 20종목. AAPL, NVDA, MSFT, GOOGL, AMZN, META, TSLA, PLTR, IonQ, Rocket Lab, Oklo, LMT, RTX, 그리고 ETF들(GLD, IBIT, SPY, QQQ, SOXL, TQQQ, SCHD).

미국 워치리스트: 빅테크, AI, 우주, 원자력, ETF. 한국 주식과 동일한 레이아웃, 동일한 데이터 소스(yfinance).

4. 뉴스 테이블 3개

  • 🇺🇸 What Trump Said Yesterday — BBC/NYT/CNBC에서 트럼프/백악관 관련 기사만 필터링
  • 🌍 세계 경제 뉴스 — BBC Business, CNBC, NYT Business
  • 🇰🇷 국내 경제 뉴스 — 한국경제, 매일경제, 서울경제
하단에 뉴스 섹션 3개 — 트럼프 헤드라인, 세계 경제, 국내 경제. RSS 피드에서 가져와 5분마다 자동 갱신.

카드 클릭하면 모달이 뜨는데, 큰 차트 + 1D~2Y 기간 탭 + 시가/고가/저가/거래량/52주 고저 지표까지 볼 수 있다.

카드를 클릭하면 상세 차트 모달이 열린다. 7개 기간 탭, 시가/고가/저가/거래량, 52주 고저.
TradingView lightweight-charts로 구현.

기술 스택

진짜 별거 없다:

백엔드:   Python 3 (표준 라이브러리 + yfinance)
프론트:   바닐라 HTML + JavaScript
차트:     TradingView lightweight-charts v4 (무료)
데이터:   Yahoo Finance (yfinance)
뉴스:     RSS 피드를 urllib + 정규식으로 직접 파싱
서버:     집 맥미니, 포트포워딩

파일은 딱 세 개:

stock-dashboard/
├── server.py                  # Python HTTP 서버 + API 전체
├── kr_stocks_dashboard.html   # 프론트엔드 전체 (HTML/CSS/JS)
└── stocks.csv                 # 종목 리스트

CSV로 종목 관리

종목 티커를 JavaScript에 하드코딩하지 않고 CSV로 분리했다:

ticker,name,sector,market
005930.KS,삼성전자,반도체,KR
000660.KS,SK하이닉스,반도체,KR
AAPL,Apple,Tech,US
NVDA,NVIDIA,반도체,US
CRCL,Circle,Fintech,US

서버가 /api/stocks 요청마다 이 파일을 읽는다. 프론트엔드는 로드 시 한 번 가져와서 market 컬럼으로 KR/US 그리드를 자동으로 분리한다. 종목 추가/제거는 CSV 한 줄 수정으로 끝. 코드 건드릴 필요 없다.


API 구조

서버가 제공하는 엔드포인트는 세 개:

GET /api/stocks                         → stocks.csv 읽어서 전체 목록 반환
GET /api/stock?ticker=AAPL&period=1d   → 가격 히스토리 + 등락
GET /api/news?category=global          → RSS 파싱 헤드라인

주식 엔드포인트는 데이터가 부족하면 interval을 바꿔가며 재시도한다:

FETCH_PLAN = {
    '1d':  [('2m', 5), ('5m', 3), ('1m', 5), ('60m', 2)],
    '5d':  [('30m', 3), ('60m', 2), ('1d', 2)],
    ...
}

period=1d로 조회했을 때 데이터가 5개 미만이면(한국 주식이 특정 시간대에 이런 경우가 있다) 5d, 그다음 1mo로 자동 폴백한다.


삽질 포인트들

^VIX, ^GSPC — URL에서 ^ 문자 문제
^가 들어간 티커를 URL에 그냥 넣으면 서버가 못 받는다. 해결책은 두 줄:

  • 프론트: encodeURIComponent(ticker)로 인코딩
  • 백엔드: unquote(ticker)로 복원

이거 찾는 데 꽤 걸렸다.

RSS + SSL 인증서
feedparser 라이브러리가 일부 사이트 SSL 인증서에서 조용히 실패한다. 그냥 feedparser를 버리고 urllib로 직접 XML 가져와서 정규식으로 파싱했다. 투박하지만 잘 된다.

Yahoo Finance 장중 데이터
yfinanceperiod=1d 조회하면 데이터 포인트가 1~2개만 올 때가 있다. 특히 한국 시장. 다중 interval 폴백으로 해결했는데, 원인 파악하는 데 가장 시간이 많이 걸렸다.

외부 접속
localhost 바인딩은 내 컴퓨터에서만 접속 가능하다. 0.0.0.0으로 바꾸고 공유기 포트포워딩 설정하면 외부 IP로도 열린다. 코드 한 줄, 설정 5분.

반응형 레이아웃
4×5 그리드가 화면 크기에 따라 자동으로 재배치된다:

  • 1300px 이상: 5열 (경제지표)
  • 900px 이상: 4열
  • 780px 이상: 3열
  • 480px 이상: 2열
  • 480px 미만: 1열

처음엔 좁은 화면에서 카드가 잘리는 문제가 있었는데, min-width: 0overflow: hidden으로 해결했다.


설치 방법

pip3 install yfinance
# server.py, kr_stocks_dashboard.html, stocks.csv를 한 폴더에
python3 server.py
# http://localhost:8888 열기

외부 접속은 server.py에서 localhost0.0.0.0 변경 후 공유기 포트포워딩.


다음에 추가하고 싶은 것

  • 가격 알림 — 특정 종목이 X% 이상 움직이면 알림
  • 포트폴리오 손익 — 보유 종목 입력하면 실시간 P&L
  • 아침 뉴스 브리핑 — 매일 아침 이메일로 요약본 발송
  • 접속 인증 — 외부 IP 노출이 걱정되니 간단한 토큰 인증

맥미니 한 대, 거실에서, 24시간. 월 운영비: 0원.

도움이 됐으면 박수 한 번 부탁드려요. 직접 만들어보셨다면 어떻게 바꿨는지 댓글로 알려주세요. 🚀

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다