Intro.
트럼프에 일론 머스크라..
미친 조합이다.
여러모로 미친거지 뭐.
미쳤어 그냥.. 미치게 될거야.
예측 더 어려워지겠어
지난번에 S&P500주가를 모아봤다.
https://simbbo-blog.tistory.com/239
[Python_stock] S&P 500 주가 데이터 수집
Intro. 드디어 이제야 정상적인 글을 쓴다.역시 스터디 해야 공부하지.혼자는 안대안대... 이번 주제는 주식이니 만큼 최대한 힘내보자.자, 다시 돌아와라... 블로그의 본질 S&P 500 주가 데이터 수
simbbo-blog.tistory.com
주식.
투자를 해봐야지?
그럼 투자하려면 뭐해야해?
투자지표보고 공부도하고 주식 어떻게 돌아가는지 시장도 파악하고 시황 다 공부해야지.
그치만 우리 데이터쟁이들 뭐해?
지표 뽑고 분석하고, 예측 해볼 수 있잖아.
해보자 이거다요.
파이썬으로 해볼수있는 주가 예측 방법 3가지 정도를 설명해보려고 한다.
당연하게도 뭐가 좋고 뭐가 맞는지는 답할 수 없다.
그럼 왜 하느냐?
재밌잖아.
1. 기술적 분석 (Technical Analysis)
정의:
기술적 분석은 과거의 주가 데이터(종가, 거래량 등)와 이를 기반으로 계산된 기술적 지표를 사용하여 미래의 가격 변동을 예측하는 방법이다.
개인적으로 가장 좋아하고? 선호하는 방식이기도 하고,
차트 패턴과 지표를 활용하여 매수/매도 신호를 포착하는 방법이라 매력적이다.
수십, 수백개의 기술적 지표들이 있지만, 그나마 좀 간단하고 익숙한 친구들 몇개 뽑아보자.
대표적인 기법:
- 이동평균선 (Moving Averages):
- 단기 이동평균과 장기 이동평균의 교차를 통해 매수/매도 신호를 생성
- 예: Golden Cross (단기 > 장기) → 매수 신호, Death Cross (단기 < 장기) → 매도 신호
- RSI (Relative Strength Index):
- 주가가 과매수 상태인지(70 이상) 또는 과매도 상태인지(30 이하)를 판단
- MACD (Moving Average Convergence Divergence):
- EMA(지수 이동평균)의 차이를 활용해 추세 강도를 파악
이런 기법들이 당연히 생소할 수 있지만, 각자의 주식창을 잘 봐보자. 여러 수십개의 기법이 모두 벌써 반영되어있고 차트를 그릴수 있다.
이런식으로 기술적인 지표를 차트와 함께 그려 매수/매도 타이밍을 잡는방법이다.
2. 기계 학습 (Machine Learning)
정의:
과거 데이터를 학습하여 미래의 주가를 예측하는 방법이고
지도 학습 및 딥러닝 모델을 사용하며, 복잡한 패턴을 찾아낼수도 있따.
데이터쟁이들이 모두 알고 좋아하고 싫어하고 사랑하고 증오하는 ML이다.
주요 기법:
- 지도 학습 (Supervised Learning):
- 특징(이동평균선, 거래량 등)을 입력으로 사용하여 회귀 및 분류 모델로 미래 주가를 예측.
- 모델 예: Random Forest, XGBoost.
- 딥러닝 (Deep Learning):
- LSTM과 같은 순환 신경망(RNN)을 사용하여 시계열 데이터를 학습.
- Random Forest를 이용한 주가 예측
- Random Forest는 다양한 특징(feature)을 기반으로 주가를 예측하는 데 효과적인 모델
- 과거의 데이터를 학습하여 미래의 특정 날짜의 종가를 예측하는 회귀(regression) 문제로 접근 가능
뭐 더 어렵고 복잡한 친구들 많지만,, 하나만 예로 들자면
예제 설명:
- 데이터 준비:
- 과거의 주가 데이터를 가져와 이동평균선(SMA), 거래량(Volume), 변동성(Volatility) 등을 생성하여 특징으로 사용.
- 예측하려는 종가는 목표 변수(target)로 설정.
- 모델 학습:
- Random Forest 회귀 모델을 사용해 데이터 학습.
- 미래 값 예측:
- 학습된 모델로 특정 날짜의 종가를 예측.
이런 느낌이겠다..
간략하게 좀 파이썬 코드 예시도 함께 봐볼까?
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 데이터 로드 및 전처리
df = pd.read_csv("stock_data.csv", parse_dates=["Date"], index_col="Date")
df['SMA_10'] = df['Close'].rolling(window=10).mean()
df['SMA_50'] = df['Close'].rolling(window=50).mean()
df['Volatility'] = df['Close'].rolling(window=10).std()
df.dropna(inplace=True)
# 특징(feature) 및 목표(target) 정의
features = df[['SMA_10', 'SMA_50', 'Volatility', 'Volume']]
target = df['Close']
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# 모델 학습
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 예측
predictions = model.predict(X_test)
# 성능 평가
mse = mean_squared_error(y_test, predictions)
print(f"Mean Squared Error: {mse}")
# 시각화
import matplotlib.pyplot as plt
plt.plot(y_test.values, label='Actual Prices')
plt.plot(predictions, label='Predicted Prices', alpha=0.7)
plt.legend()
plt.title('Actual vs Predicted Stock Prices')
plt.show()
3. 시계열 분석 (Time Series Analysis)
정의:
시계열 분석은 데이터의 시간 의존성을 기반으로 미래 값을 예측하고, 계절성, 추세, 노이즈를 분리하여 분석하는 방법이다.
통계 조금 해본 친구들은 싫어하는 시계열분석.
예시: ARIMA 모델을 이용한 주가 예측
ARIMA(Autoregressive Integrated Moving Average)는 시계열 데이터의 자기상관성을 이용해 미래를 예측하는 통계적 방법이고, 주로 주가 데이터의 추세(Trend)와 계절성(Seasonality)을 기반으로 예측한다.
예제 설명:
- 데이터 준비:
- 주가 데이터에서 날짜를 기준으로 정렬하고, 데이터를 차분(differencing)하여 정상성(stationarity)을 확보.
- 모델 학습:
- ARIMA 모델의 파라미터 (p, d, q)를 설정.
- p: 자기회귀(AR) 항수
- d: 차분 횟수
- q: 이동평균(MA) 항수
- ARIMA 모델의 파라미터 (p, d, q)를 설정.
- 미래 값 예측:
- 학습된 모델을 사용해 미래 특정 기간의 주가를 예측.
예시코드도 대충 해보면..
from statsmodels.tsa.arima.model import ARIMA
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 로드
df = pd.read_csv("stock_data.csv", parse_dates=["Date"], index_col="Date")
df = df['Close']
# 데이터 차분으로 정상성 확보
df_diff = df.diff().dropna()
# ARIMA 모델 생성 및 학습
model = ARIMA(df_diff, order=(5, 1, 0)) # (p, d, q) 설정
model_fit = model.fit()
# 미래 값 예측
forecast = model_fit.forecast(steps=30) # 30일 예측
# 결과 시각화
plt.figure(figsize=(12, 6))
plt.plot(df, label='Actual Data')
plt.plot(pd.date_range(df.index[-1], periods=30, freq='B'), forecast, label='Forecast', color='red')
plt.legend()
plt.title('ARIMA Stock Price Prediction')
plt.show()
어우 나도 오랜만에 보려니까 머리가아파..
SUMMARY
그럼 세가지 방식을 좀 간략히 정리 비교해볼까?
기술적 분석, 시계열 분석, 머신러닝 비교
기준 | 기술적 분석 (Technical Analysis) | 기계 학습 (Machine Learning) | 시계열 분석 (Time Series Analysis) |
데이터 활용 | 과거의 주가와 거래량 데이터를 기반으로 기술적 지표 생성 | 과거 데이터와 외부 요인(특징)을 활용해 학습 | 순수하게 과거 시계열 데이터만 사용 |
특징 (Features) | 이동평균선, RSI, MACD 등 다양한 지표 | 다양한 입력 데이터(특징)를 모델에 추가 가능 | 시계열 데이터 자체가 모델 입력 |
복잡성 | 상대적으로 단순한 계산과 시각화 | 데이터 준비와 모델 설계, 하이퍼파라미터 튜닝이 필요 | 정상성 확보와 적절한 파라미터 설정이 필요 |
추세와 패턴 | 과거 패턴에 기반한 매수/매도 신호 생성 | 과거와 현재 데이터를 학습해 복잡한 비선형 관계를 모델링 | 시계열 데이터의 추세와 계절성을 기반으로 미래를 예측 |
설명 가능성 | 매수/매도 신호가 직관적이고 명확 | 복잡한 알고리즘으로 인해 결과 해석이 어려움 | 추세와 패턴의 명확한 설명 가능 |
적용 범위 | 단기 트레이딩 및 매수/매도 타이밍 탐색 | 중장기 예측, 복잡한 데이터셋 | 단기 또는 계절성이 뚜렷한 데이터를 다룰 때 적합 |
확장성 | 새로운 지표 추가 가능 | 외부 데이터와 결합 가능, 다양한 알고리즘 사용 가능 | 시계열 데이터에만 제한적으로 적용 가능 |
기술적 분석, 시계열 분석, 머신러닝 요약
방식 | 장점 | 단점 | 적합한 사용 사례 |
기술적 분석 | 간단하고 직관적, 구현 용이 | 외부 요인 반영 어려움, 장기 예측에 부적합 | 단기 트레이딩, 매수/매도 신호 탐색 |
기계 학습 | 복잡한 데이터 패턴 학습 가능, 외부 요인 통합 가능 | 데이터 준비 복잡, 모델 해석 어려움 | 중장기 예측, 복잡한 데이터셋 분석 |
시계열 분석 | 계절성과 추세 설명 가능, 단기 예측에 강점 | 외부 요인 반영 어려움, 데이터 전처리 필요 | 단기 예측, 계절성이 뚜렷한 데이터 분석 |
주식인생 5년밖에 되지 않았지만, 살면서 시계열로만 주가 예측한다는건 들어보지 못했다.
기술적인 지표를 최대한 활용하는 방식과 ML를 적절히 믹스 시켜서 예측하고 매수/매도타이밍을 잡거나
미래 주가를 예측을 하고, 여기에 추가로 시계열 분석을 약간 적절히 짬뽕을 시키면 모를까...
예를들어보면...
기술적 분석 + 기계 학습
기술적 지표를 계산한 후 이를 기계 학습 모델의 입력 변수로 사용하게끔해보자
- 기술적 분석 단계에서 이동평균선(SMA), RSI, MACD, 볼린저 밴드 등 지표 생성하고
- 생성된 기술적 지표를 기계 학습 모델의 입력 변수로 사용.
- 기계 학습 알고리즘(e.g., Random Forest, XGBoost)을 통해 주가 상승/하락 여부 또는 종가를 예측 할 수 도 있겠다.. (괜찮은데?)
기술적 분석 + 시계열 분석 + 기계 학습
모든 방법을 결합하여 단기와 장기 패턴을 함께 분석할수도 있겠지,
- 기술적 분석:
- 이동평균선, MACD 등 기술적 지표 생성.
- 시계열 분석:
- ARIMA 또는 Prophet으로 기본 추세와 계절성을 모델링.
- 기계 학습:
- 기술적 지표와 시계열 예측 결과를 기계 학습 모델의 입력 변수로 사용해 더 정교한 예측.
이런식으로 세가지 방식을 모두활용하는 방식도 만들어 볼 수 있겠다.
그럼 이런 하이브리드 방식의 장단점도 있을건데...
장점 | 단점 |
기술적 분석의 단기 패턴, 시계열 분석의 계절성, 기계 학습의 비선형성 결합 | 복잡한 데이터 전처리와 모델 설계 필요 |
다양한 데이터를 활용해 높은 예측 정확도 달성 가능 | 계산 비용과 실행 시간 증가 |
새로운 데이터나 요인 추가 시 유연하게 확장 가능 | 과적합(overfitting) 위험 |
이정도로 생각해보면 되지 않을까?
옛날이 그립다.. 회사 힘들어도 이런게 힘이되고 도움이 되고 했는데, 주식과 이런거에 미쳐살떄가 있었는데,,
GS님 잘 지내시죠.. 담주에 봐요 ㅠ
'Data Analysis > Python_Stock' 카테고리의 다른 글
[Python_stock] 트럼프 재선과 S&P500: 대통령 임기와 섹터별 수익률 분석(2) (2) | 2024.12.21 |
---|---|
[Python_stock] 트럼프 재선과 S&P500: 대통령 임기와 섹터별 수익률 분석(1) (3) | 2024.12.13 |
[Python_stock] S&P 500 주가 데이터 수집 (2) | 2024.11.23 |
[Python_stock] 스토캐스틱 지표 만들기 (Stochastic) + Plotly 반응형 그래프 티스토리 블로그에 올리기 (0) | 2022.05.15 |
[Python_stock] 스토캐스틱 지표 만들기 (Stochastic) (0) | 2022.05.06 |