Python 주식 자동화 봇을 운영하고 있다면, 이제는 ‘기록’을 남겨야 할 때입니다.
매일 계산되는 손익, 수익률, 자산 변화… Chat 알림으로만 보지 말고 그래프로 쌓아보세요.
✅ 왜 DB에 저장해야 할까?
많은 분들이 이런 자동화 봇을 만듭니다.
- 네이버/증권 API로 주가 조회
- 보유 종목 수익률 계산
- Synology Chat, Slack, 텔레그램으로 알림 전송
하지만 시간이 지나면 이런 생각이 들죠.
“어제보다 오늘 얼마나 늘었지?”
“한 달 동안 수익률 추이가 어땠지?”
“어떤 종목이 실제로 수익에 가장 기여했지?”
👉 알림 메시지로는 절대 알 수 없습니다.
👉 시계열 데이터(History)가 필요합니다.
🧠 해결 방법 구조
가장 간단하고 강력한 구조는 아래입니다.
[파이썬 주식 봇]
↓
SQLite DB 저장
↓
Streamlit 웹 대시보드
이 방법의 장점은:
- 별도 서버 불필요
- DB는 파일 하나 (백업 쉬움)
- 오렌지파이 / 라즈베리파이에서도 충분히 동작
- 웹에서 그래프로 바로 확인 가능
🗄️ 1단계 — SQLite DB 설계
봇이 실행될 때마다 2가지 정보를 저장합니다.
① 포트폴리오 전체 요약 (1행)
| 항목 | 설명 |
|---|---|
| ts | 실행 시각 |
| total_value_krw | 총 평가금액 |
| total_invested_krw | 총 매입금액 |
| total_pl_krw | 총 손익 |
| total_roi_pct | 총 수익률 |
② 종목별 스냅샷 (종목 수 만큼)
| 항목 | 설명 |
|---|---|
| ts | 실행 시각 |
| name | 종목명 |
| qty | 보유 수량 |
| avg_buy | 평균 매입가 |
| price | 현재가 |
| market_value_krw | 평가금액 |
| pl_krw | 손익 |
| roi_pct | 수익률 |
💾 SQLite 저장 코드 (봇에 추가)
import sqlite3
from datetime import datetime
DB_PATH = "/home/orangepi/python/data/portfolio.db"
def init_db():
con = sqlite3.connect(DB_PATH)
cur = con.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS portfolio_snapshot (
ts TEXT PRIMARY KEY,
total_value_krw REAL,
total_invested_krw REAL,
total_pl_krw REAL,
total_roi_pct REAL
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS holding_snapshot (
ts TEXT,
name TEXT,
qty REAL,
avg_buy REAL,
price REAL,
market_value_krw REAL,
pl_krw REAL,
roi_pct REAL,
PRIMARY KEY (ts, name)
)
""")
con.commit()
con.close()
봇이 계산을 마친 시점에 다음 함수 호출만 추가하면 됩니다.
def save_snapshot(summary, holdings):
ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
con = sqlite3.connect(DB_PATH)
cur = con.cursor()
cur.execute("""
INSERT OR REPLACE INTO portfolio_snapshot VALUES (?,?,?,?,?)
""", (ts,
summary["total_value_krw"],
summary["total_invested_krw"],
summary["total_pl_krw"],
summary["total_roi_pct"]))
for h in holdings:
cur.execute("""
INSERT OR REPLACE INTO holding_snapshot VALUES (?,?,?,?,?,?,?,?)
""", (ts, h["name"], h["qty"], h["avg_buy"],
h["price"], h["market_value_krw"],
h["pl_krw"], h["roi_pct"]))
con.commit()
con.close()
🌐 2단계 — Streamlit 웹 대시보드 만들기
Streamlit은 파이썬으로 웹을 만드는 가장 쉬운 도구입니다.
설치:
pip install streamlit pandas
dashboard.py 생성:
import sqlite3, pandas as pd
import streamlit as st
DB_PATH = "/home/orangepi/python/data/portfolio.db"
st.title("📈 포트폴리오 대시보드")
con = sqlite3.connect(DB_PATH)
snap = pd.read_sql_query("SELECT * FROM portfolio_snapshot ORDER BY ts", con)
hold = pd.read_sql_query("SELECT * FROM holding_snapshot ORDER BY ts", con)
con.close()
st.subheader("총 평가금액 추이")
st.line_chart(snap.set_index("ts")["total_value_krw"])
st.subheader("총 손익 추이")
st.line_chart(snap.set_index("ts")["total_pl_krw"])
st.subheader("최근 종목별 손익")
latest = hold["ts"].max()
st.dataframe(
hold[hold["ts"] == latest].sort_values("pl_krw", ascending=False)
)
실행:
streamlit run dashboard.py --server.port 8501
이제 브라우저에서 접속하면 주식 손익 그래프 웹페이지가 열립니다.
📊 이렇게 보입니다



4
- 총 자산 증가 추이
- 손익 변동 그래프
- 종목별 수익 기여도
- 자산 비중 파이차트 (추가 가능)
🚀 이 방식의 진짜 장점
| 기존 | 개선 후 |
|---|---|
| Chat 알림으로 그때그때 확인 | 시간 흐름에 따른 데이터 축적 |
| 오늘 수익만 확인 | 한 달/세 달/1년 추이 분석 |
| 감으로 투자 판단 | 데이터 기반 판단 |
| 로그 파일 | 웹 대시보드 |
✨ 확장 아이디어
- 주간/월간 리포트를 자동으로 PNG 그래프로 생성 후 Chat 전송
- Grafana/Metabase 연결
- 종목별 ROI 히스토리 그래프
- 자산군(ETF/주식/금) 비중 변화 추이
✅ 마무리
주식 자동화 봇을 만들었다면, 이제는 데이터를 쌓아야 할 단계입니다.
기록되지 않는 수익률은, 결국 기억에만 남습니다.
SQLite + Streamlit 조합은
가볍고, 쉽고, 강력한 개인 투자자용 대시보드를 만드는 최고의 방법입니다.
지금 사용 중인 주식 봇에 단 50줄만 추가해보세요.
당신의 투자가 ‘데이터’로 보이기 시작합니다.
다음시간에 실시간 기록을 남기는 소스를 보겠습니다.
이 글이 도움이 되었나요?좋아요/추천은 다시 누르면 취소됩니다.