ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ป ํฉํฐ ๋ฐฑํ ์คํธ ์๋ํ – ํ์ด์ฌ์ผ๋ก ํฉํฐ๋ณ ์ฑ๊ณผ๋ฅผ ์๊ฐํํ๊ธฐ
octo54 2025. 10. 15. 15:15๐ป ํฉํฐ ๋ฐฑํ ์คํธ ์๋ํ – ํ์ด์ฌ์ผ๋ก ํฉํฐ๋ณ ์ฑ๊ณผ๋ฅผ ์๊ฐํํ๊ธฐ
์ด์ ์ด๋ก ์ ์ถฉ๋ถํ ์ตํ์ต๋๋ค.
์ด์ ๋ถํฐ๋ ํํธ ํฌ์์ ๋ณธ์ง์ธ **“๋ฐ์ดํฐ๋ก ๊ฒ์ฆํ๋ ํฌ์”**๋ก ๋ค์ด๊ฐ๋๋ค.
์ค๋์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๊ฐ์น, ๋ชจ๋ฉํ
, ํ๋ฆฌํฐ, ์ ๋ณ๋์ฑ, ๊ท๋ชจ ํฉํฐ๋ฅผ
ํ์ด์ฌ์ผ๋ก ์๋ ๋ฐฑํ
์คํธํ๊ณ , ์๊ฐํํ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ธ์ “์ง์ ์คํ ๊ฐ๋ฅํ ์ฝ๋”๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ,
์ด๋ณด์๋ ๊ทธ๋๋ก ๋ฐ๋ผ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ก ์๊ฐํ๋ฉ๋๋ค.
1. ์ค๋น๋ฌผ
โ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install yfinance pandas numpy matplotlib
โ ํ ์คํธ ์ข ๋ชฉ ์ ์ (์: ์ผ์ฑ์ ์, SKํ์ด๋์ค, ๋ค์ด๋ฒ, ์ ํธ๋ฆฌ์จ)
tickers = ["005930.KS", "000660.KS", "035420.KS", "068270.KQ"]
2. ๋ฐ์ดํฐ ์์ง
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1๋
์น ์ฃผ๊ฐ ๋ฐ์ดํฐ ์์ง
data = {}
for t in tickers:
df = yf.download(t, period="1y")
df["returns"] = df["Close"].pct_change()
data[t] = df
๐ ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์ข ๋ชฉ๋ณ ์ผ๊ฐ ์์ต๋ฅ ์ด ์๋์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
3. ํฉํฐ ๊ณ์ฐ
(1) ๋ชจ๋ฉํ : ์ต๊ทผ 6๊ฐ์ ์์น๋ฅ
(2) ๋ณ๋์ฑ: ์ต๊ทผ 60์ผ ํ์คํธ์ฐจ
(3) ํ๋ฆฌํฐ: ROE(์์๊ฐ ์๋ ์ ๋ ฅ)
factors = []
for t, df in data.items():
momentum = (df["Close"].iloc[-1] / df["Close"].iloc[-120]) - 1
volatility = df["returns"].rolling(60).std().mean()
roe = np.random.uniform(0.05, 0.2) # ์์์ฉ (์ค์ ๋ ์ฌ๋ฌด ๋ฐ์ดํฐ ์ฐ๋)
score = (momentum * 0.5) + (roe * 0.3) - (volatility * 0.2)
factors.append((t, momentum, volatility, roe, score))
factor_df = pd.DataFrame(factors, columns=["Ticker", "Momentum", "Volatility", "ROE", "Score"])
factor_df.sort_values("Score", ascending=False, inplace=True)
print(factor_df)
๐ Score๊ฐ ๋์์๋ก ‘์์น ๋ชจ๋ฉํ ๊ฐ + ์์ ์ฑ + ์์ต์ฑ’์ด ๋์ ์ข ๋ชฉ์ ๋๋ค.
4. ๋ฐฑํ ์คํธ & ๋์ ์์ต๋ฅ ๊ณ์ฐ
top_ticker = factor_df.iloc[0]["Ticker"]
df = data[top_ticker]
df["cum_return"] = (1 + df["returns"]).cumprod()
plt.figure(figsize=(10,5))
plt.plot(df.index, df["cum_return"], label=f"{top_ticker} ๋์ ์์ต๋ฅ ", linewidth=2)
plt.title("ํฉํฐ ๊ธฐ๋ฐ ๋์ ์์ต๋ฅ ์๊ฐํ")
plt.legend()
plt.show()
๐ ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ํฉํฐ ์ ์ 1์ ์ข ๋ชฉ์ ๋์ ์์ต๋ฅ ๊ทธ๋ํ๊ฐ ์๋์ผ๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
5. ํฉํฐ ๋น๊ต ์๊ฐํ
plt.figure(figsize=(10,6))
for t, df in data.items():
df["cum_return"] = (1 + df["returns"]).cumprod()
plt.plot(df.index, df["cum_return"], label=t)
plt.title("ํฉํฐ๋ณ ์ข
๋ชฉ ๋์ ์์ต๋ฅ ๋น๊ต")
plt.legend()
plt.show()
๐ ์ด ์ฐจํธ๋ ๊ฐ ์ข ๋ชฉ์ ํฉํฐ ์ ์์ ์ค์ ์ฑ๊ณผ๋ฅผ ๋น๊ตํ ์ ์๊ฒ ๋์์ค๋๋ค.
6. ์ฌํ ํ์ฅ
- ์ฌ๋ฌด ๋ฐ์ดํฐ API ์ฐ๋ (์: DART, FnGuide, Financial Modeling Prep)
- ์๋ ๋ฆฌ๋ฐธ๋ฐ์ฑ → ๋ถ๊ธฐ๋ง๋ค ํฉํฐ ์ฌ๊ณ์ฐ
- ๋ฉํฐํฉํฐ ํฌํธํด๋ฆฌ์ค ์๋ฎฌ๋ ์ด์ → ์ ์ฒด Score ๊ฐ์คํ๊ท ์์ต๋ฅ ๊ณ์ฐ
๐ ์ ๋ฆฌ
๋จ๊ณ ํต์ฌ ๋ด์ฉ
| 1 | yfinance๋ก ๋ฐ์ดํฐ ์์ง |
| 2 | ํฉํฐ ๊ณ์ฐ (๋ชจ๋ฉํ ·ROE·๋ณ๋์ฑ) |
| 3 | ํฉํฐ ์ ์ ์ฐ์ถ |
| 4 | ๋์ ์์ต๋ฅ ๋ฐฑํ ์คํธ |
| 5 | ์๊ฐํ ๋ฐ ๋น๊ต ๋ถ์ |
๐ ์ด ๊ณผ์ ์ ์๋ํํ๋ฉด, ๋งค์ฃผ ํน์ ๋งค์ ํฉํฐ๋ณ ์ฑ๊ณผ ๋ฆฌํฌํธ๋ฅผ ์๋ ์์ฑํ ์ ์์ต๋๋ค.
๐ ๋ค์ ๊ธ ์๊ณ
๋ค์ ํธ์์๋ **“ํํธ ์ ๋ต ์๋ ๋ฆฌ๋ฐธ๋ฐ์ฑ ์์คํ
๊ตฌ์ถ (ํ์ด์ฌ + ๊ตฌ๊ธ ์คํ๋ ๋์ํธ)”**์ ๋ค๋ฃน๋๋ค.
์ฆ, ๋งค๋ฌ ์๋์ผ๋ก ํฉํฐ ์ ์๋ฅผ ๊ณ์ฐํ๊ณ , ํฌํธํด๋ฆฌ์ค๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ตฌ์กฐ๋ฅผ ์ง์ ๋ง๋ค์ด๋ด
๋๋ค.
ํํธ๋ฐฑํ ์คํธ,ํฉํฐ๋ถ์,ํ์ด์ฌํํธ,์ฃผ์์๊ฐํ,yfinance,๋ฐ์ดํฐํฌ์,ํํธ์๋ํ,๋ชจ๋ฉํ ์ ๋ต,ROE๋ถ์,ํฌํธํด๋ฆฌ์ค๋ฆฌ๋ฐธ๋ฐ์ฑ
'์ฃผ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- PostgreSQL
- Next.js
- nextJS
- CI/CD
- ai์ฒ ํ
- ์ฟ ๋ฒ๋คํฐ์ค
- flax
- DevOps
- Docker
- JWT
- Express
- node.js
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- SEO์ต์ ํ
- NestJS
- rag
- ๋ฅ๋ฌ๋
- JAX
- ์น๊ฐ๋ฐ
- Python
- REACT
- seo ์ต์ ํ 10๊ฐ
- kotlin
- llm
- fastapi
- ๋ฐฑ์๋๊ฐ๋ฐ
- Redis
- ์๋ฐ๋ฉด์
- Prisma
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |

