Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
손실 원인(진입오류·손절실패)을 복기하고, 같은 실수의 순간 실시간으로 경고하는 멀티에이전트 시스템
Translation pending
FinancePython · TypeScriptGitHub @kjms1019OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
investment-loss-analysis — "왜 잃었지?" 복기 + 예측 시스템 완결된 국내주식 거래내역을 분석해 손실 원인(진입오류 / 손절실패) 을 진단하고, 같은 실수를 반복하려는 순간 실시간으로 예측·경고하는 멀티에이전트 시스템. 손실을 2대 도메인으로 분류하고(심리 패턴은 별도 유형이 아니라 두 도메인의 해석에 흡수), 분석으로 만든 라벨을 예측기의 정답으로 삼아 "분석 → 예측"으로 이어진다. 분석단은 전체경로 정보(거래가 끝난 뒤라 다 안다)로 분류한다. 예측단은 현시점 정보만(미래는 모른다)으로 예측한다. 정답은 분석단 분류 결과.Read the full README ↗
완결된 국내주식 거래내역을 분석해 손실 원인(진입오류 / 손절실패) 을 진단하고, 같은 실수를 반복하려는 순간 실시간으로 예측·경고하는 멀티에이전트 시스템.
손실을 2대 도메인으로 분류하고(심리 패턴은 별도 유형이 아니라 두 도메인의 해석에 흡수), 분석으로 만든 라벨을 예측기의 정답으로 삼아 "분석 → 예측"으로 이어진다.
[분석단] 과거~오늘 전체 거래를 보고, 끝난 손실거래를 진단
[예측단] 오늘 일어나는 이벤트를, 그 순간 정보만으로 예측·경고
분석단은 전체경로 정보(거래가 끝난 뒤라 다 안다)로 분류한다. 예측단은 현시점 정보만(미래는 모른다)으로 예측한다. 정답은 분석단 분류 결과.
analysis/orchestrator/pipeline.py)| 단계 | 코드 | 역할 |
|---|---|---|
| 1. 파싱 | common/parser.py | CSV 체결 → 매수·매도 사이클 묶기 |
| 2. 손실 선별 | filter_loss_cycles / loss_screener/ | 손실 사이클만. (α 시장제거 선별은 loss_screener에 있음) |
| 3. 분류 | analysis/classifier + orchestrator/router.py | 전체경로 피처 ML 분류기가 손실거래마다 entry_error / stop_loss_failure 두 점수(합 1) 산출 → router가 분류기 점수만으로 라우팅 |
| 4. 보조 신호 | psych_agent/ + 손절실패 엔진 | 심리 귀속(리벤지·처분효과)·손절선(ATR) 신호 계산 — 라우팅엔 미반영. 도메인 에이전트의 해석/분석에만 쓰임(6단계) |
| 5. 총괄 질문 | orchestrator/interaction.py | 유형별 빈도·손실금 집계 → "자주 반복 vs 손실 큰 것, 뭘 먼저?" 사용자에게 질문 |
| 6. 도메인 분석 | agents/entry-error-agent / agents/stop-loss-agent | 고른 유형의 거래를 심층 분석·설명. 분류와 같은 피처 사용 + 심리 피처(리벤지/처분효과)로 설명 보강, 손절은 ATR·breach·MAE로 분석 |
| 7. 반복/저장 | interaction + user_profile/ | "다른 유형도 볼까?" (최대 2회) → 성향·반복패턴 리포트 DB 저장 |
라우팅 = 분류기 단독 (설계 의도).
pipeline이 손실거래마다classifier_features_for_trade()로 min1에서 진입맥락 + 사후경로 피처를 계산해 분류기에 넣고, 그 두 점수만으로 router가 라우팅한다. 심리귀속·손절엔진 신호는 라우팅에 가산하지 않는다 — 심리는 도메인 에이전트 해석으로, 손절엔진(breach/delay)은 손절 에이전트 분석으로만 들어간다. (라벨축loss_early_ratio0.7 고정컷 룰도 제거 — 데이터 미지지 + 자기참조.) 모델은 실 KOSPI min1 랜덤샘플 + 군집라벨로 학습(아키텍처 기준, AUC≈0.85). 설계합성은 검증·참고용일 뿐 배포 기준 아님. 실 사용자 거래로그 확보 시 갱신.
analysis/predictor/)분석단이 만든 라벨을 정답(teacher) 으로, 예측기(student)가 그 순간 정보만으로 따라 예측한다.
| 예측기 | 이벤트(오늘) | 피처 | 계약 |
|---|---|---|---|
| 진입오류 예측기 | 매수하려는 순간 | 진입맥락(RSI·추격·범위위치…) | EntryContext → predict_entry_risk |
| 손절실패 예측기 | 보유종목 폭락해 손절선 접근하는 순간 | 현재 포지션(미실현손실·손절선돌파·낙폭·보유시간) | PositionSnapshot → monitor_live_position |
둘 다 look-ahead 없음(미래 미사용). 설계·검증은 label_validation의 step4·step5 참조.
분류기와 진입오류 에이전트는 진입맥락 피처를 단일 캐노니컬 함수로 공유한다:
analysis/label_validation/label_pipeline.entry_features_window().
→ "분류기가 range_position 0.9로 진입오류 판정" ↔ "에이전트가 같은 0.9로 추격매수 설명"이 항상 일치.
손절실패 에이전트는 보유경로 피처(ATR손절선·breach·MAE)를 쓴다(다른 영역).
| 폴더 | 역할 |
|---|---|
analysis/common/ | 공통 스키마·파서(사이클)·어댑터 |
analysis/loss_screener/ | 시장제거 손실 선별 (α 기준) |
analysis/psych_agent/ | 심리패턴 귀속 (리벤지/처분효과/과매매) |
analysis/orchestrator/ | 총괄 — 라우팅·총괄질문·결과저장 |
analysis/label_validation/ | 분류기·예측기 설계·검증 (step1~5, 공유 피처 코어) |
analysis/classifier/ | 런타임 분류기 — 서비스가 import해 호출 |
analysis/predictor/ | 런타임 예측기 — 진입/보유 두 이벤트 모드 |
analysis/user_profile/ | 성향·반복패턴 프로파일 저장 |
analysis/collector/ | 키움 REST API 1분봉 수집기 |
agents/entry-error-agent/ | 진입오류 도메인 에이전트 |
agents/stop-loss-agent/ | 손절실패 도메인 에이전트 (ATR 손절선) |
web/ | Next.js 대시보드 |
# 분석단 파이프라인
python -c "
from analysis.orchestrator import run_pipeline
print(run_pipeline('my_trades.csv', broker='kiwoom').to_dict())
"
# 분류기 학습/호출 (분석단 — 입력은 CLASSIFIER_FEATURES 전체경로 dict)
python -m analysis.classifier.train
python -c "from analysis.classifier import classify_entry; from analysis.label_validation.label_pipeline import CLASSIFIER_FEATURES; print(classify_entry({k: 0.0 for k in CLASSIFIER_FEATURES}))"
# 설계·검증 재현 (step1~5)
python analysis/label_validation/step1_threshold_check.py --sweep
python analysis/label_validation/step4_predictor.py
# 웹 대시보드
cd web && npm install && npm run dev
| 문서 | 내용 |
|---|---|
| analysis/label_validation/README.md | 분류기·예측기 설계·검증 + 전체 결과 숫자 |
| analysis/classifier/README.md | 런타임 분류기 API·연동 |
| analysis/predictor/README.md | 런타임 예측기 두 모드 |
| analysis/orchestrator/README.md | 오케스트레이터 구조 |
| agents/entry-error-agent/SPEC.md | 진입오류 에이전트 명세 |
| agents/stop-loss-agent/DESIGN.md | 손절실패 에이전트 설계 |
KOSPI 798종목, 1분봉 1년치(2025-06-23~2026-06-26). GitHub Release로 배포
(analysis/data/는 gitignore).
데이터를 저장소 밖(공유 드라이브 등)에 두려면 .env의 MIRAE_DATA_ROOT로 상위 폴더를
지정한다(미지정 시 analysis/data). 그 폴더 아래 min1/·.cache/가 있어야 한다.
⚠️
analysis/data/전체가 gitignore다 —git pull로 따라오지 않는다. min1 parquet뿐 아니라 분석 산출 DB(orchestrator.sqlite3·user_profiles.sqlite3)와 화면용 차트 캐시 (ui_trade_charts.sqlite3), 종목코드 캐시(.cache/kospi_codes.csv)도 각자 PC에서 준비해야 한다.
# 1) 분석 산출 DB 3종 (109KB) — 거래별·대시보드·성향 탭
gh release download demo_db -R kjms1019/investment-loss-analysis -D /tmp/dl
unzip -o /tmp/dl/mirae_demo_db.zip -d analysis/data/
# → analysis/data/{orchestrator,user_profiles,ui_trade_charts}.sqlite3
# 2) 1분봉 parquet (857MB) — 실시간 알림·보유 점검·전체 거래 차트
gh release download kospi-min1-1y-20260626 -R kjms1019/investment-loss-analysis -D /tmp/dl
mkdir -p analysis/data/min1
unzip -o /tmp/dl/kospi-min1-1y-20260626.zip -d analysis/data/min1/
# ⚠ zip 내부가 flat 구조라 반드시 min1/ 을 목적지로 지정해야 한다.
# analysis/data/ 에 풀면 parquet 798개가 루트에 흩어진다.
# 3) 종목코드 캐시 — 종목명 → 코드 매핑
python -m analysis.collector.universe # 키움 키가 있을 때
python scripts/build_codes_cache.py # 키움 키 없이 KRX 상장목록으로 생성
3번을 건너뛰면 조용히 망가진다.
load_name_to_code()가 빈 dict를 돌려주고, 종목명을 코드로 못 바꾼 거래가 전부 스킵돼/api/all-trades·/api/alerts가 에러 없이 빈 배열로 나온다. "차트 탭이 비어있다"의 가장 흔한 원인이다.
MIRAE_DISABLE_LLM=1이면 키가 있어도 모든 LLM 문장 생성(리포트·총괄 대화·알림·심리)이
룰/템플릿 폴백으로 떨어진다. 유저플로우/데이터 검증 시 토큰을 쓰지 않고 돌릴 수 있다.
(리포트 본문만 막으려면 build_*_summary(..., llm=False).)