FM-FTRL 학습·피처·파라미터 정합성 점검
작성 2026-09-19 KST · 근거: heeyong 로그/CSV + 소스 코드 · 조치 코드 반영 후 다음 배포 필요
신규라벨 0 주간 지속
배포 시 표본 72,980→63,830
id.m5 CSV=0 (train/serve 불일치)
id.ret / id.vr 학습·서빙 공통 경로 OK
핵심 판정
“학습 정지”가 아니라 가중치 갱신 정체였습니다(워커·하트비트는 가동).
원인은 (1) 일봉 캐시가 최종봉 날짜를 검사하지 않아 최대 ~7일 동안 옛 봉만 재사용 → 증분 라벨 0,
(2) 매 기동 워밍업이 모델을 replace해 누적 학습을 날림 → 표본 점프,
(3) id.m5는 서빙에만 넣고 학습에는 없어 CSV에 영원히 0.
아래 세 가지를 코드로 수정했습니다. 배포 후 stale refresh·워밍업 생략 로그를 확인하세요.
1. 피처 구성 (현재 설계)
| 키 | 학습 | 서빙(스캔) | 상태 |
price.*/vol.* SAX (잔차·거래량) | ○ | ○ | 동일 encode 경로 |
mkt.reg / thm.bin | ○ | ○ | 컨텍스트 on |
id.ret / id.vr | ○ (OPEN+CLOSE PIT) | ○ (장중 last) | 9/18 이후 CSV에 등장·가중치 학습됨 |
id.m5 (6×5분 수익률) | 없음 | 제거함 | train/serve 불일치 → FM 피처에서 제외. 단기 급등은 dayChange buyScore 가산 |
라벨: 종가 기준 향후 5거래일 ±15% 도달(up15/down15). OPEN as-of 시 id.ret=flat이 절반 — CLOSE PIT가 비-flat 버킷을 학습.
2. 발견된 불일치와 원인
| 증상 | 원인 | 조치 |
09-12~17 newSamples=0 전일(워커는 가동) |
DailyOhlcvCacheService: 메모리/디스크 히트 시 LS 미호출. 디스크 TTL 기본 168h → 최종봉이 멈춰도 캐시 재사용 → 라벨 프론티어 불변 |
최종봉 < 직전 평일이면 stale → LS 갱신. 디스크 TTL 기본 48h |
| 9/18 배포 후 표본 72,980→63,830 · feats 2224→2282 |
기동마다 warmup()이 빈 모델로 재학습 후 replace — 디스크 가중치·누적 표본 폐기 |
training-skip-warmup-if-model-loaded=true(기본): 모델 있으면 워밍업 생략 + 라벨 프론티어만 동기화 |
CSV id.m5 건수 0 |
학습 dailyFeaturesAsOf에 m5 없음 · 서빙만 recentPulse 추가 → 가중치 미생성 |
FM 피처에서 m5 제거(플래그 기본 false). 실행 측 early-surge는 dayChange 유지 |
스캔 이상코드 엔비알모션(0004V0)·디비금융제14호스팩(0004Y0) |
6자리이지만 알파벳 포함 · 종목명 스팩 휴리스틱만으로는 코드 단계 미차단 |
유니버스 제외: 6자리 전 숫자만 허용 |
3. 파라미터 스냅샷 (생산 CSV 2026-09-19)
- feats up/down ≈ 2282 · k=8 · hashBits=0(원문 키)
id.ret 12행 · id.vr 10행 · id.m5 0행
- UP
id.ret=up3 main≈+0.20 · id.ret=dn1 ≈−0.54 — 당일 급등 버킷이 양의 기여
- 9/18 워밍업 직후 PR-AUC UP 0.197 lift 4.2 · DOWN 0.287 lift 13.1 (양호 구간)
4. 잘한 점
- 일봉 SAX + 지수 잔차 + 시장/테마 컨텍스트로 학습·스캔 encode 경로를 공유
- OPEN/CLOSE 이중 PIT로 장중 last-price와 정합을 맞추려는 설계
id.ret/id.vr를 encode 공통부에 넣어 학습 CSV에 실제로 반영됨
- hashBits=0으로 피처 해석·CSV 채널 분리 가능
- 품질 게이트·당일등락 게이트·유동성 게이트 등 실행 안전장치가 학습과 분리되어 동작
5. 부족한 점 (조치 전)
- 일봉 캐시 신선도 부재 → 증분 학습이 “대기”로만 보임
- 배포=전체 재워밍업으로 온라인 학습 연속성 파괴
id.m5 도입이 학습 없이 서빙만 → 무의미한 키·관측 혼란
- 이상코드가 스캔 topUp에 노출
6. 반영한 코드 변경
DailyOhlcvCacheService — stale(직전 평일) 검사 후 LS refresh · TTL 48h
FmftrlTrainingWorker — 모델 로드 시 워밍업 skip + syncLabelFrontiersFromUniverse
FeatureBuilder — FM 피처에서 id.m5 제거
FmftrlUniverseService — 비숫자 6자리 코드 제외
application.yml — training-skip-warmup-if-model-loaded, intraday-m5-features:false, disk TTL 48
7. 배포 후 확인 체크리스트
- 기동 로그:
워밍업 생략 | 기존 모델 유지 (replace 없음)
[DailyOhlcvCache] stale refresh 후 하트비트 newSamples>0 (다음 거래일 EOD 이후 특히)
- 스캔 topUp에
0004* 알파벳 코드 미등장
- param CSV에 불필요한
id.m5 신규 행 없음 · id.ret/id.vr 유지
남은 개선(이번 미포함)
공휴일 캘린더(주말만 스킵 중), 라벨 프론티어 디스크 영속, 분봉 PIT로 진짜 단기 모멘텀 학습.
주간 거래 편중·FM 매도 0은 실행 게이트 이슈로 본 점검과 별도.