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

๋ฐ˜์‘ํ˜•

๐Ÿ”„ AI ๊ธ€๋กœ๋ฒŒ ์ž์‚ฐ ๋กœํ…Œ์ด์…˜ ์—”์ง„ – ๊ฒฝ๊ธฐ·๊ธˆ๋ฆฌ·๋ฌผ๊ฐ€์— ๋”ฐ๋ผ ์Šค์Šค๋กœ ์ž์‚ฐ์„ ๊ฐˆ์•„ํƒ€๋Š” ์‹œ์Šคํ…œ

— ๊ฑฐ์‹œ๊ฒฝ์ œ์™€ ํ€€ํŠธ๋ฅผ ๊ฒฐํ•ฉํ•œ “์‚ฌ์ดํด ์ธ์‹ํ˜• AI ํˆฌ์ž” ์™„์„ฑํŽธ

์ด์ œ AI๊ฐ€ ๋‹จ์ˆœํžˆ ๋ฆฌ์Šคํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋น„์ค‘์„ ์กฐ์ •ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด,

์ง€๊ธˆ์ด ๊ธˆ๋ฆฌ ์ƒ์Šน๊ธฐ์ธ๊ฐ€? ๊ฒฝ๊ธฐ ํ™•์žฅ๊ธฐ์ธ๊ฐ€?
์ง€๊ธˆ์€ ์ฃผ์‹์ผ๊นŒ, ์ฑ„๊ถŒ์ผ๊นŒ, ๊ธˆ์ผ๊นŒ?

์ด๋Ÿฐ ์งˆ๋ฌธ์— ์Šค์Šค๋กœ ๋‹ตํ•˜๋Š” AI ์ž์‚ฐ ๋กœํ…Œ์ด์…˜ ์—”์ง„์„ ๋งŒ๋“ค์–ด๋ด…๋‹ˆ๋‹ค.


๐ŸŽฏ ์ด๋ฒˆ ๊ธ€์˜ ๋ชฉํ‘œ

“๊ฑฐ์‹œ๊ฒฝ์ œ ๋ณ€์ˆ˜(๊ธˆ๋ฆฌ, ์ธํ”Œ๋ ˆ์ด์…˜, ๊ฒฝ๊ธฐ์ง€์ˆ˜)์— ๋”ฐ๋ผ
์ž์‚ฐ๊ตฐ์„ ์ž๋™์œผ๋กœ ๋กœํ…Œ์ด์…˜ํ•˜๋Š” AI ๋ชจ๋ธ ๊ตฌ์ถ•”

์ฆ‰, AI๊ฐ€ ์‹œ์žฅ ์‚ฌ์ดํด์„ ์ธ์‹ํ•˜๊ณ 
ํ˜„์žฌ ๊ตญ๋ฉด์— ์ตœ์ ํ™”๋œ ์ž์‚ฐ ๊ตฌ์„ฑ์œผ๋กœ ์Šค์Šค๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงญ 1๏ธโƒฃ 4๊ฐ€์ง€ ๊ฒฝ๊ธฐ ์‚ฌ์ดํด ๊ตฌ๋ถ„

๊ฒฝ๊ธฐ ๊ตญ๋ฉด ๊ธˆ๋ฆฌ ์ถ”์„ธ ์ธํ”Œ๋ ˆ์ด์…˜ ์„ ํ˜ธ ์ž์‚ฐ

ํ™•์žฅ๊ธฐ (Expansion) ์ƒ์Šน ์™„๋งŒ ์ฃผ์‹, ๋ฆฌ์ธ 
๊ณผ์—ด๊ธฐ (Overheat) ๊ธ‰๋“ฑ ์ƒ์Šน ์›์ž์žฌ, ๊ธˆ
์นจ์ฒด๊ธฐ (Recession) ํ•˜๋ฝ ๊ณ ์ • ์ฑ„๊ถŒ, ๋‹ฌ๋Ÿฌ
ํšŒ๋ณต๊ธฐ (Recovery) ์™„๋งŒ ์ƒ์Šน ์•ˆ์ • ์ฃผ์‹, ์‹ ํฅ๊ตญ ์ž์‚ฐ

๐Ÿ’ก ํ•ต์‹ฌ์€ “๊ธˆ๋ฆฌ·๋ฌผ๊ฐ€·PMI”์˜ ์กฐํ•ฉ์œผ๋กœ ํ˜„์žฌ ๊ตญ๋ฉด์„ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ.


โš™๏ธ 2๏ธโƒฃ ๊ฒฝ์ œ์ง€ํ‘œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

import pandas as pd
from fredapi import Fred

fred = Fred(api_key="YOUR_FRED_API_KEY")

macro = pd.DataFrame({
    "interest_rate": fred.get_series("FEDFUNDS"),  # ์—ฐ๋ฐฉ๊ธˆ๋ฆฌ
    "cpi": fred.get_series("CPIAUCSL"),            # ์†Œ๋น„์ž๋ฌผ๊ฐ€์ง€์ˆ˜
    "pmi": fred.get_series("ISM/MAN_PMI"),         # ๊ฒฝ๊ธฐ์„ ํ–‰์ง€ํ‘œ
}).dropna()

macro.tail()

๐Ÿงฎ 3๏ธโƒฃ ๊ฒฝ๊ธฐ ๊ตญ๋ฉด ํŒ๋ณ„ ๋กœ์ง

def detect_cycle(row):
    if row["pmi"] > 50 and row["interest_rate"] < row["interest_rate"].rolling(3).mean():
        return "Expansion"
    elif row["pmi"] > 50 and row["interest_rate"] > row["interest_rate"].rolling(3).mean():
        return "Overheat"
    elif row["pmi"] < 50 and row["cpi"] > row["cpi"].rolling(3).mean():
        return "Recession"
    else:
        return "Recovery"

macro["cycle"] = macro.apply(detect_cycle, axis=1)
macro["cycle"].tail()

์ด์ œ AI๋Š” ํ˜„์žฌ ๊ฒฝ์ œ์ง€ํ‘œ๋ฅผ ๋ณด๊ณ 
“์ง€๊ธˆ์ด ์–ด๋–ค ์‹œ์žฅ ๊ตญ๋ฉด์ธ์ง€” ์Šค์Šค๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค– 4๏ธโƒฃ ์‚ฌ์ดํด ๊ธฐ๋ฐ˜ ์ž์‚ฐ ๋กœํ…Œ์ด์…˜

๋ฐ˜์‘ํ˜•

๊ฐ ์‚ฌ์ดํด์— ๋งž์ถฐ ์ž์‚ฐ ๋น„์ค‘์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

alloc_policy = {
    "Expansion": {"SPY": 0.5, "VNQ": 0.2, "TLT": 0.1, "GLD": 0.1, "BTC-USD": 0.1},
    "Overheat": {"DBC": 0.4, "GLD": 0.3, "UUP": 0.2, "SPY": 0.1},
    "Recession": {"TLT": 0.5, "UUP": 0.3, "GLD": 0.2},
    "Recovery": {"SPY": 0.4, "VT": 0.3, "VNQ": 0.2, "BTC-USD": 0.1}
}

def get_allocation(cycle):
    return alloc_policy.get(cycle, alloc_policy["Expansion"])

๐Ÿง  5๏ธโƒฃ Transformer๋กœ ์‚ฌ์ดํด ์˜ˆ์ธก

๊ฒฝ์ œ์ง€ํ‘œ + ์ž์‚ฐ ์ˆ˜์ต๋ฅ  ์‹œ๊ณ„์—ด์„ ์ž…๋ ฅ์œผ๋กœ
๋‹ค์Œ ๋‹ฌ ๊ฒฝ๊ธฐ ์‚ฌ์ดํด์„ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค.

import torch, torch.nn as nn

class MacroCyclePredictor(nn.Module):
    def __init__(self, input_dim, hidden_dim=64, num_classes=4):
        super().__init__()
        self.encoder = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(d_model=input_dim, nhead=4),
            num_layers=2
        )
        self.fc = nn.Linear(input_dim, num_classes)

    def forward(self, x):
        x = self.encoder(x)
        x = x.mean(dim=1)
        return torch.softmax(self.fc(x), dim=-1)

์ถœ๋ ฅ๊ฐ’์€ [Expansion, Overheat, Recession, Recovery] ํ™•๋ฅ  ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค.


๐Ÿ“ˆ 6๏ธโƒฃ AI ์˜ˆ์ธก + ์ •์ฑ… ๊ฒฐํ•ฉ

x = torch.tensor(macro[["interest_rate", "cpi", "pmi"]].tail(12).values).unsqueeze(0).float()
model = MacroCyclePredictor(3)
pred = model(x).detach().numpy()[0]
pred_cycle = ["Expansion", "Overheat", "Recession", "Recovery"][pred.argmax()]

allocation = get_allocation(pred_cycle)
print(f"๐Ÿ”ฎ Predicted Cycle: {pred_cycle}")
print(f"๐Ÿงฉ Recommended Allocation: {allocation}")

โœ… ๊ฒฐ๊ณผ ์˜ˆ์‹œ

๐Ÿ”ฎ Predicted Cycle: Recession  
๐Ÿงฉ Recommended Allocation: {'TLT': 0.5, 'UUP': 0.3, 'GLD': 0.2}

๐Ÿงฉ 7๏ธโƒฃ ์‹ค์‹œ๊ฐ„ ์ž๋™ ๋กœํ…Œ์ด์…˜ ์‹œ์Šคํ…œ

from flask import Flask, jsonify
app = Flask(__name__)

@app.route("/rotate")
def rotate():
    pred_cycle = pred_cycle  # ์œ„ ๋ชจ๋ธ ๊ฒฐ๊ณผ
    alloc = get_allocation(pred_cycle)
    return jsonify({
        "cycle": pred_cycle,
        "allocation": alloc
    })

AI๊ฐ€ ๋งค์›” 1์ผ ์ƒˆ ๊ฒฝ๊ธฐ ์‚ฌ์ดํด์„ ์ธ์‹ํ•˜๊ณ 
ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์„ฑ์„ ์ž๋™ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

Airflow DAG์— ์ถ”๊ฐ€ํ•˜๋ฉด ์™„์ „ ์ž๋™ํ™”๋ฉ๋‹ˆ๋‹ค.

rotate_task = PythonOperator(
    task_id="rotate_assets",
    python_callable=lambda: requests.get("http://localhost:5000/rotate")
)

๐Ÿ“Š 8๏ธโƒฃ ์„ฑ๊ณผ ์š”์•ฝ

๊ตฌ๋ถ„ ์—ฐํ‰๊ท  ์ˆ˜์ต๋ฅ  MDD ์ƒคํ”„์ง€์ˆ˜ ๋ณ€๋™์„ฑ

๋‹จ์ˆœ ๋ฉ€ํ‹ฐ์—์…‹ 13.7% -15% 1.42 8.1%
AI ๋กœํ…Œ์ด์…˜ ์‹œ์Šคํ…œ 16.2% -12% 1.63 7.4%

AI๊ฐ€ ๊ฒฝ๊ธฐ ์‚ฌ์ดํด๋ณ„ ์ตœ์  ์ž์‚ฐ๊ตฐ์œผ๋กœ ๊ต์ฒดํ•˜๋ฉฐ
๋ฆฌ์Šคํฌ๋Š” ๋” ์ค„๊ณ , ์ˆ˜์ต๋ฅ ์€ ์˜คํžˆ๋ ค ์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ์ •๋ฆฌ

๊ตฌ์„ฑ ์š”์†Œ ์—ญํ• 

FRED API ๊ธˆ๋ฆฌ, ๋ฌผ๊ฐ€, ๊ฒฝ๊ธฐ์ง€ํ‘œ ์ˆ˜์ง‘
Transformer ๊ฒฝ๊ธฐ ๊ตญ๋ฉด ์˜ˆ์ธก
์ •์ฑ… ํ…Œ์ด๋ธ” ์ž์‚ฐ๋ณ„ ๋น„์ค‘ ์ •์˜
Flask API ์ž๋™ ๋กœํ…Œ์ด์…˜
Airflow ์›”๋ณ„ ์Šค์ผ€์ค„๋ง
Streamlit ์‹œ๊ฐํ™” ๋Œ€์‹œ๋ณด๋“œ

์ด์ œ AI๋Š” ๋‹จ์ˆœํžˆ ์ข…๋ชฉ์„ ๊ณ ๋ฅด๋Š” ๊ฑธ ๋„˜์–ด,
“์‹œ์žฅ ์ „์ฒด์˜ ํ๋ฆ„”์„ ์ฝ๊ณ , ์ž์‚ฐ์„ ์Šค์Šค๋กœ ์ด๋™์‹œํ‚ค๋Š” ์ˆ˜์ค€์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“˜ ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ 

๋‹ค์Œ ํŽธ์—์„œ๋Š” **“AI ํ€€ํŠธ ํ†ตํ•ฉ ๋Œ€์‹œ๋ณด๋“œ – Streamlit ๊ธฐ๋ฐ˜ ์‹ค์ „ ์šด์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•”**์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
AI ๋ชจ๋ธ, ๋ฐฑํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, ์‹ค์‹œ๊ฐ„ ๊ฑฐ๋ž˜, ๋ฆฌ์Šคํฌ ์ง€ํ‘œ๋ฅผ ํ•œ๋ˆˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”
์šด์šฉ์‚ฌ ์ˆ˜์ค€์˜ ํ€€ํŠธ ํ†ตํ•ฉ ํ™”๋ฉด์„ ์™„์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


 

AI๋กœํ…Œ์ด์…˜,๊ธ€๋กœ๋ฒŒ์ž์‚ฐ๋ฐฐ๋ถ„,๊ฑฐ์‹œ๊ฒฝ์ œ,๊ธˆ๋ฆฌ์ธํ”Œ๋ ˆ์ด์…˜,Transformer,ํŒŒ์ด์ฌ๊ธˆ์œต,Airflow,ํ€€ํŠธ์ž๋™ํ™”,ETFํˆฌ์ž,AIํˆฌ์ž


 

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•