실험 0006 · 국채선물

앙상블 — 성능이 아니라 선택의 간극을 메운다

0005 의 모델 18종 확률을 다섯 방법 × k 넷으로 섞었다. 멤버와 가중치는 시험연도 이전 성적만 보고 골랐다.

H14 미지지 방법 14종 × 티어 5 단일 최고와 짝지은 McNemar

12개 조합이 단일 최고를 승률로 넘고 McNemar p<0.05 까지 통과했다(최소 p=0.0029). 그런데 사전등록 문턱 셋째 — 차이가 시드 흔들림의 2배를 넘을 것 — 을 하나도 넘지 못해 H14 미지지다. 그래도 이 실험은 값을 했다: 0005 의 0.6065 는 여덟 해를 다 보고 고른 값이고, 정직하게 고르면 2.0%p 떨어진다. 앙상블이 되돌리는 것이 정확히 그 간극이다.

무엇을 물었나

H14 — 0005 의 확률을 섞은 앙상블이 같은 티어의 단일 최고 모델을 넘는가. 0002·0004 에서 "앙상블 재료 없음" 이 두 번 확인됐는데(갈리는 날이 정확히 50:50), 그때는 갈래가 둘뿐이었다. 18종으로 넓혀 다시 본다.

모델을 다시 적합하지 않는다 — 0005 의 워크포워드 확률을 그대로 섞는다. 그래서 이 실험의 결과는 그 확률에 종속이다.

누설 규율 — 이 실험의 전부

앙상블에서 가장 쉬운 자기기만은 전체 성적 상위 k 개를 골라 전체에서 평균하는 것이다. 그것은 시험연도를 보고 멤버를 고르는 사후 선택이다. 그래서 시험연도 Y 의 멤버·가중치는 Y 보다 앞선 연도 성적에서만 골랐고, 첫 시험연도(고를 과거가 없는 해)는 동일가중 전체 평균으로 규칙을 미리 정했다. 스태킹 메타학습기도 Y 이전 자료로만 적합한다.

학습·시험·선택 데이터 — 분할이 두 층이다

이 실험은 모델을 새로 적합하지 않으므로 학습·시험 분할은 0005 에서 그대로 물려받는다. 이 실험이 더하는 것은 세 번째 창 — 멤버와 가중치를 고르는 선택창이다. 선택창은 시험연도 이전만 보고, 시험창과 겹치지 않는다.

물려받은 학습·시험창과 이 실험이 더한 선택창
(가) 0005 의 연도 확장창 — 학습 344일에서 1,693일로 자라고 시험은 그 해 148~210일이다. (나) 선택창 — 시험 2020 은 2019 한 해(178일) 만 보고 멤버를 고르고, 시험 2026 은 일곱 해(1,349일)를 본다. 첫 시험연도(2019)는 고를 과거가 없어 동일가중 전체 평균이라는 규칙을 사전등록으로 미리 박았다. 막대의 일수는 0005 정본 런 산출에서 읽은 값이다.
연도별 멤버 순위 히트맵
T0_core 에서 선택창이 매긴 연도별 순위. 주황 테두리가 그 해의 top2 멤버다. 순위가 해마다 바뀐다 — 2020~2022 는 rf·bag, 2023 부터는 et·rf 다. 여덟 해를 다 보고 하나를 고를 수 없다는 사실이 이 그림이고, 앙상블이 메우는 간극이 정확히 여기다. 이 표는 런이 남기지 않았으므로 같은 규칙을 같은 확률에 다시 적용해 복원했고, 복원한 「직전 연도 최고 단일」 승률이 커밋된 표와 티어 다섯 모두 일치하는 것을 그림을 그리기 전에 확인한다.

무엇을 묶나 — 멤버 모델과 결합 방법

이 실험은 모델을 새로 학습하지 않는다. 앞선 실험(모델 열여덟 종을 티어 다섯에서 돌린 실험)이 남긴 날짜별 확률을 읽어, 여러 모델의 답을 하나로 묶는 방법만 바꿔 가며 잰다. 그래서 두 가지를 먼저 밝힌다: 묶는 대상(멤버)이 무엇이고, 묶는 방법이 무엇인가.

멤버 — 묶이는 모델 열여덟 종

멤버는 계열 여섯으로 나뉜다. 배깅트리(et · rf · bag)는 결정트리 수백 그루를 서로 다른 표본으로 따로 키워 평균낸다. 부스팅(lgb · xgb · hgb · gbdt · ada)은 트리를 순서대로 키우되 다음 트리가 앞선 트리들의 잘못을 고치게 한다. 단일트리 (dt)는 트리 한 그루로, 앙상블이 얼마나 버는지 재는 바닥이다. 커널·거리(svm_rbf · svm_lin · knn)는 피처 공간에서 가까움을 재서 답한다. 선형·확률 (log · lin · ridge · enet · gnb)은 피처의 가중합 하나로 답한다. 신경망 (mlp)은 32칸·16칸 은닉층 두 개를 쌓은 다층 퍼셉트론이다. 각 모델의 구조도(학습된 모델 객체에서 그린 실제 분기·층·계수)는 모델 열여덟 종 실험의 상세 페이지에 있다.

앙상블이 이득을 보려면 멤버끼리 서로 다르게 틀려야 한다. 그래서 아래 결과에 쌍 예측 일치율을 함께 싣는다 — 두 모델이 같은 날 같은 방향을 고른 비율이다. 일치율이 1 에 가까우면 묶어도 새로 얻을 것이 없다.

결합 방법 다섯

결합 방법 — 같은 날 같은 멤버에게서 어떻게 하나의 답을 만드나. k 는 쓰는 멤버 수이고 2·3·5 를 모두 시험했다.
이름무엇을 하나왜 다른가
avg_topk 상위 k 모델의 확률을 평균내고 0.5 를 넘으면 상승으로 낸다. 확신이 센 모델의 극단값이 평균을 끌 수 있다.
wavg_topk 같은 평균인데 직전 연도 승률에서 0.5 를 뺀 값을 가중치로 쓴다. 과거에 잘 맞힌 모델의 표가 더 무겁다. 가중치도 이전 연도만 보고 만든다 — 시험연도를 쓰지 않는다.
vote_topk 확률을 버리고 방향에만 투표한다. 상승·하락 표를 세어 많은 쪽으로 낸다. 동수면 그날의 적응 상수 기준선을 따른다. 극단 확률의 영향을 받지 않는다.
family_one 계열마다 그 계열에서 가장 높은 모델을 하나씩 뽑아 확률을 평균낸다. 성적 대신 다양성을 먼저 본다 — 같은 계열 여럿이 몰려 한쪽으로 쏠리는 것을 막는다.
stack_logit 모델 열여덟 개의 확률을 그대로 입력으로 받아 로지스틱 회귀를 한 번 더 적합한다(메타학습기). 가중치를 사람이 정하지 않고 데이터에서 배운다. 대신 배울 것이 많아 표본을 더 요구한다 — 이전 연도 표본이 200일 미만이면 건너뛴다.

어느 모델이 「상위 k」인지는 시험연도 이전 연도의 성적으로만 정한다. 시험연도 성적을 보고 고르면 그 순간 답을 미리 본 것이 되고, 앙상블이 좋아 보이는 것은 실력이 아니라 누설이다. 같은 이유로 스태킹의 메타학습기도 이전 연도 확률로만 적합한다.

결과

티어별 최고 앙상블 — 정본 results/20260922_142912_ensemble/.
티어정직한 단일최고 앙상블승률누적틱McNemar p (b:c)
T0_core0.5805avg_top20.6005+6370.0029 (63:33)
T1_flow340.5678vote_top20.5915+4850.0108 (66:39)
T4_daily0.5925vote_top20.5979+6410.4797 (53:45)
T5_all0.5766vote_top30.5968+5310.0117 (50:27)
T6_nan0.5972vote_top20.6012+6930.6063 (50:44)
사전등록 문턱 셋 (protocol.md §5) — 하나라도 어긋나면 미지지다.
문턱결과
(a) 단일 최고를 승률로 넘는다통과 — 21개 조합
(b) 짝지은 McNemar p < 0.05통과 — 그 중 12개
(c) 차이 > 시드 흔들림 2배전부 실패 — 최대 차이 2.0%p 대 문턱 13.8%p

(c) 가 이렇게 센 이유는 시드 흔들림을 그 티어의 최대값으로 잡았기 때문이다(T0_core 0.0692 — 부스팅 계열 하나가 크게 흔들린 값). 실제로 앙상블에 들어가는 상위 2~3 모델의 흔들림은 0.012~0.024 다. 문턱 정의가 보수적이었다 — 그 사실을 적고 기준을 사후에 고치지 않는다.

앙상블이 메우는 것

정직한 선택·앙상블·사후 최고 비교
회색이 직전 연도 성적으로만 고른 단일 모델, 파랑이 최고 앙상블, 주황이 여덟 해를 다 보고 고른 사후 최고다. 파랑이 주황에 닿는 티어(T0_core·T6_nan)가 이 실험의 관측이다.

T0_core 에서 사후 최고 0.6005, 정직한 단일 선택 0.5805, avg_top2 0.6005 — 앙상블이 사후 최고와 같은 자리에 정직하게 도달한다. 즉 앙상블은 성능을 만드는 것이 아니라 "어느 모델이 좋을지 미리 모른다" 를 없앤다.

쌍 예측 일치율 — 재료가 있었는가(사전등록 상한 0.95).
티어모델중위최소최대
T0_core180.6860.5130.945
T1_flow34180.6950.4970.935
T4_daily180.6790.4350.932
T5_all170.6930.5540.937
T6_nan60.7990.6750.941

중위 0.68~0.80 이라 재료는 있었다. 0002·0004 에서 없던 이유는 갈래가 둘뿐이었기 때문이고, 18종이면 서로 다른 날 틀린다.

방법 사이의 차이

방법별 중위 승률(티어 다섯).
방법중위방법중위
vote_top20.5960wavg_top30.5825
vote_top30.5919stack_logit0.5820
vote_top70.5912avg_top50.5819
vote_top50.5905wavg_top50.5819
avg_top20.5905avg_top70.5775
wavg_top20.5872family_one0.5752
wavg_top70.5845avg_top30.5832

다수결이 대체로 최고다 — 확률 평균은 한 모델의 극단 확률에 끌리는데 다수결은 그것을 한 표로 누른다. 가중 평균은 단순 평균보다 낫지 않다 (연 190일에서 승률 차 대부분이 잡음이다). stack_logit 은 멤버 간 상관 때문에 계수가 흔들리고, family_one 은 다양성을 강제하느라 약한 계열(선형 0.52~0.54)을 반드시 들여 평균을 끌어내린다.

한계

0005 확률에 종속이다. 그쪽이 시드 3개를 이미 평균했으므로 앙상블 안에서 시드 다양성을 쓰지 못했다.

② 멤버 재선택이 연도 경계에서만 일어난다. 더 잦은 재선택은 표본이 하루 1행인 문제에서 잡음을 좇는다.

③ 문턱 (c) 의 정의가 보수적이었다. 판정은 미지지로 남긴다 — 기준을 결과 뒤에 고치는 것이 더 나쁘다. 다시 설계하려면 새 사전등록 (0007)이 먼저다.

④ 스태킹의 확률 보정은 하지 않았다. 로그손실은 내지 않았다.

산출물

  • 사전등록protocol.md
  • 분석·판정analysis.md
  • 정본 런results/20260922_142912_ensemble/
  • 입력(0005)experiments/0005_flow_api_model_zoo/