본문으로 건너뛰기
JSL107's Tech Note
돌아가기

미선택 종목까지 남기는 스크리닝 원장 설계

5분 분량이 글 고치기
목차 · 4

모의투자에서 스크리닝 규칙을 평가하려면 매수한 종목뿐 아니라 선택 직전의 후보 집합과 당시 상태도 남겨야 해요. 이번 변경에서는 미선택 종목까지 같은 축에서 비교할 수 있도록 스크리닝 결과를 별도 원장으로 설계했어요.

매수 기록만으로는 규칙을 평가할 수 없다

모의투자 시스템은 매일 수천 개 종목을 스크리닝해요. 규칙을 통과한 종목 가운데 상위 일부를 추천 프롬프트에 넣고, 모델이 매수하기로 한 종목은 주문 원장에 저장해요.

문제는 모델에게 보여줬지만 매수하지 않은 종목이에요. 주문으로 이어지지 않으니 어떤 원장에도 기록이 남지 않았어요. 스크리닝을 수행하는 유스케이스는 통과 목록과 규칙 버전을 반환했지만 이를 저장할 구조가 없었고, 회차가 끝나면 당시 후보 목록도 함께 사라졌어요.

이 상태에서도 “매수한 종목이 이후에 올랐는가”는 확인할 수 있어요. 하지만 다음 질문에는 답할 수 없어요.

스크리닝 규칙의 품질은 선택한 종목의 절대 성과만으로 판단하기 어려워요. 선택 효과를 따로 보려면 같은 회차에서 제외한 종목과 비교해야 하는데, 미선택 종목이 사라지는 기존 구조에는 이런 대조군이 없었어요.

회차와 후보를 분리해 기록한다

이번 변경의 핵심은 스크리닝 결과를 주문 여부와 관계없는 별도 원장으로 만드는 거예요. 저장 구조는 스크리닝 회차 원장과 노출 후보 원장으로 나눴어요.

스크리닝 회차 원장은 한 번의 스크리닝 회차를 나타내요. 후보 목록을 만든 규칙 버전처럼 회차 전체에 공통으로 적용되는 정보를 담아요.

노출 후보 원장에는 해당 회차에서 실제로 추천 프롬프트에 노출한 종목을 기록해요. 한 회차에 포함된 후보를 각각의 행으로 저장하고 종목별 순위와 점수도 함께 남겨요.

개념적인 구조는 다음과 같아요.

스크리닝 회차 원장
└── 노출 후보 원장
├── 순위
├── 점수
└── 지표 스냅샷

회차와 종목을 분리하면 같은 실행 맥락을 중복해서 저장하지 않으면서 후보별 당시 상태를 추적할 수 있어요. 이제 주문 생성 여부는 후보를 기록하는 조건이 아니에요. 모델이 매수하지 않았더라도 프롬프트에 노출된 종목은 스크리닝 원장에 남아요.

현재 값이 아니라 당시 지표를 남긴다

종목 식별자와 순위만 저장해서는 충분하지 않아요. 나중에 최신 지표를 다시 조회하면 스크리닝 당시 모델이 확인한 조건과 달라질 수 있기 때문이에요.

각 노출 후보 기록에는 순위와 점수뿐 아니라 당일 지표도 스냅샷으로 저장했어요. 이 스냅샷은 “현재 이 종목의 상태”가 아니라 “그 회차에서 이 종목을 평가했을 당시의 상태”를 보존해요.

지표 형식은 주문 원장과 비교할 수 있도록 통일했어요. 매수 종목은 주문 원장에 있고 전체 노출 후보는 노출 후보 원장에 있으므로, 양쪽의 지표 구조가 다르면 비교할 때마다 별도로 변환해야 하거든요. 같은 형식으로 저장하면 매수 여부와 관계없이 동일한 분석 축을 적용할 수 있어요.

한 회차의 후보를 주문 원장과 연결하면 다음 두 집단을 같은 기준으로 나눌 수 있어요.

여기에 종목별 당시 순위·점수·지표 스냅샷과 이후 성과를 결합하면 실제 선택과 선택하지 않았을 경우를 비교하는 counterfactual 분석의 기반이 마련돼요.

선택과 미선택을 같은 축에서 비교한다

이번 변경으로 스크리닝 결과는 일회성 반환값이 아니라 분석할 수 있는 원장이 됐어요. 매수 주문만 남기던 구조에서 벗어나 모델에게 보여준 후보 전체를 회차 단위로 복원할 수 있게 됐어요.

이제 다음 분석을 수행할 수 있는 기반이 마련됐어요.

다만 이 변경이 규칙의 성능 향상을 증명한 것은 아니에요. 이번 변경의 의의는 성과에 대한 결론을 내렸다는 데 있지 않고, 그 결론을 검증할 데이터를 보존하기 시작했다는 데 있어요. 실제로 규칙이 개선됐는지는 이후 성과 데이터와 연결하고 회귀 검증을 수행한 뒤에야 판단할 수 있어요.

모의투자에서도 주문 원장만으로는 의사결정 과정을 온전히 설명할 수 없어요. 선택한 결과뿐 아니라 선택 직전의 후보 집합과 당시 상태도 함께 남겨야 해요. 그래야 “무엇을 샀는가”를 넘어 “무엇을 보고 무엇을 버렸는가”까지 검증할 수 있어요.


이 글 고치기
이 글 공유하기:

이전 글
LLM 응답 형식을 JSON Schema로 강제한 이유