anti-gambling-trader-tw
무료 오픈소스 투자 사기 방지·거래 통계·자동매매 도구, 기본 PaperBroker와 14개 증권사 옵션 제공, 로컬 분석
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
사주는 "이 종목이 오를까"가 아니라 "당신은 어떤 투자자인가"에 답한다. 거기서 얻은 성향 프로파일을 종목 판단과 결합해 최종 매수 판단을 사람마다 다르게 낸다. AI의 역할은 수익을 보장하거나 매매를 지시하는 것이 아니라, 분산된 정보를 정리하고 판단 근거를 이해하기 쉽게 보여주는 것이다. 투자자문이 아니다. 이 저장소는 두 프로젝트를 합친 것이다 — 주식 분석(StockProject)의 구조를 기저로 사주 서비스(SajuService, Next.js 단독 앱)의 엔진을 옮겨 왔다. 합치는 방향은 통합 기획이 미리 정해 두었고, 그 문서의 5.3 절이 요구한 integrations/saju/ 경계가 실제 접점이다. 두 개의 터미널이 필요하다. 백엔드를 먼저 띄운다 — 프런트가 SSR 단계에서 호출한다. 사주 화면(/saju)과 /api/v1/saju/* 는 DB 도 LLM 도 쓰지 않는다 — 순수 계산이라 .env 없이도 돈다. /saju/report 만 GEMINI_API_KEY 를 쓰고, 없으면 규칙 기반 간이 리포트로 내려간다. 사주가 하는 일 — 그리고 하지 않는 일 지켜지는 선이 둘이다. 둘 다 코드가 강제한다.README 전문 보기 ↗
사주는 "이 종목이 오를까"가 아니라 "당신은 어떤 투자자인가"에 답한다. 거기서 얻은 성향 프로파일을 종목 판단과 결합해 최종 매수 판단을 사람마다 다르게 낸다.
AI의 역할은 수익을 보장하거나 매매를 지시하는 것이 아니라, 분산된 정보를 정리하고 판단 근거를 이해하기 쉽게 보여주는 것이다. 투자자문이 아니다.
이 저장소는 두 프로젝트를 합친 것이다 — 주식 분석(StockProject)의 구조를 기저로
사주 서비스(SajuService, Next.js 단독 앱)의 엔진을 옮겨 왔다. 합치는 방향은
통합 기획이 미리 정해 두었고, 그 문서의 5.3 절이
요구한 integrations/saju/ 경계가 실제 접점이다.
| 디렉터리 | 스택 | 역할 |
|---|---|---|
back/ | FastAPI · SQLAlchemy(async) · Pydantic v2 · Gemini · lunar-python | 시세·검색·지표·AI 판단 + 사주 엔진 |
front/ | Next.js 16 (App Router) · Tailwind v4 · axios | SSR 리서치 화면 + 성향 온보딩 |
docs/ | — | 통합 기획 · 사주→성향 매핑 규칙 |
두 개의 터미널이 필요하다. 백엔드를 먼저 띄운다 — 프런트가 SSR 단계에서 호출한다.
# 1) 백엔드 → http://127.0.0.1:8000 (문서: /docs)
cd back
uv sync --all-groups
cp .env.example .env # 전체 기능용. 사주만 볼 거면 .env.saju-only.sample 로 충분하다
uv run fastapi dev
# 2) 프런트 → http://localhost:3000
cd front
npm install
cp .env.local.example .env.local
npm run dev
사주 화면(/saju)과 /api/v1/saju/* 는 DB 도 LLM 도 쓰지 않는다 — 순수 계산이라
.env 없이도 돈다. /saju/report 만 GEMINI_API_KEY 를 쓰고, 없으면 규칙 기반 간이
리포트로 내려간다.
| 화면 | 경로 | 사용하는 API |
|---|---|---|
| 시장 현황 | / | GET /api/v1/markets/overview |
| 종목 상세 | /stocks/[symbol] | GET /api/v1/stocks/history · /content · /fundamentals |
| AI 투자 판단 | 종목 상세 내 | POST /api/v1/stocks/advice |
| 투자 성향 온보딩 | /saju | POST /api/v1/saju/chart · PUT /api/v1/profile |
[가입 1회] 생년월일시 → 사주엔진 → 성향 초안 → 사용자 보정 → DB 영구 저장
↓ (LLM 비용 0, 재계산 없음)
[종목 분석] 시세·지표·뉴스 → 에이전트 3인 → 판단 → ① MarketVerdict
InvestorProfile × StockMetrics ────→ ② FitScore (순수 함수)
①+② ────→ ③ PersonalVerdict (결정론적)
지켜지는 선이 둘이다. 둘 다 코드가 강제한다.
domain/fit.py 도 domain/verdict.py 도 saju_summary 를 읽지 않는다.AVOID 가 BUY 로 올라가지 않는다 (domain/verdict.py). 프로파일은
브레이크지 액셀이 아니다.그래서 "사주가 매수를 추천하나요?"에 "아니요. 프로파일은 매수를 만들어내지 못하고 보류시킬 수만 있습니다" 라고 답할 수 있다.
원본 SajuService 는 TypeScript 로 쓰인 Next.js 단독 앱이었다. 엔진을 파이썬으로
옮기면서 유일한 외부 의존(lunar-javascript)은 같은 저자(6tail)의 파이썬 포팅본
lunar-python 으로 갈았다 — API 가 1:1 로 대응한다.
포팅이 맞다는 것은 diff 가 판정했다. 사주 계산은 틀려도 그럴듯해 보여 육안 검토로는 잡히지 않으므로, 두 엔진에 같은 입력을 주고 출력을 비교하는 하네스를 만들었다.
| 표본 | 결과 |
|---|---|
| 손으로 고른 경계 케이스 28건 (자시·입춘·서머타임·자오선 전환·음력/윤달·시각 미상) | 완전 일치 |
| 무작위 표본 1,500건 (1920-2024, seed 고정) | 완전 일치 |
# 재현
cd back && uv run python tests/gen_random_cases.py 1500 > cases.json
SAJU_CASES_PATH=cases.json npx tsx ../../SajuService/scripts/dump-charts-for-port.ts > ts.json
SAJU_CASES_PATH=cases.json uv run python tests/dump_python_charts.py > py.json
uv run python tests/compare_dumps.py ts.json py.json
두 덤퍼가 같은 케이스 파일 하나를 읽는다 — 한쪽에만 케이스를 추가하는 실수가 구조적으로 불가능하다.
원본이 여러 차례의 조사 끝에 굳힌 판단들이라 주석과 함께 그대로 옮겼다.
tests/test_saju_engine.py 의 시두법 불변식이 전 시각에 대해 강제한다.cd back && uv run ruff check . && uv run pytest # 사주 66개 포함
cd front && npx tsc --noEmit && npm run lint && npm test && npm run build
DB 를 쓰는 백엔드 테스트는 TEST_DATABASE_URL(Postgres) 이 있어야 돈다.
없으면 그 테스트들만 명시적으로 실패하고, 사주 엔진처럼 순수 계산인 것은 그대로 돈다.
합치면서 의도적으로 가져오지 않은 것이 있다.
| 원본 SajuService 에 있던 것 | 왜 안 옮겼나 |
|---|---|
| 결제(Toss)·주문·리포트 작업 큐 | 그쪽은 리포트를 파는 제품이었다. 여기서 사주는 온보딩 수단이라 결제 경로가 없고, 옮기면 쓰이지 않는 결제 코드가 남는다 |
| 생년월일시 저장(Order 30일 보관) | 저장 대상은 보정이 끝난 숫자 6개다. 재산정 허용 여부가 미결인 상태에서 민감정보를 미리 받아 두는 것은 안 받는 것보다 나쁘다 |
| 회원·관리자 화면 | 이 저장소에 이미 있다 (NextAuth + /admin) |
| 웹툰 렌더러 | 판단 영역과 재미 영역을 시각적으로 분리한다는 기획 5.7 과 맞지 않는다 |
자세한 것은 사주→성향 매핑 규칙과 통합 기획을 본다.