본문 바로가기
경제 금융 포털사이트 경제 금융 포털사이트

미국채 금리가 오르면 나스닥100은 떨어질까? 파이썬 딥러닝으로 직접 분석해봤습니다

금알남 읽는 시간 약 22분
ai thumbnail minimal 미국채 금리 나스닥100 1789701587

미국채 금리가 오르면 나스닥이 무조건 떨어진다고 생각하기 쉽지만 실제 시장은 그렇게 단순하지 않습니다. 금리 수준과 금리 변화 속도, 시장 변동성까지 함께 넣어 파이썬 딥러닝으로 어떻게 분석할 수 있는지 정리했습니다. 미국 성장주나 나스닥 ETF를 장기적으로 보고 있다면 투자 판단 전에 한 번 읽어보셔도 좋습니다.

미국채 금리가 오르면 정말 나스닥100은 떨어질까?

미국 주식을 투자하다 보면 거의 공식처럼 듣는 말이 있습니다.

“금리가 오르면 기술주는 떨어진다.”

특히 미국 10년물 국채금리가 빠르게 상승하는 날이면 나스닥 관련 뉴스에는 어김없이 금리 이야기가 등장합니다.

그런데 실제 투자 경험을 조금만 쌓아보면 이상한 순간을 만나게 됩니다.

미국채 금리가 올랐는데 나스닥도 같이 오르는 날이 있고, 반대로 금리가 내려갔는데도 나스닥이 하락하는 날도 있습니다.

그렇다면 질문을 조금 바꿔봐야 합니다.

“금리가 오르면 나스닥이 떨어지는가?”가 아니라

“어떤 금리 환경에서 나스닥100의 금리 민감도가 커지는가?”

이 질문이 훨씬 중요합니다.

미 연방준비제도 역시 금리 변화가 주식의 상대적 투자 매력과 자산가격에 영향을 줄 수 있다고 설명합니다. 자산가격은 미래 현금흐름을 현재 가치로 할인하는 과정의 영향을 받기 때문에 금리는 중요한 변수입니다. 하지만 동시에 기업의 미래 이익 전망과 위험 프리미엄도 함께 움직이기 때문에 주가와 금리 사이를 단순한 일대일 관계로 해석하기는 어렵습니다.

그래서 이번에는 단순한 이야기 대신 데이터를 이용해 구조를 만들어보겠습니다.

분석 대상은 나스닥100 지수와 미국 10년물 국채금리입니다.

Nasdaq에 따르면 Nasdaq-100은 나스닥에 상장된 대형 비금융 기업 100개를 추적하며 수정 시가총액 방식으로 구성되는 지수입니다. 기술주와 대형 성장주의 흐름을 살펴볼 때 대표적으로 활용되는 지수 중 하나입니다.

금리 데이터는 세인트루이스 연방준비은행 FRED의 DGS10, 즉 미국 10년 만기 국채의 일별 시장수익률 데이터를 이용할 수 있습니다. 원자료 출처는 미국 연방준비제도입니다.

상관계수 하나만 보면 중요한 것을 놓칠 수 있습니다

가장 먼저 떠올릴 수 있는 방법은 나스닥100 수익률과 미국채 금리 변화를 놓고 상관계수를 구하는 것입니다.

예를 들어 이런 식입니다.

df[['ndx_ret_1d', 'yield_chg_1d']].corr()

문제는 여기서부터입니다.

상관계수는 기본적으로 두 변수 사이의 선형적인 관계를 요약합니다.

하지만 금융시장은 항상 직선처럼 움직이지 않습니다.

미국 10년물 금리가 낮은 구간에서 조금 상승하는 것과 이미 높은 구간에서 다시 급등하는 것은 시장이 받아들이는 의미가 다를 수 있습니다.

금리가 상승하는 이유도 중요합니다.

경기와 기업이익 전망이 강해지면서 금리가 상승하는 경우에는 주식과 금리가 동시에 올라갈 수 있습니다.

반대로 인플레이션 우려나 예상보다 긴 긴축 전망 때문에 할인율이 빠르게 상승한다면 성장주의 밸류에이션에는 부담으로 작용할 수 있습니다.

미국채 금리가 오르면 나스닥100은 떨어질까? 파이썬 딥러닝으로 직접 분석해봤습니다

즉,

금리 상승 = 나스닥 하락

이라는 단순 공식보다는

금리 수준 + 금리 변화 속도 + 주가 모멘텀 + 변동성 + 시장 국면

을 함께 봐야 합니다.

연준의 자산가격 설명에서도 주가는 금리뿐 아니라 예상 미래 현금흐름과 위험 프리미엄 등의 영향을 동시에 받는다고 설명합니다.

그래서 선형회귀를 기준 모델로 만들고, 이후 신경망 모델을 이용해 비선형 관계가 존재하는지 비교해보겠습니다.

파이썬으로 나스닥100과 미국 10년물 금리를 학습시켜보자

여기서 중요한 포인트가 하나 있습니다.

나스닥100의 ‘지수 가격’ 자체를 예측 목표로 두기보다는 미래 수익률을 목표 변수로 잡는 편이 분석 목적에 더 적합합니다.

이번 모델에서는 예를 들어 다음과 같은 변수를 사용할 수 있습니다.

  1. 미국 10년물 국채금리 수준
  2. 하루 금리 변화
  3. 5거래일 금리 변화
  4. 나스닥100 1일 수익률
  5. 나스닥100 5일 수익률
  6. 나스닥100 20일 수익률
  7. 최근 20일 변동성

예측하려는 값은 향후 5거래일 나스닥100 수익률로 설정합니다.

아래 코드는 전체 과정을 재현할 수 있는 기본 모델입니다.

import numpy as np
import pandas as pd
import yfinance as yf

from pandas_datareader import data as web
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping

# 1. 데이터 수집
start = '2010-01-01'
end = pd.Timestamp.today()

ndx_raw = yf.download(
    '^NDX',
    start=start,
    end=end,
    auto_adjust=True,
    progress=False
)

ndx = ndx_raw['Close'].squeeze()
ndx.name = 'ndx'

dgs10 = web.DataReader(
    'DGS10',
    'fred',
    start,
    end
)

dgs10.columns = ['dgs10']

# 2. 데이터 결합
df = pd.concat([ndx, dgs10], axis=1)

# 금리 데이터의 빈 날짜 처리
df['dgs10'] = df['dgs10'].ffill(limit=5)

# 나스닥 거래일이 존재하는 날짜만 사용
df = df.dropna(subset=['ndx'])

# 3. Feature 생성
df['ndx_ret_1d'] = df['ndx'].pct_change()
df['ndx_ret_5d'] = df['ndx'].pct_change(5)
df['ndx_ret_20d'] = df['ndx'].pct_change(20)

df['yield_chg_1d'] = df['dgs10'].diff()
df['yield_chg_5d'] = df['dgs10'].diff(5)

df['volatility_20d'] = (
    df['ndx_ret_1d']
    .rolling(20)
    .std()
    * np.sqrt(252)
)

# 향후 5거래일 수익률
df['target_5d'] = (
    df['ndx'].shift(-5) /
    df['ndx'] - 1
)

features = [
    'dgs10',
    'yield_chg_1d',
    'yield_chg_5d',
    'ndx_ret_1d',
    'ndx_ret_5d',
    'ndx_ret_20d',
    'volatility_20d'
]

data = df[features + ['target_5d']].dropna()

# 4. 시간순 데이터 분할
n = len(data)

train_end = int(n * 0.70)
val_end = int(n * 0.85)

train = data.iloc[:train_end]
val = data.iloc[train_end:val_end]
test = data.iloc[val_end:]

X_train = train[features]
y_train = train['target_5d']

X_val = val[features]
y_val = val['target_5d']

X_test = test[features]
y_test = test['target_5d']

# 5. Scaling
scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)

# 6. 선형회귀 Benchmark
linear_model = LinearRegression()
linear_model.fit(X_train_scaled, y_train)

linear_pred = linear_model.predict(X_test_scaled)

print('Linear MAE:',
      mean_absolute_error(y_test, linear_pred))

print('Linear RMSE:',
      np.sqrt(mean_squared_error(y_test, linear_pred)))

print('Linear R2:',
      r2_score(y_test, linear_pred))

# 7. Deep Learning Model
tf.random.set_seed(42)

model = Sequential([
    Dense(
        64,
        activation='relu',
        input_shape=(len(features),)
    ),
    Dropout(0.15),

    Dense(
        32,
        activation='relu'
    ),

    Dense(
        16,
        activation='relu'
    ),

    Dense(1)
])

model.compile(
    optimizer=tf.keras.optimizers.Adam(
        learning_rate=0.001
    ),
    loss='mse',
    metrics=['mae']
)

early_stop = EarlyStopping(
    monitor='val_loss',
    patience=20,
    restore_best_weights=True
)

history = model.fit(
    X_train_scaled,
    y_train,
    validation_data=(
        X_val_scaled,
        y_val
    ),
    epochs=300,
    batch_size=32,
    callbacks=[early_stop],
    verbose=0
)

# 8. 테스트 데이터 예측
deep_pred = model.predict(
    X_test_scaled,
    verbose=0
).flatten()

print('Deep Learning MAE:',
      mean_absolute_error(y_test, deep_pred))

print('Deep Learning RMSE:',
      np.sqrt(mean_squared_error(y_test, deep_pred)))

print('Deep Learning R2:',
      r2_score(y_test, deep_pred))

여기서 중요한 것은 딥러닝 모델의 예측 정확도가 몇 퍼센트냐만 보는 것이 아닙니다.

오히려 첫 번째 질문은 이것이어야 합니다.

“선형회귀가 설명하지 못하는 패턴을 신경망이 실제로 추가로 잡아내고 있는가?”

딥러닝이라는 이름이 붙었다고 자동으로 더 좋은 모델이 되는 것은 아닙니다.

테스트 구간에서 선형모델보다 성능 개선이 거의 없다면 복잡한 딥러닝보다 단순한 모델이 더 실용적일 수도 있습니다.

금융 데이터에서는 이 판단이 특히 중요합니다.

딥러닝으로 봐야 할 핵심은 ‘금리 민감도 곡선’입니다

이제 더 재미있는 분석이 가능합니다.

금리가 조금 움직였을 때와 크게 움직였을 때 나스닥100의 예상 반응이 같은지를 확인하는 것입니다.

이를 위해 다른 조건을 일정하게 유지하고 5일간 미국채 금리 변화만 바꾸면서 딥러닝 모델의 예측값을 관찰할 수 있습니다.

import matplotlib.pyplot as plt

base = X_test.median().to_frame().T

rate_min = X_test['yield_chg_5d'].quantile(0.02)
rate_max = X_test['yield_chg_5d'].quantile(0.98)

rate_grid = np.linspace(
    rate_min,
    rate_max,
    100
)

scenarios = pd.concat(
    [base] * len(rate_grid),
    ignore_index=True
)

scenarios['yield_chg_5d'] = rate_grid

scenario_scaled = scaler.transform(
    scenarios[features]
)

predicted_return = model.predict(
    scenario_scaled,
    verbose=0
).flatten()

plt.figure(figsize=(10, 6))

plt.plot(
    rate_grid,
    predicted_return
)

plt.axhline(
    0,
    color='gray',
    linestyle='--'
)

plt.xlabel('5-Day Change in US 10Y Treasury Yield')
plt.ylabel('Predicted Nasdaq-100 5-Day Return')
plt.title(
    'Nonlinear Relationship Between Treasury Yield and Nasdaq-100'
)

plt.show()

이 그래프에서 보고 싶은 것은 단순한 우하향 직선만이 아닙니다.

예를 들어 결과가 완만하다가 특정 금리 변화 구간부터 급격하게 내려간다면 시장의 금리 민감도가 일정하지 않을 가능성을 생각해볼 수 있습니다.

반대로 어느 구간에서는 금리 상승과 예상 수익률이 함께 높아지고 다른 구간에서는 방향이 바뀐다면, 금리와 나스닥100의 관계가 단순한 선형관계가 아니라는 단서가 됩니다.

다만 여기서 중요한 주의점이 있습니다.

딥러닝이 비선형 패턴을 찾았다고 해서

“금리가 이렇게 움직이면 나스닥이 반드시 이렇게 움직인다”

라는 인과관계가 증명되는 것은 아닙니다.

머신러닝은 데이터에 존재하는 조건부 패턴을 학습하는 도구이지 경제적 인과관계를 자동으로 증명하는 도구는 아니기 때문입니다.

연준의 최근 연구에서도 통화정책 충격이 주식시장에 전달되는 과정은 금리, 위험 프리미엄, 예상 배당과 현금흐름 등 여러 채널을 통해 나타날 수 있다고 설명합니다.

따라서 모델 결과는 투자 의사결정의 보조 자료로 보는 것이 적절합니다.

그래서 금리가 오르면 나스닥100을 팔아야 할까?

제가 이 분석에서 가장 중요하게 보는 결론은 “금리가 오르면 나스닥이 떨어진다”라는 한 문장 자체가 아닙니다.

오히려 그 공식이 지나치게 단순하다는 점입니다.

미국 10년물 국채금리가 움직이는 이유는 매번 다릅니다.

경기 성장 기대 때문일 수도 있고, 인플레이션 우려 때문일 수도 있으며, 연준의 정책 기대가 바뀌었기 때문일 수도 있습니다.

나스닥100 역시 금리 하나만 보고 움직이지 않습니다.

기업 실적, 이익 성장률, 밸류에이션, 투자심리, 위험 프리미엄, 유동성 등 수많은 변수가 동시에 가격에 반영됩니다.

그래서 투자할 때는 단순히

“금리 상승 = 매도”

“금리 하락 = 매수”

와 같은 공식을 만드는 것보다 더 중요한 것이 있습니다.

현재 금리는 어느 구간에 있는가.

금리의 변화 속도는 얼마나 빠른가.

기업의 이익 전망은 함께 좋아지고 있는가.

시장 변동성은 확대되고 있는가.

그리고 지금의 관계가 과거와 동일한가.

이런 질문을 함께 보는 것입니다.

나스닥100은 현재도 대형 비금융 나스닥 상장사를 중심으로 구성되며, 지수 구성과 방법론 역시 정기적으로 관리·변경됩니다. 따라서 장기간 백테스트를 할 때는 지수 구조와 시장환경이 시간에 따라 달라질 수 있다는 점도 고려해야 합니다. Nasdaq은 2026년에도 Nasdaq-100 방법론 일부를 업데이트했습니다.

그리고 이것이 딥러닝을 사용하는 이유이기도 합니다.

미래 가격을 마법처럼 맞히기 위해서가 아니라,

사람이 한 줄 공식으로 단순화하기 어려운 시장의 비선형적인 관계를 데이터로 점검하기 위해서입니다.

Q1. 미국채 금리가 오르면 나스닥100에는 무조건 악재인가요?

그렇게 단정하기는 어렵습니다. 금리 상승은 할인율 측면에서는 성장주 밸류에이션에 부담이 될 수 있지만, 경제성장과 기업이익 전망이 동시에 개선되는 환경에서는 주가와 금리가 함께 상승할 수도 있습니다. 금리 상승의 원인과 시장 환경을 같이 확인하는 것이 중요합니다.

Q2. 딥러닝이면 나스닥 방향을 높은 확률로 맞힐 수 있나요?

그렇게 해석하면 위험합니다. 금융시장은 구조가 계속 변하고 예상하지 못한 사건의 영향을 받습니다. 딥러닝 역시 과적합과 데이터 누수, 시장 국면 변화에 취약할 수 있습니다. 반드시 시간순 검증과 테스트 구간 평가가 필요합니다.

Q3. 그렇다면 이런 모델은 어디에 활용하면 좋을까요?

매수·매도를 자동 결정하는 정답지보다는 시장 환경을 점검하는 보조 도구로 활용하는 편이 합리적입니다. 선형회귀와 비교하고, 금리 변화에 대한 민감도 곡선을 관찰하며, 이후 물가·달러·변동성·실적 같은 변수를 추가하면서 모델을 확장할 수 있습니다.

다음 단계에서는 여기에 미국 2년물 국채금리, 장단기 금리차, VIX, 달러인덱스, 물가 데이터까지 추가하면 훨씬 재미있는 모델을 만들 수 있습니다.

특히

“어떤 금리 수준부터 나스닥의 민감도가 달라지는가?”

“금리 급등기와 안정기의 반응은 다른가?”

“기술주가 금리에 민감해지는 시장 국면을 사전에 분류할 수 있는가?”

까지 확장한다면 단순 뉴스 해석을 넘어 자신만의 시장 분석 시스템을 만들 수 있습니다.

투자는 미래를 정확하게 맞히는 사람이 항상 이기는 게임이라기보다, 내가 무엇을 알고 무엇을 모르는지를 구분하면서 의사결정 기준을 만들어가는 과정에 가깝습니다.

뉴스에서 “금리 상승으로 나스닥 하락”이라는 문장을 볼 때마다 그대로 받아들이기보다 데이터로 한 번 더 확인하는 습관을 만들어보는 것.

저는 그것이 이런 모델을 만드는 가장 큰 이유라고 생각합니다.

본 자료는 금융시장과 데이터 분석에 대한 교육 및 정보 제공을 목적으로 작성되었으며 특정 금융상품의 매수·매도 또는 투자수익을 보장하거나 권유하기 위한 자료가 아닙니다. 투자 결과는 시장 상황과 투자자의 판단에 따라 달라질 수 있으며 원금 손실이 발생할 수 있습니다. 과거 데이터와 모델 결과가 미래 성과를 보장하지 않습니다.

데이터 출처: Federal Reserve Bank of St. Louis FRED DGS10, Board of Governors of the Federal Reserve System, Nasdaq Global Indexes.

개인 유의사항: 본문에 사용된 분석 방법과 코드는 교육 목적의 예시이며 데이터 제공처, 조회 시점, 결측치 처리, 학습 기간, 모델 설정에 따라 결과가 달라질 수 있습니다. 실제 투자 판단 전에는 투자 목적, 투자 기간, 손실 감내 수준 등을 충분히 고려하시기 바랍니다.

금알남

금알남
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.