← 빌드 일지
일반2026-05-13·20분 읽기

오픈모델로 어디까지 갈까: 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개:

  1. 운영자 가설을 데이터로 검증할 것. 그냥 confirm 하지 말 것.
  2. Bonferroni / multiple-testing 인식. 11일 × 33 심볼 × 601 진입 = spurious 패턴 위험 높음.
  3. 모든 진단에 self-critique: "이게 틀렸다면 내가 뭘 잘못 본 건가?"
  4. 코드 변경은 구체적으로 (변수명 / 값 / 예상 효과).
  5. 모르면 모른다고. 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.372026 Q1
Gemini 3.1 Pro Preview1M$2.00$12.002026-04
DeepSeek V4 Pro (MoE 1.6T)1M$0.435$0.872026-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 gapsRR 분기점 %시간비용
Gemma 4 31B (raw)5352350.076.4s$0.001
Gemma 4 × 하네스3332464.3130.5s (3 calls)$0.003
Gemini 3.1 Pro Preview3232450.047.1s$0.065
DeepSeek V4 Pro6464825.0198.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 rawGemma × 하네스Gemini 3.1 ProDeepSeek 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 만점)6677

두 가지 관찰.

모델 간 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)

Wildeconforce

매일 만들고, 매일 분석하고, 매일 기록합니다.
© 2026 wildeconforce · build-in-public

이 사이트는 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.