파이썬(Python) 프로그래밍 언어를 이용하여 투자 관련 데이터를 수집, 가공, 표현, 분석하는 방법에 대한 연재를 시작합니다. 파이썬 클라우드(cloud) 서비스의 하나인 구글 코랩(Colab)을 기준으로 설명합니다.
연재의 목적과 읽기 전에 알아두면 좋은 점은 다음과 같습니다.
- 이 연재는 파이썬 언어 자체에 대한 연재가 아닙니다. 중간중간 이해에 필요한 부분을 조금씩 설명하지만, 언어 자체를 세세하게 해설하지는 않습니다. 언어 자체에 대한 설명은 다른 책이나 글을 참고하기 바랍니다. 참고: 아마 올해 중에 파이썬 입문서를 하나 쓸 듯합니다.
- 이 연재는 투자 데이터 분석에서 파이썬으로 어떻게 하면 어떤 결과를 얻을 수 있는지를 위주로 설명합니다. 왜 그렇게 분석하고 어떤 의미를 가지는지까지는 충분히 해설하지 않습니다. 해설을 덧붙이다 보면, 배보다 배꼽이 더 커지게 되기 때문입니다. 분석 방법의 배경과 해석 방법에 대해서는 제 책 <왜 위험한 주식에 투자하라는 걸까 - 장기 투자와 분산 투자에 대한 통계학적 시각>을 참고하기 바랍니다.
- 소개하는 분석을 구글 시트(Google Sheets)와 같은 스프레드시트로 하는 방법은 제 책 <구글 시트로 시작하는 투자 포트폴리오 분석 - 오렌지사과의 불친절한 워크북>에 자세히 설명되어 있습니다.
- 파이썬으로 체계적으로 데이터를 수집, 가공, 분석, 표현한다고 해서 더 나은 투자 결정 내리거나, 더 좋은 투자 성과를 얻을 수 있는 것은 아닐 수 있습니다.
- 이 연재의 상당 부분은 파이썬으로 그래프를 그리는 방법 위주로 설명합니다. 말하자면, 도수분포 그래프의 개념을 알고 있는 상황에서 학생들의 점수 데이터를 스프레드시트에 입력하여 그래프를 그리는 방법을 소개하는 셈입니다.
- 파이썬의 장점 중 하나는 스프레드시트에 비해 세세한 그래프 설정이 가능하다는 점입니다. 그래프를 그리는 전문 프로그램을 이미 사용하고 있다면 파이썬을 사용한다고 해서 더 편리하거나 유용해지지 않을 수 있습니다.
- 파이썬의 또 다른 장점 중 하나는 동일한 형식의 그래프를 목적에 맞춰 수정하여 재사용하기 쉽다는 점입니다. 불러오는 데이터 또는 데이터 처리 방식 또는 결과의 표현 방식만 바꾸면 되기 때문입니다.
- 이 연재는 무료 버전의 구글 코랩으로 파이썬을 사용한다고 가정하고 설명하지만, 노트북 또는 PC에 파이썬을 설치해서 쓸 수도 있습니다. 개인적으로는 설치해서 사용하기를 권합니다.
- 코랩은 클라우드 서비스이기에, 무료 버전의 경우 다시 접속하면 다른 신규 서버에 할당될 수 있습니다. 이런 경우 코드와 코드 실행 결과가 남아 있는 것처럼 보이지만, 스크린숏이라 보면 됩니다. 이전 결과에 대한 데이터가 모두 사자진 상태이기에 연이어서 작업할 수 없을 수 있습니다. 이런 경우 처음부터 다시 실행해서 데이터를 처리해야 합니다. 마찬가지로 서버에 업로드했던 데이터도 사라질 수 있습니다.
- 코랩으로 만든 코드와 결과가 묶인 노트는 공유가 가능합니다. 하지만 이 연재 진행에 사용한 노트는 공유하지 않습니다. 프로그래밍 언어는 직접 입력해서 실행하면서 우여곡절을 겪고 해결해 보지 않으면 실력이 잘 늘지 않기 때문입니다. 대개의 예제는 길지 않으니 직접 타이핑해서 결과를 살펴보고, 이리저리 수정해서 어떤 변화가 생기는 지도 관찰해 보길 권합니다.
- 연재를 읽으면서 코랩으로 연습하다 보면, 파이썬이 본인의 목적에 적합한 툴인지 판단이 가능할 것입니다. 그런 경우 노트북 또는 PC에 파이썬을 설치해서 사용하면 됩니다. 제 경우에는 아나콘다와 주피터 노트북을 설치해서 사용하고 있습니다.
주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.
구글 코랩(Colab)과 인공지능 코드 생성 기능
구글 코랩 사이트(https://colab.research.google.com/)에 접속하면 다음 왼쪽과 화면이 나옵니다. 화면 아래 "+ 새 노트"를 누르면 새 노트북을 열어 코드 작성을 시작할 수 있습니다.
오른쪽과 같이 새 노트가 나타납니다. 상단 Untitiled를 클릭해서 노트의 제목을 "주가 그래프"로 바꾸었습니다.
노트의 상단 맨 처음 셀(cell)에 "코딩을 시작하거나 AI로 코드로 생성하세요."라고 되어 있습니다. 실행이라는 글자에 밑줄이 그어져 있습니다. 이를 클릭하면 개인정보처리방침 화면이 나옵니다. "계속" 버튼을 눌러 진행하면 됩니다.
제가 예전에 쓸 때에는 없었는데, 인공지능 코드 생성 기능이 추가되었습니다. 다음 그림과 같이 "SPY 주가를 가져와서 그래프로 그리기"라고 입력하고 생성 버튼을 누면 해당 프롬프트(prompt)에 적절한 코드가 만들어집니다. 참고: 저도 코랩에서 코드 자동 생성 기능은 이 연재를 시작하면서 처음 써 봅니다.
코드 셀 왼쪽에 있는 동그란 플레이(play) 버튼을 누르면 코드가 실행되고 그 아래에 다음과 같이 그래프가 생성됩니다.
2023년 데이터로 SPY 주가 그래프가 만들어졌습니다. 상단 그래프 제목은 한글이 포함되어 있는데 "SPY □□"로 표시되어 있습니다. x, y 좌표축 이름도 역시 한글이 깨져있습니다.
일단 자동 생성된 코드를 살펴보겠습니다. 중간중간 코멘트(comments; 주석)도 붙어 있습니다.
# prompt: SPY 주가를 가져와서 그래프로 그리기
import yfinance as yf
import matplotlib.pyplot as plt
# SPY 주가 데이터 가져오기
ticker = "SPY"
data = yf.download(ticker, start="2023-01-01", end="2024-01-01")
# 종가 그래프 그리기
plt.figure(figsize=(12, 6))
plt.plot(data["Close"])
plt.title(f"{ticker} 주가")
plt.xlabel("날짜")
plt.ylabel("종가")
plt.grid(True)
plt.show()
전반적인 코드를 살펴봅니다.
import yfinance as yf
import는 모듈(module)을 불러오는 오는 명령입니다. 모듈은 라이브러리(library)라고 보면 됩니다. yfinance 모듈을 불러오되, 이름이 기니 yf로 줄여 쓰겠다는 의미입니다. yfinance는 야후 파이낸스(Yahoo Finance) 사이트를 포함하여 여러 데이터 소스(source)를 제공하는 사이트에서 투자 관련 데이터를 가져올 수 있는 모듈입니다.
import matplotlib.pyplot as plt
matplotlib는 그림을 그리는 모듈입니다. matplotlib의 하위 모듈인 pyplot 모듈을 가져와서 plt라는 이름으로 줄여 씁니다. 마침표(.)는 뭐뭐 아래라는 뜻입니다.
ticker = "SPY"
ticker 변수에 "SPY"라는 문자열을 할당합니다. 문자열은 큰 따옴표(") 사용해도 되고, 작은 따옴표(')를 쓸 수도 있습니다. 짝만 맞으면 됩니다.
data = yf.download(ticker, start="2023-01-01", end="2024-01-01")
yfinance 함수로 ticker(= "SPY")에 대해 2023년 1월 1일부터 2024년 1월 1일 하루 전까지 데이터를 가져와서 data 변수에 넣습니다.
그 아래는 plt 모듈로 그래프를 그리는 코드입니다. 순서대로 그림 크기를 설정하고, 종가를 기준으로 선그래프를 그리고, 제목을 달고, x축과 y축 이름을 붙입니다. 격자를 나타낸 다음 그림을 보여줍니다.
참 쉽습니다.
자동 생성된 코드 수정
이제 코드를 바꿔 보겠습니다. 금 실물 ETF인 GLD를 사용하고 최대로 긴 기간을 표시하기 위해 1990년 1월 1일부터 2030년 12월 31일로 바꾸어 봅니다. 한글은 글자가 제대로 나타나지 않으니 모두 영어로 바꾸었습니다.
# prompt: SPY 주가를 가져와서 그래프로 그리기
import yfinance as yf
import matplotlib.pyplot as plt
# SPY 주가 데이터 가져오기
ticker = "GLD"
data = yf.download(ticker, start="1990-01-01", end="2030-12-31")
# 종가 그래프 그리기
plt.figure(figsize=(12, 6))
plt.plot(data["Close"])
plt.title(f"{ticker} Price")
plt.xlabel("Date")
plt.ylabel("Close")
plt.grid(True)
plt.show()
실행하면 다음과 같은 그래프가 그려집니다. 만들어진 그래프에서 오른쪽 마우스 버튼을 누르면 그래프를 복사하거나 저장할 수 있습니다. 파이썬으로 만든 그래프는 고품질이기에 보고서나 책에 넣기 좋습니다. 제 글과 책 대부분의 그래프는 파이썬으로 생성한 것입니다.
복잡한 코드 생성
좀 더 복잡한 것도 가능합니다. 다음은 "SPY, TLT, GLD의 최근 10년 데이터로 효율적 투자선을 그려줘. 각 자산의 위치도 나타내줘"라고 지시해서 얻은 코드입니다. 코드가 다소 길어 중간에 생략했습니다.
# prompt: SPY, TLT, GLD의 최근 10년 데이터로 효율적 투자선을 그려줘. 각 자산의 위치도 나타내줘
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Download historical data for SPY, TLT, and GLD
tickers = ['SPY', 'TLT', 'GLD']
data = yf.download(tickers, period="10y")['Adj Close']
# Calculate daily returns
returns = data.pct_change().dropna()
# 중간 생략
plt.scatter(optimal_portfolio['Volatility'], optimal_portfolio['Return'], marker='*', s=200, color='r', label='Optimal Portfolio')
plt.legend()
plt.show()
# Print the optimal portfolio weights
print(f"Optimal Portfolio Weights:\n{pd.Series(portfolio_weights[portfolio['Sharpe'].idxmax()], index=tickers)}")
신기하게도 잘 만들어 줍니다. 그런데 실행해 보면 에러가 납니다. 다음과 같이 10번째 줄의 Adj Close를 Close로 바꾸면 됩니다.
data = yf.download(tickers, period="10y")['Close']
코드를 수정해서 실행하면, 멋진 평균-분산 그래프를 그려줍니다. 신기합니다.
그래프 아래에는 샤프 비율(Sharpe ratio)이 최대인 포트폴리오의 자산 비중도 함께 표시하고 있습니다. 그래프에는 최적 포트폴리오(Optimal Portfolio)라는 이름으로 별표시 위치에 해당됩니다.
Optimal Portfolio Weights:
SPY 0.558411
TLT 0.440388
GLD 0.001201
SPY에 56%, TLT에 44%를 투자하는 것이 샤프 비율이 가장 높았다고 설명하고 있습니다.
자동 생성된 코드의 오류
얼핏 생각하기에 이 정도의 인공지능 기능이면, 본인이 파이썬을 잘 다루지 못해도 혼자서 데이터를 처리해서 분석할 수 있겠다고 생각할 수 있습니다. 하지만 현실은 그렇게 녹록지 않습니다. 앞서 Close 대신 Adj Close가 나온 오류는 약과입니다.
한눈에 봐도 평균-분산 그래프와 표의 최적 포트폴리오가 맞지 않습니다. 자동 생성된 코드를 사용하면서 이를 눈치채지 못하면, 엉뚱한 분석 결과를 투자에 참고할 수 있습니다.
평균-분산 그래프에서 두 자산을 반반씩 혼합하면 대략 평균 수익률이 나옵니다. 별표시가 된 최적 포트폴리오는 SPY와 TLT에 절반 정도씩 투자한 경우라고 되어 있습니다. 그렇다면 별표시는 y축(연평균 수익률)에서 볼 때 0.06(6%)에서 0.08(8%) 사이에 위치해야 합니다. 그런데 0.11(11%)에 위치하고 있습니다. 무엇인가 잘못 표시된 것입니다.
yf.downlaod()로 받아온 데이터를 살펴보면, 이유는 알 수 없지만 종목 순서가 주어진 티커 순서와 달랐기 때문입니다. SPY, TLT, GLD 순으로 데이터를 가져오라고 했는데, 데이터에는 GLD, SPY, TLT로 기입되어 있습니다. 참고: 알파벳 순서인 듯합니다.
순서를 다시 맞추기 위해 다음 코드를 yf.download() 아래에 넣고 실행해 봅니다.
data = data[tickers]
동일한 그래프가 나오지만, 그래프 아래 최적 포트폴리오의 투자 비중은 다르게 표시됩니다.
Optimal Portfolio Weights:
SPY 0.419273
TLT 0.003382
GLD 0.577345
SPY에 42%, GLD에 58% 투자하는 것이 샤프 비율이 가장 높았다고 출력됩니다. 최적 포트폴리오의 수익률 11%는 대략 SPY(대략 12%)와 GLD(대략 10%) 사이에 위치하고 있으니, 이 결과가 맞다고 볼 수 있습니다
연 1% 평균 수익률을 낮추는 대신, 변동성을 1 / 3이나 줄일 수 있는 이 포트폴리오는 투자자에 따라서는 참고할 가치가 있습니다.
정리하며
파이썬으로 투자 데이터 분석 방법 연재를 시작했습니다. 첫 연재로 구글 코랩을 소개하였습니다. 구글 코랩은 원격 접속으로 무료 사용할 수 있는 클라우드 서비스입니다. 인터넷 연결만 되어있으면, 다양한 장비로 접속할 수 있어 편리합니다. 파이썬 이외에도 데이터 처리에 많이 사용되는 R 언어도 지원합니다. 최근에는 Julia라는 언어도 지원되고 있습니다.
최근 코랩에 추가된 자동 코드 생성 기능을 이용하여 코랩을 어떻게 사용하는지 간단하게 알아보았습니다. 그리 길지 않은 코드로도 근사한 결과물이 나옵니다. 특히 자동 생성된 코드는 원하는 분석을 위해 코드를 어떻게 작성하면 될지 대략적인 감을 잡기 좋습니다.
분야에 따라 다르겠지만, 코드 자동 생성 기능은 아직까지는 충분한 수준으로 정확하지는 않은 듯합니다. 믿고 사용하다고 보면 이 글에서 본 사례와 같이, 자칫하면 잘못된 데이터 처리 결과를 투자에 참고하게 될 수도 있습니다.
이후 연재에서는 자동 코드 생성 기능을 사용하지 않을 예정입니다. 설명하고자 하는 코드가 길지 않고 복잡하지 않기도 하지만, 기본적인 사항을 확실하게 이해해야 자동으로 만든 코드가 정확한지 판단할 수 있기 때문입니다. 또한 이 연재에서는 주로 다루게 될 세세한 그래프 설정은 자동 코드 생성에 적합하지 않기 때문입니다. 이 글에서 든 예제의 경우에도 효율적 투자선(efficient frontier)이 그려지지 않았습니다.
참고: 연재와 관련한 질문은 댓글로 남겨주시기 바랍니다. 답변을 드리거나 이후 연재에서 다룰 수 있도록 노력하겠습니다.
참고 서적: 왜 위험한 주식에 투자하라는 걸까? - 장기 투자와 분산 투자에 대한 통계학적 시각
이어지는 글: [파이썬 분석 2] PR(배당 미고려)과 TR(배당 재투자) 주가 흐름을 그래프로 그려 보자 (FinanceDataReader 모듈 사용)
연재 목록: 자산 배분 분석 방법 책 소개, 연재글 및 사례 모음 [목록]
함께 읽으면 좋은 글 (최신 글)
- [중급 14] 레버리지 ETF의 성과는 왜 좋았을까? (민감한 레버리지님과 기준 금리)
- [중급 13] 레버리지 배율은 무한정 높여도 될까? (복리 수익률을 평균-분산 그래프에 나타내 보자)
- [중급 12] 레버리지는 얼마나 위험할까? (레버리지의 위험을 평균-분산 그래프에 좀 더 현실적으로 표현해 보자)
- [중급 11] 투자자는 왜 분석 방법을 공부해야 할까? (평균-분산 그래프를 사용하는 이유)
- [중급 10] 분산 투자에서 체계적 위험은 무엇을 의미할까? (무서운 수식과 나신입씨의 경품 뽑기)
함께 읽으면 좋은 글 (인기 글)
- 챗GPT(ChatGPT)로 사진을 지브리 만화 스타일로 변환하기
- 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이 + ImageFX)
- 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이)
- 구글 제미나이(Gemini)를 이용한 그림 생성하기 (vs. 마이크로소프트 이미지 크리에이터의 이미지 생성 AI)
- 챗GPT(ChatGPT)로 사진을 지브리 vs 이누야샤 만화 스타일로 변환한 사례 비교 (인물 사진 #3)
'주식투자' 카테고리의 다른 글
[파이썬 분석 5] 환율을 적용해 보고 어떤 변화가 발생했는지 살펴보자 (0) | 2025.04.13 |
---|---|
[파이썬 분석 4] 수익률의 기초 통계량을 추출해 보고 확률 분포를 그려보자 (0) | 2025.04.12 |
[파이썬 분석 3] 누적 수익률로 그래프로 그려 보자 (로그 스케일에 수익률을 표현하는 방법) (0) | 2025.04.12 |
[파이썬 분석 2] PR(배당 미고려)과 TR(배당 재투자) 주가 흐름을 그래프로 그려 보자 (FinanceDataReader 모듈 사용) (0) | 2025.04.12 |
[중급 14] 레버리지 ETF의 성과는 왜 좋았을까? (민감한 레버리지님과 기준 금리) (0) | 2025.04.11 |
[중급 13] 레버리지 배율은 무한정 높여도 될까? (복리 수익률을 평균-분산 그래프에 나타내 보자) (0) | 2025.04.10 |
[중급 12] 레버리지는 얼마나 위험할까? (레버리지의 위험을 평균-분산 그래프에 좀 더 현실적으로 표현해 보자) (0) | 2025.04.09 |
[중급 11] 투자자는 왜 분석 방법을 공부해야 할까? (평균-분산 그래프를 사용하는 이유) (0) | 2025.04.09 |