콘텐츠로 이동

Topic: 3-4월 백테스트 (단일포지션·매도사인 점수화)

상태: 🔄 진행 중 (S346 — D7 rank aggregation 완성 + 리포트 품질 개선, RS편중 해소) 기간: 2026-03-01 ~ 2026-04-30 (영업일 43일) Last Updated: 2026-06-04 (S346)

S346 진행 (D7 rank aggregation 재설계 + 리포트 품질 — ✅ 완료)

Status: ✅ 완료 (6/02 LLM 검증, RS편중 해소 입증)

배경: S345 PM 지적 — "차트게이트 + RS×2.5 가중치합산"이 RS편중 유발(SKAI 약점3축인데 1등).

(1) D7 rank aggregation (M1~M6): - PM결정4: 결손=중간순위 / 거래대금폴백 불필요(top_amount200, SKAI절대133위) / RS=rs_high 1축통합 / EA panel selected만 백필. - rank축 5개 동등(rs_high·실거래대금·수급·재료·펀더) Borda 순위합, 차트게이트 전제, sector_flow정합=selector LLM 정성. - 신규 turnover_axis.py, score_compose 재작성(_borda_ranks), build_d7 sector_flow 주입, schemas D7Input.sector_flow. - 검증(6/02 LLM0): SKAI 1→7등(거래대금12·재료10.5·실적7 약점 반영), 두산로보(20.0)·삼성전자(22.0) 1·2등.

(2) 리포트 품질 (PM 6지적 + 추가): - A truncate: utils.truncate_at_sentence 문장경계 절단(5파일) + market 1400→2500. ★call_agent 호출전 output삭제(LLM이 파일있으면 스킵하던 구조결함). - B 서술품질: 4 synthesizer "지표→해석" 작성원칙+PM 4예시. - C D3/D4/D5 빈 섹션 제거(서술 D2 흡수, raw z값 행동정보 없음 — PM 확인). - 6/02 재생성: selected=두산로보 순위합20, 6지적 전부해소(시장=자금이동/차트=점화동의/재료=젠슨황 구조위이벤트/펀더=가속후감속). final_score N/A→순위합 표기.

Output: docs/work_logs/2026-06-03_S346_d7_rank_aggregation.md, docs/discover/20260602.md(재생성), 계획서 docs/planning/2026-06-03_S346_d7_rank_aggregation_redesign.md.

S344 진행 (전체 파이프 LLM end-to-end 스모크 — 6영역 통합 1회 실행)

S343이 6영역을 원자화했으나 각 축 개별 LLM 검증만 했고 통합 1회 실행은 미실시였음. S344에서 해소.

실행: run_discover.py --date 20260414 --max-universe 2 --pregate-top 2 (T0=4/14 백필 구간, PM 선택). 2종 캡(046970 우리넷·000660 SK하이닉스 — 분기 배선+D7 통합 확인이 목적이라 종목 무관).

결과 — 6영역 분기 전부 발화 + D7 글로빙 통합 1회 실행 확인 (목표 충족): - 전 Phase 실행: T0 → D9(cold skip) → D1 market 6관찰 종합 POSITIVE/MED/support → universe(130→2) → loop D2(5관찰)·D3/D4/D5(raw)·D6(4관찰)·Dnews(2관찰) ×2종 → D7(catalyst Dnews 소스 확인) → D8 → report. - verdict chain 변별: 046970(D2 POS/D5 NEG/D6 UNKNOWN/Dnews NEUTRAL), 000660(D2 NEUTRAL/D6 POS/Dnews UNKNOWN). - D7이 6축 raw+verdict 통합 → selected=046970(final_score 1.607) / runners_up=[] / D+20≈5/13.

★ 스모크가 잡은 실 wiring 버그 1건: _enforce_required가 stale D1_output.md 요구 → ENFORCE FAIL(exit1). S343 D1 재배선이 출력을 D1_macro_judge_output.md로 쓰는데 게이트 상수가 구 macro-judge 파일명 그대로. 콘텐츠 정상, 파일명만 불일치. 수정(run_discover.py:40-45): D1_macro_judge_output.md로 교체 → ENFORCE PASS 검증.

UNKNOWN 2건 = 정상(anti-averaging 작동, 버그 아님): D6 046970(EA panel 196종에 046970 행 부재) / Dnews 000660(뉴스 60일 0건 — 반도체 대표주라 실측 불가 판단). 종합자가 "정보 부재≠나쁜 신호" 분리 처리. → 데이터 커버리지 갭 2건 노출(EA panel 046970 미적재 / news 슬라이스 000660 4/14 0건) — 별건.

work_log: docs/work_logs/2026-06-03_S344_full_pipeline_e2e_smoke.md

S343 진행 (D1 재배선 + sector_flow 백필 + 펀더/재료 원자화 — 6영역 완성)

S340~342의 차트·시장 원자화 패턴(빌더 input → 관찰 원자 → 종합자)을 전 영역으로 확장 완료.

(1) step_d1_macro 정식 재배선: 단일 macro-judge → run_market_obs_synth(관찰6+종합자). S341 chart 재배선 패턴. build/envelope 경로 불변 → D7 무변경. report _section_d1 envelope 우선.

(2) sector_flow 43영업일 백필: fetch_sector_flow --asof 모드 추가(look-ahead 차단, quarter_cutoff 식 ETF 종가). sector_flow_backfill.py로 3/03~4/30 전구간. 관찰5 결손 해소(4/14 LEADING 9 / 3/31 DOWNTREND 4).

(3) 가격 기반 축 차트로 수렴 (PM 통찰 연쇄): D3 상대강도·D4 테마(RS·정점)·D5 OF는 전부 가격/상승률 비교축 = 차트 성격 → judge 폐기, raw 점수축(stock_rs_z/theme_bonus/ofm_cvd_z)만 유지. of_verdict/theme_verdict 제거.

(4) 펀더 원자화 + 빌더 5결함 수정 (PM "실데이터 검증"): fund-obs-* 4관찰 + fund-synthesizer. 빌더 결함(metric net→op, look-ahead 미차단→quarter_cutoff, ea_z_cs None→cross-section z 사전계산, ea_qoq 미사용, vintage 컬럼명, winsorize ±10) 수정. weight 폐기→verdict 파생. 멀티에이전트 리서치(영업이익 EA).

(5) 재료 원자화 (PM "차트 선별 종목의 재료를 찾는다"): news-obs-* 2관찰(재료존재·유형 / 구조성) + news-synthesizer. build_dnews_input(종목별 뉴스 cutoff + 사업맥락). 정식 stage(Dnews) D7 통합. 선반영 제외(차트 몫), 구조성 4축(지속·해자·가격전가·독과점) 평가. catalyst_score verdict 파생 폴백.

검증: 각 축 LLM 실호출 변별 확인(미래에셋/삼천당, 047040/178320, 000150 구조성). 전체 파이프 LLM 스모크는 미실시(S344).

work_log: docs/work_logs/2026-06-02_S343_d1_rewire_sector_backfill.md

S342 진행 (시장상황 영역 원자화 — 6관찰 + 종합자 + 누적 보강)

차트 템플릿(관찰 원자 + 종합자 + slice + 검증) 재사용. PM 조율로 자금이동 비대화·누적 결손 교정.

누적 보강 (PM "변화와 누적"): ChangeSet(변화)만 있고 d20 한 점이 출렁임/추세 구분 못 함 발견. - schemas.CumulativeFlow(build_5d/20d·accel·dir_consistency_20d) + _cumulative_flow() 빌더. deriv 5 + fx 5 산출. - 검증: KOSPI200 d20=-3333→consistency 0.55(출렁임 정직)+build_5d +2233(최근 순증). VKOSPI/BASIS accel 가속 변별.

6관찰 분할 (PM 확정): 위험환경/심리·변동성/자금이동①fx/자금이동②cot/자금이동③섹터/국내파생. - 자금이동 3분리(출발 fx/큰손 cot/도착 섹터 — 출처·시간축·누적깊이 상이). 국내파생 독립(S317: basis 7/7 한국 -8.6d 선행). - 미국 VIX→심리, SPY옵션→큰손으로 sector_flow 분할. context(메타)→종합자만.

산출: slice_market_obs.py, market-obs-*.md 6 + market-synthesizer.md(verdict=자금흐름방향+우호도), steps/market_obs_synth.py(run_market_obs_synth).

검증 (PM 제안 — verdict ↔ 종목 결과 교차): sector_flow 과거 백필 안됨→관찰5 결손, 5관찰 종합. - 미래에셋 4/14(진입정답+60%) → POSITIVE/MED risk_on_overheat / 삼천당 3/31(붕괴) → NEGATIVE/MED stress - 누적이 verdict 가름(USD build_5d+72,697 accel 3.17). 국내선행 vs 미국큰손 시간축 해소. 엔캐리 한국선행 포착.

★ PM 교정 — 시장=방향결정자 X, 심리 기울기 O (종목 일별 시계열 옆 시장평가 나란히 검증): - 시장은 종목 방향을 안 정함(방향=D2 차트). 시장은 종목 신호의 표현 확률을 기울임. - 받침우호(lev HIGH·VIX↓·CONTANGO)=하단 받칠 심리↑→조정 얕고 추세지속(미래에셋 4/16 -2.1%인데 clv유지→62k). - 차익압력(VIX↑·BACKWARDATION)=빨리 차익 심리↑→clv 무너지고 되돌림(미래에셋 3/27 +15%→3/31 -10.5%, clv 0.91→0.09). - 시장이 망가진 종목 못 살림(삼천당 4월 받침전환에도 회복X)=방향결정자 아님. S317/S309 측정과 정합. - 반영: synthesizer verdict="받침(POSITIVE)/차익(NEGATIVE) 기울기"로 정정 + psych_tilt 필드. D7은 종목신호 곱셈 가중치(방향합산 X).

★ PM 교정 2 (타임프레임 통일): 차트 cum_delta·시장 CumulativeFlow는 이미 5/20일·|d5|/|d20| 일치. 섹터 flow accel만 (d5/5)/(d20/20)=4배 차이 발견 → |d5|/|d20|로 통일. status 라벨 12섹터 전부 불변 검증.

★ PM 교정 3 (거래대금 보강, 완료): sector_flow가 가격 등락만 보던 것 → ETF 거래대금(Close×Volume) amt5_over_20 추가. 실측: 반도체 가격+18% LEADING인데 거래대금 0.83(분배의심) vs 태양광 +20% 거래대금 1.34(진짜쏠림). 가격≠자금량 변별. 관찰5 명세 flow_confirmed/flow_divergent + 종합자 envelope. 기존 5/29 재수집은 백필 시.

work_log: docs/work_logs/2026-06-01_S342_market_atomization.md / 설계: docs/planning/2026-06-01_S342_market_atomization_design.md

S341 진행 (slice/step 정식 통합 — 관찰5 → 종합자)

S340 standalone(수동 슬라이스+호출)을 정식 파이프라인에 배선: - 신규 scripts/discover/steps/chart_obs_synth.pyrun_chart_obs_synth(): 슬라이스 → 관찰1~5 순차 호출(파싱: ## observation 서술 항상 확보 + 구조 필드 보조) → synth_in 조립 → 종합자 → D2_chart_judge 호환 envelope. - 재배선 step_loop_d2to6.py: D2 stage agent 칸 chart-judgechart-obs-synth 마커, run 루프 D2 분기. envelope 경로(D2_chart_judge_{code}.json) 불변 → D7 빌더/스코어 무변경(surgical). - 검증 3/3 통과: ①슬라이스 등가성 standalone과 16/16 비트 동일 ②파싱 헬퍼 + smoke 실호출(구조5필드+서술1765자) ③연속 2종목 정식 경로 — 미래에셋 100790 4/14 POSITIVE/MED, 삼천당 000250 3/31 NEGATIVE/HIGH 정답방향. R4 상충 averaging 금지(미래에셋 bvc↔cvd↔price_reaction 3중 conflicting 명시) + R3 raw 동봉 정식 경로 작동. - 발견(코드 결함 아님): subprocess numpy PATH 의존 — run_py.ps1 래퍼 밖 직접 & python.exe 호출 시 D5 빌더 numpy DLL 로드 실패→D5 결손. 기존 _build_input과 동일 패턴, 운영은 정상. 래퍼 경유 재검증 D5 포함 정답 불변.

work_log: docs/work_logs/2026-06-01_S341_chart_obs_synth_integration.md 검증 자산: scripts/discover/_s341_verify_{slice,parse,integration}.py

S340 진행 (차트/수급 원자화)

PM 지시 흐름: 원자화는 환각·누락 방지(현상 파악, 해석 아님) → 종합은 별도 → 3계층 구조 → 차트/수급부터, 다음 시장·펀더·재료 순. 영역별 같은 패턴(관찰 원자 + 종합자).

완료 — Tier3 차트/수급 관찰 원자 5개 (.claude/agents/discover/chart-obs-*.md): - 관찰1 추세·위치 (trend+trajectory+exceptionality+cum_delta 일봉) - 관찰2 이례일 사건 (exceptional_days, 변동폭+거래대금+당일수급 한 몸) - 관찰3 매물대 (volume_profile) - 관찰4 VSA·캔들 (vsa+candles) - 관찰5 오더플로 (D5 price_reaction 가격대 반응맵 핵심 + cvd_z/bvc 보조) - 공통: 자기 데이터만 / verdict·국면판정 금지(현상 서술만) / envelope 사실필드. 미래에셋·삼천당 양방향 검증 전부 정답방향.

신규 코드: - of_indicators.compute_price_reaction_map() — 가격대별 매수/매도 반응(footprint 근사, clv×거래량). overhead_walls/support_zones. - schemas.D5PriceReactionBlock (D5Input v2), builders/slice_chart_obs.py (D2/D5→관찰 슬라이스) - D5 당일컷 버그수정: <=t0(자정)→<t0+23:59. asof 당일 장중을 미래로 오인해 버리던 버그(look-ahead 아님). D2는 이미 올발랐음.

리서치 (멀티에이전트 종합): TradingAgents(2단 종합·상충 averaging X)/FinCon(위험제어 종합 지배)/MAESTRO(탐색≠종합)/RES(코드집계+LLM서사)/lost-in-middle(이중요약 손실). 5대 계층 규칙 도출.

다음 (S341): - ★ Tier2 차트/수급 종합자 — 관찰1~5 → 영역 verdict + 상충 노출 + 핵심 raw 동봉(이중요약 손실 방지). TradingAgents 2단 종합 차용. - 슬라이스/스텝 정식 통합(step_loop_d2to6에 관찰 5호출). - 시장상황→펀더→재료 순차 원자화(차트가 템플릿). - S333 "OF 무용" 판정 D5 버그 영향 재검증(PM 판단).

설계: docs/planning/2026-06-01_S340_{chart_subagent_inventory,three_tier_synthesis_design}.md work_log: docs/work_logs/2026-06-01_S340_{chart_observation_atomization,d5_price_reaction_and_bugfix}.md

목표

S332까지 정비된 discover 파이프라인을 3-4월 데이터로 백테스트. Look-ahead 차단, 단일 보유, 매도사인 점수화 룰.

PM 확정 사양

항목
기간 2026-03-01 ~ 2026-04-30
종목풀 OHLCV 가용 270종 (data/backtest/s303/ohlcv)
후보풀 (매일) final_score top 10
매수 매일 rank 1 종목, 미보유 시 T+1 시가 진입
매도 sell_score ≥ 60 발생 시 T+1 시가 청산 (시간청산 X)
동시 보유 1종
뉴스 축 제외 (catalyst_z = 0 마스킹)
비교군 (a) 같은날 미선택 top9 평균/중위 (b) KOSPI

점수 산식

buy_score (D7 final_score 그대로, catalyst만 마스킹)

buy_score = stock_rs_z + accel_z + ofm_cvd_z_z + 0(catalyst) + ea_z
          + theme_bonus
          + chart_verdict + of_verdict + theme_verdict + ea_verdict
          (D1 매크로 NEG시 selected=None 게이트)

sell_score (6축 동등 가중, z-합 → 0~100 스케일)

측정
1. 차트 균형 회귀 (역) -chart_verdict_t (분배·균형회귀 강도)
2. IMB resolving imbalance-dynamics generating→resolving 전환
3. 분배 형상 overheat-detector 강도 (CONFIRMED=강)
4. 매도우위 OF (역) -of_verdict_t (CVD/매도압력)
5. 매크로 위험자산 불리 (역) -d1_macro_score
6. RS 하향 (역) -stock_rs_z_t

→ 각 축 z-normalize → 평균 → 50 + 평균10 (0~100 스케일링) → 임계 60*.

데이터 소스 (확보 완료)

  • data/backtest/s303/ohlcv/*.parquet — 270종 일봉 2021-07-01 ~ 2026-05-29 ✅
  • data/backtest/e4_portfolio/daily_state.parquet — 종목×날짜 15,532행 ✅
  • 이미 산출된 컬럼: chart_score, state, phase_label, cycle_position, OF 게이트(buy_intent/buy_pres/sell_pres/exh/cvd_div/cvd_slope), POC/VAH/VAL, best_state, best_theme, best_rs_60d, best_rs_5d
  • 기간: 2026-02-20 ~ 2026-05-22 — 3-4월 완전 커버
  • data/backtest/e4_portfolio/bench_kospi.parquet — KOSPI 벤치 NAV ✅

→ 추가 데이터 수집 없이 백테스트 가능.

엔진 구조 (신규)

파일: scripts/backtest/s333_single_pos_walk.py

1. 로드: daily_state.parquet + ohlcv 270종 + bench_kospi
2. 영업일 루프 (T = 2026-03-01 ... 2026-04-30):
   a. 미보유 상태:
      - daily_state[date=T]에서 종목별 buy_score 산출
      - top 10 추출 → selected = rank 1
      - T+1 시가로 매수 (없으면 다음 거래일)
      - 동시 진입 buy_score, 비교군 9종 진입가 기록
   b. 보유 상태:
      - 보유종목 sell_score[T] 산출
      - sell_score >= 60 → T+1 시가 매도, 비교군 종료가 기록
3. 산출:
   - data/backtest/s333/trades.parquet (진입/청산/수익률/비교군)
   - data/backtest/s333/nav.parquet (포트 NAV vs KOSPI vs 비교군 평균)
   - data/backtest/s333/summary.json
   - docs/work_logs/2026-05-30_s333_backtest_mar_apr.md

Look-ahead 차단

  • daily_state.parquet은 종목×날짜 사전계산이지만 각 행은 해당 일자 close 기준 룩백으로 산출됨 (look-ahead 없음).
  • 진입가는 항상 T+1 시가 (T일 close 시점에 sell_score=60 확인 → 다음날 시가 청산).
  • 비교군 수익률도 동일 T+1 시가~청산 T+1 시가 구간으로 계산.

산출 위치

  • scripts/backtest/s333_single_pos_walk.py (엔진)
  • data/backtest/s333/{trades, nav}.parquet, summary.json
  • docs/work_logs/2026-05-30_s333_backtest_mar_apr.md

결정 로그

일시 항목 결정
2026-05-30 13:15 universe 80종 → top 10 후보풀 너무 좁히지 않게 top 10 (5/7/10 중 선택)
2026-05-30 13:17 매도 임계 60점 (50/60/70 중 중립)
2026-05-30 13:19 sell 가중치 6축 동등 (별도 가중치 없음)
2026-05-30 13:19 buy_score 정의 D7 final_score 그대로, catalyst=0 마스킹 (뉴스 제외)
2026-05-30 13:25 데이터 소스 e4_portfolio/daily_state.parquet 재활용
2026-05-31 02:11 정본 코드만 v6 결과 NAV 2.146 (+114.6%), 알파 +100.7pp, rank 단조성 확인
2026-05-31 03:11 D5 OF 30분봉 전용 + D2 일봉 OF 제거 OF 본질(POC+흡수)는 일봉 프록시 불가 — D2OFDailyBlock/compute_orderflow_daily/S317 OF 신호 폐기
2026-05-31 03:36 차트 × OF 결합 가설 (v11) bullish 안 OF 강화/약화 차이 +0.12pp → PM "분배 의심" 가설 기각
2026-05-31 03:42 선제 감지력 검증 결론 v8~v12 모두 선제 X. cvd_z_chg_60bar UP_start vs DOWN_start p=0.95. PM: "차트로 선제 확인 불가하면 차트는 볼 필요 없음 → 다른 영역 리서치 후 작업"
2026-05-31 12:30 변동성 레짐 (v13d) 방향무관 변동성 AUC 0.67(일봉5년), 방향 0.53 불가. 예측력 원천=변동성군집(atr_ratio)
2026-05-31 17:00 v13l 정정 "하루 갱신 rho 0.66"은 look-ahead 착시. 엄밀히 하면 가격 파생 지표 방향예측력 모두 0.5 수렴
2026-05-31 17:30 입력 방식 결함 발견 "차트 alpha 없음"의 진짜 원인=D2Input이 스냅샷+절대값+분절. PM: 변화·에너지·특별함을 분절없이 에이전트에 제공해야
2026-05-31 17:40 D2Input 3종 구현 trajectory/energy/exceptionality 추가, schema_version 2. 삼천당붕괴 vs 미래에셋 구분 검증
2026-05-31 18:25 차트 역할 재정의 차트=방향예측기 X, "이상탐지+조사대상지목" 도구. 전제①사람들이 봐야(거래대금 게이트) ②값=사람들 반응(돌파=용인). 종목선정=불균형 유지가능성+재료·수급 에너지 결합, 이어지는 사건
2026-05-31 18:50 S335 chart-judge 프레임 완성+검증 4프레임(거래대금게이트/이례성트리거/반응해석/3질문) chart-judge.md 반영. 실호출 2종: 삼천당 NEGATIVE(거부) vs 미래에셋 NEUTRAL(용인) 구분 성공. 에이전트가 Spring 함정 간파+분기시나리오 작성
2026-05-31 19:40 S336 이어지는 사건 데이터 + 질문 원자화 PM 교정: 거래대금 게이트는 절대임계 X(상위 파이프라인이 이미 함) → chart-judge에서 제거. exceptional_days(이례적인 날 시퀀스, 가격+30분봉 OF 수급+후속반응) schema_v3 구현. 원자질문 A1~A8. 실호출: 미래에셋을 3막극(붕괴→분배실패→재점화)으로 서술, late_session이 일봉 못보는 막판분배 포착
2026-05-31 20:50 S337 연속 판단 생애주기 검증 (양방향) 미래에셋(상승28일) 진입@38,900→+60.4%, 삼천당(하락16일) 24일 미보유 자본보존. 같은 프레임으로 정반대 종목 정반대 판정. 진입 가른 핵심축=late_session(일봉 못보는 30분봉 신호). 미래데이터 차단·전일판정 첨부 연속성 작동
2026-05-31 21:10 S337 필드 전수점검 + A그룹 버그수정 PM 지적("나머지 정보·나쁜정보vs정보부족"). 40필드 중 결정력 6개 집중. in_lvn 로직버그(poc_bin<median=항상False) 수정→4/14진입일 True 변별 발생. va_position·strength·age 제거. l2_scenario·spring은 함정(룰과 실전 충돌, S338 정리)
2026-05-31 22:10 S338 상대화 + 드리프트 노출 late/cvd를 자기평소 대비(late_vs_self·baseline_late_median). 미래 baseline -70=상시분배 입증. PM 지적 "어제3배면 내일도 3배 늘 수 없다"→base60 17→1531억(88배) 드리프트 확증, amt_eok(절대)+base60 노출로 에이전트 교차보정(PM #14)
2026-05-31 22:40 S338 structure 통째 제거(계산버그) PM "버그냐 정상이벤트냐" 조사→전부 버그: swing이 신고가 상한가일을 None/LH_LL로, l2가 폭락일에 transition 오발화, accel 분모음수서 부호뒤집힘(+3.87%인데 -9.32). PM "라벨 빼고 raw로 판단"→파이프라인 7곳 연쇄 제거. pre-gate가 버그값으로 종목 줄세우던 것도 range_pos로 교체
2026-05-31 22:55 S338 국면별 지표 유효성 매핑 PM "어떤 데이터가 진입판단에 도움되나+어떤 국면에서 켜지나". ablation 3종목: C그룹은 신고가권(미래·SK) 장식이나 깊은조정후반등(090360)에선 verdict 가름(NEUTRAL→NEGATIVE, overhang 0.01=머리위 매물벽). PM "깊은조정 반등은?"이 표본편향 지적. 진짜무용=spring_count 하나. "지표는 국면마다 켜진다" 가이드 추가
2026-06-01 00:00 S339 차트 에이전트 계층 통합 PM "차트 하위에이전트 설정 확정". 조사: D2만 검증됨, C10 chartist·imbalance-* 4Layer 미검증(mtf_profiler API의존). mtf asof 래퍼로 과거검증 가능케 함. 전지표 ablation: cum_delta(4/14 충돌 "전환초입" 해소)·상위TF방향(초입/후기 위치교정)·vsa_events(no_demand stale 간파) 유효→D2Input 흡수. evr(r²<0.5)·fvg(0개)·journey(부실)·sr(중복) 폐기
2026-06-01 00:10 S339 계층 폐기 — D2 단일화 PM "층위 나눌 필요 있냐, 지표로 쓰면 되잖아"(정확). imbalance가 의미있던 건 계층이 아니라 cum_delta 지표. 유효지표 chart_indicators.py 이식(schema_v6), C10·imbalance 4Layer deprecated. 최종검증: D2 단일이 별도 3에이전트 판단을 한 reasoning에 종합(PM #14: 코드=재료, 에이전트=판단)
2026-06-02 S343 D1 재배선 + sector 백필 macro-judge 단일 → market-obs 6관찰+종합자(run_market_obs_synth). fetch_sector_flow --asof 백필 43일(look-ahead 차단). 관찰5 결손 해소
2026-06-02 S343 가격축 차트 수렴 (PM 연쇄통찰) "상대강도=상승률 아니냐"→"테마정점=수급·상승률 아니냐". D3 RS·D4 테마·D5 OF 전부 가격 비교축=차트 성격 → judge 폐기, raw 점수축만. of/theme_verdict 제거. verdict축은 차트·실적·재료만(가격 환원 불가)
2026-06-02 S343 펀더 빌더 5결함 (PM "실데이터 검증") "계산 정확한지 먼저"→실데이터 점검: metric net(우연)→op, look-ahead 미차단(미발표 분기 사용 버그)→quarter_cutoff, ea_z_cs None→cross-section 사전계산, ea_qoq/vintage 컬럼명, winsorize. 멀티에이전트 리서치=영업이익 EA. weight 폐기→verdict 파생
2026-06-03 S343 재료 원자화 (PM "차트 선별 종목 재료") 범용 뉴스 X → 종목별 재료 빌더(뉴스 cutoff+사업맥락). 선반영 제외(차트 몫). 구조성 4축(지속·해자·가격전가·독과점). 정식 stage(Dnews) D7 통합. discover 6영역 원자화 완성
2026-06-03 S344 전체 파이프 e2e 스모크 PASS run_discover.py --date 20260414 1회(2종 캡). 6영역 분기 전부 발화 + D7 글로빙 통합(catalyst Dnews 소스) 확인. wiring 버그 1건 검출·수정: _enforce_required stale D1_output.mdD1_macro_judge_output.md(S343 재배선 파일명). UNKNOWN 2건은 anti-averaging 정상동작
2026-06-04 S346 D7 rank aggregation (PM "RS×2.5 가중치합산이 RS편중") 가중치합산→Borda 순위합 5축 동등(rs_high·실거래대금·수급·재료·펀더). PM결정4: 결손=중간순위/거래대금폴백불필요(주도주 조정저점 worst159위<200)/RS=rs_high 1축통합/EA selected만. 차트게이트 전제, sector_flow정합=selector LLM. 검증 SKAI 1→7등, 두산로보 1등
2026-06-04 S346 call_agent 구조결함 (PM "실행할때마다 있으면 실행안할꺼 아니야") call_agent가 output 안지우고 LLM호출→LLM "파일있고 스키마충족"으로 스킵(D2 재호출 실패 실증). 호출직전 output+.md 삭제로 근본수정. 모든 재실행/재시도에 영향이던 결함
2026-06-04 S346 리포트 서술품질 (PM "지표 날것 말고 해석") A truncate 문장경계절단(글자수 중간절단 버그). B 4synthesizer "지표→해석" 작성원칙+예시(시장=자금이동/차트=상황판정/재료=본질/펀더=추세). C D3/D4/D5 빈섹션 제거(raw z값 행동정보 없음, D2 흡수). 6/02 재생성 6지적 해소

진행 결과 (S333 v1~v12)

v 핵심 결과
v6 정본 indicator + score_compose, LLM X NAV 2.146, 알파 +100.7pp
v7 RS 4 카테고리 신호 발화율 cvd_z>1/bull_str>bear_str 작동, in_lvn/absorption/spring/wick_ratio/transition 가짜
v8 전환점 -5d→0d + 38↔270 일치 ANOVA 강건 7지표 확인, peak 선제 ❌
v9 OF 단기 변화율 5/20봉 후행 알파 미미
v10 OF 장기 변화율 60/120봉 통계 강함, 후행 역방향
v11 차트 × OF 9-cell 차트만 ±33pp, OF 추가 효과 X
v12 ZigZag segment 추적 UP/DOWN start·end 사후 구분 ⭕, 변화율 선제 X 확정

진행 결과 (S334 v13a~p + 진단 + 구현)

S334 16회 검증이 "차트 alpha 통계로 있나"를 따지다 진짜 원인=입력 패키지 결함 발견. - v13a~h: 변동성/선물/공격성/맥락 — 가격 파생 지표 방향 alpha 모두 0.5 수렴 (look-ahead 엄밀 시) - v13d: 방향무관 변동성 레짐 AUC 0.67(방어 도구), 방향 0.53. 하락추세 반등 5회 반복. - v13l: rho 0.66은 look-ahead 착시(정정). v13o: 힘빠짐 시점 cvd로 RESUME/REVERSE 구분(p<0.0001, 효과 작음). - v13p: if-then 시나리오기 → PM "코드로 모든 시나리오 못 짠다, 에이전트가 판단" - 구현: D2Input schema_version 2 — trajectory(5일궤적)/energy(상승률×거래대금)/exceptionality(평소대비) - 차트 역할 재정의: 방향예측기 X → 이상탐지+조사대상지목. 자세히 docs/work_logs/2026-05-31_S334_inflection_volatility_research.md

Status

🔄 S344 완료 — 전체 파이프 LLM end-to-end 스모크 PASS. run_discover.py 1회(20260414, 2종 캡)로 D1(market 6관찰)·D2(chart 5관찰)·D3/D4/D5(raw)·D6(fund 4관찰)·Dnews(재료 2관찰) 분기 전부 발화 + D7 글로빙 통합(catalyst Dnews 소스) 확인. 스모크가 실 wiring 버그 1건 검출·수정(_enforce_required stale D1_output.mdD1_macro_judge_output.md). UNKNOWN 2건은 anti-averaging 정상동작(버그 아님). 6영역 원자화(S340~343)가 통합 실행에서도 작동 검증 완료. (이전 S343: 6영역 원자화 완성 / S342: 시장 / S340~341: 차트)

진행 결과 (S335 — chart-judge 프레임 완성)

차트 역할 재정의를 chart-judge.md에 4프레임으로 반영: 1. 거래대금 게이트 (liquidity_gate) — amount_pctile/vol_vs_self로 "사람들이 보는가" 판정, WEAK시 신뢰↓ 2. 이례성 트리거 (investigation_trigger) — amount_pctile≥0.9/ret_vs_atr≥2.5 → 조사대상 지목 3. 반응 해석 (reaction_read) — 돌파=용인/거부=비싸다/소화=대기 4. 3질문 사고절차 + next_branch(다음 갈림길, 단정예측 금지)

실호출 검증: 삼천당 000250(3/31)=NEGATIVE/거부 vs 미래에셋 100790(4/14)=NEUTRAL/용인 구분 성공. 같은 고가권·이례성인데 trajectory로 정반대 판정. 에이전트가 Spring 함정 간파 + 분기 시나리오 작성. 산출: data/backtest/s335/d2_*.json. 상세 work_log §S335.

진행 결과 (S336 — 이어지는 사건 데이터 + 질문 원자화)

PM 교정 2가지로 재설계: 1. 거래대금 게이트 = 절대임계 X (상위 universe+RS+테마가 이미 종목 걸름) → chart-judge에서 제거 2. 본질 = 데이터 가공 + 질문 원자화 (인간 트레이더가 차트에서 읽는 패턴을 raw로 펼치고 자동 판단)

구현: exceptional_days(자기 대비 거래대금 급증일 시퀀스, top-8/6개월) — 각 날에 시고종저+clv+ 30분봉 OF 수급(close_vs_vwap/intraday_cvd/late_session/가격대별거래%)+후속반응(next3d/10d) 동봉. is_today 플래그(오늘 행 항상). schema_v3. 코드는 구간화·라벨·신선도 판정 안 함(PM #14). chart-judge에 원자질문 A1~A8(이날무슨일/종가사수/지지/눌림목/돌파거부/거래량동의/오늘국면/재점화). OF는 가용 65일(2/13~5/22)만, 그 밖 과거 사건은 일봉 clv만(of_available=false).

실호출 검증: 삼천당=NEGATIVE/distribution/resolving vs 미래에셋=POSITIVE/re_ignition/continuing. 미래에셋을 3막극(파라볼릭붕괴→막판분배실패→재점화)으로 서술 = "이어지는 사건" 작동. late_session이 일봉 못 보는 막판분배 포착(03-27 clv 0.82인데 late -87→next10d -14.1%). 설계서 docs/planning/2026-05-31_S336_chart_event_context_design.md.

진행 결과 (S337 — 연속 판단 검증 + 필드 점검)

PM 요구: "평범→수급증가→급등→진입/이탈 전 과정을 미래데이터 차단 연속 판단 가능한가." - 양방향 검증: 미래에셋(상승 28일) 4/14 진입@38,900→+60.4%, 삼천당(하락 16일) 24일 미보유 자본보존. 같은 프레임(거래대금×clv×cvd×late 동의판정)으로 정반대 종목 정반대 판정. 진입 가른 핵심축=late_session. - 필드 전수점검(PM "나머지 정보·나쁜정보vs정보부족"): 40필드 중 결정력 6개. A(데이터부족)/B(나쁜정보)/C(무용의심) 구분. - A그룹 버그수정: in_lvn 로직버그(poc_bin<median=항상False) 수정, va_position·strength·age 제거. - 상세 work_log docs/work_logs/2026-05-31_S337_continuous_judgment_validation.md, 설계서 docs/planning/2026-05-31_S337_judgment_atomization.md

진행 결과 (S338 — 상대화 + structure 버그제거 + 국면별 지표 매핑)

PM 연쇄 지적으로 4가지 완수: 1. B1 상대화 — late/cvd를 자기평소 대비(late_vs_self/baseline_late_median/cvd_vs_self). schema_v5. 미래 baseline_late_median -70=상시 분배종목 입증. 3/27 late -87은 vs_self -0.24(평소수준=천장해석 과대), 4/22 late +82 vs_self +2.14(상위11%=이례 흡수). _daily_micro_baseline() OF가용 전체일 분포. 2. 드리프트 노출(PM "어제3배면 내일도 3배 늘 수 없다") — base60 17→1531억(88배), 12/18 vs_self 25.6 vs 4/22 vs_self 5.0(거래대금 4배 큰데). amt_eok(절대)+amt_base60_eok 노출로 에이전트 교차보정(PM #14, 판정 X). 3. structure 통째 제거(PM "버그냐 정상이벤트냐") — l2/swing/accel/break 전부 계산버그: swing이 신고가 상한가일(4/14 +29.9%)을 None/LH_LL로, l2가 폭락일(-10/-18%)에 transition 오발화, accel 분모음수서 부호뒤집힘 (4/06 +3.87%인데 -9.32). PM "라벨 빼고 raw로" → 파이프라인 7곳 연쇄 제거(schema/indicator/builder/pregate/ score/loop/report+chart-judge.md). pre-gate가 버그값으로 종목 줄세우던 것도 range_pos로 교체. 4/22 재호출 검증: 손실 없이 개선. 4. 국면별 지표 유효성 매핑(PM "어떤 데이터가 도움되나+어떤 국면에서 켜지나") — ablation 3종목(C그룹 빼고/넣고):

케이스 유형 C그룹 verdict 변화
미래에셋 3/25 사건성급등 ❌ POSITIVE/MED 동일(장식)
SK 4/14 완만추세 ❌ NEUTRAL/MED 동일(장식)
090360 4/8 깊은조정후반등 NEUTRAL→NEGATIVE(overhang 0.01=머리위 매물벽)

→ C그룹(overhang/poc_dist)은 신고가권 장식이나 바닥반등권 결정타. 신고가권만 봐서 "장식"이라 한 건 표본편향 (PM "깊은조정 반등은?"이 정확히 지적). 진짜 무용은 spring_count 하나(4국면 거짓발화). 나머지는 국면 의존. chart-judge.md에 "지표는 국면마다 켜진다" 가이드 추가(사건성→clv/cvd/late, 완만→range_pos/매물대, 조정반등→overhang/poc_dist). - 상세 work_log docs/work_logs/2026-05-31_S338_field_regime_mapping.md

진행 결과 (S339 — 차트 에이전트 계층 통합, D2 단일화)

PM "차트 하위에이전트 설정 확정" → 차트 분석을 D2 chart-judge 단일 에이전트로 통합: 1. C그룹 확장검증: 깊은조정후반등 3종목(090360·065680·204270) 전부 C그룹(overhang/poc_dist)이 verdict/conf 가름. S338 발견 표본 1→3 견고화. 065680(데이터결손)에서 D2가 "판별불가→D5 재판정 권고" 정직. 2. 조사: D2만 검증됨. C10 chartist·imbalance- 4Layer는 mtf_chart_profiler(Kiwoom API)의존이라 과거 재현 불가→미검증. mtf asof 래퍼(_s339_mtf_asof.py)로 parquet 백테스트 가능케 함. 3. 전 지표 ablation 검증* → 흡수 vs 폐기:

흡수(유효) 근거 폐기(무용) 근거
cum_delta_5d/20d/accel 4/14 충돌(5d+/20d-) "전환초입" 해소 evr_residual r² 5종목 0.003~0.37 전부<0.5
상위TF tf_monthly/weekly/alignment "초입 아닌 후기"(위치교정)·오판방지 fvg_list 5종목 전부 0개
vsa_events no_demand "돌파4일전 stale" 간파 journey.phases phase None 부실+중복
overhang/poc(이미 D2) 바닥반등 결정타 sr_levels / HH·break_stage overhang중복·swing버그

30분봉VP→D5, 주체귀속(외인/기관)→sentiment 이관(차트 아님). 4. 계층 폐기: PM "층위 나눌 필요 있냐, 지표로 쓰면 되잖아"(정확). 유효지표 chart_indicators.py 이식 (_cum_delta_and_events·_higher_tf_direction, schema_v6). C10·imbalance- 5개 deprecated 표시. 최종검증: 100790 4/14 v6 단일패키지 → D2가 cum_delta+상위TF+vsa_events+매물대+사건시퀀스를 한 reasoning에 종합. 별도 3에이전트 판단을 D2 하나가 동등 수행(PM #14). 5. ★ PM 단서 (S339 말미): 이 D2 통합은 데이터·지표 검증용 임시다. PM 원칙 "1에이전트=1질문=1답변" — 한 에이전트가 차트 여러 질문을 관장하면 강한 신호로 결론 내고 약한 질문(매물대·델타)을 흐릿하게 넘긴다. 최종은 차트 질문을 원자 에이전트로 분리(sector-analyst→sector/ 처럼 차트 메인이 원자 하위 거느림). 흡수한 지표는 코드 산출물로 유지, 그걸 해석하는 질문을 원자로 나눔. 폐기한 C10/imbalance(중복계층)와 원자분리(역할별)는 다른 개념. 사이징/손절/목표는 차트 역할 아님(제외). - 상세 work_log docs/work_logs/2026-05-31_S339_chart_layer_consolidation.md

Next Steps (다음 세션, S347)

S347 우선순위 (S346 후속)

  • 다른 날짜 robustness — S346 검증은 6/02 1일. 다른 날 전체 파이프 재실행으로 rank·서술 안정성 확인.
  • call_agent output 삭제 회귀 점검 — evening 등 다른 사용처가 누적 출력에 의존하지 않는지 1회 e2e 확인.
  • 037560 등 메타 결손 종목 — stock_name·D4 None. universe 메타 적재(별건).
  • discover_pipeline_followups 잔여 — E(today_d1_verdict 자동주입)/F(OHLCV 데일리)/G(chart_warning)/H(C2·C3 자동).
  • 백테스트 라이브뉴스 구조결함(S345 갭2) — 백테스트가 과거 뉴스 미제공. Dnews 시계열 소스 필요.

(구) S345 우선순위 — 완료 (S345/S346에서 처리)

  • 데이터 커버리지 갭 2건 (스모크가 노출, 별건):
  • EA panel(196종)에 046970 등 중소형 종목 미적재 → universe 종목별 D6 UNKNOWN 빈발 가능. EA panel universe 확장 검토.
  • news 슬라이스가 4/14 시점 000660(반도체 대표주) 0건 → 뉴스 빌더의 과거 시점 수집 커버리지 점검(self-report도 미보고).
  • 30종 운영 규모 스모크 1회 — 2종 스모크는 배선 확인용. EA cross-section z(2종에선 퇴화 0/2)· pregate 변별·D7 runners_up 경합이 실 운영 규모에서 정상인지 1회 더 확인(비용 고려, PM 승인 시).

S345 차선 (보류)

  • D7(Tier1) 종합 점수합산→자연어/하이브리드 전환 검토 (전영역 영향, PM 별도 승인)
  • D7 점수화 today_phase·fund_destination·구조성(durability/moat) 반영 / 백테스트 재실행 alpha
  • 데드코드 정리: step_loop _call_judge(STAGES 전부 분기로 도달 불가, 헬퍼만 참조) — PM 판단
  • S333 "OF 무용" 판정 D5 당일컷 버그 영향 재검증 / S334 방향 선행성 — 미착수

S344 — 완료

  • ✅ 전체 파이프 LLM end-to-end 스모크 PASS (6영역 분기 + D7 글로빙 통합)
  • ✅ wiring 버그 수정: _enforce_required D1_output.mdD1_macro_judge_output.md

(구) S340~343 — 완료

  • 차트 원자화: S340 관찰5+종합자, S341 slice/step 정식 통합 (chart_obs_synth)
  • 시장 원자화: S342 관찰6+종합자+누적 보강 (market_obs_synth)
  • S343: D1 재배선 + sector 백필 + RS/테마/OF judge 폐기(가격축 차트 수렴) + 펀더·재료 원자화 = 6영역 완성
  • 사이징/손절/목표가는 차트 역할 아님(제외 확정)