한국 주식, 미국 주식, 거시경제 지표, 코인, 환율, 뉴스, 트럼프 발언까지
— 맥미니 한 대, 거실에서, 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개
카드 클릭하면 모달이 뜨는데, 큰 차트 + 1D~2Y 기간 탭 + 시가/고가/저가/거래량/52주 고저 지표까지 볼 수 있다.
진짜 별거 없다:
백엔드: 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 # 종목 리스트 종목 티커를 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 한 줄 수정으로 끝. 코드 건드릴 필요 없다.
서버가 제공하는 엔드포인트는 세 개:
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 그리드가 화면 크기에 따라 자동으로 재배치된다:
처음엔 좁은 화면에서 카드가 잘리는 문제가 있었는데, 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 변경 후 공유기 포트포워딩.
맥미니 한 대, 거실에서, 24시간. 월 운영비: 0원.
도움이 됐으면 박수 한 번 부탁드려요. 직접 만들어보셨다면 어떻게 바꿨는지 댓글로 알려주세요. 🚀
중고거래 안전결제, 다들 써보셨죠? AI 결제에도 이게 필요합니다. 문제는, 생각보다 훨씬 까다롭다는 거예요. 중고거래를 떠올려…
앞 편의 x402가 자판기였다면, 이번 두 방식은 '용돈 한도'와 '술집 외상장부'에 가깝습니다. 앞 편 복습:…