삼성전자 10년후 주가 전망(2035): Prophet 예측 + 백테스트 + 시나리오 분석 (Python)

삼성전자 10년후 주가 전망 이미지

제가 작년 이맘쯤(2025년 12월) 유사한 주제로 글을 썼었습니다. 삼성전자 10년후 주가가 12만원 언저리일 것이다!

그런데 최근 거의 근처(최고 113,400원)에 도달해버렸는데요. 저도 깜짝 놀랐습니다. 그래서 1년이 지난 시점에 한번 더 살펴봐야겠다는 생각이 들어서 본 ㅔ내용을 적고 있습니다.

3줄 요약

  • 데이터 기준일: 2025.12.16.(화) / 예측 시점: 2035년 말(10년)
  • 결론: 단일 숫자보다 시나리오(범위) 로 보는 게 안전합니다. (모델 불확실성 ≠ 시장 리스크)
  • 이 글의 목표: “맞추기”가 아니라 데이터 기반으로 생각하는 틀(모델+검증+한계)을 만드는 것

⚠️ 본 글은 교육 목적이며 투자 자문이 아닙니다.

1) 삼성전자 10년후 주가, 사람들이 진짜 궁금해하는 것

대부분의 사람들은 보통 이걸 원합니다.

  • “10년 뒤 대충 얼마?” (단, “언제 기준인지”가 중요)
  • “낙관/비관 시나리오가 있나?”
  • “이 예측을 믿어도 되나?”

그래서 이 글은 기준일 + 범위 + 검증(백테스트) 를 보여주는 구조로 이야기를 풀어가보려고 합니다.

2) 왜 “단일 목표가”는 위험할까?

주가는 기술/경쟁/정책/금리/환율/사이클 등 많은 변수에 따라 크게 변동이 생깁니다.
게다가 장기 예측은 오차에 오차가 누적됩니다.

그래서 이 글은 결과를 이렇게 정리하고자 합니다.
물론 다들 정답을 알고 계십니다. 기업의 내재가치에 수렴하게 된다!
(문제는 그 내재가치를 산정하는게 쉽지 않다는거겠죠?)

  • Base(중앙값)
  • Bull(낙관 시나리오)
  • Bear(보수 시나리오)

파이썬에 관심이 별로 없으신 분은 여기[👉 시나리오 표로 바로 가기]를 클릭해서 표형태로 정리된 데이터를 확인하세요!

3) 데이터 준비: 10년치 가격을 가져오는 방법 (Python)

핵심: “Close(종가)”를 쓰면 분할/배당 등 이벤트 영향이 덜합니다.

import yfinance as yf
import pandas as pd

ticker = "005930.KS"
df = yf.download(ticker, start="2015-01-01", auto_adjust=True, progress=False)

price = df["Close"].iloc[:, 0].rename("y").to_frame()
price.index.name = "ds"
price = price.dropna()
print(price.head())
print(f"삼성전자 주가 데이터: {len(price)} 일")
price.to_csv("samsung_stock_prices.csv")

4) Prophet으로 예측하기 (월 단위 추천)

일별 데이터는 노이즈가 커서 10년 장기 예측에는 과적합/착시가 생기기 쉽습니다.
그래서 월 단위로 리샘플링한 뒤 예측하는 걸 추천합니다. Prophet도 비일별 데이터에서 예측 주기를 맞추는 방식을 안내합니다.

import yfinance as yf
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
import warnings
warnings.filterwarnings('ignore')

# 🔹 한글 폰트 설정 (사용 OS에 맞게 한 줄만 활성화)
plt.rcParams['font.family'] = 'AppleGothic'      # macOS
# plt.rcParams['font.family'] = 'Malgun Gothic'  # Windows
# plt.rcParams['font.family'] = 'NanumGothic'    # Linux (나눔폰트 설치 시)
plt.rcParams['axes.unicode_minus'] = False      # 마이너스 깨짐 방지

# 데이터 다운로드
ticker = "005930.KS"
df = yf.download(ticker, start="2015-01-01", auto_adjust=True, progress=False)
price = df["Close"].iloc[:, 0].rename("y").to_frame()
price.index.name = "ds"
price = price.dropna()
print(f"삼성전자 주가 데이터: {len(price)} 일")
price.to_csv("samsung_stock_prices.csv")

monthly = price.resample("ME").last().reset_index()
print(f"월 데이터: {len(monthly)} 개월")

# Prophet 모델
m = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    changepoint_prior_scale=0.2,
    seasonality_mode="multiplicative"
)
m.fit(monthly)

# 예측 생성
future = m.make_future_dataframe(periods=120, freq="ME")
fcst = m.predict(future)

# 결과 출력
print("\n=== 2026년 12개월 예측 ===")
next_year = fcst[fcst['ds'] > '2025-12-31'].head(12)[['ds', 'yhat']].round(0)
print(next_year.to_string(index=False))

print("\n=== 10년 후 샘플 (2035년) ===")
print(fcst[fcst['ds'] > '2035-01-01'].tail(3)[['ds', 'yhat']].round(0))

# CSV 저장
fcst.to_csv("samsung_prophet_forecast.csv", index=False)
print("\n✅ 예측 완료: samsung_prophet_forecast.csv 저장")

# 예측 그래프 저장
fig1 = m.plot(fcst)
plt.title("삼성전자 주가 Prophet 예측 (2015-2035)")
plt.savefig("samsung_forecast.png", dpi=300, bbox_inches='tight')
plt.close()
print("📊 시각화 저장: samsung_forecast.png")

# 구성요소 플롯 저장
fig2 = m.plot_components(fcst)
plt.savefig("samsung_forecast_components.png", dpi=300, bbox_inches='tight')
plt.close()
print("📊 구성요소 분석: samsung_forecast_components.png")

위 코드 실행결과는 다음과 같습니다.

삼성전자 주가 데이터: 2687 일
월 데이터: 132 개월
19:03:52 - cmdstanpy - INFO - Chain [1] start processing
19:03:52 - cmdstanpy - INFO - Chain [1] done processing

=== 2026년 12개월 예측 ===
        ds    yhat
2026-01-31 72427.0
2026-02-28 71676.0
2026-03-31 73554.0
2026-04-30 73215.0
2026-05-31 73204.0
2026-06-30 73956.0
2026-07-31 75920.0
2026-08-31 72707.0
2026-09-30 73763.0
2026-10-31 77195.0
2026-11-30 77517.0
2026-12-31 80366.0

=== 10년 후 샘플 (2035년) ===
            ds      yhat
249 2035-10-31  103689.0
250 2035-11-30  104461.0
251 2035-12-31  107207.0
삼성전자 10년후 주가 전망 그래프
삼성전자 10년후 주가 전망 그래프2

위 그래프와 데이터에 대한 분석내용입니다. 참고하세요.

2026년에는 삼성전자 주가가 완만한 우상향, 2035년에는 현재보다 약 30~40% 높은 수준(10만 원대 초반)을 예측하는 모델 결과입니다. 이 값은 Prophet이 과거 2015~2025년 패턴을 연장해 본 통계적 추세일 뿐, 실제 미래 가격을 보장하지는 않습니다.

## 2026년 예측 값 해석
- 2026년 1월~12월 예상 종가는 약 7.2만 원 → 8.0만 원으로, 1년 동안 약 10% 내외의 상승을 예측합니다.  
- 연중 박스권은 대략 7.1만~8.0만 원 사이로, 상반기에는 7만 원대 중반 수준에 머물다가 하반기로 갈수록 7.5만~8만 원에 근접하는 흐름을 보입니다.  
- 월별로 보면 2월이 가장 낮고(약 7.17만), 12월이 가장 높게(약 8.04만) 예측되어, 연말로 갈수록 점진적 상승 추세를 가정하고 있습니다.

## 2035년 예측 값 해석
- 10년 뒤인 2035년 말에는 10만 원 초반대를 예측합니다.  
- 2035년 10~12월 예측치는 각각 약 10.37만, 10.45만, 10.72만 원으로, 2035년에도 여전히 완만한 상승 추세가 이어지는 형태입니다.  
- 현재 실거래 구간(7만~8만 원대)을 기준으로 보면, 10년 동안 대략 30~40% 정도 우상향하는 장기 성장 스토리를 그린다고 볼 수 있습니다.

## 첫 번째 그래프 해석 (전체 예측)
- 검은 점: 2015년 이후 실제 월말 종가(관측값). 점들이 파란 선 주변에 비교적 잘 붙어 있어, 과거 데이터에 대한 적합도는 무난한 편입니다.  
- 파란 선: Prophet이 추정한 “중앙 예측값(yhat)”으로, 2015년 약 2만 원대에서 2035년 10만 원 이상까지 완만하게 올라가는 장기 상승 추세입니다.  
- 파란 음영(밴드): 불확실성을 표현하는 예측 구간(yhat_lower~yhat_upper)로, 미래로 갈수록 폭이 넓어지며 “멀리 갈수록 자신감이 떨어진다”는 것을 보여줍니다.

## 두 번째 그래프 해석 (구성요소)
- 위쪽(trend):  
  - 2015년 이후 꾸준한 우상향, 특히 2019~2021년 구간에서 기울기가 더 가팔라졌다가, 이후에는 약간 완만해지지만 계속 상승하는 형태입니다.  
  - 2030년 이후 구간에서는 데이터가 없기 때문에, Prophet이 이전 구간의 평균적인 기울기를 연장해 직선에 가까운 추세를 그립니다.
- 아래쪽(yearly):  
  - 1년 안에서 어느 달에 상대적으로 강세/약세가 나오는지 비율(%)로 표현한 연간 시즌성입니다.  
  - 예를 들어, 특정 월(예: 4~5월, 9월 등)에서 20~30% 수준의 양(+)의 값이면 “그 달에는 평균적으로 다른 달보다 주가가 강한 경향”, 음(-)의 값이면 “상대적으로 약한 경향”을 의미합니다.  
  - 다만 삼성전자 개별 종목 주가는 거시환경·업황 영향이 커서, 이 연간 패턴은 “통계적으로 이런 경향이 있었다” 정도로 참고만 하는 수준입니다.

## 투자 관점에서 어떻게 봐야 하는지
- 이 모델은 과거 가격 패턴만으로 미래를 연장한 **통계적 시뮬레이션**이라, 반도체 사이클, EPS 성장, 환율, 경쟁사, 지정학 리스크 등은 반영하지 못합니다.  
- “10년 뒤 10만 원 초반대”라는 수치는 절대적인 목표가라기보다, “과거 10년과 비슷한 성장/변동성이 이어진다면 이 정도 궤적이 나올 수 있다”는 가정 시나리오로 보는 것이 안전합니다.

5) 백테스트(검증): “최근 1년”을 맞혀보면 신뢰가 생긴다

장기 예측을 보기 전에, 최소한 최근 12개월을 떼어내서 맞혀보세요.

import yfinance as yf
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt
from matplotlib import rc
import platform
import warnings
warnings.filterwarnings('ignore')

# -------------------------------
# 0. 한글 폰트 설정
# -------------------------------
if platform.system() == "Darwin":       # macOS
    rc('font', family='AppleGothic')
elif platform.system() == "Windows":    # Windows
    rc('font', family='Malgun Gothic')
else:                                   # Linux
    rc('font', family='NanumGothic')

plt.rcParams['axes.unicode_minus'] = False

# -------------------------------
# 1. 데이터 다운로드 및 월말 변환
# -------------------------------
ticker = "005930.KS"
df = yf.download(ticker, start="2015-01-01", auto_adjust=True, progress=False)

# 멀티인덱스 컬럼 대비: 평탄화
if isinstance(df.columns, pd.MultiIndex):
    df.columns = ['_'.join([str(c) for c in col if c != '']) for col in df.columns]

# 종가 컬럼 탐색 (Close, Close_005930.KS 등)
close_col = None
for c in df.columns:
    if c.startswith('Close'):
        close_col = c
        break
if close_col is None:
    raise ValueError(f"Close 컬럼을 찾을 수 없습니다. 현재 컬럼: {df.columns}")

price = df[[close_col]].copy()
price.columns = ['y']          # Prophet용 이름
price.index.name = 'ds'
price = price.dropna()

print(f"삼성전자 주가 데이터: {len(price)} 일")

# 월말 종가로 리샘플
monthly = price.resample('ME').last().copy()
monthly.reset_index(inplace=True)       # ds 컬럼
monthly['ds'] = pd.to_datetime(monthly['ds'])
monthly['y'] = monthly['y'].astype(float)
monthly = monthly[['ds', 'y']]

print(f"월 데이터: {len(monthly)} 개월")

monthly.to_csv("samsung_stock_prices_monthly.csv", index=False)

# -------------------------------
# 2. 전체 기간 학습 + 10년 예측
# -------------------------------
m = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    changepoint_prior_scale=0.2,
    seasonality_mode="multiplicative"
)
m.fit(monthly)

future = m.make_future_dataframe(periods=120, freq="ME")
fcst = m.predict(future)
fcst.to_csv("samsung_prophet_forecast.csv", index=False)

print("\n=== 2026년 12개월 예측 ===")
next_year = fcst[
    (fcst['ds'] >= '2026-01-01') & (fcst['ds'] <= '2026-12-31')
][['ds', 'yhat']].round(0)
print(next_year.to_string(index=False))

print("\n=== 10년 후 샘플 (2035년) ===")
sample_2035 = fcst[
    (fcst['ds'] >= '2035-10-01') & (fcst['ds'] <= '2035-12-31')
][['ds', 'yhat']].round(0)
print(sample_2035.to_string(index=False))

print("\n✅ 장기 예측 완료: samsung_prophet_forecast.csv 저장")

# -------------------------------
# 3. 백테스트: 최근 12개월 성능
# -------------------------------
print("\n=== 최근 12개월 백테스트 ===")

train = monthly.iloc[:-12].copy()
test = monthly.iloc[-12:].copy()

m_bt = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    changepoint_prior_scale=0.2,
    seasonality_mode="multiplicative"
)
m_bt.fit(train)

future_bt = m_bt.make_future_dataframe(periods=12, freq="ME")
pred_bt = m_bt.predict(future_bt)

bt = test.merge(pred_bt[['ds', 'yhat']], on='ds', how='left')

mae = np.mean(np.abs(bt['y'] - bt['yhat']))
mape = np.mean(np.abs((bt['y'] - bt['yhat']) / bt['y'])) * 100

print(f"Backtest MAE : {mae:,.0f} KRW")
print(f"Backtest MAPE: {mape:.2f} %")
print("\n백테스트 실제 vs 예측:")
print(bt.tail(12).round(0))

bt.to_csv("samsung_prophet_backtest.csv", index=False)

# -------------------------------
# 4. 그래프 저장
# -------------------------------
fig1 = m.plot(fcst)
plt.title("삼성전자 주가 Prophet 예측 (2015-2035)")
plt.savefig("samsung_forecast.png", dpi=300, bbox_inches='tight')
plt.close()

fig2 = m.plot_components(fcst)
plt.savefig("samsung_forecast_components.png", dpi=300, bbox_inches='tight')
plt.close()

print("\n📊 예측 그래프: samsung_forecast.png")
print("📊 구성요소 그래프: samsung_forecast_components.png")
print("📊 백테스트 결과: samsung_prophet_backtest.csv")

위 코드 실행결과와 그 결과에 대한 해석은 다음과 같습니다.

삼성전자 주가 데이터: 2687 일
월 데이터: 132 개월
19:25:24 - cmdstanpy - INFO - Chain [1] start processing
19:25:24 - cmdstanpy - INFO - Chain [1] done processing

=== 2026년 12개월 예측 ===
        ds    yhat
2026-01-31 72642.0
2026-02-28 71929.0
2026-03-31 73870.0
2026-04-30 73349.0
2026-05-31 73183.0
2026-06-30 74178.0
2026-07-31 76386.0
2026-08-31 72979.0
2026-09-30 73886.0
2026-10-31 77426.0
2026-11-30 77644.0
2026-12-31 80679.0

=== 10년 후 샘플 (2035년) ===
        ds     yhat
2035-10-31 104644.0
2035-11-30 105111.0
2035-12-31 108483.0

✅ 장기 예측 완료: samsung_prophet_forecast.csv 저장

=== 최근 12개월 백테스트 ===
19:25:24 - cmdstanpy - INFO - Chain [1] start processing
19:25:25 - cmdstanpy - INFO - Chain [1] done processing
Backtest MAE : 19,571 KRW
Backtest MAPE: 27.35 %

백테스트 실제 vs 예측:
           ds         y     yhat
0  2025-01-31   51543.0  79594.0
1  2025-02-28   53609.0  72177.0
2  2025-03-31   57192.0  73796.0
3  2025-04-30   54917.0  72672.0
4  2025-05-31   55609.0  71600.0
5  2025-06-30   59534.0  73458.0
6  2025-07-31   71083.0  75167.0
7  2025-08-31   69390.0  71060.0
8  2025-09-30   83900.0  68014.0
9  2025-10-31  107500.0  67275.0
10 2025-11-30  100500.0  68535.0
11 2025-12-31  102800.0  72665.0
이번 결과는 이전에 본 결과와 **패턴은 거의 동일하지만, 수준(level)이 약간 더 높게 잡힌 모델**이라고 보면 됩니다. 2026년·2035년 예측 수치는 소폭 상향되었고, 백테스트를 통해 “최근 1년은 꽤 크게 과소추세(underfit)”하고 있다는 것도 확인됩니다. 

## 2026년 예측: 이전 결과와 비교
- 예전 해석에서 2026년 예측은 대략 7.2만 → 8.0만 구간으로 연간 약 10% 상승, 이번 결과는 7.26만 → 8.07만으로 **수백~수천 원 정도만 위로 올라간 수준**입니다.  
- 1~12월 흐름 자체는 거의 같고,  
  - 2월이 가장 낮고(71,929원),  
  - 12월이 가장 높으며(80,679원),  
  - 상반기 7만 중반, 하반기 7.6만~8만 근처로 올라가는 **완만한 우상향** 패턴은 그대로 유지됩니다.  
- 즉, “2026년 한 해 동안 7.1만~8.0만 사이 박스권, 연말이 연초보다 약 10~12% 높은 수준”이라는 이전 해석과 일관된 결과이고, 새 모델은 이를 약간 더 낙관적으로 보는 정도입니다.

## 2035년 예측: 장기 레벨만 살짝 상향
- 예전 설명에서는 2035년 말이 “10만 원 초반대(10.3만~10.7만 정도)”로 해석되었는데, 이번 결과는  
  - 10월: 104,644원  
  - 11월: 105,111원  
  - 12월: 108,483원  
  으로, **여전히 10만 초반~중반 구간**에 위치합니다.  
- 즉, “10년 뒤 10만 초반대, 현재(7만~8만대) 대비 30~40% 상승”이라는 장기 스토리는 그대로고, 마지막 달(12월)이 10.8만으로 약간 더 높은 정도라 이전 대비 **아주 조금 더 강한 장기 우상향**을 그립니다.  

## 백테스트 결과 해석 (이번에 새로 추가된 핵심)
- MAE 19,571원, MAPE 27.35%는 **최근 1년 월말 가격을 예측할 때 평균적으로 20%대 후반 오차**가 났다는 뜻입니다.  
  - 삼성전자가 5만~10만 원 사이를 크게 오르내린 구간이라 절대 오차(1.9만 원)는 꽤 큰 편입니다.  
- 실제 vs 예측을 보면:
  - 2025년 초 (1~6월): 실제 5만~6만 원대인데 예측은 대부분 7만 이상 → **실제보다 높게 보는 경향**.  
  - 2025년 9~12월: 실제가 8.4만 → 10만 후반까지 급등했는데, 예측은 6.7만~7.2만 근처 → **실제 급등을 전혀 못 따라가고, 추세보다 한참 낮게 예측**.  
- 요약하면:
  - 모델은 “완만한 우상향 + 부드러운 계절 패턴”에는 강하지만,  
  - 2025년 같은 **급락·급등 구간(반도체 업황 급반전, AI 수요 폭발 등)**은 거의 반영하지 못합니다.  
  - 그래서 “장기 평균 경로를 보는 참고용”으로는 괜찮지만, “단기(1년 이내) 매수/매도 타이밍” 판단에는 그대로 쓰기 어렵다는 점이 백테스트로 드러난 셈입니다.

## 이전 결과와의 종합 비교 정리
| 항목                 | 이전 해석 기반 모델 느낌                | 이번 결과                             |
|----------------------|----------------------------------------|----------------------------------------|
| 2026년 연초 수준     | 약 72,000원 전후                       | 72,642원 (거의 동일, 소폭 상향)      |
| 2026년 연말 수준     | 약 80,000원 전후                       | 80,679원 (거의 동일, 수백 원 증가)   |
| 2035년 12월 수준     | 약 103,000~107,000원 해석              | 108,483원 (조금 더 낙관적)           |
| 장기 추세 방향       | 완만한 우상향, 10년 30~40% 상승       | 동일, 다만 상단이 약간 더 높게 형성 |
| 백테스트 지표        | (이전엔 없었음)                        | MAE 1.96만, MAPE 27.35%              |
| 백테스트 해석        | –                                      | 최근 급등 구간을 크게 과소추정       |

정리하면, **장기 추세에 대한 스토리는 그대로 유지되면서, 새 코드/데이터 처리로 예측 레벨이 아주 약간 상향된 상태**입니다. 백테스트 수치(MAPE 27%)를 보면 “최근 1년을 맞추는 능력은 그리 높지 않다”는 것도 숫자로 확인됐기 때문에,  
- 장기 투자 아이디어를 그려보는 시나리오 도구로는 의미 있고,  
- 실제 매수·매도 결정을 할 때는 이 모델만 의존하지 말고, 업황·실적·밸류에이션 등 펀더멘털과 같이 보는 것이 안전합니다.

6) 결과 해석: Base / Bull / Bear 시나리오로 정리하기

Prophet은 yhat(중앙값), yhat_lower, yhat_upper(불확실성 구간)을 줍니다.

중요: 이 구간은 “모델 추정의 불확실성”이지, “시장 급변/위기/호황”까지 반영하는 완전한 리스크 범위는 아닙니다.

import yfinance as yf
import pandas as pd
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt
from matplotlib import rc
import platform
import warnings
warnings.filterwarnings('ignore')

# -------------------------------
# 0. 한글 폰트 설정
# -------------------------------
if platform.system() == "Darwin":       # macOS
    rc('font', family='AppleGothic')
elif platform.system() == "Windows":    # Windows
    rc('font', family='Malgun Gothic')
else:                                   # Linux
    rc('font', family='NanumGothic')

plt.rcParams['axes.unicode_minus'] = False

# -------------------------------
# 1. 데이터 다운로드 및 월말 변환
# -------------------------------
ticker = "005930.KS"
df = yf.download(ticker, start="2015-01-01", auto_adjust=True, progress=False)

# 멀티인덱스 컬럼 대비: 평탄화
if isinstance(df.columns, pd.MultiIndex):
    df.columns = ['_'.join([str(c) for c in col if c != '']) for col in df.columns]

# 종가 컬럼 탐색 (Close, Close_005930.KS 등)
close_col = None
for c in df.columns:
    if c.startswith('Close'):
        close_col = c
        break
if close_col is None:
    raise ValueError(f"Close 컬럼을 찾을 수 없습니다. 현재 컬럼: {df.columns}")

price = df[[close_col]].copy()
price.columns = ['y']          # Prophet용 이름
price.index.name = 'ds'
price = price.dropna()

print(f"삼성전자 주가 데이터: {len(price)} 일")

# 월말 종가로 리샘플
monthly = price.resample('ME').last().copy()
monthly.reset_index(inplace=True)       # ds 컬럼
monthly['ds'] = pd.to_datetime(monthly['ds'])
monthly['y'] = monthly['y'].astype(float)
monthly = monthly[['ds', 'y']]

print(f"월 데이터: {len(monthly)} 개월")

monthly.to_csv("samsung_stock_prices_monthly.csv", index=False)

# -------------------------------
# 2. 전체 기간 학습 + 10년 예측
# -------------------------------
m = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    changepoint_prior_scale=0.2,
    seasonality_mode="multiplicative"
)
m.fit(monthly)

future = m.make_future_dataframe(periods=120, freq="ME")
fcst = m.predict(future)
fcst.to_csv("samsung_prophet_forecast.csv", index=False)

print("\n=== 2026년 12개월 예측 ===")
next_year = fcst[
    (fcst['ds'] >= '2026-01-01') & (fcst['ds'] <= '2026-12-31')
][['ds', 'yhat']].round(0)
print(next_year.to_string(index=False))

print("\n=== 10년 후 샘플 (2035년) ===")
sample_2035 = fcst[
    (fcst['ds'] >= '2035-10-01') & (fcst['ds'] <= '2035-12-31')
][['ds', 'yhat']].round(0)
print(sample_2035.to_string(index=False))

print("\n✅ 장기 예측 완료: samsung_prophet_forecast.csv 저장")

# -------------------------------
# 3. 10년 후 Bear / Base / Bull 시나리오
# -------------------------------
end = fcst.iloc[-1]   # 예측 구간 마지막 행 (대략 10년 후)

base = end["yhat"]
bear = end["yhat_lower"]
bull = end["yhat_upper"]

print("\n=== 10Y Scenario (Model Uncertainty Band) ===")
print(f"Bear : ₩{bear:,.0f}")
print(f"Base : ₩{base:,.0f}")
print(f"Bull : ₩{bull:,.0f}")

# ⚠️ 주의: 이 구간은 Prophet 추정의 통계적 불확실성일 뿐,
#         실제 시장 위기/호황까지 포함하는 '최악/최선' 범위는 아님.

# -------------------------------
# 4. 백테스트: 최근 12개월 성능
# -------------------------------
print("\n=== 최근 12개월 백테스트 ===")

train = monthly.iloc[:-12].copy()
test = monthly.iloc[-12:].copy()

m_bt = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    changepoint_prior_scale=0.2,
    seasonality_mode="multiplicative"
)
m_bt.fit(train)

future_bt = m_bt.make_future_dataframe(periods=12, freq="ME")
pred_bt = m_bt.predict(future_bt)

bt = test.merge(pred_bt[['ds', 'yhat']], on='ds', how='left')

mae = np.mean(np.abs(bt['y'] - bt['yhat']))
mape = np.mean(np.abs((bt['y'] - bt['yhat']) / bt['y'])) * 100

print(f"Backtest MAE : {mae:,.0f} KRW")
print(f"Backtest MAPE: {mape:.2f} %")
print("\n백테스트 실제 vs 예측:")
print(bt.tail(12).round(0))

bt.to_csv("samsung_prophet_backtest.csv", index=False)

# -------------------------------
# 5. 그래프 저장
# -------------------------------
fig1 = m.plot(fcst)
plt.title("삼성전자 주가 Prophet 예측 (2015-2035)")
plt.savefig("samsung_forecast.png", dpi=300, bbox_inches='tight')
plt.close()

fig2 = m.plot_components(fcst)
plt.savefig("samsung_forecast_components.png", dpi=300, bbox_inches='tight')
plt.close()

print("\n📊 예측 그래프: samsung_forecast.png")
print("📊 구성요소 그래프: samsung_forecast_components.png")
print("📊 백테스트 결과: samsung_prophet_backtest.csv")
print("📊 전체 예측: samsung_prophet_forecast.csv")

위 코드 실행 및 해석 내용은 다음과 같습니다.

월 데이터: 132 개월
19:31:46 - cmdstanpy - INFO - Chain [1] start processing
19:31:46 - cmdstanpy - INFO - Chain [1] done processing

=== 2026년 12개월 예측 ===
        ds    yhat
2026-01-31 72579.0
2026-02-28 71863.0
2026-03-31 73799.0
2026-04-30 73306.0
2026-05-31 73148.0
2026-06-30 74130.0
2026-07-31 76319.0
2026-08-31 72919.0
2026-09-30 73832.0
2026-10-31 77373.0
2026-11-30 77593.0
2026-12-31 80651.0

=== 10년 후 샘플 (2035년) ===
        ds     yhat
2035-10-31 104485.0
2035-11-30 104967.0
2035-12-31 108341.0

✅ 장기 예측 완료: samsung_prophet_forecast.csv 저장

=== 10Y Scenario (Model Uncertainty Band) ===
Bear : ₩91,449
Base : ₩108,341
Bull : ₩124,798

=== 최근 12개월 백테스트 ===
19:31:46 - cmdstanpy - INFO - Chain [1] start processing
19:31:46 - cmdstanpy - INFO - Chain [1] done processing
Backtest MAE : 19,126 KRW
Backtest MAPE: 26.30 %

백테스트 실제 vs 예측:
           ds         y     yhat
0  2025-01-31   51543.0  77117.0
1  2025-02-28   53609.0  71186.0
2  2025-03-31   57192.0  72793.0
3  2025-04-30   54917.0  71737.0
4  2025-05-31   55609.0  70673.0
5  2025-06-30   59534.0  72321.0
6  2025-07-31   71083.0  73744.0
7  2025-08-31   69390.0  69675.0
8  2025-09-30   83900.0  66733.0
9  2025-10-31  107500.0  66071.0
10 2025-11-30  100500.0  67403.0
11 2025-12-31  102800.0  71352.0
2026년과 10년 뒤 주가 흐름을 “완만한 우상향 + 통계적 시나리오”로 잘 요약한 결과입니다. 단, 최근 1년 예측 정확도는 높지 않아 단기 매매보다는 장기 시나리오 참고용으로 보는 게 적절합니다.

## 2026년 예측 요약
- 2026년 1~12월 예상 주가는 약 7.2만 원에서 8.1만 원 수준으로, 1년 동안 대략 10% 정도 우상향하는 그림입니다.  
- 연중 대부분 7만 원대 중후반을 유지하다가, 연말(12월)에 약 8.06만 원으로 마감하는 완만한 상승 패턴입니다.  

## 2035년 말 수준과 10년 시나리오
- 2035년 10~12월은 약 10.4만~10.8만 원 수준으로, 현재(7만~8만대)보다 10년간 30~40% 정도 오른 장기 상승을 가정합니다.  
- 10년 뒤 한 점(마지막 달)에 대해 모델이 주는 구간은  
  - Bear(보수적 하단): 약 9.1만 원  
  - Base(중앙값): 약 10.8만 원  
  - Bull(낙관적 상단): 약 12.5만 원  
  으로, **“Prophet 모델이 추정한 통계적 불확실성 범위”**이지, 실제 위기·초호황까지 모두 포함한 최악/최선 시나리오는 아니라는 점이 중요합니다.  

## 최근 12개월 백테스트 의미
- MAE 약 19,000원, MAPE 26.3%는 최근 1년 월말 종가를 예측할 때 평균적으로 25% 안팎의 오차가 있었다는 뜻입니다.  
- 실제 2025년 후반에 8만~10만 원대로 급등했지만, 모델은 6.6만~7.3만 원 수준에 머물러 **급등 구간을 크게 과소추정**하고 있습니다.  
- 따라서 이 모델은 “장기 평균적인 우상향 경로를 보는 용도”로는 쓸 만하지만, 단기 가격 급변까지 맞추는 용도로 쓰기엔 한계가 크다고 볼 수 있습니다.

삼성전자 1/3/5/10년 시나리오 표

아래와 같이 하나의 표로 정리해보았습니다.

시점Bear(보수)Base(중앙)Bull(낙관)비고
1년 후₩69,574₩80,870₩92,143월 단위 예측
3년 후₩75,837₩87,416₩99,108
5년 후₩80,907₩93,572₩106,370
10년 후(2035)₩93,490₩109,319₩125,482기준일: 2025-12-16

常见问题

Q1. 삼성전자 10년후 주가를 Prophet으로 맞출 수 있나요?
A. “정답 맞히기”보다는 패턴 기반 시나리오를 만드는 데 의미가 큽니다. 장기 예측은 충격 변수에 약합니다.

Q2. Prophet 신뢰구간(yhat_lower~upper)은 시장 리스크까지 포함하나요?
A. 아닙니다. 기본적으로는 모델 추정 불확실성에 가깝습니다.

Q3. 왜 일별이 아니라 월별로 예측하나요?
A. 10년 장기는 일별 노이즈가 너무 커서 과적합이 쉬워요. Prophet도 데이터 주기에 맞춰 예측 주기를 설정하는 방법을 안내합니다.

Q5. 이 글대로 투자해도 되나요?
A. 투자 자문이 아닙니다. 모델은 참고 도구이고, 최종 판단은 본인 책임입니다.

类似文章