ํํธ ์ ๋ต์ผ๋ก ํฌ์ํ๊ธฐ: Python์ ํ์ฉํ ๋ฐฉ๋ฒ
ํํธ ํฌ์ ์ ๋ต์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ํต๊ณ ๋ชจ๋ธ์ ํตํด ํฌ์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ฌํ ์ ๋ต์ ์๊ณ ๋ฆฌ์ฆ ํธ๋ ์ด๋ฉ, ๋ฆฌ์คํฌ ๊ด๋ฆฌ, ํฌํธํด๋ฆฌ์ค ์ต์ ํ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋ฉ๋๋ค. ์ต๊ทผ ๋ช ๋ ๊ฐ, Python์ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๊ธ์ต ๋ถ์ผ์์ ์ธ๊ธฐ๋ฅผ ๋๊ณ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋์์ต๋๋ค. ๋ณธ ํฌ์คํ ์์๋ Python์ ํ์ฉํ์ฌ ํํธ ์ ๋ต์ ์ธ์ฐ๋ ๊ณผ์ ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
1. ํ์ํ ํจํค์ง ์ค์นํ๊ธฐ
Python์ผ๋ก ํํธ ์ ๋ต์ ์๋ฆฝํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํ์ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ๋ํ์ ์ธ ํจํค์ง๋ก๋ pandas
, numpy
, matplotlib
, scikit-learn
, yfinance
๋ฑ์ด ์์ต๋๋ค. ์๋์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ธ์.
pip install pandas numpy matplotlib scikit-learn yfinance
2. ๋ฐ์ดํฐ ์์ง
ํํธ ์ ๋ต์ ์์์ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ์
๋๋ค. Yahoo Finance์ ๊ฐ์ API๋ฅผ ํตํด ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์์งํ ์ ์์ต๋๋ค. yfinance
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
import yfinance as yf
# ์ ํ ์ฃผ์ ๋ฐ์ดํฐ ์์ง
data = yf.download('AAPL', start='2020-01-01', end='2023-10-01')
print(data.head())
3. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์์งํ ๋ฐ์ดํฐ๋ ์์ธก ๋ชจ๋ธ์ ์ ํฉํ๋๋ก ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ฒฐ์ธก๊ฐ์ ์ฒ๋ฆฌํ๊ณ , ํ์ํ ์ด๋ง ์ ํํ๋ ๋ฑ์ ์์ ์ด ํ์ํฉ๋๋ค. ์๋์ ์ฝ๋๋ ๊ฒฐ์ธก๊ฐ์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
# ๊ฒฐ์ธก๊ฐ ์ ๊ฑฐ
data.dropna(inplace=True)
4. ํน์ฑ ์์ฑ
ํํธ ์ ๋ต์์๋ ๋ค์ํ ํน์ฑ์ ์์ฑํ์ฌ ๋ชจ๋ธ์ ์์ธก๋ ฅ์ ๋์ด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ ํ๊ท , ์๋ ๊ฐ๋ ์ง์(RSI) ๋ฑ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
# ์ด๋ ํ๊ท ๊ณ์ฐ
data['SMA_20'] = data['Close'].rolling(window=20).mean()
5. ๋ชจ๋ธ ์ ํ ๋ฐ ํ๋ จ
ํน์ฑ์ ์์ฑํ ํ์๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ ํํ๊ณ ํ๋ จ์์ผ์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# ํน์ฑ๊ณผ ํ๊ฒ ์์ฑ
X = data[['SMA_20']]
y = (data['Close'].shift(-1) > data['Close']).astype(int)
# ๋ฐ์ดํฐ ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y[:-1], test_size=0.2, random_state=42)
# ๋ชจ๋ธ ํ๋ จ
model = LogisticRegression()
model.fit(X_train, y_train)
6. ์ฑ๋ฅ ํ๊ฐ
๋ชจ๋ธ์ ํ๋ จํ ํ์๋ ์ฑ๋ฅ์ ํ๊ฐํ์ฌ ์ค์ ํฌ์์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ํ๋์ ํผ๋ ํ๋ ฌ์ ํ์ฉํ ์ ์์ต๋๋ค.
from sklearn.metrics import accuracy_score, confusion_matrix
# ์์ธก
y_pred = model.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))
print('Confusion Matrix:\n', confusion_matrix(y_test, y_pred))
7. ์ ๋ต ์ ์ฉ ๋ฐ ๋ฐฑํ ์คํธ
๋ง์ง๋ง์ผ๋ก ํํธ ์ ๋ต์ ์ค์ ํฌ์์ ์ ์ฉํ๊ณ ๋ฐฑํ ์คํธ๋ฅผ ํตํด ์ฑ๊ณผ๋ฅผ ํ๊ฐํด์ผ ํฉ๋๋ค. ๋ฐฑํ ์คํธ๋ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์ ๋ต์ ์ฑ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๋๋ค.
# ์ ๋ต ์๋ฎฌ๋ ์ด์
data['Signal'] = model.predict(data[['SMA_20']])
data['Strategy_Return'] = data['Close'].pct_change() * data['Signal'].shift(1)
cumulative_return = (1 + data['Strategy_Return']).cumprod() - 1
print('Cumulative Return:', cumulative_return[-1])
๊ฒฐ๋ก
Python์ ํ์ฉํ์ฌ ํํธ ์ ๋ต์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ์์ ๊ณผ์ ์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์์์ด๋ฏ๋ก, ์ค์ ํฌ์์ ์ ์ฉํ ๊ฒฝ์ฐ ๋ ๋ง์ ๋ฐ์ดํฐ์ ๋ณต์กํ ๋ชจ๋ธ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ํ, ํํธ ํฌ์๋ ํญ์ ๋ฆฌ์คํฌ๋ฅผ ๋๋ฐํ๋ฏ๋ก ์ ์คํ ์ ๊ทผ์ด ํ์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์ ๋ต์ ์ธ์ฐ๋ ๊ณผ์ ์์ Python์ ํ์ฉํด ๋ณด์ธ์. ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ํ์ธํ ์ ์์ ๊ฒ์ ๋๋ค.