콘텐츠로 이동
Data Prep
상세

Henry Hub 천연가스 가격 예측

시계열 분석 및 SVR 기반 가격 예측 프로젝트


개요

학부 과정에서 배운 시계열 분석 방법과 모델링 기법을 실습하기 위해 진행한 사이드 프로젝트. Henry Hub 천연가스 가격의 향후 3개월 추세를 예측하고, 가격 결정 요인을 도출했다. 특히 도메인 지식이 부족한 상황에서 OpenAI를 활용하여 변수 후보군을 탐색한 최초의 시도였다.


문제정의

Henry Hub 천연가스 가격은 북미 및 글로벌 천연가스 시장의 벤치마크로, 발전소 운영 비용, LNG 수출입 전략 등에서 중요한 지표다.

핵심 목표:

  1. 향후 3개월 가격 추세 예측
  2. 가격 결정 요인 도출 (변수 분석)
  3. 예측 정확도 검증 (MAPE)
  4. 변곡점 발생 시점 및 유발 요인 식별

가설설정

예측 가설

천연가스 가격은 경제 지표, 에너지 시장 변수, 계절성, 수급 상황이 복합적으로 작용하며, 시계열적 변화와 상호작용을 학습한 모델로 예측 가능함.

변수 선정 전략 (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 (달러) 약세

가격 급락 구간: - 수입량 급증 - 천연가스 지수 하락 - 달러 인덱스 상승 (강세)


배운 점

  1. OpenAI 활용: 도메인 지식 부족 시 변수 탐색에 효과적
  2. GRA 분석: 비선형 관계, 작은 표본에서 유용
  3. 시차 분석: 변수별 최적 시차 적용으로 예측 성능 개선
  4. 앙상블 효과: SVR 단독보다 Bagging 결합 시 안정성 향상

기술 스택

분류 도구
언어 Python
최적화 Optuna
모델링 scikit-learn (SVR, BaggingRegressor)
분석 pandas, numpy
시각화 matplotlib, seaborn