10  แบบจำลองอนุกรมเวลาและการพยากรณ์ขั้นสูง

Modified

April 29, 2026

Keywords

Python for Economics, Computational Economics, Applied Econometrics, Python สำหรับเศรษฐศาสตร์, เศรษฐศาสตร์คำนวณ, เศรษฐมิติเชิงประยุกต์

ในงานเศรษฐศาสตร์มหภาค ข้อมูลส่วนใหญ่มีลักษณะเป็นอนุกรมเวลา (Time Series) ซึ่งมีความซับซ้อนเนื่องจากตัวแปรมักมีความสัมพันธ์กับค่าในอดีตของตัวเอง statsmodels ในบทนี้เราจะศึกษาแบบจำลองที่ออกแบบมาเพื่อข้อมูลที่มีเงื่อนไขทางเวลา โดยเน้นไปที่การพยากรณ์ค่าในอนาคต (ARIMA) และการวิเคราะห์ความเสี่ยงผ่านความผันผวน (GARCH)

10.1 แบบจำลอง ARIMA (AutoRegressive Integrated Moving Average)

ARIMA เป็นแบบจำลองมาตรฐานในการพยากรณ์ข้อมูลอนุกรมเวลาที่มีลักษณะ “นิ่ง” (Stationary) หรือผ่านการปรับให้ชิ่งแล้ว โดยมีสมการพื้นฐานคือ: \[Y'_t = c + \phi_1 Y'_{t-1} + ... + \phi_p Y'_{t-p} + \theta_1 \epsilon_{t-1} + ... + \theta_q \epsilon_{t-q} + \epsilon_t\]

  • AR (p): การใช้ค่าในอดีตมาพยากรณ์ปัจจุบัน

  • I (d): จำนวนครั้งที่ต้องทำ Differencing เพื่อให้ข้อมูลนิ่ง

  • MA (q): การใช้ค่าความคลาดเคลื่อนในอดีตมาช่วยพยากรณ์

10.1.1 การปรับปรุงและประมาณค่า ARIMA

คลิกเพื่อดูโค้ดไพธอน
import pandas as pd
import yfinance as yf
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA

# 1. ดึงข้อมูล S&P 500
df = yf.download('^GSPC', start='2023-01-01')

# จัดการเรื่อง Index และ Frequency
prices = df['Close']
# กำหนดให้เป็น Business Days ('B') และเติมค่าว่างที่เกิดจากวันหยุดตลาด
prices = prices.asfreq('B').ffill()

# 2. ประมาณค่า ARIMA(1, 1, 1)
# เพิ่ม enforce_stationarity=False เพื่อเลี่ยงปัญหา Non-stationary starting parameters
model_arima = ARIMA(prices, order=(1, 1, 1), enforce_stationarity=False)
results_arima = model_arima.fit()

# 3. พยากรณ์ไปข้างหน้า 5 วัน
forecast = results_arima.get_forecast(steps=5)

# แสดงผลพยากรณ์ (คราวนี้จะได้วันที่ที่ถูกต้องแทนตัวเลข index)
display(forecast.summary_frame())
^GSPC mean mean_se mean_ci_lower mean_ci_upper
2026-04-30 7140.892007 50.131834 7042.635418 7239.148596
2026-05-01 7141.050268 69.693903 7004.452728 7277.647807
2026-05-04 7140.956863 85.442409 6973.492817 7308.420908
2026-05-05 7141.011990 98.411476 6948.129042 7333.894938
2026-05-06 7140.979454 110.017365 6925.349382 7356.609526

10.2 แบบจำลอง GARCH (Generalized Autoregressive Conditional Heteroskedasticity)

ในตลาดการเงิน ความผันผวน (Volatility) มักจะไม่คงที่และมีลักษณะเป็นกลุ่มก้อน (Volatility Clustering) นักเศรษฐศาสตร์จึงไม่ใช้ OLS แต่จะใช้ GARCH เพื่อประมาณค่าความแปรปรวนที่เปลี่ยนแปลงตามเวลา

สมการความแปรปรวน (Variance Equation): \[\sigma^2_t = \omega + \alpha \epsilon^2_{t-1} + \beta \sigma^2_{t-1}\]

  • \(\alpha\) (ARCH term): ผลกระทบจากช็อกในอดีต

  • \(\beta\) (GARCH term): ความต่อเนื่องของความผันผวนในอดีต

Tipการติดตั้งไลบรารีเพิ่มเติม

สำหรับการทำ GARCH ใน Python เรานิยมใช้ไลบรารี arch ซึ่งเสถียรที่สุด

pip install arch

10.2.1 การประมาณค่าความผันผวนด้วย GARCH(1, 1)

คลิกเพื่อดูโค้ดไพธอน
from arch import arch_model

# 1. คำนวณผลตอบแทน (Returns) เนื่องจาก GARCH มักใช้กับข้อมูลที่นิ่งแล้ว
returns = 100 * prices.pct_change().dropna()

# 2. สร้างตัวแบบ GARCH(1, 1)
# vol='Garch', p=1, q=1
model_garch = arch_model(returns, vol='Garch', p=1, q=1)
results_garch = model_garch.fit(disp='off')

# 3. แสดงผลสถิติและค่า Alpha, Beta
display(results_garch.summary())
Constant Mean - GARCH Model Results
Dep. Variable: ^GSPC R-squared: 0.000
Mean Model: Constant Mean Adj. R-squared: 0.000
Vol Model: GARCH Log-Likelihood: -1068.44
Distribution: Normal AIC: 2144.88
Method: Maximum Likelihood BIC: 2163.94
No. Observations: 866
Date: Wed, Apr 29 2026 Df Residuals: 865
Time: 21:44:22 Df Model: 1
Mean Model
coef std err t P>|t| 95.0% Conf. Int.
mu 0.0879 2.578e-02 3.411 6.469e-04 [3.741e-02, 0.138]
Volatility Model
coef std err t P>|t| 95.0% Conf. Int.
omega 0.0479 2.217e-02 2.159 3.089e-02 [4.402e-03,9.131e-02]
alpha[1] 0.0966 2.993e-02 3.227 1.250e-03 [3.793e-02, 0.155]
beta[1] 0.8398 4.512e-02 18.612 2.582e-77 [ 0.751, 0.928]


Covariance estimator: robust
คลิกเพื่อดูโค้ดไพธอน
import matplotlib.pyplot as plt
# 4. พล็อตค่าความผันผวนที่ประมาณได้ (Conditional Volatility)
results_garch.plot()
plt.show()

10.2.2 การทดสอบความนิ่งของข้อมูล (Stationarity Tests)

ก่อนการทำแบบจำลอง ผู้อ่านต้องมั่นใจว่าข้อมูลมีความนิ่ง (Stationary) เพื่อป้องกันปัญหา ความสัมพันธ์ลวง (Spurious Regression) โดยเราจะใช้ข้อมูล Macro-data ของสหรัฐฯ (1959-2009) มาทดสอบผ่าน Augmented Dickey-Fuller (ADF) Test

คลิกเพื่อดูโค้ดไพธอน
import statsmodels.api as sm
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller

# 1. ดึงข้อมูล Macro-economic (Real GDP, CPI, Unemployment)
macro_data = sm.datasets.macrodata.load_pandas().data
gdp = macro_data['realgdp']

# 2. ทดสอบ Augmented Dickey-Fuller (ADF Test)
# H0: ข้อมูลมี Unit Root (ไม่นิ่ง)
result = adfuller(gdp)

print(f'ADF Statistic: {result[0]:.4f}')
print(f'p-value: {result[1]:.4f}')
ADF Statistic: 1.7505
p-value: 0.9982
คลิกเพื่อดูโค้ดไพธอน
# 3. แสดงภาพข้อมูลเพื่อดูลักษณะ Trend
gdp.plot(title='US Real GDP (Time Series)')
plt.show()

10.2.3 แบบจำลองการพยากรณ์ขั้นสูง (SARIMAX)

แบบจำลอง SARIMAX เป็นเครื่องมือที่ทรงพลังเนื่องจากสามารถจัดการได้ทั้งปัจจัยฤดูกาล (Seasonal) และการใส่ตัวแปรอิสระภายนอก (Exogenous) เข้าไปในแบบจำลองพยากรณ์

คลิกเพื่อดูโค้ดไพธอน
from statsmodels.tsa.statespace.sarimax import SARIMAX

# พยากรณ์ GDP โดยใช้แบบจำลอง ARIMA(1, 1, 1) 
# order=(p, d, q) -> p: AR, d: Differencing, q: MA
model_sarima = SARIMAX(gdp, order=(1, 1, 1))
results_sarima = model_sarima.fit(disp=False)

# พยากรณ์ไปข้างหน้า 4 ไตรมาส
forecast = results_sarima.get_forecast(steps=4)
forecast_df = forecast.summary_frame()

print("GDP Forecast for next 4 Quarters:")
display(forecast_df[['mean', 'mean_se', 'mean_ci_lower', 'mean_ci_upper']])
GDP Forecast for next 4 Quarters:
realgdp mean mean_se mean_ci_lower mean_ci_upper
203 12976.051033 55.634020 12867.010356 13085.091709
204 12962.699796 93.228821 12779.974664 13145.424928
205 12950.225623 131.489980 12692.509998 13207.941248
206 12938.570898 171.090790 12603.239111 13273.902684

10.2.4 แบบจำลอง Vector Autoregression (VAR)

ในทางมหภาค ตัวแปรต่างๆ มักส่งผลกระทบซึ่งกันและกัน (Endogeneity) เช่น รายได้ประชาชาติส่งผลต่อการบริโภค และการบริโภคก็ส่งผลกลับไปที่รายได้ แบบจำลอง VAR ช่วยให้เราวิเคราะห์ความสัมพันธ์เชิงพลวัตนี้ได้พร้อมกัน

คลิกเพื่อดูโค้ดไพธอน
from statsmodels.tsa.api import VAR

# เลือกตัวแปร GDP, Consumption และ Investment
data_var = macro_data[['realgdp', 'realcons', 'realinv']]

# แปลงข้อมูลเป็นอัตราการเปลี่ยนแปลง (Percent Change) เพื่อให้ข้อมูลนิ่ง
data_diff = data_var.pct_change().dropna()

# ประมาณค่าแบบจำลอง VAR (เลือก Lag 2 ตามความเหมาะสม)
model_var = VAR(data_diff)
results_var = model_var.fit(2)

# แสดงสรุปผลสรุป
display(results_var.summary())
  Summary of Regression Results   
==================================
Model:                         VAR
Method:                        OLS
Date:           Wed, 29, Apr, 2026
Time:                     21:44:22
--------------------------------------------------------------------
No. of Equations:         3.00000    BIC:                   -27.5660
Nobs:                     200.000    HQIC:                  -27.7721
Log likelihood:           1960.87    FPE:                7.54892e-13
AIC:                     -27.9123    Det(Omega_mle):     6.80869e-13
--------------------------------------------------------------------
Results for equation realgdp
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const               0.001600         0.001108            1.445           0.149
L1.realgdp         -0.290659         0.169828           -1.711           0.087
L1.realcons         0.676241         0.130914            5.166           0.000
L1.realinv          0.035336         0.026488            1.334           0.182
L2.realgdp         -0.016528         0.173909           -0.095           0.924
L2.realcons         0.307306         0.145211            2.116           0.034
L2.realinv         -0.003448         0.026229           -0.131           0.895
==============================================================================

Results for equation realcons
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const               0.005483         0.000957            5.729           0.000
L1.realgdp         -0.107428         0.146764           -0.732           0.464
L1.realcons         0.270191         0.113135            2.388           0.017
L1.realinv          0.026899         0.022891            1.175           0.240
L2.realgdp         -0.140840         0.150291           -0.937           0.349
L2.realcons         0.244722         0.125491            1.950           0.051
L2.realinv          0.026840         0.022667            1.184           0.236
==============================================================================

Results for equation realinv
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const              -0.021634         0.005757           -3.758           0.000
L1.realgdp         -1.985526         0.882820           -2.249           0.025
L1.realcons         4.298376         0.680530            6.316           0.000
L1.realinv          0.228663         0.137693            1.661           0.097
L2.realgdp          0.084051         0.904035            0.093           0.926
L2.realcons         0.979484         0.754854            1.298           0.194
L2.realinv         -0.082754         0.136346           -0.607           0.544
==============================================================================

Correlation matrix of residuals
             realgdp  realcons   realinv
realgdp     1.000000  0.602058  0.754110
realcons    0.602058  1.000000  0.135463
realinv     0.754110  0.135463  1.000000
คลิกเพื่อดูโค้ดไพธอน
# พล็อต Impulse Response Functions (IRF) เพื่อดูการตอบสนองต่อ Shock
irf = results_var.irf(10)
irf.plot(orth=True)
plt.show()