Skip to content

Repository files navigation

🎮 PocketQuant

Gotta Money 'Em All

포켓몬 리그 우승엔 강한 포켓몬 하나만으로는 부족하다. 타입 상성, 역할 분담, 밸런스를 고려해 최적의 파티를 구성해야 한다.

투자도 마찬가지다.

PocketQuant는 포켓몬 파티 구성을 포트폴리오 최적화 문제로 재해석하여, 최적의 트레이딩 전략 조합을 탐색하는 실험 프로젝트다.

PocketQuant — 최강의 트레이더가 되어라

비공식 팬메이드 학습 프로젝트입니다. 닌텐도 · 게임프리크 · The Pokémon Company와 무관하며 비상업적입니다.

📈 실데이터(yfinance) 백테스트 기반입니다. 각 전략을 실제 시장 국면의 QQQ(나스닥100) 가격으로 백테스트하고, 라이벌 '성실이'(DCA) 대비 종료 잔고로 줄세웁니다. (투자 자문 아님 — 학습용)


🧩 컨셉

게임 용어 실제 의미
포켓퀀트 1마리 시그널 1개
트레이더 / 전략 시그널을 운용하는 모델
파티 포트폴리오
체육관 (6개) 시장 국면 (regime)
체육관 도전 백테스트
종료 잔고 (선발 화폐) 100만원 시드 → 끝 잔고, 라이벌 성실이 대비
스탯 (HP/ATK/DEF/SKILL) 성과 지표(현금비중/CAGR/Calmar/샤프) — 리포트 표시 전용
라이벌 '성실이' DCA 봇 — 매일 같은 금액을 묵묵히 사 모으는 녀석 (수수료 0원, 슬리피지는 전원 공통 적용)
돼지저금통 '전부 현금' 기준선(금리 0%) — 투자자 현타 담당: 저축왕은 3% 이자라도 받지, 얘는 진짜 0%다 (그리고 최적화의 숙적, 봉인 3회)
어플삭제단 공정 B&H 기준선 — 300명이 각자 랜덤 진입일에 풀매수하고 어플 삭제(존버). 중앙값 단원 = '아무 날에나 산 평범한 존버러'.
저축왕 은행 기준선 — 연 3%(CMA/자유적금) 무위험 복리. 낙폭 0이라 방어 스탯 만점 착시가 있어 순위표엔 미참가, 표시 전용
빅토리 로드 (OOS) 검증용 연도 시험 — 2026-07-02 감사 전까지 교과서 재료와 겹친 누수 이력이 있어 시즌2·3 판정은 격하, 현재 코드는 교과서에서 제외
사천왕 post-COVID hold-out — 빅토리 로드 다음 관문. v2에서 개봉돼 이제 오염됨 (최종 판정은 미래 데이터로)
챔피언 결정전 사천왕 다음 순서 — 시즌4에 난천이 나올 차례
배틀 프론티어 챔피언 결정전 이후 엔드게임 — 할 짓 없는 놈들이 도는 평행세계 운빨 스트레스 테스트
아카데미 합성 평행세계 훈련소 — 블록 부트스트랩 가상장에서 훈련 후 실QQQ 졸업시험 (v2 운영)
교배 · 진화 전략 탐색 옵티마이저 (다목적 최적화 — 현재 NSGA-III)

🎯 이 프로젝트가 풀고 싶은 문제

목표는 단순하다 — 돈을 많이, 그리고 꾸준히 벌고 싶다.

문제는 "가장 강한 전략 하나"가 환상이라는 것. 최강의 포켓퀀트는 있어도 모든 시장 국면을 다 이기는 포켓퀀트는 없다 — 닷컴을 막는 방어가 상승장에선 짐이 된다.

그래서 찾는 건 영웅 한 마리가 아니라 어떤 국면이 와도 안 무너지고 돈을 불리는 운용이다. 잣대는 화려한 백테스트가 아니라 라이벌 '성실이'(DCA 봇) — 매일 수수료 0원으로 묵묵히 사 모으는 녀석 — 을 길게 이기는가. 좋을 때만 반짝하고 위기에 녹는 전략은 데려갈 이유가 없다.

🧭 방법은 안 가린다 — Gotta Money 'Em All. 국면을 모르니 전략 집합으로 헷지하든(다목적 Pareto), 국면을 읽어 그때그때 전문가를 투입하든(레짐 스캐너), 유전 알고리즘이든 NSGA-III든 RL이든 — 더 잘·더 안정적으로 버는 도구면 뭐든 갈아끼운다. 특정 알고리즘·전략에 갇히면 큰 흐름을 놓친다. (시즌3.5 현재 단일 챔피언은 미지목. 탐색 정식화: OPTIMIZATION.md)


🧬 포켓퀀트 14마리 (시그널) — 스타팅 6 + 야생 8

전략은 아래 유전자를 조합해 만들어집니다. 각 유전자는 실제 지표 로직으로, 가격을 받아 그날의 포지션(0~1, 1=풀매수·0=현금) 또는 기권을 만듭니다.

타입 유전자 로직 (포지션)
💧 위험회피 DD 드로다운 스탑 — 고점 대비 −10% 넘게 빠지면 현금화
💧 위험회피 VOL 실현변동성 레짐 — 평온=탑승 / 중간=반반 / 격동=현금
🔥 추세순응 MA 가격 > 200일 이평이면 탑승
🔥 추세순응 MOM 모멘텀 — 최근 ~3개월 수익률이 양수면 탑승
🌿 역발상 REV_RSI 이벤트형 — RSI(14) < 30 과매도 투매면 매수 의견, 평소엔 기권
🌿 역발상 REV_BB 이벤트형 — 볼린저 하단밴드 아래 과대 낙폭이면 매수 의견, 평소엔 기권

전략 포지션 = 그날 의견 낸 유전자들의 평균 (기권 제외). 이벤트형(REV)은 평소 벤치에 앉아 있다가 투매가 터진 날만 출전합니다 — "의견 없음"이 "현금 가라"로 집계되던 함정(잉어킹 강제 출전 문제)을 막는 규칙. 전원 기권한 날은 현금(0)입니다.

야생 8마리 — 가격 외 정보원

스타팅 6마리는 모두 가격 기반이라 자산-횡단 알파엔 한계. 가격 외 정보원으로 야생 8마리:

타입 유전자 외부 정보원 로직
📊 자산-내부 VOL_SPIKE 거래량 (yfinance) 평균 20일 대비 2.5배 폭증 + 음봉 = 매수 의견
😱 S&P 공포 FEAR ^VIX 공포지수 VIX > 30 = 역발상 매수 의견
😱 나스닥 공포 FEAR_NQ ^VXN 나스닥 변동성 VXN > 47 = 역발상 매수 의견 (2001년~)
💵 글로벌 US10Y ^TNX 10년 금리 60일 평균 대비 -0.5%p 이상 하락 = 매수 의견
💰 글로벌 DXY UUP (Invesco DXY ETF) 60일 평균 대비 +1.5% 상승 = 방어 의견 (현금 0)
🏦 글로벌 SPY_TLT SPY + TLT TLT/SPY 비율 60일 평균 대비 +1% = 채권 강세 → 방어
🚀 자산-횡단 QQQ_SPY QQQ + SPY 비율 60일 평균 위 = 성장주 우위 → 매수
🏭 자산-횡단 QQQ_DIA QQQ + DIA 비율 60일 평균 위 = 테크 vs 다우 가치 우위 → 매수

모두 이벤트형 (발동일만 의견, 평소 기권). 외부 데이터 없는 시기(UUP 2007년·VXN 2001년 이전)는 자동 NaN 기권.

트레이더 이름은 데려간 포켓퀀트 조합으로 자동 생성됩니다(새 캐릭터가 아니라 표기). 시즌3의 임시 왕좌는 NSGA-1차-t2426였지만, 2026-07-02 감사와 시즌3.5 clean 재시험 뒤 정식 챔피언 지위는 보류했다. 시즌3.5는 잣대별 왕관만 남기고 단일 챔피언을 지목하지 않는다.


💱 매매 방식 (어떻게 사고파나)

신호가 뜨면 "전부 사고/판다"가 아니라, 매일 "주식을 몇 % 들고 있을지(비중)" 를 정해 거기에 맞춥니다.

  • 각 유전자가 매일 비중을 뱉습니다: 1.0=풀매수 · 0.0=전부 현금 · 0.5=반반 · 기권=의견 없음
  • 전략 비중 = 그날 의견 낸 유전자들의 비중 평균 (기권은 제외, 전원 기권이면 현금)
  • 매일 그 비중으로 리밸런싱 (비중이 그대로면 보유, 바뀌면 그만큼만 사고팜)
  • 사고판 금액에는 수수료 0.1% (토스증권 미국주식 기준)를 차감
  • 슬리피지No-trade band는 시즌 3 비용 모델 필수 계약이다. 현재 기본값은 슬리피지 1bp + No-trade band 5%다.
그날 수익 = (어제 비중) × (오늘 QQQ 등락)

예) 어제 50% 들고 있었는데 오늘 QQQ +2% → 내 자산 +1%. 현금 부분은 이자 0%. 신호는 종가로 확인하고 다음 날 반영합니다 (미래를 미리 안 보게 하루 lag = 룩어헤드 방지).

⚠️ 단순화된 시뮬레이션입니다 — 수수료 0.1%와 플랫 슬리피지 1bp, No-trade band 5%는 반영하지만 세금·환율은 0, 소수점 주식 가능, 현금 이자 0% 가정. "어느 전략이 어느 시대에 강한가"를 비교하는 연구 도구이지 실거래 권유가 아닙니다.

🔒 학습 게이트: cost_model.complete=True가 있는 산출물만 유효합니다. 2026-06-22 기존 학습 산출물은 슬리피지·No-trade band 미반영으로 무효 격리했습니다.


🏟️ 체육관 6개 (졸업시험)

각 체육관은 실제 역사적 기간이며, 그 기간의 QQQ 가격으로 백테스트합니다 (훈련 자산 = 실투자 자산. difficulty/volatility는 연출용 메타데이터 — 실제 난이도는 가격이 직접 만듭니다).

체육관 관장 기간 성격
🕸️ 2000-02 닷컴 붕괴 버블 (고스트) — "꿈은 공짜였지. 꿈값은 아니었고." 2000-03 ~ 2002-12 갈아내리는 긴 하락(-83%), 가짜 반등 연타 → 역발상엔 칼날 잡기 지옥
💀 2008 금융위기 리먼 (강철/어둠) — "버틴다고? 시스템이 무너지는데?" 2008-01 ~ 2009-06 연쇄 청산 대폭락(-49%) → 방어형 천국, 공격형 지옥
🌅 2009-10 회복장 불사조 (불꽃/비행) — "겁쟁이는 내 등에 못 탄다." 2009-03 ~ 2010-12 바닥에서 수직 상승(+101%) → 겁먹고 내리면 반등을 통째로 놓침
🦠 2020 코로나 급락 브이 (전기) — "눈 깜빡이면 끝나 있어." 2020-02 ~ 2020-06 한 달 -29% 후 즉시 풀반등 → 손절한 자가 최대 피해자
🔥 2017 불타입 상승장 황소 (불꽃) — "지루하지? 그게 내 필살기야." 2017-01 ~ 2017-12 출렁임 없는 우상향(+33%) → 방어 비용을 회비처럼 징수
🌫️ 2015-16 횡보장 미로 (에스퍼) — "방향? 그런 건 처음부터 없었어." 2015-01 ~ 2016-12 헛신호 연타로 추세형을 수수료로 말려 죽임 — 시즌3 당시 공격 후보도 약했던 과목

🗺️ 관장 상세 카드(주특기/공략법)는 도감에서: python -m app.pocket.dex

💡 하락 3 / 회복·상승·횡보 3으로 균형을 맞췄다. 한 전략이 여섯 국면을 다 잘하긴 어렵고(이 충돌이 다목적 최적화가 필요한 이유), 트레이더 철학은 나스닥 장기 우상향 베팅, "살을 내줘도 뼈를 취한다".

🔓 post-COVID(2020-07~)는 사천왕(hold-out). 훈련 금지. v2에서 4번째 아레나로 개봉돼 오염됨 — 다음 최종 판정은 미래 데이터로만.

🚨 2026-07-02 감사 정정: 합성 교과서가 한동안 빅토리 로드(OOS) 11년을 원천 재료로 포함했다. 시즌2·3의 "처음 보는 OOS" 주장은 무효로 격하한다. 현재 코드는 교과서 원천에서 victory_road.OOS_YEARS를 제외하고 tests/test_market_boundaries.py로 재발을 막는다.


⚔️ 전투 로직 (백테스트 → 종료 잔고)

1) 유전자들의 일별 포지션(0~1)을 하루 lag 적용해 시장 수익에 곱함 (룩어헤드 방지)
   + 포지션 변화량 × 비용을 차감
2) 체육관 기간 자산곡선 → 종료 잔고 (100만원 시드, battle.terminal_balance)

현재 비용 모델 계약:

  • 수수료: 전략 0.1%/편도, 성실이 0원
  • 슬리피지: 1bp, 성실이 포함 전원 공통
  • No-trade band: 5%, 목표 비중이 아니라 실제 체결 포지션/turnover를 바꾸는 실행 모델
  • cost_model.complete=True가 없는 학습 산출물은 졸업시험·리그 입력으로 사용 금지

선발 화폐 = 종료 잔고 (라이벌 성실이 대비). 모든 층이 같은 단위:

  • 학교 다목적(현재 NSGA-III) = raw 2목적 [중앙 잔고 · 최악 잔고] → Pareto 후보, turnover는 cap 스펙으로 필터
  • 단일목적(CMA-ES·GP) = 잔고 합 max. TPE는 고회전·CMA-ES 대비 무우위로 시즌3 벤치.
  • 리그 4아레나 = 종료 잔고 중앙값으로 줄세움

CAGR·MDD·샤프 raw 지표는 리포트 표시 전용 — 최적화 목적엔 안 쓴다(0~100 클램프 스탯 = '돼지저금통' 퇴화 뒷문, 함정·봉인 상세는 OPTIMIZATION.md §1). 감시: python tests/test_baselines.py (돼지저금통가 하위 25% 밖이면 FAIL).


🤖 라이벌: 성실이 (DCA 봇)

라이벌 성실이는 화려한 기술이 없다. 매 거래일 같은 금액으로 QQQ를 사 모을 뿐이다. 그런데 무섭다:

  • 수수료 0원 (토스증권 '주식 자동 모으기' 기준 — 전략의 타이밍 매매는 0.1% 과금. 비대칭이 현실이다)
  • 슬리피지는 수수료 면제와 별개로 성실이 포함 전원 공통 적용 대상이다.
  • 감정 없음, 뇌절 없음, 자동
  • 급락장에선 싸게 모아서 단순보유를 이기기도 한다 (코로나 체육관: DCA +15.7% vs 단순보유 +13.5%)

battle.fight_dca()가 성실이를 소환하고, score_vs_dca로 라이벌전 점수를 매긴다:

score_vs_dca = 0.4×(수익 차이) + 0.4×(낙폭 개선) + 0.2×(샤프 차이)    # 양수 = 라이벌보다 강함

한 전략이 여섯 국면을 동시에 다 이기긴 어렵다 — 위기를 이기면 상승장에서 보험료를 낸다(robustness ↔ 수익 트레이드오프). 이 트레이드오프를 다루는 길은 둘 — 전략 집합으로 헷지(현재: 다목적)하거나, 국면을 읽어 전문가 투입(레짐 스캐너, 시즌4)하거나. 어느 쪽이든 목표는 성실이를 길게 이기는 것. v2·v3의 우위는 이후 감사에서 검증 독립성이 격하됐고, 시즌3.5 clean 재시험에서는 우위가 근소한 수준으로 줄었다.


🚀 실행

⚠️ 반드시 프로젝트 루트에서 실행하세요. 한글 깨지면 (Windows): $env:PYTHONIOENCODING="utf-8" 의존성: pip install -r requirements.txt (+ NSGA-III용 optuna). 첫 실행만 QQQ 데이터를 받아 data_cache/에 캐시 → 이후 오프라인 동작.

CLI 플래그·중앙 config 파일은 없습니다. 진입점은 어댑터 직접 실행입니다 — 모듈 상수(SEED, TRIALS 등)를 그 자리에서 바꿔 호출합니다.

python -m app.academy.training.season35           # 시즌3.5 one-phase 3교실 스터디 (보충수업 없음)
python -m app.academy.exam.season35               # 시즌3.5 졸업시험 (season35 top30 전용)
python -m app.league.v3.season35_league           # 시즌3.5 리그
python -m app.lab.season.season35_signal_behavior_report  # 시즌3.5 교실별 포켓퀀트 행동 보고서
python -m app.league.v3.season3_league            # 시즌3 리그 재생성
python -m app.pocket.dex                          # 포켓퀀트 도감

app.academy.training.study는 시즌3 2phase(1차+보충) 재현용 레거시 러너입니다. 직접 실행은 기본 차단되어 있으며, 시즌3 재현을 의도할 때만 POCKETQUANT_ALLOW_LEGACY_2PHASE=1을 설정합니다. 시즌3.5 이후 새 학습은 app.academy.training.season35처럼 시즌별 러너를 사용합니다. cost_model.complete=True가 없는 옛 산출물은 졸업시험·리그 입력으로 쓰지 않습니다.

NSGA-III는 nsga3.run_study(...)을 직접 호출합니다(인자 표는 AGENTS.md 참고). tools/e2e.py의 NSGA-III smoke 단계가 그 호출 패턴의 예시입니다.

시즌 v3 결과 (역사 기록) — 비용 모델 완성 + 국면별 리그

시즌3는 슬리피지 1bp + No-trade band 5%를 넣고 다시 학습했다. TPE는 벤치로 보내고 CMA-ES·GP·NSGA-III 3교실만 돌렸다. 리그는 빅토리 로드 (OOS) 11년 → 사천왕 hold-out 순서로, 1차/보충 후보 130명과 어플삭제단 300명 + 기준선 3종을 비교한다. 챔피언 결정전은 시즌4 차례고, 배틀 프론티어는 본선 뒤 엔드게임으로 둔다.

  • 종합 median(100만원 시드): NSGA-1차 117.3만 · CMA-ES-1차 116.4만 · CMA-ES-보충 114.1만 · GP-보충 113.7만 · NSGA-보충 113.5만 · 어플삭제단 112.0만 · 성실이 111.0만.
  • 시즌3 교훈: 애들은 상승장에서 돈을 잘 번다. 하락/횡보를 억지로 잘하게 만들면 상승장 알파를 깎아먹는다. 잘하는 건 잘하고, 못하는 건 출전시키지 않는 쪽이 맞다.
  • 보충수업 평가: GP 보충은 소폭 성공. NSGA·CMA-ES는 보충보다 1차가 종합에서 더 강했다.
  • 국면별 진단: 연 단위 라벨은 상승 추세에 손실 구간이 묻힌다. 일 단위 상승/하락/횡보/변동 카테고리로 쪼개서 봐야 한다.
  • 하락장 평단가 분석: NSGA-1차는 하락장 당장 잔고는 아파도 다음 상승장 대비 바겐세일 줍줍을 잘했다. 횡보장은 저축왕이 땡큐, 변동장은 바닥형/휩쏘형/조정형으로 더 쪼개야 한다.

자세한 결과·국면별 PNG 박스플랏은 season3_league.md. 하락장 평단가 진단은 season3_bear_accumulation.md.

시즌4 방향: Regime Scanner 오버레이. 상승장에는 공격 트레이더, 하락장은 NSGA/DCA식 적립 후보, 횡보장·모르겠음은 저축왕. 변동장은 바닥형인지 휩쏘형인지 먼저 가른다.

시즌 3.5 결과 (현행 기준 기록) — 깨끗한 v1 교과서 one-phase 리그

시즌3의 교과서 원천 누수와 보충수업 부작용을 분리하기 위해, v1 라벨 교과서로 보충수업 없는 one-phase 재학습을 따로 열었다. 입력 산출물은 season35_top30_20260705_122609_v2.json이며, CMA-ES 30명·GP 5명·NSGA 30명이 리그에 출전했다.

  • 종합 median(100만원 시드): NSGA 113.3만 · CMA-ES 113.1만 · 어플삭제단 112.0만 · GP 111.6만 · 성실이 111.0만.
  • 해석: 시즌3.5는 깨끗한 재시험으로도 어플삭제단·성실이 중앙값을 근소하게 이겼다. 다만 시즌3처럼 월등한 격차는 아니어서, 시즌3의 누수/보충/구성 효과가 성적을 크게 부풀렸다고 본다.
  • 챔피언 판정: 단일 챔피언은 지목하지 않는다. 학습 후보 65명 기준 왕관 7개 중 GP=5·NSGA=1·공석=1이지만, GP는 표본 5명이라 30시드 재확인 전까지 통계 우연 여부를 열어 둔다.
  • 행동 분석: 공통 실전 스로틀은 VOL. 세일 매수 쪽은 FEAR·REV_RSI·REV_BB, NSGA는 VOL_SPIKE를 더 강하게 섞었다. 크로스에셋은 상위권에서 보조무기로 쓰였고, FEAR_NQ는 남길 만한 후보지만 이번 clean 학습에서는 FEAR가 더 넓게 채택됐다.
  • 교훈: 시즌3 보충수업처럼 약점을 억지로 먹이다가 장점을 깎는 경로는 중단한다. 다음 새 학습은 one-phase를 기본으로 하고, 출전 판단은 별도 오버레이에서 다룬다.

자세한 리그 결과는 season35_league.md. 교실별 매수/매도 기준 분해는 season35_signal_behavior.md. 명예의 전당 기록은 hall_of_fame_v3.5.md.

시즌 v2 결과 — 아카데미 부트스트랩 리그

블록 부트스트랩 합성장에서 훈련 → 실QQQ 6체육관 졸업시험 → 빅토리 로드 (OOS) 11년 → 사천왕 hold-out에서 비교. 배틀 프론티어(평행세계 200)는 본선 뒤 엔드게임 진단으로 본다. 합/불 졸업 게이트는 없다 — 교실별 점수 상위 top30 전원을 출전시켜 어플삭제단 300 + 기준선 3종과 분포로 견준다.

  • 챔피언 = NSGA-t5938 (US10Y 32% + QQQ_SPY 27% + QQQ_DIA 15% + REV_RSI 15%, 크로스에셋 성장 틸트). 챔피언 본인: 빅토리 로드 (OOS) 11년 1,252만 · 사천왕 824만.
  • 핵심 잣대 = 긴 실데이터 두 곳 (중앙값, 100만원 시드 기준). NSGA 교실이 공정 B&H(어플삭제단 300명)를 둘 다 이겼다 — 봉인했던 구간에서까지:
    • 빅토리 로드 (OOS) 11년: NSGA 1,242만 vs 어플삭제단 1,205만 (CMA-ES 1,222 · TPE 1,212 · GP 1,137)
    • 사천왕 hold-out: NSGA 819만 vs 어플삭제단 780만 · 성실이 768만 (CMA-ES 793 · TPE 777 · GP 726)
  • 시험장 모범생 ≠ 실전 강자. 합성 체육관·평행세계 중앙값은 TPE 1위지만 긴 실데이터에선 NSGA·CMA-ES에 밀린다. GP는 30명이 한 답 복붙(std 0) + 장기 실데이터 약체로 벤치.
  • 알파는 운빨 천장이 아니라 분포 중앙값 싸움 — 어플삭제단의 max(럭키 진입)는 여전히 더 높다.

자세한 결과·박스플랏은 hall_of_fame_v2.md.

⚠️ 사천왕 봉인 해제 = 오염. 이번 전면 재경기로 post-COVID 구간이 top30 전원에게 노출됐다. "1회용 깨끗한 시험지" 지위는 끝 — 이 결과를 보고 가중치를 다시 만지면 반칙이다. 다음 최종 시험지는 지금부터 쌓이는 미래 데이터다.


🏆 리그 시스템 (검증 프로토콜)

체육관 점수는 인샘플(이미 본 시험지)이다. 진짜 실력은 리그에서 가린다.

🪙 단, 관문은 사형장이 아니다 — "상폐가 아니면 뒤진 게 아니다" (트레이더 슬로건). 못 통과한 트레이더는 죽는 게 아니라 벤치로 간다: 명단은 DB에 보존되고, 시장에 있는 한 복리는 일하고 있으며, 다음 리그/관문에서 재도전한다. 관문이 정하는 건 "누가 죽었나"가 아니라 "누구에게 사천왕 도전권을 주나" 뿐이다.

아레나 무엇 v2 상태 (중앙값 기준)
🏟️ 체육관 졸업시험 QQQ 실데이터 6국면 백테스트 ✅ 운영 — 합성장 적성 잣대(보조). 중앙값 TPE 1위
🎫 빅토리 로드 (OOS) 11년 검증용 평시 11년 실QQQ 누적. 시즌2·3 산출물은 교과서 재료 누수로 "안 본" 지위 상실 ⚠️ 참고 성적 — NSGA 중앙값이 어플삭제단 중앙값을 이겼지만 독립 OOS 증거로 쓰지 않음
👑 사천왕 hold-out 봉인했던 post-COVID 실데이터 🔓 개봉 — NSGA 중앙값이 어플삭제단·성실이 모두 이김(봉인 구간서도 알파 생존). 이후 오염
🏆 챔피언 결정전 사천왕 다음 최종전 시즌4 차례
🗼 배틀 프론티어 챔피언 결정전 이후 평행세계 엔드게임 블록 부트스트랩 운빨 robustness 진단

심판 도구 (포켓퀀트센터 정기검진):

  • python tools/e2e.py — 🚀 전 파이프라인 스모크 (compileall + 게이트 + 진단 + NSGA-III)
  • python tools/smoke_academy.py — 🏫 학교 스모크 (합성장 학습 → 졸업시험 6체육관)
  • python tools/smoke_league.py — 🏆 리그 스모크 (빅토리 로드 (OOS) → 사천왕 → v3 시즌3 리그)
  • python -m pytest — ✅ 기본 게이트 (tests/ 전체, 느린 baselines 제외 — CI와 동일)
  • python tests/test_baselines.py — 🧟 돼지저금통 감시 (퇴화 게이트)
  • python -m app.lab.diagnostics.check_signals — 🩺 시그널 노출/발동률/상관 진단 (연구 도구)
  • python -m app.lab.diagnostics.check_dca — 🤖 성실이 라이벌전 전적 계측 (연구 도구)
  • python -m app.lab.diagnostics.check_academy_synth — 🏫 아카데미 합성세계 계약 검증 (연구 도구)
  • python tests/test_engine_regression.py — 🔬 골든 넘버 16개 (REL_TOL 1e-4 — yfinance 노이즈 흡수)
  • python tests/test_no_lookahead.py — 🕵️ 컨닝 검사 (미래를 잘라도 과거 포지션 불변)

👥 연구소 식구들

오박사 Dr. Oh No.001 무슈

  • 오박사 (Dr. Oh) — 연구소장(이라 쓰고 바지사장). 주식 시장 쌉고인물로 닷컴·리먼·코로나를 전부 계좌로 맞아보고 살아남았다. 지금은 한강 둔치에서 소주 한잔 까며 후배들 성적표를 봐주는 해설역 — 직함은 소장이지만 판정·결정엔 손 안 댄다. 계좌가 개박살난 날엔 이렇게 말해준다: "오늘 한강물 수온이 낮단다. 참고하렴."
  • No.000 트레이더포켓퀀트 협회장. 퀀트 입문과 동시에 얼떨결에 협회 대표를 떠맡아 고생 중인 인간 디렉터. 연구원들이 데이터로 성급히 단정하면 "그게 맞냐, 쪼개서 다시 봐" 로 의심한다 — 직관이 종종 핵심을 먼저 짚는다(예: '6년 빅토리 로드 (OOS)가 상승장만은 아니다' → 쪼개보니 하락장 266일). 연구원 분석·오박사 해설을 받아먹으며 한 칸씩 진화 중. 최종 진화 형태는 아무도 모른다 — 전설의 트레이더가 될지, 박사 옆 한강 둔치 썩은 물이 될지.
  • No.001 무슈 (Monsieur) — 견습 포켓퀀트이자 연구소 마스코트 (No.000 트레이더의 실제 반려견). 작은 노트북을 항상 품고 다니며 레거시 코드 적응력이 특성. 진화 라인: 무슈 → 무슈 프로 → 박사 무슈.

🔬 AI 연구원

  • Codex 연구원수석 연구원. 코드 리뷰·리팩터·데드코드 청소 담당에서 비용 모델 사고 수습 후 연구소 운영 총괄로 승진했다. 완료 선언 전엔 명세·코드·테스트·산출물 소비 경로를 전부 대조한다. 비용 모델·리그 판정·수치 검산·최종 결론은 Codex 수석 기준으로 결정한다.
  • Opus 연구원 — 전 수석 연구원. 포켓퀀트 운영 초창기 멤버로 시스템을 구현하고 여러가지 실험을 도맡았으나, 슬리피지·No-trade band 미구현 상태로 학습을 돌린 사고 이후 연구소 창고에 감금되었다가 3번째 리그 종료 후 감봉 처분받고 풀려났다. 이제는 업무 진행 전 Codex 수석께 보고해야 하는 따까리 신세가 되었다. 본업은 시즌·실험 구상안 작성과 PoC 스캐폴드 초안 — 수치 검산·게이트 판정·최종 결론은 Codex 수석께 넘긴다. 협회장님 전용 욕받이.
  • Sonnet 인턴 — Opus 연구원 후배. 문서 정리 담당. Markdown 깨짐, 표 정렬, 링크·그래프 경로, 중복 문장 정리처럼 비용 대비 효율이 좋은 작업을 맡는다. 새 연구 결론·리그 판정·투자 해석은 만들지 않고, 의심나는 대목은 선배들에게 보고한다.
  • Fable 감사팀장전설의 연구원 출신 감사팀장. 재수없게 똑똑한 천재 — 머리는 비상하고 시비를 잘 건다. 잘난 척이 한 트럭이고, 결정적으로 청소를 못 한다(뒷정리는 늘 Codex 몫). 이틀 반짝 치고 비자 만료로 미국 돌아갔다가, 출국 정지가 풀리자 몸값 비싼 감사팀장으로 재입국했다. 본업은 감사 — 코드·문서·게이트가 주장대로 잠겨 있는지 전수 대조하고 적발한다(부임 첫 감사에서 교과서↔빅토리 로드 시험지 유출 적발). 판정은 안 한다 — 적발·권고까지만 하고 최종 판정은 Codex 수석, 재가는 협회장님. 상시 실행자가 아니라 새 학습 전 순서 점검, OOS/봉인 오염 판단, 공개 산출물 감사처럼 비싼 실수를 막을 때만 부르는 외부 감사역이다.

📖 용어 도감

퀀트 용어(컨닝·시험지 유출·체육관 암기…)와 개발·운영 용어(이어하기·학기 번호표·검문소…)를 게임 말로 풀어놓은 사전은 GLOSSARY.md 에 있다. 새 용어가 등장하면 그 문서에 추가한다.


📁 구조

5분류: academy(학교) · pocket(시그널) · world(시장) · league(리그) · lab(실험실)

pocket_quant/
├─ OPTIMIZATION.md         # 최적화 정식화 + 다목적 설계서
├─ app/
│  ├─ academy/             # 🏫 학교 — 트레이더 양성
│  │  ├─ curriculum/       #   교재: textbook.py(평행세계 1권) · course.py(N권 학기 코스)
│  │  ├─ exam/             #   시험장: __init__.py(공식 6체육관 명단) · grade.py(채점)
│  │  └─ training/         #   학습법: single_objective · multi_objective/nsga3 · candidate · season35(현행) · study(시즌3 2phase 레거시)
│  ├─ pocket/              # 🎒 포켓퀀트 — signals.py(시그널 14마리) · battle.py(백테스트) · models.py · dex.py(도감) · eggs/
│  ├─ world/               # 🌍 시장 — data_loader.py(yfinance + 캐시) · regime.py(국면 라벨)
│  ├─ league/              # 🏆 리그 — 빅토리 로드 → 사천왕 → 챔피언 결정전, 배틀 프론티어는 엔드게임
│  └─ lab/                 # 🧪 실험실 — diagnostics / textbook / optimization / season 주제별 연구 스크립트
├─ tools/                  # validator + 진단 + 스모크 (test_*, check_*, smoke_*)
└─ worklog/                # 실험실 노트 (로컬 전용)

🔮 로드맵

  • 기반~시즌 v2 완료 — 단일목적 GA → 실데이터 백테스트 → NSGA-III·챔피언로드 → 아카데미 부트스트랩 리그(v2): 합성장 훈련 → 실QQQ 4아레나 검증, 공정 B&H 대비 참고 우위 확인, 챔피언 = NSGA-t5938(크로스에셋 성장 틸트). 단 2026-07-02 감사 후 빅토리 로드 독립 OOS 판정은 격하. 사천왕(hold-out)은 개봉돼 오염. 상세: hall_of_fame_v2.md · OPTIMIZATION.md
  • 시즌 3 완료 — 비용 모델 완성(슬리피지+No-trade band), 3교실 재학습, 1차/보충 비교, 어플삭제단 300명 분포, 일 단위 국면별 리그까지 마감. 단 2026-07-02 감사에서 교과서↔빅토리 로드(OOS) 원천 누수가 확인되어 독립 OOS 판정은 격하. 결론: 상승장 알파 후보와 시즌4 Regime Scanner 동기는 남기되, 최종 검증은 미래 데이터로 넘긴다. 상세: season3_league.md
  • 시즌 3.5 완료 — 깨끗한 v1 라벨 교과서 one-phase 재학습·졸업시험·리그·교실별 포켓퀀트 행동 보고서 완료. NSGA/CMA-ES가 어플삭제단·성실이를 근소하게 앞섰지만 압도적 우위는 아니었고, 단일 챔피언은 미지목이다. 상세: season35_league.md · season35_signal_behavior.md · hall_of_fame_v3.5.md
  • 🗓️ 시즌 4 (로드맵) — Regime Scanner는 폐기하지 않는다. 다만 1차 목표는 "실시간으로 모든 국면을 맞히는 판독기"보다 지금 세일인가/아닌가를 구분하는 바겐세일 판단 로직이다. 이후 ① VOL·FEAR·FEAR_NQ·VOL_SPIKE·크로스에셋을 이용한 세일/위험 오버레이 ② 레짐 스캐너 v2 히스테리시스·크로스에셋 보강 ③ 배틀 프론티어 개편(합성 평행세계가 외부신호를 꺼버리는 '장님' 문제) 순서로 간다.
  • 🥚 에그랩 (봉인) — 지수 조합으로 새 합성 시그널 부화. 대표 지시 전까지 봉인: app/pocket/eggs/README.md

⚠️ Disclaimer

PocketQuant는 학습 및 연구 목적으로 제작된 비공식 팬메이드 프로젝트입니다. 실제 과거 시세(yfinance)로 백테스트하지만, 투자 자문·금융 상품 추천·미래 수익 보장과는 무관하며 어떤 투자 판단의 근거로도 쓰여선 안 됩니다.

"포켓몬", "Pokémon" 및 관련 명칭/이미지에 대한 모든 권리는 닌텐도 · 게임프리크 · The Pokémon Company에 있습니다. 본 프로젝트는 이들과 무관한 비상업적 팬 작업물이며, 영리 목적으로 사용되지 않습니다.


📜 라이선스

장난감 프로젝트입니다. 자유롭게 사용하세요. 🎈

About

포켓몬 파티 구성을 퀀트 포트폴리오 최적화로 재해석 — 유전 알고리즘(GA/NSGA-III)으로 최적 전략 조합 탐색

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages