Henry Hub 천연가스 가격 예측¶
시계열 분석 및 SVR 기반 가격 예측 프로젝트
개요¶
학부 과정에서 배운 시계열 분석 방법과 모델링 기법을 실습하기 위해 진행한 사이드 프로젝트. Henry Hub 천연가스 가격의 향후 3개월 추세를 예측하고, 가격 결정 요인을 도출했다. 특히 도메인 지식이 부족한 상황에서 OpenAI를 활용하여 변수 후보군을 탐색한 최초의 시도였다.
- 수행 기간: 학부 과정 (사이드 프로젝트)
- 블로그: Henry Hub 천연가스 가격 예측
- 분석 도구: Python, Optuna, scikit-learn
문제정의¶
Henry Hub 천연가스 가격은 북미 및 글로벌 천연가스 시장의 벤치마크로, 발전소 운영 비용, LNG 수출입 전략 등에서 중요한 지표다.
핵심 목표:
- 향후 3개월 가격 추세 예측
- 가격 결정 요인 도출 (변수 분석)
- 예측 정확도 검증 (MAPE)
- 변곡점 발생 시점 및 유발 요인 식별
가설설정¶
예측 가설¶
천연가스 가격은 경제 지표, 에너지 시장 변수, 계절성, 수급 상황이 복합적으로 작용하며, 시계열적 변화와 상호작용을 학습한 모델로 예측 가능함.
변수 선정 전략 (OpenAI 활용)¶
도메인 지식이 부족한 상황에서 OpenAI를 활용해 변수 후보군 탐색
- 공급 측: 천연가스 생산량, 수입량, 시추 활동 지표
- 시장 가격: WTI/Brent 원유, BCOMNG 지수, 환율(DXY), CPI/PPI
- 경제 선행 지표: CLI, Fed Fund Rate, S&P 500
데이터¶
타겟 변수¶
- Henry Hub 천연가스 가격 (월별)
주요 특성 (26개 최종 선별)¶
| 변수 | 설명 |
|---|---|
| BCOMCL_INDX | Brent 원유 지수 |
| BCOMNG_INDX | 천연가스 지수 |
| Fed_Fund_Effective_USA | 미국 기준 금리 |
| Natural_Gas_Rotary_Rig_Count_USA | 천연가스 시추 장비 수 |
| DXY_INDX | 달러 인덱스 |
| Natural_Gas_Total_Consumption_USA | 미국 천연가스 소비량 |
시계열 특성¶
- 2004~2009년: 급격한 가격 상승/하락 반복
- 계절성: 1~3월, 11~12월 가격 상승 (난방 수요)
분석/모델링¶
1. 변수 선정 프로세스¶
상관관계 분석
# 시차 상관 분석 (최대 12개월)
def calculate_lag_correlation(df, target_col, max_lag=12):
result = {}
for col in df.columns:
correlations = []
for lag in range(0, max_lag + 1):
shifted = df[col].shift(lag)
corr = df[target_col].corr(shifted)
correlations.append((lag, corr))
best_lag, best_corr = max(correlations, key=lambda x: abs(x[1]))
result[col] = {"best_lag": best_lag, "best_corr": best_corr}
return pd.DataFrame(result).T
GRA (Grey Relational Analysis) - 비선형 관계 파악 - 불확실성 있는 변수 처리 - 작은 표본에서 의미 있는 관계 추출
2. 파생 변수 생성¶
- 이전 달 값 (lag 1)
- 전월 대비 증감률 (pct_change)
- 3개월 이동 평균 (Rolling Mean)
3. 모델링: SVR + Bagging¶
from sklearn.svm import SVR
from sklearn.ensemble import BaggingRegressor
import optuna
def objective(trial):
C = trial.suggest_float("C", 0.1, 100, log=True)
gamma = trial.suggest_float("gamma", 1e-4, 0.1, log=True)
epsilon = trial.suggest_float("epsilon", 0.01, 1.0)
svr = SVR(kernel="rbf", C=C, gamma=gamma, epsilon=epsilon)
bagging_model = BaggingRegressor(estimator=svr, n_estimators=10)
bagging_model.fit(X_train_scaled, y_train)
y_pred = bagging_model.predict(X_train_scaled)
return mean_absolute_percentage_error(y_train, y_pred)
study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=50)
모델 선택 이유: - SVR: RBF 커널로 비선형 관계 학습 - Bagging: 과적합 방지, 예측 안정성 확보 - 데이터셋 규모가 작아 계산 효율적
4. 예측 방식: Rolling Mean¶
# 3개월 순차 예측
for step in range(3):
pred = model.predict(x_input)[0]
preds.append(pred)
x_input[0, -1] = pred # 예측값을 다음 입력으로
결과¶
모델 성능¶
- 학습 MAPE: 0.0409 (약 4%)
- 주요 추세 예측 가능
- 급등/급락 구간에서 보수적 예측
변곡점 분석¶
가격 급등 구간: - BCOMNG 지수 동반 상승 - 천연가스 수입량 감소 - DXY (달러) 약세
가격 급락 구간: - 수입량 급증 - 천연가스 지수 하락 - 달러 인덱스 상승 (강세)
배운 점¶
- OpenAI 활용: 도메인 지식 부족 시 변수 탐색에 효과적
- GRA 분석: 비선형 관계, 작은 표본에서 유용
- 시차 분석: 변수별 최적 시차 적용으로 예측 성능 개선
- 앙상블 효과: SVR 단독보다 Bagging 결합 시 안정성 향상
기술 스택¶
| 분류 | 도구 |
|---|---|
| 언어 | Python |
| 최적화 | Optuna |
| 모델링 | scikit-learn (SVR, BaggingRegressor) |
| 분석 | pandas, numpy |
| 시각화 | matplotlib, seaborn |