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

이제 브라우저에서 접속하면 주식 손익 그래프 웹페이지가 열립니다.


📊 이렇게 보입니다

https://miro.medium.com/1%2AtpZuypCypENZw1eq8ijWCA.png
https://images.prismic.io/turing/65a53cdf7a5e8b1120d5887f_image1_11zon_c0821d08b2.webp?auto=format%2Ccompress
https://miro.medium.com/v2/resize%3Afit%3A1400/1%2A63VrsZO18fBTDmCdnbiNiw.gif

4

  • 총 자산 증가 추이
  • 손익 변동 그래프
  • 종목별 수익 기여도
  • 자산 비중 파이차트 (추가 가능)

🚀 이 방식의 진짜 장점

기존개선 후
Chat 알림으로 그때그때 확인시간 흐름에 따른 데이터 축적
오늘 수익만 확인한 달/세 달/1년 추이 분석
감으로 투자 판단데이터 기반 판단
로그 파일웹 대시보드

✨ 확장 아이디어

  • 주간/월간 리포트를 자동으로 PNG 그래프로 생성 후 Chat 전송
  • Grafana/Metabase 연결
  • 종목별 ROI 히스토리 그래프
  • 자산군(ETF/주식/금) 비중 변화 추이

✅ 마무리

주식 자동화 봇을 만들었다면, 이제는 데이터를 쌓아야 할 단계입니다.

기록되지 않는 수익률은, 결국 기억에만 남습니다.

SQLite + Streamlit 조합은
가볍고, 쉽고, 강력한 개인 투자자용 대시보드를 만드는 최고의 방법입니다.

지금 사용 중인 주식 봇에 단 50줄만 추가해보세요.
당신의 투자가 ‘데이터’로 보이기 시작합니다.

다음시간에 실시간 기록을 남기는 소스를 보겠습니다.

이 글이 도움이 되었나요?좋아요/추천은 다시 누르면 취소됩니다.
hong
발행: 2026.02.04 최종 검토: 2026.02.04

답글 남기기

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