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.py — run_chart_obs_synth(): 슬라이스 →
관찰1~5 순차 호출(파싱: ## observation 서술 항상 확보 + 구조 필드 보조) → synth_in 조립 → 종합자 → D2_chart_judge 호환 envelope.
- 재배선 step_loop_d2to6.py: D2 stage agent 칸 chart-judge→chart-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.jsondocs/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.md→D1_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.md→D1_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.md→D1_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영역 완성
- 사이징/손절/목표가는 차트 역할 아님(제외 확정)