본문 바로가기
똑똑한 재테크

파이썬으로 포트폴리오 수익률 자동 추적하기 — 구글 시트·텔레그램 연동까지

by Mindy.s 2026. 5. 13.

자동매매 봇을 돌리고 있는데 지금 수익이 얼마인지 한눈에 보이지 않아서 불편했어요.

증권사 앱에서 확인하면 되긴 하는데, 여러 계좌에 걸쳐있거나 ETF·주식·달러 자산이 섞여있으면 전체 수익률을 한 번에 보기가 쉽지 않아요. 그래서 파이썬으로 직접 포트폴리오 추적기를 만들었어요.

yfinance로 현재가를 자동으로 가져오고, 내가 입력한 매수가와 비교해서 수익률을 계산하고, 구글 시트나 터미널에 출력하는 구조예요. 이번 글에서는 기본 포트폴리오 추적기부터 구글 시트 자동 업데이트까지 단계별로 만들어볼게요.

만들 것들 미리보기

📊 포트폴리오 수익률 리포트 (출력 예시)
AAPL — 애플 (10주) +18.3% (+$285,000)
NVDA — 엔비디아 (5주) +42.1% (+$620,000)
SPY — S&P500 ETF (20주) +11.2% (+$340,000)
005930.KS — 삼성전자 (50주) -4.2% (-$85,000)
총 포트폴리오 수익률 +19.4%

1단계 — 기본 포트폴리오 추적기

예제 1
보유 종목 수익률 자동 계산
매수가 입력 → 현재가 자동 조회 → 수익률 출력

보유 종목과 매수가를 딕셔너리로 입력해두면, yfinance로 현재가를 자동으로 가져와서 수익률을 계산해줘요.

import yfinance as yf
import pandas as pd

# 보유 종목 설정 (티커: [매수가, 수량])
portfolio = {
  "AAPL": [155.0, 10],
  "NVDA": [450.0, 5],
  "SPY": [430.0, 20],
  "005930.KS":[72000, 50],
}

results = []

for ticker, (buy_price, qty) in portfolio.items():
  try:
    data = yf.Ticker(ticker)
    current = data.fast_info['last_price']
    profit_rate = (current - buy_price) / buy_price * 100
    profit_amt = (current - buy_price) * qty
    results.append({
      "티커": ticker,
      "매수가": buy_price,
      "현재가": round(current, 2),
      "수익률(%)": round(profit_rate, 2),
      "손익": round(profit_amt, 2),
    })
  except:
    print(f"{ticker} 데이터 조회 실패")

df = pd.DataFrame(results)
print(df.to_string(index=False))

2단계 — 전체 포트폴리오 수익률 합산

예제 2
투자 원금 대비 전체 수익률 계산
종목별 + 전체 합산 수익률
# 예제 1에 이어서 실행

total_invest = sum(
  buy_price * qty for buy_price, qty in portfolio.values()
)
total_profit = df["손익"].sum()
total_rate = total_profit / total_invest * 100

print(f"\n총 투자 원금: {total_invest:,.0f}")
print(f"총 손익: {total_profit:,.0f}")
print(f"전체 수익률: {total_rate:.2f}%")

3단계 — 구글 시트에 자동 업데이트

수익률을 터미널에서만 보는 게 불편하다면 구글 시트에 자동으로 업데이트하게 만들 수 있어요. gspread 라이브러리를 쓰면 파이썬에서 구글 시트를 직접 읽고 쓸 수 있어요.

예제 3
구글 시트 자동 업데이트 세팅
gspread + 구글 서비스 계정 활용
# 설치
# pip install gspread google-auth

import gspread
from google.oauth2.service_account import Credentials
import yfinance as yf
from datetime import datetime

# 구글 서비스 계정 인증
scope = ["https://spreadsheets.google.com/feeds",
         "https://www.googleapis.com/auth/drive"]
creds = Credentials.from_service_account_file("service_account.json", scopes=scope)
client = gspread.authorize(creds)

# 구글 시트 열기
sheet = client.open("포트폴리오 추적기").sheet1

# 헤더 작성
sheet.update("A1", [["티커", "매수가", "현재가", "수익률(%)", "손익", "업데이트 시간"]])

# 데이터 업데이트
row = 2
for ticker, (buy_price, qty) in portfolio.items():
  data = yf.Ticker(ticker)
  current = data.fast_info['last_price']
  rate = (current - buy_price) / buy_price * 100
  profit = (current - buy_price) * qty
  now = datetime.now().strftime("%Y-%m-%d %H:%M")
  sheet.update(f"A{row}", [[ticker, buy_price, round(current,2),
                        round(rate,2), round(profit,2), now]])
  row += 1

print("구글 시트 업데이트 완료!")
💡 구글 서비스 계정 만들기 — Google Cloud Console → 새 프로젝트 → Google Sheets API 활성화 → 서비스 계정 생성 → JSON 키 다운로드 → 구글 시트에 서비스 계정 이메일 공유. 처음 한 번만 설정하면 이후로는 코드만 실행하면 돼요.

4단계 — 크론탭으로 매일 자동 실행

예제 4
장 마감 후 자동 업데이트 스케줄
크론탭 또는 작업 스케줄러 연계
# 파일명: portfolio_update.py 로 저장

# 크론탭 설정 (맥·리눅스) — 평일 오후 4시 자동 실행
# 0 16 * * 1-5 /path/to/venv/bin/python3 /path/to/portfolio_update.py

# 실행 결과를 텔레그램으로 받고 싶다면
import requests

def send_telegram(message):
  token = "YOUR_BOT_TOKEN"
  chat_id = "YOUR_CHAT_ID"
  url = f"https://api.telegram.org/bot{token}/sendMessage"
  requests.post(url, data={"chat_id": chat_id, "text": message})

# 수익률 요약 메시지 발송
msg = f"📊 포트폴리오 업데이트\n전체 수익률: {total_rate:.2f}%\n총 손익: {total_profit:,.0f}"
send_telegram(msg)

5단계 — 자동매매 봇 성과 기록

예제 5
일별 수익률 로그 자동 저장
봇 성과를 CSV로 누적 기록

자동매매 봇이 매매할 때마다 결과를 CSV에 기록해두면, 나중에 봇 성과를 분석하고 전략을 개선할 수 있어요.

import csv
import os
from datetime import datetime

def log_trade(ticker, action, price, qty, reason):
  """매매 내역 CSV 로그 저장"""
  log_file = "trade_log.csv"
  write_header = not os.path.exists(log_file)

  with open(log_file, "a", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    if write_header:
      writer.writerow(["시간", "티커", "매수/매도", "가격", "수량", "사유"])
    writer.writerow([
      datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
      ticker, action, price, qty, reason
    ])

# 사용 예시
log_trade("AAPL", "매수", 172.5, 5, "골든크로스 발생")
log_trade("NVDA", "매도", 890.0, 3, "목표가 도달")

전체 구조 정리

단계기능사용 라이브러리
현재가 조회yfinance로 실시간 가격 자동 수집yfinance
수익률 계산매수가 대비 수익률·손익 계산pandas
구글 시트 업데이트결과를 시트에 자동 기록gspread
텔레그램 알림장 마감 후 수익률 요약 발송requests
매매 로그봇 거래 내역 CSV 자동 기록csv, os
자동 스케줄크론탭으로 매일 자동 실행crontab
💡 이 구조를 맥 미니나 리눅스북에 올려두면 — 24시간 자동으로 포트폴리오가 업데이트되고, 장 마감 후 텔레그램으로 수익률 요약을 받을 수 있어요. 구글 시트에서 언제 어디서나 확인도 가능해요.
✅ 핵심 요약
  • yfinance로 현재가 자동 조회 → 매수가와 비교해 수익률 계산
  • 여러 계좌·종목을 하나의 딕셔너리로 관리 → 전체 수익률 합산
  • gspread로 구글 시트 자동 업데이트 → 언제 어디서나 확인
  • 텔레그램 봇 연동 → 장 마감 후 수익률 요약 자동 수신
  • 매매 로그 CSV 저장 → 봇 성과 분석 및 전략 개선 가능
  • 크론탭 + 맥 미니·리눅스북으로 완전 자동화 가능

포트폴리오 추적기, 한 번 만들어두면 매일 증권사 앱 여러 개를 열어볼 필요가 없어요. 구글 시트 하나에서 전체 현황이 보이는 게 생각보다 많이 편해요.

궁금한 점은 댓글로 남겨주세요!

예제 1번 코드 복붙하고 본인 보유 종목으로 바꿔보세요.

터미널에 수익률이 출력되는 순간, 나만의 포트폴리오 대시보드가 시작됩니다.

※ 이 글은 기술적인 정보 제공 목적으로 작성되었으며 투자 권유가 아닙니다. yfinance 데이터는 비공식 API 기반으로 실시간 정확성을 보장하지 않습니다. 실제 투자 판단 및 자동매매 시스템 구축 전 충분한 테스트와 검증이 필요합니다.