자동매매 봇을 돌리고 있는데 지금 수익이 얼마인지 한눈에 보이지 않아서 불편했어요.
증권사 앱에서 확인하면 되긴 하는데, 여러 계좌에 걸쳐있거나 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))
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}%")
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("구글 시트 업데이트 완료!")
# 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)
# 크론탭 설정 (맥·리눅스) — 평일 오후 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, "목표가 도달")
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 기반으로 실시간 정확성을 보장하지 않습니다. 실제 투자 판단 및 자동매매 시스템 구축 전 충분한 테스트와 검증이 필요합니다.
'똑똑한 재테크' 카테고리의 다른 글
| 파이썬으로 주식 데이터 가져오기 — yfinance 입문 [코딩 초보도 가능] (0) | 2026.05.12 |
|---|---|
| 환헤지 vs 환노출 ETF — (H) 붙은 ETF 뭐가 다른지 완전 정복 (0) | 2026.05.11 |
| 글로벌 ETF 추천 — 미국·선진국·신흥국 어디에 투자할까 (1) | 2026.05.10 |
| 연금저축펀드 vs IRP — 직장인이 꼭 알아야 할 차이점과 최적 조합법 (0) | 2026.05.09 |
| 달러 투자 방법 총정리 — 환전 수수료 아끼고 환차익 챙기는 법 (0) | 2026.05.08 |