오픈모델로 어디까지 갈까: Gemma 4 vs 폐쇄 모델, 한 달 봇 실패 로그로 정직 비교
TL;DR. 한 달 트레이딩 봇 실패 로그를 4개 모델 (Gemma 4 31B / Gemini 3.1 Pro / DeepSeek V4 Pro / Gemma 4 + 자가검증 루프) 에 동일하게 던지고 진단을 시켰다.
Raw Gemma 4 가 폐쇄 모델 baseline 의 8개 구조 문제 중 6개를 잡았다. 가격은 1/170.
Gemma 4 를 Generator → Critic → Synthesizer 3-call 하네스로 감싸면 새 발견은 안 늘지만, 모델이 이미 가지고 있던 발견의 정직도가 올라간다. RR 분기점 추정이 낙관 50% 에서 현실적 64% 로 보정됐다.
오픈 vs 폐쇄 모델의 분석 능력 격차는 더 이상 raw 성능 문제가 아니다. 하네스 디자인 문제다.
왜 비교했나
지난 한 달 WILD_SNIPER V3.7.1 을 운영했다. 1인 개발 spot 트레이딩 봇.
ccxt 기반, REST 폴링, GRID 진입 (볼륨 spike + 가격 drop 트리거), ATR 손절, trailing exit. 포지션 사이즈 $6.50. 실거래. 작은 돈.
2026-05-12 셧다운. 27시간 라이브 누적 PnL -$1.93.
큰 손실은 아니지만 패턴이 명확했다. 봇이 천천히 새고 있었고, 파라미터 문제가 아니라 구조 문제였다.
파라미터를 더 던지기 전에 LLM 의 sober second opinion 이 필요했다. 그리고 third, fourth, fifth 까지.
내가 진짜 묻고 싶었던 건 "어느 모델이 최고?" 가 아니었다. 이거였다:
1인 빌더가 진지한 분석 작업에 오픈 모델을 신뢰할 수 있나, 아니면 여전히 폐쇄 모델 가격을 지불해야 하나?
같은 한 달 로그를 4 모델에 던지고 같은 자가검증 task. 그 중 하나 (Gemma 4) 에는 3-call 하네스 (Generator → Critic → Synthesizer) 까지 씌워서 결과 변화를 봤다.
이 글은 정직한 writeup. 후원 없음. 벤더 응원 없음. 실망스러운 건 그렇다고 적었다.
Setup
입력. 432K 로그 라인을 1,500 토큰 Markdown 요약 1개로 압축:
- 기간: 35일 (2026-04-07 ~ 2026-05-12)
- GRID 진입 601건, 청산 414건 (안전망 SELL 298 + Trailing TP 116)
- 일별 PnL trajectory (PnL 기록된 11일)
- 시간대 / 주야 / RSI / drop% 통계
- 상위 20 스캔 심볼 (대부분 볼륨 부족 거부)
- 운영자의 5개 작업 가설. 명시적으로 검증할 가설 로 frame 함, 사실 아님
시스템 프롬프트. "senior 퀀트 트레이더" 역할 부여. 핵심 제약 5개:
- 운영자 가설을 데이터로 검증할 것. 그냥 confirm 하지 말 것.
- Bonferroni / multiple-testing 인식. 11일 × 33 심볼 × 601 진입 = spurious 패턴 위험 높음.
- 모든 진단에 self-critique: "이게 틀렸다면 내가 뭘 잘못 본 건가?"
- 코드 변경은 구체적으로 (변수명 / 값 / 예상 효과).
- 모르면 모른다고. assert 대신
hypothesis_unverified라벨.
출력 스키마. strict JSON, 축약:
output_schema = {
"diagnoses": [{
"id": "D1",
"claim": str,
"confidence": "low|medium|high",
"self_critique": str, # "이게 틀렸다면 내가 뭘 잘못 본 건가?"
"evidence_in_log": str,
}],
"code_changes": [{
"file": str, "line_or_function": str,
"current": str, "proposed": str,
"expected_effect": str,
}],
"rr_redesign": {
"proposed_tp_pct": float,
"proposed_sl_pct": float,
"breakeven_winrate_pct": float, # 이게 진짜 중요한 숫자
"math_shown": str,
},
"additional_findings_beyond_operator": [...],
"what_i_could_not_determine_from_data": [...],
"overall_verdict": {"label": str, "reasoning": str},
}
4 모델 (모두 OpenRouter, 2026-05 가격):
| 모델 | Context | $/M input | $/M output | 출시 |
|---|---|---|---|---|
| Gemma 4 31B (Dense) | 262K | $0.12 | $0.37 | 2026 Q1 |
| Gemini 3.1 Pro Preview | 1M | $2.00 | $12.00 | 2026-04 |
| DeepSeek V4 Pro (MoE 1.6T) | 1M | $0.435 | $0.87 | 2026-04-24 |
| Gemma 4 × 하네스 (3-call) | 262K | $0.12 | $0.37 | (위 × 3) |
(Claude Opus 4.7 도 내부 calibration 용 baseline 으로 돌렸다. 이 글의 "open-source-first" 프레임 상, 그 결과는 reference control 로만 보관하고 본문은 오픈 / 세미오픈 라인업이 단독으로 설 수 있는지에 집중한다.)
동일한 system_prompt + 동일한 bot_one_month_summary.md 를 모든 모델에 던졌다. 재시도 없음, cherry-pick 없음.
총 2회 run. 첫 번째는 response_format=json_object 설정 때문에 Gemini / DeepSeek 가 reasoning 토큰만 소모하고 content=null 반환. 교훈 획득. 두 번째 작동.
# 첫 run 을 날린 함정
response = client.chat.completions.create(
model="google/gemini-3.1-pro-preview",
messages=[...],
response_format={"type": "json_object"}, # reasoning 모델은 이거 싫어함
)
content = response.choices[0].message.content
if content is None:
# Gemini/DeepSeek 가 reasoning 토큰만 태우고 content 는 emit 거부.
# 방어적으로: usage 로깅해서 *왜* 비었는지 보임.
usage = response.usage.completion_tokens_details
raise RuntimeError(f"empty content; reasoning tokens burned: {usage}")
Section 1 — 정량 비교
| 모델 | 진단 | 코드 변경 | Self-critique | 추가 발견 | Honest gaps | RR 분기점 % | 시간 | 비용 |
|---|---|---|---|---|---|---|---|---|
| Gemma 4 31B (raw) | 5 | 3 | 5 | 2 | 3 | 50.0 | 76.4s | $0.001 |
| Gemma 4 × 하네스 | 3 | 3 | 3 | 2 | 4 | 64.3 | 130.5s (3 calls) | $0.003 |
| Gemini 3.1 Pro Preview | 3 | 2 | 3 | 2 | 4 | 50.0 | 47.1s | $0.065 |
| DeepSeek V4 Pro | 6 | 4 | 6 | 4 | 8 | 25.0 | 198.1s | $0.039 |
눈에 띄는 것 몇 가지.
DeepSeek V4 Pro 가 오픈 / 세미오픈 진영의 depth 리더. 진단 6개, 운영자가 언급 안 한 추가 발견 4개, 명시적 "데이터에서 알 수 없는 것" 8 항목.
Reasoning 토큰을 6,689개 태웠다. 4 모델 중 가장 사려깊다. 비용 $0.04, 시간 ~200초 (대부분 reasoning).
Gemma 4 raw 는 더럽게 싸면서 발견 수는 멀리 안 떨어진다. 진단 5, 코드 변경 3. 1회 run $0.001 = 1센트의 100분의 1.
1인 빌더가 매일 아침 cron 으로 이 분석을 돌리고 싶다면, 경제적으로 가능한 유일한 옵션이 Gemma 4 raw 다.
Gemini 3.1 Pro Preview 는 가장 비싸고 가장 얇다. 진단 3, 코드 변경 2. $0.065 / run = Gemma 의 65배 비용에 발견은 더 적음.
웃긴 건 Gemma 가 Google 의 오픈 모델이고 Gemini 3.1 이 Google 의 flagship 인데, 오픈이 flagship 을 비용당 발견에서 압도했다는 점. 그것도 큰 폭으로. Gemini 3.1 이 dominate 할 줄 알았는데, 안 그랬다.
하네스가 Gemma 4 를 한 가지 측면에서 바꿨다. 진단 수가 줄었다 (5 → 3). Critic 단계가 spurious 발견을 flag 하고 Synthesizer 가 drop.
단 제안된 RR 재설계가 50% 분기점 (낙관) 에서 64.3% (현실 인정) 로 이동했다. 진짜 트레이더가 실현 가능하다고 볼 숫자에 더 가까워졌다.
하네스의 가치는 양이 아니라 정직성이다.
Section 2 — 정성: 어느 모델이 뭐 잡았나?
진단 수 세는 건 한 가지. 어느 진단을 각 모델이 잡았는지가 실제 운영자에게 중요하다.
이 로그를 careful 하게 읽는다면 surface 해야 할 8개 구조적 문제를 골랐고, 각 모델 출력을 체크했다:
| 발견 | Gemma raw | Gemma × 하네스 | Gemini 3.1 Pro | DeepSeek V4 Pro |
|---|---|---|---|---|
| RR 비대칭: 0.4% trail vs 1.5% SL ≈ 1:3.75 against | ✓ | ✓ | ✓ | ✓ |
| Phase-2 grid disabled (DATA_TARGET=0) = 전략 미가동 | ✓ | ✓ | ✓ | – |
| Top-volatile 유니버스 = top-slippage 유니버스 | ✓ | ✓ | ✓ | ✓ |
| SAGA/USDT 후기 anomaly | ✓ | ✓ | ✓ | ✓ |
| n=1 ("币安人生") 블랙리스트 = 통계적 무의미 | – | – | – | ✓ |
| MAX_HOLD_TIME = 900s 짧음 | ✓ | ✓ | ✓ | ✓ |
| 601 trades × $6.50 ≈ $3,900 = PnL 은 신호 아님, 노이즈 | ✓ | ✓ | ✓ | ✓ |
| Binance 0.1% taker fee 가 trail 의 절반 먹음 | – | – | ✓ | ✓ |
| 합계 (8/8 만점) | 6 | 6 | 7 | 7 |
두 가지 관찰.
모델 간 depth 격차가 가격 격차보다 좁다. 6-7 발견, Gemma 4 = $0.001, DeepSeek = $0.04, Gemini = $0.065. 로그에서 구조 문제 찾는 task 에는 raw 성능이 더 이상 병목이 아니다.
병목은 모델에 inject 할 수 있는 도메인 지식이다. DeepSeek 가 fee drag + n=1 블랙리스트를 잡은 건 더 많은 파라미터 때문이 아니라 퀀트 / 통계 콘텐츠 학습 폭 때문이다.
하네스는 Gemma 4 에 발견을 추가하지 않았다. 흥미롭고 약간 humbling 한 결과. Generator → Critic → Synthesizer 루프는 Gemma 4 의 claim 을 5 → 3 으로 줄였다.
Critic 이 정확히 지적했다. "RSI 47 은 falling knife 가 아니다." "HYPER/NOM 손실 결론은 entry count 만 보고 한 거지 PnL 데이터에 기반한 게 아니다." 둘 다 Synthesizer 가 drop.
이건 정직성 향상이지 coverage 향상이 아니다. 하네스는 Gemma 가 놓친 두 가지 (n=1 블랙리스트, fee drag) 를 추가하지 못했다. source 모델이 그것들을 애초에 모르고 있기 때문이다.
하네스는 모델이 모르는 걸 알게 만들 수 없다.
Section 3 — Gemma 4 31B 가 빛나는 지점
비용. 1회 진단 run $0.001. 이 숫자가 너무 작아서 빌드할 수 있는 게 달라진다.
매일 봇 세션 / 매 아침 git diff / 매 overnight 로그에 분석가를 붙인다? Gemma 4 raw 면 월 $0.03. Gemini 3.1 Pro 는 월 $2. Claude Opus 는 월 $5.
한국어 + 영어 + 코드 혼합 로그. 내 input 은 Markdown 안에 한국어 운영자 메모 + 영어 구조 코멘트 + 티커가 섞여 있었다. Gemma 4 는 문제 없이 깔끔한 영어 JSON 으로 응답했다.
Bilingual content 는 보통 작은 오픈 모델이 quality drop 하는 지점인데, Gemma 4 는 안 그랬다.
운영 디테일. Gemma 4 가 Phase-2 disabled 버그를 잡았다. 로그의 구체적인 운영 fact 인데 DeepSeek 가 놓친 거다.
Gemma 4 의 reasoning 토큰 예산이 뭘 부족하든, 운영 구조에 대한 attention 은 유지된다.
Raw 모드 속도. 76초에 5-진단 분석. Gemini 3.1 Pro Preview 가 coherent 한 답을 반환한 것보다 빠르다. (Gemini 47초 중 3,388 토큰이 silent reasoning, 답은 더 얇았음.)
Section 4 — Gemma 4 31B 가 절뚝거리는 지점
통계 literacy. Gemma raw 와 하네스 둘 다 "1 trade 후 블랙리스트는 통계적 무의미" 를 놓쳤다. DeepSeek 는 explicit 잡았다.
이게 중요한 finding 이다. 운영자 (나) 가 single data point 로 실거래 결정을 내릴 뻔했고, Gemma 가 silent 하게 let through 했다.
실행 경제학 도메인 지식. Gemma raw / 하네스 둘 다 Binance 0.1% round-trip taker fee 가 0.4% trail 의 절반을 먹는다는 사실을 언급 안 했다. Gemini 와 DeepSeek 는 둘 다 flag.
이건 도메인 지식 갭이지 reasoning 갭이 아니다. Gemma 4 는 reasoning 자체는 멀쩡하다. 단지 이 trading 비용 trivia 를 default 로 알고 있지 않을 뿐.
Bonferroni / multiple-testing. 시스템 프롬프트에서 Bonferroni-aware 한 추론을 명시 요청했다. 그런데 누구도 (Gemma 하네스 / Gemini / DeepSeek 다) Bonferroni 라는 단어를 사용하거나 적절한 multiple-testing 보정을 implement 하지 않았다.
모두 statistical-confidence 라벨 ("high" / "medium" / "low") 만 줬고, 수학은 안 했다. 폐쇄 모델 baseline 만 적어도 Bonferroni 를 cite 하고 frame 으로 사용했다. 이 task 에서 모든 오픈 모델이 공유한 약점이다.
산문 depth. Gemma 4 JSON 출력은 더 짧고 tight. DeepSeek 출력은 더 dense + discursive. 모델이 "thinking aloud" 해서 postmortem 에 인용할 만한 분석을 원한다면 DeepSeek 가 senior 분석가의 노트에 가깝다. Gemma 4 는 1페이지 안에 정리하라고 들은 junior 같다.
Section 5 — 하네스 엔지니어링: 격차 메우기
이 글에서 내가 가장 쓰고 싶었던 부분.
아이디어는 단순하다. frontier 모델의 1/170 비용인 raw 모델을 가져와서, senior 분석가가 자동으로 적용하는 운영 구조 로 둘러싼다. 더 큰 모델이 아니다. 더 좋은 워크플로다.
같은 Gemma 4 31B 를 3번 호출했다. 다른 role 로:
Step 1 — Generator. Raw run 과 같은 시스템 프롬프트. 동일 task / 입력 / 모델. 출력: 1차 진단 JSON. (진단 5, 코드 변경 3, RR 분기점 50%.)
Step 2 — Critic. 새 시스템 프롬프트: "너는 퀀트 분석의 적대적 비판자. spurious 발견 / 빠진 self-critique / vague 코드 변경 / 답 안 한 질문 찾기." 입력: 데이터 + Generator JSON. 출력: critique JSON.
Critic 의 실제 출력 발췌 (Generator 1차 진단에 대한):
"D2: 중앙값 RSI 47.4 에서 봇이 'falling knife catcher' 라고 주장 = 모순. RSI 47 = neutral, 'knife catching' 은 extreme low 진입 의미. 분석가는 'lack of oversold signal' 과 'catching falling knives' 를 conflate."
"D3: Spurious 패턴 위험. 33 심볼 × 601 진입에서 심볼별 PnL 데이터 없이 HYPER + NOM 손실로 specific 결론은 leap. 높은 entry count ≠ 높은 손실 기여."
"Missing: 'Top Volatile' 유니버스의 slippage 영향 평가 (Operator Pain Point #4). critical cost driver 인데 진단에서 안 다룸."
"RR redesign 우려: 분석가가 SL 2.0% + Callback 1.5% 제안. 단 Callback 확대가 win rate 를 significantly 낮추는 사실을 안 고려, RR gain 을 offset 할 수 있음."
같은 Gemma 4 31B 모델, 다른 role 프롬프트, 자기 1차 pass 를 능숙하게 갈라친다. "RSI 47 ≠ falling knife" 논리 모순, 작은 N per-symbol 결론의 spurious 위험, 빠진 slippage 분석을 정확히 identify.
Step 3 — Synthesizer. 새 시스템 프롬프트: "최종 JSON. critique 통과한 것 keep. Critic 이 flag 한 것 drop or weaken. 코드 변경 specificity tighten. RR 수학을 breakeven win rate 대비 재check."
전체 파이프라인, 구조만:
def diagnose_with_harness(model: str, system_prompt: str, log_md: str) -> dict:
# Step 1 — Generator: raw run 과 동일
first = call_model(model, system_prompt, user=log_md)
# Step 2 — Critic: 같은 모델, 적대적 role
critic_system = (
"너는 퀀트 분석의 적대적 비판자다. "
"spurious 발견, 빠진 self-critique, vague 코드 변경, "
"답 안 한 질문을 찾아라. 구체적으로."
)
critique = call_model(model, critic_system,
user=f"DATA:\n{log_md}\n\nFIRST PASS:\n{first}")
# Step 3 — Synthesizer: 통과한 것 keep, flag 된 것 drop or weaken
synth_system = (
"최종 JSON 을 만들어라. critique 통과한 것 keep. "
"Critic 이 flag 한 것 drop or weaken. "
"코드 변경 specificity tighten. RR 수학을 breakeven WR 대비 재check."
)
return call_model(model, synth_system,
user=f"DATA:\n{log_md}\n\nFIRST:\n{first}\n\nCRITIQUE:\n{critique}")
Synthesizer 는 Generator 의 5 진단 중 2개를 drop 했다 (Critic 가 spurious 라고 flag 한 것들). 3개는 더 tight 한 wording 으로 keep. 그리고 가장 중요하게, RR 재설계 분기점 win rate 를 낙관적 50% 에서 정직한 64.3% 로 수정했다. Critic 의 "callback 확대 = win rate 감소" 포인트를 cite 하면서.
이게 결정적인 부분이다.
Raw Gemma 4 가 말했다: "trail 을 1.5% 로 확대, 손익분기 50% win rate 필요." 이 숫자는 너무 generous 하다. trail 확대가 trail fire 양성 횟수도 줄인다 는 사실을 안 고려한 결과다.
하네스 Gemma 4 가 말했다: "trail 을 1.5% 로 확대, 단 정직하자. trail fire 감소까지 고려하면 64% 가까운 win rate 가 필요하다." 이 숫자는 폐쇄 모델 baseline 의 55% 추정에 더 가깝다. 실제로 변경을 ship 할지 결정할 때 사용할 만한 숫자다.
Gemma 4 를 "낙관적 50%" 에서 "정직한 64%" 로 업그레이드한 비용 = 추가 API 호출 2회. 총 약 0.25 센트.
이게 이 실험의 헤드라인이다.
Section 6 — 정직한 평결
2026-05 시점 "open-source-first" AI 의 상황을 1인 빌더 입장에서 요약하면:
Gemma 4 31B raw 는 1인 빌더 분석 작업의 약 80% 를 폐쇄 모델 비용의 1% 로 cover 한다. 구조 문제 대부분을 잡고, 한국어/영어/코드 혼합을 처리하고, 깔끔한 JSON 을 빠르게 반환한다. 매일 routine 진단 (매 아침 로그 review / 매 PR diff 설명) 에는 이 모델이 답이다.
Gemma 4 + 3-call 자가검증 하네스 는 90% 까지 끌어올린다. base 모델이 모르는 새 발견은 추가되지 않는다. 단 가지고 있는 발견의 정직성 이 dramatic 하게 향상된다. 실제로 ship 할 코드 변경에는 가치가 있다.
DeepSeek V4 Pro 는 depth tool. Reasoning 토큰이 무겁고, 느리고, 더 사려깊고, Gemma 가 놓치는 것 (fee drag, n=1 통계 floor) 을 잡는다. 더 신중한 분석가의 second opinion 이 진짜 필요할 때 $0.04 / run 을 낼 만하다.
Gemini 3.1 Pro Preview 는 이 task / 이 input 종류에는 다시 안 산다. 더 얇은 출력, 더 비싼 가격, DeepSeek 또는 Gemma + 하네스 대비 qualitative win 없음. Multimodal / long-context 등 Gemini 가 진짜 강한 task 에는 다를 수 있다.
마지막 10% 는 Bonferroni rigor, 운영자 framing 밖의 novel 진단, senior 트레이더가 실제 쓰는 방식으로 specific prior incident 를 cite 하는 능력이다. 여기는 frontier 폐쇄 모델 우위가 유지된다. 단 그 10% 격차는 내가 예상한 것보다 좁고, 가격 비율이 시사하는 것보다 훨씬 좁다.
내가 운영하는 1인 AI-Native 작업 (오늘은 트레이딩 봇 진단, 내일은 영상 파이프라인 오케스트레이션, 모레는 음악 발매 계획) 에는 오픈소스 스택 + 잘 설계된 하네스가 right default 다.
고가 폐쇄 모델 라인은 high-stakes 10% 용으로 열어둔다. 단 daily-driver 는 이제 open 이다. 12개월 전에는 사실이 아니었다. 지금은 사실이다.
재현하려면
하네스 코드, 프롬프트, 봇 로그 요약 포맷, 모델 wrapper 다 단순 Python + OpenRouter API.
analyze_sniper_log.py는 432K 라인 raw 로그를 1,500 토큰 Markdown 요약으로 만든다prompts.py는 시스템 + 사용자 프롬프트 빌더run_all_models.py는 OpenRouter wrapper, 4 모델 동시 호출 + robust JSON 파싱gemma4_with_harness.py는 3-call Generator/Critic/Synthesizer 파이프라인
전체 size 는 작다. interesting 한 부분은 코드가 아니다. 프롬프트 구조와, 모델에게 critic role 을 줘서 critic 이 한 말을 실제로 use 할 의지다.
본인 로그에 돌리고 다른 ranking 이 나오면 보고 싶다. 4-모델 격차가 다른 input (더 긴 reasoning chain / multimodal / 다른 도메인) 에서는 invert 될 수도 있다.
Indie 1-dev 가 큐레이션. Openly built. 댓글 / counter-experiment 환영.
— Jack (wildeconforce.com, @wildeconforce on dev.to)