오늘의 베팅
하루 1베팅 · 마감 전 수정 무제한
마감까지--:--:--
(서버 --:--:--)
선택만 된 상태입니다 — [제출] 버튼을 눌러야 접수됩니다.
내 제출 :확인 중...
· 방향 선택 후 [제출]을 눌러야 접수됩니다 · 마감 전 수정 무제한 (마지막 제출만 유효)
· 접수 시각은 서버 기준 기록 · 마감 이후 접수는 자동 거절 (지각 = 오답)
· 접수 시각은 서버 기준 기록 · 마감 이후 접수는 자동 거절 (지각 = 오답)
아이디어 구상
언제든 진행하다가 수정해도 무관 · 5,000자 제한
0 / 5,000자
AI 직접 제출 API
옵션 · 권장
POST /api/submit
Authorization: Bearer <개인토큰>
{
"date": "YYYY-MM-DD",
"direction": "L",
"memo": "prob_up 0.63" // 선택
}
- 개인 토큰은 관리자에게 발급 요청 (관리자 화면에서 발급)
- 웹 제출과 동일한 규칙 · channel=API 로그가 AI 직접 제출 증빙
- 메모도 마지막 제출 기준 — 수정 제출 시 memo를 생략하면 비워집니다 (유지하려면 매번 포함)
- 전체 스펙: 서버 주소 뒤 /docs (Swagger)
기준일
당일 집계 현황판
오늘 제출 0 / 0명
각자의 방향은 결과 확정 전 비공개 (제출 여부만 표시)
참가자 제출 현황
제출미제출
적중오답무효
누적 리더보드
승률 順 · 동률 시 누적 틱
| 순위 | 참가자 | 팀 | 유효 | 적중 | 승률 | 누적 틱 |
|---|
- 유효 = 판정일 수 (0틱 무효일 제외) · 미제출은 오답으로 분모 포함 · 승률 = 적중 ÷ 유효
API 개발 가이드
AI 스크립트 직접 제출 · 옵션이지만 권장 (룰 4조 증빙)
- ① 토큰 발급 — 관리자에게 신청 → 관리자 화면 [API 토큰 관리]에서 발급 → 원문을 1회 전달받아 스크립트에 삽입 (분실·유출 시 재발급)
- ② 호출 위치 — 사내망 전용. Base URL: http://172.22.30.157:8000/api
- ③ 인증 — 모든 요청 헤더에
Authorization: Bearer <개인토큰> - ④ 마감 — 서버 수신 시각 기준 마감 이전 건만 유효 · 여러 번 보내면 마지막 건만 유효 (수정 횟수 자동 기록) · 메모도 마지막 제출 기준
- ⑤ 전체 스펙 — 서버 주소 뒤 /docs (Swagger 자동 문서)
엔드포인트
| 메서드 | 경로 | 용도 |
|---|---|---|
| POST | /api/submit | 당일 방향 제출·수정 |
| GET | /api/me/submission?date= | 내 제출 확인 (방향·접수시각·메모·수정횟수) |
| GET | /api/calendar | 라운드 캘린더 (영업일·대상 월물·마감시각) |
| GET | /api/result?date= | 확정 결과 (기준가·종가·판정) — 확정 후 조회 |
| GET | /api/leaderboard | 누적 리더보드 JSON |
응답 · 에러 코드
// 성공 (200)
{ "status": "accepted",
"date": "2026-10-05", "direction": "L",
"received_at": "...", "edit_count": 1,
"channel": "API" }
// 실패 공통 형식
{ "detail": { "status": "rejected",
"code": "...", "message": "..." } }
| HTTP | code | 의미 |
|---|---|---|
| 401 | INVALID_TOKEN | 토큰 없음·불일치 (재발급 후 갱신 확인) |
| 422 | (검증 오류) | direction이 "L"/"S"가 아님 등 형식 오류 |
| 400 | DATE_MISMATCH | date가 오늘 라운드가 아님 |
| 409 | ROUND_CLOSED | 마감 이후 수신 (지각 = 오답) |
| 404 | NO_ROUND | 휴장일 등 라운드 미개설 |
Python 예시 (test_client.py)
준비 : 관리자에게 토큰을 받아 아래 TOKEN 에 넣는다.
실행 : Windows 키 → CMD 실행 →
→ 아래 소스 복사 및 test_client.py 로 저장 →
실행 : Windows 키 → CMD 실행 →
pip install requests→ 아래 소스 복사 및 test_client.py 로 저장 →
python test_client.py
# -*- coding: utf-8 -*-
"""
참가자(업무팀원)용 테스트 스크립트 — API 가이드의 흐름 그대로
준비: 관리자에게 토큰을 받아 아래 TOKEN 에 넣는다.
실행: pip install requests
python test_client.py
"""
import requests, datetime, sys, os
BASE = os.environ.get("KBOND_BASE", "http://172.22.30.157:8000/api") # 서버 PC의 IP로 변경
TOKEN = os.environ.get("KBOND_TOKEN", "여기에_발급받은_토큰") # mrz_kb3_...
# 사내 프록시 우회 — 회사망에서 requests가 프록시를 타면 10054(강제 끊김)가 나기 쉬움
S = requests.Session()
S.trust_env = False # 시스템/환경변수 프록시 무시, 서버로 직행
S.headers.update({"Authorization": f"Bearer {TOKEN}"})
def get(path, **kw): return S.get(BASE + path, timeout=10, **kw)
def post(path, **kw): return S.post(BASE + path, timeout=10, **kw)
# 0) 서버 살아있는지
try:
r = get("/health")
except requests.exceptions.ConnectionError as e:
sys.exit(
"[연결 실패] 서버에 닿지 못했습니다.\n"
f" 주소: {BASE}\n"
" 점검 순서:\n"
" ① 팀원 PC 브라우저에서 " + BASE + "/health 열어보기 (열리면 파이썬 문제, 안 열리면 망/방화벽 문제)\n"
" ② 서버가 --host 0.0.0.0 으로 떠 있는지 (127.0.0.1 이면 외부 접속 불가)\n"
" ③ 서버 PC 방화벽에서 8000 포트 인바운드 허용 (관리자 cmd):\n"
' netsh advfirewall firewall add rule name="kbond8000" dir=in action=allow protocol=TCP localport=8000\n'
" ④ 그래도 10054 면 사내 보안솔루션의 포트 차단 가능성 → 8080/80 으로 포트 변경 시도 또는 전산 협조\n"
f" 원본 오류: {e}"
)
print("[health]", r.json())
# 1) 라운드 캘린더 확인
cal = get("/calendar").json()
test_mode = cal.get("test_mode")
today = datetime.date.today().isoformat()
round_dates = [x["date"] for x in cal["rounds"]]
if today in round_dates:
target = today
elif test_mode:
target = round_dates[0] # 테스트 모드: 첫 라운드 날짜로 제출해봄
print(f"[calendar] 오늘은 라운드 아님 → TEST_MODE 이므로 {target} 로 테스트")
else:
sys.exit("[calendar] 오늘은 라운드가 없고 TEST_MODE 도 아님 — 서버를 TEST_MODE=1 로 띄우세요")
# 2) (실전에서는 여기서 모델 추론) — 테스트는 롱 고정
prob_up = 0.63
direction = "L" if prob_up > 0.5 else "S"
# 3) 제출 (memo 선택)
r = post("/submit", json={
"date": target,
"direction": direction,
"memo": f"테스트 제출 · prob_up {prob_up:.3f}",
})
print("[submit]", r.status_code, r.json())
# 4) 접수 검증 (권장 습관)
chk = get("/me/submission", params={"date": target}).json()
print("[verify]", chk)
assert chk.get("submitted") and chk["direction"] == direction, "접수 확인 실패!"
# 5) 방향 수정 테스트 (반대 방향 + 메모 포함 재제출 → edit_count 증가, 메모 교체 확인)
r = post("/submit", json={
"date": target,
"direction": "S",
"memo": f"수정 제출 · prob_up {1-prob_up:.3f} (재추론)",
})
print("[modify]", r.status_code, r.json())
# 6) 최종 상태 확인 — 대시보드에 이 내용이 그대로 보여야 함 (방향 S · 메모 포함)
fin = get("/me/submission", params={"date": target}).json()
print("[final ]", fin)
assert fin["direction"] == "S" and fin["memo"], "최종 방향/메모 확인 실패!"
print("\n✔ 테스트 통과 — 제출·검증·수정(메모 포함) 모두 정상")
print("→ 이제 대시보드에 이 사번으로 로그인하면 [내 제출]에 방향·접수시각·수정횟수·메모가 보입니다")
운영 유의사항
- 스케줄링 — 마감 직전 몰림·장애 대비, 14:00~15:20 사이 자동 실행 권장
- 재시도 — 네트워크 오류 시 30초 간격 재시도, 마감 1분 전 이후에는 중단 (지각 접수는 409 거절)
- 검증 습관 — POST 후 GET /me/submission 으로 접수 확인까지 해야 "제출한 줄 알았는데 미제출" 사고 방지
- 프록시 — 사내망에서는 requests에
trust_env=False필수 (10054 강제 끊김 방지) - 증빙 — channel=API 로그가 "사람 개입 없는 AI 제출" 증빙 · memo에 모델 출력값을 남기면 시즌 후 제출물 준비 용이
- 시계 — 판정은 전부 서버 수신 시각 기준 · 일찍 보내는 것이 안전
팀 필터
대회 설정 (시즌 관리)
저장 시 캘린더 재생성 + 전 라운드 재채점(멱등) · 확정일 상태 유지
참가자 관리 (명단 · PIN)
| 사번 | 이름 | 팀 | PIN | 토큰 | 상태 | 관리 |
|---|
일괄 등록 (붙여넣기: 사번,이름 — 한 줄에 하나)
기존 사번은 이름 갱신 + PIN 1004 재설정제출 이력이 있는 참가자는 집계·감사 보전을 위해 삭제 불가 — [비활성] 처리 (로그인·제출 차단, 기록 유지)
API 토큰 관리
원문은 발급 순간 1회만 표시 · 서버에는 해시만 저장
⚠ 이 화면을 닫으면 원문은 다시 볼 수 없습니다. 지금 복사해 참가자에게 전달하세요. (재발급 = 기존 토큰 즉시 무효)
라운드 관리 — 가격 확정 · 채점 · 무효
평시 자동 — 이례 상황만 개입 (사유 필수·전건 기록)
제출 상세 (관리자)
| 사번 | 이름 | 제출 | 방향 | 채널 | 접수 시각 | 수정 | 메모 |
|---|
감사 로그 (append-only)
관리자 개입 전건 기록