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

한국 주식, 미국 주식, 거시경제 지표, 코인, 환율, 뉴스, 트럼프 발언까지
— 맥미니 한 대, 거실에서, 24시간. 월 운영비: 0원.
솔직히 말하면 나는 금융 앱을 다섯 개쯤 깔아두고 살았다. 코스피 볼 때는 증권사 앱, 나스닥은 인베스팅닷컴, 코인은 업비트, 뉴스는 구글… 이걸 매일 오락가락하는 게 너무 귀찮아서 결국 직접 만들었다.
처음엔 간단한 주식 차트 뷰어로 시작했는데, 어느 순간 나만의 대시보드가 되어 있었다. 지금은 매일 아침 이 화면 하나로 시장을 확인한다. 외부 IP로도 접속되니까 폰에서도 열린다.
이렇게 만들었다.
화면 구성
위에서 아래로 스크롤하면 이렇게 나온다:

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

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

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).

4. 뉴스 테이블 3개
- 🇺🇸 What Trump Said Yesterday — BBC/NYT/CNBC에서 트럼프/백악관 관련 기사만 필터링
- 🌍 세계 경제 뉴스 — BBC Business, CNBC, NYT Business
- 🇰🇷 국내 경제 뉴스 — 한국경제, 매일경제, 서울경제

카드 클릭하면 모달이 뜨는데, 큰 차트 + 1D~2Y 기간 탭 + 시가/고가/저가/거래량/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 장중 데이터yfinance로 period=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: 0과 overflow: hidden으로 해결했다.
설치 방법
pip3 install yfinance
# server.py, kr_stocks_dashboard.html, stocks.csv를 한 폴더에
python3 server.py
# http://localhost:8888 열기
외부 접속은 server.py에서 localhost → 0.0.0.0 변경 후 공유기 포트포워딩.
다음에 추가하고 싶은 것
- 가격 알림 — 특정 종목이 X% 이상 움직이면 알림
- 포트폴리오 손익 — 보유 종목 입력하면 실시간 P&L
- 아침 뉴스 브리핑 — 매일 아침 이메일로 요약본 발송
- 접속 인증 — 외부 IP 노출이 걱정되니 간단한 토큰 인증
맥미니 한 대, 거실에서, 24시간. 월 운영비: 0원.
도움이 됐으면 박수 한 번 부탁드려요. 직접 만들어보셨다면 어떻게 바꿨는지 댓글로 알려주세요. 🚀