실험 0006 · 국채선물

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

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

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

세 줄 요약

  1. 12개 조합이 단일 최고를 승률로 넘고 McNemar p<0.05 까지 통과했다(최소 p=0.0029).
  2. 그런데 사전등록 문턱 셋째(차이가 시드 흔들림의 2배를 넘을 것)를 하나도 넘지 못해 H14 미지지다.
  3. 그래도 이 실험은 값을 했다: 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/