본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
금융 데이터 분석

금융 분석과 주식 시장 예측을 위한 Python

by 아참형인간 2026. 6. 13.

시장 인사이트를 얻기 위해 Python을 활용하는 실전 여정.

 

1. 소개: 왜 금융 분석에 Python을 사용하게 되었는가

처음 금융 분석을 공부하기 시작했을 때, 대용량 데이터를 처리하고, 통계 모델링을 수행하며, 예측을 위한 머신러닝까지 지원할 수 있는 도구가 필요했습니다. Python은 pandas, NumPy, scikit-learn, matplotlib, yfinance, statsmodels와 같은 풍부한 라이브러리 생태계를 갖추고 있어 자연스럽게 선택하게 되었습니다. 시간이 지나면서 금융 데이터를 분석하고 주가를 예측할 수 있는 엔드투엔드 프로젝트들을 직접 구축하게 되었습니다.

print("Starting my journey into Python for financial analysis...")

2. yfinance를 활용한 주식 시장 데이터 수집

첫 번째 단계는 실제 시장 데이터를 가져오는 것이었습니다. 저는 Yahoo Finance에서 직접 주가 이력을 가져오기 위해 yfinance를 사용했습니다.

import yfinance as yf

# 애플 주식 데이터 가져오기
ticker = yf.Ticker("AAPL")
data = ticker.history(period="5y")

print(data.head())

이를 통해 OHLCV(Open, High, Low, Close, Volume) 데이터를 확보할 수 있었고, 이는 이후 모든 분석의 기반이 되었습니다.

3. 금융 데이터 정제 및 전처리

원시 시장 데이터에는 종종 결측치가 포함되어 있습니다. 저는 pandas를 사용하여 데이터를 정리하고 분석에 적합한 형태로 가공했습니다.

import pandas as pd

# 결측치 제거
data = data.dropna()

# 새로운 특성 생성: 일간 수익률
data["Daily_Return"] = data["Close"].pct_change()

# 이동평균선
data["MA_50"] = data["Close"].rolling(50).mean()
data["MA_200"] = data["Close"].rolling(200).mean()

print(data.tail())

이러한 특성들을 생성한 후에는 시장 추세와 변동성을 분석할 수 있게 되었습니다.

4. Matplotlib을 활용한 주가 추세 시각화

가격 움직임의 패턴을 파악하기 위해 시각화는 매우 중요한 역할을 했습니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(12,6))
plt.plot(data["Close"], label="Close Price")
plt.plot(data["MA_50"], label="50-Day Moving Average")
plt.plot(data["MA_200"], label="200-Day Moving Average")
plt.legend()
plt.title("AAPL Stock Price with Moving Averages")
plt.show()

이를 통해 이동평균선 교차 구간을 쉽게 확인할 수 있었으며, 이는 많은 트레이더들이 매수·매도 신호로 활용하는 지표입니다.

5. Python을 활용한 통계 분석

다음 단계에서는 기술통계와 상관관계 분석을 수행했습니다.

# 수익률과 거래량 간 상관관계
correlation = data["Daily_Return"].corr(data["Volume"])
print("Correlation between returns and volume:", correlation)

# 이동 변동성
data["Volatility"] = data["Daily_Return"].rolling(30).std()

print(data[["Daily_Return", "Volatility"]].tail())

이러한 지표들은 시장 행동과 위험 요인을 이해하는 데 도움이 되었습니다.

6. 예측을 위한 머신러닝 모델 구축

저는 주가 움직임을 예측하기 위해 scikit-learn을 활용한 실험도 진행했습니다.

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import numpy as np

# 다음 날 가격 상승 여부를 타깃으로 생성
data["Target"] = (data["Close"].shift(-1) > data["Close"]).astype(int)

features = ["Daily_Return", "MA_50", "MA_200", "Volatility"]
model_data = data[features + ["Target"]].dropna()

X = model_data[features]
y = model_data["Target"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, shuffle=False
)

model = RandomForestClassifier(
    n_estimators=100,
    random_state=42
)
model.fit(X_train, y_train)

accuracy = model.score(X_test, y_test)
print("Prediction Accuracy:", accuracy)

이 모델을 통해 다음 거래일의 주가 상승 여부를 예측할 수 있는지 검증해 보았습니다.

7. ARIMA를 활용한 시계열 예측

또한 statsmodels의 ARIMA 모델을 활용하여 시계열 예측도 수행했습니다.

from statsmodels.tsa.arima.model import ARIMA

# 종가만 사용
series = data["Close"]

# ARIMA 모델 학습
model = ARIMA(series, order=(5,1,0))
model_fit = model.fit()

# 향후 10일 예측
forecast = model_fit.forecast(steps=10)
print("Forecasted Prices:", forecast)

이 접근 방식은 추세 분석에는 효과적이었지만, 갑작스러운 시장 충격을 예측하는 데에는 한계가 있었습니다.

8. LSTM을 활용한 딥러닝

마지막으로 TensorFlow/Keras를 활용하여 순차 데이터 분석에 적합한 LSTM 신경망을 실험했습니다.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(
    data["Close"].values.reshape(-1,1)
)

X_train, y_train = [], []

for i in range(60, len(scaled_data)):
    X_train.append(scaled_data[i-60:i, 0])
    y_train.append(scaled_data[i, 0])

X_train, y_train = np.array(X_train), np.array(y_train)

X_train = np.reshape(
    X_train,
    (X_train.shape[0], X_train.shape[1], 1)
)

model = Sequential()
model.add(
    LSTM(
        units=50,
        return_sequences=True,
        input_shape=(X_train.shape[1],1)
    )
)
model.add(LSTM(units=50))
model.add(Dense(1))

model.compile(
    optimizer="adam",
    loss="mean_squared_error"
)

model.fit(
    X_train,
    y_train,
    epochs=10,
    batch_size=32
)

LSTM은 주가 데이터의 장기 의존성을 학습할 수 있어 보다 정확한 추세 예측 결과를 제공했습니다.

9. 위험 분석 및 포트폴리오 최적화

저는 포트폴리오 관리 측면에서 Markowitz 평균-분산 최적화 접근법도 살펴보았습니다.

import numpy as np

returns = data["Daily_Return"].dropna()

mean_return = returns.mean() * 252
volatility = returns.std() * np.sqrt(252)

sharpe_ratio = mean_return / volatility

print("Expected Annual Return:", mean_return)
print("Annual Volatility:", volatility)
print("Sharpe Ratio:", sharpe_ratio)

이를 통해 위험과 수익률 간의 균형을 평가하는 데 필요한 인사이트를 얻을 수 있었습니다.

10. 결론: Python 금융 분석을 통해 얻은 교훈

이 과정을 통해 다음과 같은 점을 깨달았습니다.

Python은 금융 데이터를 수집하고, 정제하며, 분석하는 과정을 매우 쉽게 만들어 줍니다.

머신러닝과 딥러닝 모델은 예측 능력을 향상시키는 강력한 도구가 될 수 있습니다.

위험 관리와 포트폴리오 최적화는 예측 자체만큼 중요합니다.

어떤 모델도 시장을 완벽하게 예측할 수는 없지만, Python은 보다 근거 있는 투자 전략을 구축하는 데 큰 도움을 줍니다.

 

<출처: https://medium.com/pythoneers/python-for-financial-analysis-and-stock-market-predictions-5b420335487a>

댓글