ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ’ป ํŒฉํ„ฐ ๋ฐฑํ…Œ์ŠคํŠธ ์ž๋™ํ™” – ํŒŒ์ด์ฌ์œผ๋กœ ํŒฉํ„ฐ๋ณ„ ์„ฑ๊ณผ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ธฐ

์ด์ œ ์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ์ตํ˜”์Šต๋‹ˆ๋‹ค.
์ด์ œ๋ถ€ํ„ฐ๋Š” ํ€€ํŠธ ํˆฌ์ž์˜ ๋ณธ์งˆ์ธ **“๋ฐ์ดํ„ฐ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํˆฌ์ž”**๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฐ€์น˜, ๋ชจ๋ฉ˜ํ…€, ํ€„๋ฆฌํ‹ฐ, ์ €๋ณ€๋™์„ฑ, ๊ทœ๋ชจ ํŒฉํ„ฐ๋ฅผ
ํŒŒ์ด์ฌ์œผ๋กœ ์ž๋™ ๋ฐฑํ…Œ์ŠคํŠธํ•˜๊ณ , ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์€ “์ง์ ‘ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ”๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
์ดˆ๋ณด์ž๋„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋กœ ์‹œ๊ฐํ™”๋ฉ๋‹ˆ๋‹ค.


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
๋งํฌ
ยซ   2026/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•