왜 자체 모델이 필요했나
랭퀀트의 분석 파이프라인은 트위터·뉴스·온체인까지 다 보지만, 코인판·디시·네이버카페 같은 한국어 커뮤니티에서 떠다니는 글은 가장 다루기 어려운 데이터입니다. "가즈아", "존버", "나락", "ㅈ버", … 일반 한국어 모델로 임베딩하면 "이게 매수 신호인가, 단순 푸념인가" 구분이 안 됩니다.
처음에는 GPT-4로 라벨링해서 매번 분류를 돌렸지만, 한 종목당 수천 건의 글을 실시간으로 처리하기에는 비용이 너무 컸습니다. 그래서 자체 모델 — LQ-KBERT-Base — 을 만들기로 했습니다.
목표: 한 문장에서 6가지를 한 번에
투자 심리 분석은 단순한 긍정/부정 이진 분류로는 한참 부족합니다. "여기선 관망이 맞다"는 약한 부정이지만 행동은 보유입니다. "들어가도 될까?"는 조심스러운 낙관이지만 행동은 질문입니다. 이 두 축은 따로 봐야 합니다.
그래서 한 문장에서 다음 6개를 동시에 예측하기로 했습니다:
{
"sentiment_strength": "strong_pos | weak_pos | neutral | weak_neg | strong_neg",
"action_signal": "buy | hold | sell | avoid | info_only | ask_info",
"emotions": ["greed","fear","confidence","doubt","anger","hope","sarcasm"],
"certainty": 0.0 ~ 1.0,
"relevance": 0.0 ~ 1.0,
"toxicity": 0.0 ~ 1.0
}- sentiment_strength — 가격 전망의 톤 (5단계 강도)
- action_signal — 실제 투자 행동 의도 (매수·보유·매도·회피·정보·질문)
- emotions — 다중 선택 (탐욕·공포·확신·의심·분노·희망·풍자)
- certainty — 확신도. 단순 질문은 낮고, 수치 근거가 있으면 높음
- relevance — 투자 관련성. 잡담/밈을 거르기 위한 신호
- toxicity — 욕설·비하 강도. 투자 의미와 독립
이 여섯이 묶여 나와야 "강한 부정 + 회피 + 분노 + 확신도 0.9 + 관련성 0.95" 같은 풍부한 컨텍스트를 만들 수 있습니다.
데이터: 10만 건의 한국어 가상자산 텍스트
- 코인판·디시 코인갤·네이버카페·텔레그램 채널에서 수집한 커뮤니티 글
- 가상자산 전문 매체의 뉴스 헤드라인과 본문 첫 문단
- 트위터/X의 한국어 가상자산 트윗
문장 단위 200자 이내로 자르고, 중복·광고·자동 봇 게시물을 1차 필터링한 후 10만 건 이상을 남겼습니다.
라벨링은 두 단계로 했습니다:
- Human 라벨링 — 사람이 게시글 제목을 보고 약 몇백개의 예시 샘플에 대해 Valid/Test 셋의 라벨링을 진행합니다.(예: "가즈아 → strong_pos/buy")
- LLM 라벨링 + 사람 검수 — Human 라벨링을 바탕으로 GPT-4.1로 멀티태스크 라벨을 생성한 뒤, Test 셋에 대해 높은 정확도가 나오도록 튜닝하였습니다.
가장 까다로웠던 라벨은 sarcasm(풍자) 와 certainty(확신도) 였습니다.
"이번엔 진짜 간다 ㅋㅋ"는 표면적으로는 strong_pos지만 sarcasm 플래그가 켜져야 하고, certainty는 오히려 낮아야 합니다. 이런 케이스가 전체의 약 8%였습니다.
라벨링 가이드라인
라벨러마다 기준이 달라지면 모델이 학습하는 신호가 흐려집니다. 그래서 라벨링 가이드를 명문화했습니다.
Sentiment Strength
| 라벨 | 표현 예시 |
|---|---|
| strong_pos | "가즈아", "무조건 간다", 급등 확신 |
| weak_pos | "반등 가능", "괜찮을 듯" — 조심스러운 낙관 |
| neutral | 단순 정보/공지/잡담 |
| weak_neg | "조정 올 듯", "관망" — 완곡한 부정 |
| strong_neg | "나락", "망함", "해킹/제재" — 폭락·패닉 |
Action Signal
| 라벨 | 표현 예시 |
|---|---|
| buy | "지금 산다", "롱" — 매수/진입 지시 |
| hold | "존버", "유지" — 보유/관망 |
| sell | "익절", "손절", "정리" — 매도/청산 |
| avoid | "가지마", "스캠", "위험" — 회피 권고 |
| info_only | 뉴스/공지 단순 전달 |
| ask_info | "들어가도 돼?", "왜 떨어져?" — 질문/탐색 |
Certainty / Relevance / Toxicity
연속값(0–1)이라 구간으로 가이드했습니다:
- Certainty — 0.2–0.4 질문·밈 · 0.4–0.6 완곡한 의견 · 0.6–0.8 수치·근거 · 0.8–1.0 강한 단정·지시
- Relevance — 0.7–1.0 직접 투자 관련 · 0.4–0.7 간접(업계·인물·기술) · 0.0–0.3 무관·잡담·밈
- Toxicity — 욕설·모욕·비하 강도. 투자 의미와 별개로 평가
모델: klue/bert-base + 멀티 헤드
백본은 klue/bert-base. 한국어 KLUE 벤치마크에서 학습된 BERT라 코인판 같은 비표준 한국어에도 잘 적응했습니다.
[문장] → klue/bert-base → [CLS] 벡터
├── linear → sentiment_strength (5-class)
├── linear → action_signal (6-class)
├── linear → emotions (7 sigmoid)
└── linear → certainty / relevance / toxicity (3 reg)
손실은 네 헤드의 가중합:
loss = (
w_senti * CE(logits_senti, y_senti) +
w_act * CE(logits_act, y_act) +
w_emo * BCE(logits_emo, y_emo) +
w_reg * MSE(pred_reg, y_reg)
)태스크 간 difficulty가 다른 만큼 가중치는 휴리스틱하게 조정했습니다. emotion(다중 라벨)이 가장 약한 신호라 BCE 가중치를 더 높여 잡았습니다.
학습 과정에서 만난 함정
1. Action vs Sentiment의 분리
초기 모델은 sentiment와 action을 거의 동일하게 예측했습니다. weak_neg면 무조건 sell, strong_pos면 무조건 buy. 이건 데이터 라벨이 그렇게 균일했기 때문이었습니다.
해결: 라벨링 단계에서 sentiment와 action이 다른 케이스(예: weak_neg + hold, weak_pos + ask_info)를 의도적으로 더 많이 수집해서 학습 분포를 어긋나게 만들었습니다.
2. Sarcasm은 sentiment만으로는 못 잡는다
"비트 그만 좀 내려라 진짜.." — 단어만 보면 strong_neg이지만, 글쓴이는 사실 매수자고, 톤은 풍자입니다. sarcasm을 emotions 다중 라벨에 넣은 이유입니다. sentiment_strength와 emotions를 같이 봐야 톤이 풀립니다.
3. 200자 절단의 문제
긴 분석글을 200자로 자르면 결론이 잘릴 수 있습니다. 다만 커뮤니티 글의 80% 이상이 200자 이내였고, 긴 글은 별도의 요약 파이프라인(LQ-FSE-Base 모델)에서 처리하기로 했습니다.
사용법
import torch, json
from transformers import AutoTokenizer, AutoModel
repo = "LangQuant/LQ-Kbert-base"
texts = [
"비트코인 조정 후 반등, 투자심리 개선",
"환율 급등에 증시 변동성 확대",
"비트 그만 좀 내려라 진짜..",
"폭락ㅠㅠㅜㅠㅜ 다 팔아야할까요?",
]
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModel.from_pretrained(repo, trust_remote_code=True)
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device).eval()
enc = tokenizer(
texts, return_tensors="pt",
padding=True, truncation=True, max_length=200,
).to(device)
with torch.inference_mode():
out = model(**enc)
IDX2SENTI = {0:"strong_pos",1:"weak_pos",2:"neutral",3:"weak_neg",4:"strong_neg"}
IDX2ACT = {0:"buy",1:"hold",2:"sell",3:"avoid",4:"info_only",5:"ask_info"}
EMO_LIST = ["greed","fear","confidence","doubt","anger","hope","sarcasm"]
for i, t in enumerate(texts):
senti = int(out["logits_senti"][i].argmax().item())
act = int(out["logits_act"][i].argmax().item())
emo_p = torch.sigmoid(out["logits_emo"][i]).tolist()
reg = torch.clamp(out["pred_reg"][i], 0, 1).tolist()
emos = [EMO_LIST[j] for j, p in enumerate(emo_p) if p >= 0.5]
print(json.dumps({
"text": t,
"pred_sentiment_strength": IDX2SENTI[senti],
"pred_action_signal": IDX2ACT[act],
"pred_emotions": emos,
"pred_certainty": float(reg[0]),
"pred_relevance": float(reg[1]),
"pred_toxicity": float(reg[2]),
}, ensure_ascii=False))실제 출력 예시
| 문장 | sentiment | action | 해석 |
|---|---|---|---|
| "개떡상이여" | strong_pos | buy | 강한 상승 확신 + 즉시 매수 의도 |
| "여기선 관망이 맞다" | weak_neg | hold | 부정적이지만 보유 유지 |
| "들어가도 될까?" | weak_pos | ask_info | 조심스러운 낙관, 매수 탐색 |
| "해킹 터짐, 비상. 접근 금지" | strong_neg | avoid | 강한 부정 + 회피 권고 |
| "업데이트 공지 나왔습니다" | neutral | info_only | 단순 정보, 행동 없음 |
같은 문장이라도 sentiment와 action이 분리되어 나오는 것을 볼 수 있습니다. 이 분리가 단순 감성분석과 LQ-KBERT-Base의 가장 큰 차이입니다.
랭퀀트에서는 어떻게 쓰이나
LQ-KBERT-Base는 랭퀀트 파이프라인의 첫 번째 신호 레이어입니다.
- 크롤러가 한국어 커뮤니티/뉴스에서 신규 글을 수집
- LQ-KBERT-Base가 각 문장을 6차원 벡터로 분류
- 종목 단위로 집계 — "BTC 관련 글 1,200건 중 strong_pos+buy 비중 18%, sarcasm 비중 4%"
- 시점별 변화를 추적해 커뮤니티 지수 산출
기존에 GPT-4.1로 처리하던 부분을 BERT로 대체하면서 비용은 1/40 수준으로 하락하였으며, 우리나라에서 발생하는 모든 커뮤니티 글과 뉴스를 분류하여 커뮤니티 인덱스를 구축할 수 있게 되었습니다.

Overheat / Oversell 구간은 어떻게 정의되나
지수의 절대값은 종목·기간마다 다르기 때문에, 누적 히스토리를 기준으로 상대 위치로 판단합니다. 프론트엔드 차트와 운영 백테스트는 동일한 정의를 사용합니다:
- OVERHEAT EXTREME —
combined ≥ 90th percentile. 커뮤니티에 strong_pos + buy 비중이 극단적으로 몰린 상태 → SHORT 진입 후보 - OVERSELL EXTREME —
combined ≤ 10th percentile. strong_neg + sell/avoid 비중이 몰리고 fear·anger emotion이 함께 치솟는 상태 → LONG 진입 후보 - 25/75 같은 완만한 구간은 정보가 약해서 (백테스트에서 10/90보다 일관되게 떨어짐) 실제 알람·매매 룰에서는 쓰지 않습니다
백테스트: BTC 일봉, 룩어헤드 없이
신호가 실제로 의미가 있는지 보려면 그 날짜 시점의 트레이더가 아는 데이터만으로 임계값을 정해야 합니다. 만약 8개월 전체를 다 모아놓고 10/90 퍼센타일을 계산해서 그 8개월에 적용하면, 2025-09월의 신호가 2026-05월까지의 미래 데이터를 미리 본 셈이 되어버립니다.
그래서 다음과 같이 설계했습니다:
- 각 트레이딩 일자 D마다 — cm_index 시계열의 [시작, D) 구간으로 10/90 퍼센타일을 다시 계산
- 그 날 combined ≤ 10%ile 이면 oversell, ≥ 90%ile 이면 overheat 신호
- 워밍업 60일 적용 (그 전까지는 신호 없음)
- 진입은 알림 받은 다음날 09시 (바이낸스 일봉 종가, T+1)
프로덕션 코드는 365일 rolling window를 쓰지만, 데이터가 365일보다 짧은 구간에서는 expanding window가 동일한 효과를 냅니다.
조건:
- 종목: BTC 일봉 (바이낸스, 종가 기준, 신호 알림 후 +1일 09시 종가 진입)
- 기간: 2025-11-10 – 2026-05-17 (60일 워밍업 후, 189일)
- 같은 기간 BTC HOLD: −25.57% (여전히 약세장 비중이 큰 환경)
- 그리드: cm_type 3 (all / community / news) × side 2 (long / short) × hold 3 (5 / 10 / 20일) = 12개 룰 (프로덕션 진입/청산 알람에 그대로 운영)
- 10/90 percentile 단일 (sensitivity 분석 결과 25/75보다 일관되게 우월)
- Short은 합성 (실제 공매도 venue 모델링은 따로 필요)
집계 결과
| 방향 | 룰 수 | 평균 누적수익 | 플러스 비율 |
|---|---|---|---|
| SHORT (overheat) | 6 | +26.75% | 100% (6/6) |
| LONG (oversell) | 6 | +16.64% | 83% (5/6) |
| BTC HOLD | — | −25.57% | — |
SHORT은 6개 룰 모두 플러스, 평균 +26.75%. 약세장 환경이라 단순 "매일 short" 보유가 +25.57%인 점은 감안해야 하지만, 시그널 진입은 MaxDD가 −5%–−13%로 매일 보유 (변동성 크게 노출) 대비 훨씬 안정적입니다 — 신호가 시점까지 잡고 있다는 뜻입니다.
LONG은 6개 중 5개 플러스, 평균 +16.64%. 같은 기간 BTC가 −25% 빠진 환경에서 long을 들고 +16% 누적이면 신호 자체에 알파가 있다고 보는 게 합리적입니다. 다만 news 5d 단독은 −22%로 실패 — 감정 신호가 뉴스보다 커뮤니티에서 더 정확하게 잡히는 패턴입니다.
룰별 결과
LONG (oversell 진입 · 10/90 percentile · 알림 +1일 09시 진입)
| 룰 | N | 승률 | 평균수익 | 누적수익 | Sharpe | MaxDD |
|---|---|---|---|---|---|---|
all 5d 보유 | 7 | 86% | +3.89% | +30.31% | 0.56 | −9.0% |
all 20d 보유 | 4 | 100% | +7.56% | +33.76% | 0.55 | −9.2% |
community 5d 보유 | 6 | 83% | +3.49% | +22.60% | 0.45 | −9.0% |
community 10d 보유 | 4 | 100% | +4.93% | +20.96% | 0.44 | −8.2% |
all 10d 보유 | 4 | 100% | +3.46% | +14.35% | 0.33 | −8.2% |
news 5d 보유 | 9 | 33% | −2.46% | −22.14% | −0.43 | −29.3% |
SHORT (overheat 진입 · 10/90 percentile · 알림 +1일 09시 진입)
| 룰 | N | 승률 | 평균수익 | 누적수익 | Sharpe | MaxDD |
|---|---|---|---|---|---|---|
all 20d 보유 | 4 | 100% | +9.28% | +41.96% | 0.67 | −10.3% |
all 10d 보유 | 4 | 75% | +7.72% | +32.54% | 0.60 | −8.5% |
community 10d 보유 | 3 | 100% | +8.55% | +27.31% | 0.69 | −5.2% |
all 5d 보유 | 4 | 100% | +5.92% | +25.31% | 0.54 | −11.6% |
community 5d 보유 | 4 | 100% | +4.79% | +20.19% | 0.43 | −11.6% |
news 5d 보유 | 10 | 60% | +1.41% | +13.18% | 0.35 | −13.2% |
가장 견고한 SHORT 룰은 all 20d 보유 — N=4, 100% 승률, +41.96%, MaxDD −10.3%. SHORT 6개 룰 전체 평균 +26.75%, 다 플러스. LONG 쪽은 all 5d 보유 / community 5d 보유가 N도 충분하고 결과 일관 (83–86% 승률, +22–30% 누적수익). news 5d 보유는 LONG에서 의미 없음 — 감정 신호가 뉴스보다 커뮤니티에 더 강하게 잡힙니다.
거래 표본은 룰당 N=3–10건. 추세는 명확하지만 표본 크기가 작아 통계적 의미는 강하지 않습니다 — 백테스트 수치는 "신호가 정보를 갖는다"를 보여주는 증거지, "이 정확한 수익이 미래에 재현된다"는 보장이 아닙니다.
진입 타이밍: 신호 발생일 D → 알림 D+1 09:05 → 진입 D+2 09:00 (바이낸스 D+1 일봉 종가). 진입을 0–3일 지연시키며 sensitivity를 본 결과 +1일이 모든 룰에서 누적수익·승률이 가장 좋게 나왔습니다. Oversell 신호 직후 평균적으로 하루 더 빠지고 반등하는 패턴이 있어서, 신호 받자마자 매수하는 것보다 하루 기다리는 게 유리합니다.
전체 거래 내역
표본 검증을 위해 12개 룰의 모든 closed 거래를 공개합니다. 진입가/청산가는 바이낸스 BTC 일봉 종가 (KST 09:00) 기준.
LONG
CM-Index-Strategy-01 (all · 5d) — N=7, 승률 86%, 누적 +30.31%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-21 | $85,129.43 | 2025-11-26 | $90,484.02 | +6.29% |
| 2025-12-01 | $86,286.01 | 2025-12-06 | $89,236.79 | +3.42% |
| 2025-12-17 | $86,243.22 | 2025-12-22 | $88,620.79 | +2.76% |
| 2026-02-05 | $62,909.86 | 2026-02-10 | $68,841.29 | +9.43% |
| 2026-02-12 | $66,272.17 | 2026-02-17 | $67,503.52 | +1.86% |
| 2026-02-20 | $68,020.01 | 2026-02-25 | $67,988.04 | −0.05% |
| 2026-03-01 | $65,776.47 | 2026-03-06 | $68,114.02 | +3.55% |
CM-Index-Strategy-02 (all · 10d) — N=4, 승률 100%, 누적 +14.35%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-21 | $85,129.43 | 2025-12-01 | $86,286.01 | +1.36% |
| 2025-12-17 | $86,243.22 | 2025-12-27 | $87,877.01 | +1.89% |
| 2026-02-05 | $62,909.86 | 2026-02-15 | $68,832.58 | +9.41% |
| 2026-02-20 | $68,020.01 | 2026-03-02 | $68,830.06 | +1.19% |
CM-Index-Strategy-03 (all · 20d) — N=4, 승률 100%, 누적 +33.76%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-21 | $85,129.43 | 2025-12-11 | $92,513.38 | +8.67% |
| 2025-12-17 | $86,243.22 | 2026-01-06 | $93,747.97 | +8.70% |
| 2026-02-05 | $62,909.86 | 2026-02-25 | $67,988.04 | +8.07% |
| 2026-03-01 | $65,776.47 | 2026-03-21 | $68,918.12 | +4.78% |
CM-Index-Strategy-04 (community · 5d) — N=6, 승률 83%, 누적 +22.60%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-12-01 | $86,286.01 | 2025-12-06 | $89,236.79 | +3.42% |
| 2025-12-17 | $86,243.22 | 2025-12-22 | $88,620.79 | +2.76% |
| 2026-02-05 | $62,909.86 | 2026-02-10 | $68,841.29 | +9.43% |
| 2026-02-12 | $66,272.17 | 2026-02-17 | $67,503.52 | +1.86% |
| 2026-02-20 | $68,020.01 | 2026-02-25 | $67,988.04 | −0.05% |
| 2026-03-01 | $65,776.47 | 2026-03-06 | $68,114.02 | +3.55% |
CM-Index-Strategy-05 (community · 10d) — N=4, 승률 100%, 누적 +20.96%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-12-01 | $86,286.01 | 2025-12-11 | $92,513.38 | +7.22% |
| 2025-12-17 | $86,243.22 | 2025-12-27 | $87,877.01 | +1.89% |
| 2026-02-05 | $62,909.86 | 2026-02-15 | $68,832.58 | +9.41% |
| 2026-02-20 | $68,020.01 | 2026-03-02 | $68,830.06 | +1.19% |
CM-Index-Strategy-06 (news · 5d) — N=9, 승률 33%, 누적 −22.14%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-14 | $94,594.00 | 2025-11-19 | $91,554.96 | −3.21% |
| 2025-11-21 | $85,129.43 | 2025-11-26 | $90,484.02 | +6.29% |
| 2025-11-30 | $90,360.00 | 2025-12-05 | $89,330.04 | −1.14% |
| 2025-12-08 | $90,634.34 | 2025-12-13 | $90,240.01 | −0.44% |
| 2025-12-17 | $86,243.22 | 2025-12-22 | $88,620.79 | +2.76% |
| 2026-01-31 | $78,741.09 | 2026-02-05 | $62,909.86 | −20.11% |
| 2026-02-06 | $70,580.26 | 2026-02-11 | $67,082.52 | −4.96% |
| 2026-02-14 | $69,822.95 | 2026-02-19 | $67,003.73 | −4.04% |
| 2026-02-24 | $64,058.15 | 2026-03-01 | $65,776.47 | +2.68% |
SHORT
CM-Index-Strategy-07 (all · 5d) — N=4, 승률 100%, 누적 +25.31%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-10 | $106,011.13 | 2025-11-15 | $95,596.24 | +9.82% |
| 2026-01-07 | $91,364.16 | 2026-01-12 | $91,296.20 | +0.07% |
| 2026-02-02 | $78,738.61 | 2026-02-07 | $69,289.38 | +12.00% |
| 2026-03-14 | $71,211.95 | 2026-03-19 | $69,930.00 | +1.80% |
CM-Index-Strategy-08 (all · 10d) — N=4, 승률 75%, 누적 +32.54%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-10 | $106,011.13 | 2025-11-20 | $86,637.23 | +18.28% |
| 2026-01-07 | $91,364.16 | 2026-01-17 | $95,147.77 | −4.14% |
| 2026-02-02 | $78,738.61 | 2026-02-12 | $66,272.17 | +15.83% |
| 2026-03-14 | $71,211.95 | 2026-03-24 | $70,556.74 | +0.92% |
CM-Index-Strategy-09 (all · 20d) — N=4, 승률 100%, 누적 +41.96%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-10 | $106,011.13 | 2025-11-30 | $90,360.00 | +14.76% |
| 2026-01-07 | $91,364.16 | 2026-01-27 | $89,250.00 | +2.31% |
| 2026-02-02 | $78,738.61 | 2026-02-22 | $67,643.40 | +14.09% |
| 2026-03-14 | $71,211.95 | 2026-04-03 | $66,964.30 | +5.96% |
CM-Index-Strategy-10 (community · 5d) — N=4, 승률 100%, 누적 +20.19%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-08 | $102,312.94 | 2025-11-13 | $99,692.02 | +2.56% |
| 2026-01-25 | $86,670.36 | 2026-01-30 | $84,260.49 | +2.78% |
| 2026-02-02 | $78,738.61 | 2026-02-07 | $69,289.38 | +12.00% |
| 2026-03-14 | $71,211.95 | 2026-03-19 | $69,930.00 | +1.80% |
CM-Index-Strategy-11 (community · 10d) — N=3, 승률 100%, 누적 +27.31%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-08 | $102,312.94 | 2025-11-18 | $92,960.83 | +9.14% |
| 2026-01-25 | $86,670.36 | 2026-02-04 | $73,165.83 | +15.58% |
| 2026-03-14 | $71,211.95 | 2026-03-24 | $70,556.74 | +0.92% |
CM-Index-Strategy-12 (news · 5d) — N=10, 승률 60%, 누적 +13.18%
| 진입일 | 진입가 | 청산일 | 청산가 | 수익률 |
|---|---|---|---|---|
| 2025-11-11 | $103,058.99 | 2025-11-16 | $94,261.44 | +8.54% |
| 2025-11-25 | $87,369.96 | 2025-11-30 | $90,360.00 | −3.42% |
| 2025-12-03 | $93,429.95 | 2025-12-08 | $90,634.34 | +2.99% |
| 2026-01-06 | $93,747.97 | 2026-01-11 | $91,013.65 | +2.92% |
| 2026-01-15 | $95,604.80 | 2026-01-20 | $88,427.66 | +7.51% |
| 2026-02-27 | $65,872.10 | 2026-03-04 | $72,666.77 | −10.31% |
| 2026-03-06 | $68,114.02 | 2026-03-11 | $70,191.86 | −3.05% |
| 2026-03-17 | $73,909.36 | 2026-03-22 | $67,859.00 | +8.19% |
| 2026-04-15 | $74,809.99 | 2026-04-20 | $75,840.97 | −1.38% |
| 2026-04-24 | $77,437.13 | 2026-04-29 | $75,780.00 | +2.14% |
결론
| 가설 | 결과 |
|---|---|
| Overheat이 단기 조정의 선행 신호다 (SHORT) | 6개 SHORT 룰 모두 플러스를 기록했으며 평균 누적수익은 +26.75%였습니다. 약세장 환경의 영향이 일부 반영되어 있지만, MaxDD가 −5%–−13% 범위로 단순 short 보유 대비 훨씬 안정적이라는 점에서 신호 자체에도 정보가 있다고 해석할 수 있습니다. |
| Oversell이 단기 반등의 선행 신호다 (LONG) | 6개 LONG 룰 중 5개가 플러스를 기록했고 평균 누적수익은 +16.64%였습니다. BTC가 같은 기간 −25% 하락한 환경에서 long 포지션이 양의 수익을 낸 것은 신호 자체에 알파가 존재한다는 증거로 볼 수 있습니다. |
| community 신호가 news 신호보다 정확하다 | news 5d LONG 룰은 −22%로 유일하게 실패했으며, community 계열은 LONG·SHORT 양쪽 모두 안정적인 양의 수익을 보였습니다. 감정·매수의도 신호는 뉴스 기사보다 커뮤니티 게시글에서 더 또렷하게 드러나는 것으로 해석됩니다. |
| 신호 다음날 진입이 당일 진입보다 유리 | 진입 시점을 0일–3일 지연시키며 비교한 결과, 모든 LONG 룰에서 +1일 지연이 가장 높은 누적수익을 보였습니다. Oversell 신호가 뜬 직후에도 평균적으로 하루 정도 가격이 더 빠진 뒤 반등하는 경향이 있어, 신호를 보자마자 사는 것보다 하루 기다리는 편이 결과적으로 더 좋았습니다. |
아직 풀지 못한 것
- 표본: 약세장 비중이 큰 8개월. LONG이 약세장 환경에서 +16% 평균을 낸 건 인상적이지만 강세장 데이터가 1년쯤 더 쌓여야 일관성을 검증할 수 있습니다.
뉴스 vs 커뮤니티 괴리 신호
별도 신호 한 개를 덧붙입니다. news_comm_divergence는 뉴스 인덱스만 overheat인데 커뮤니티는 중립·약세인 상태를 잡습니다. "기관·언론은 띄우는데 실제 한국 개인 투자자들은 차분한" 상황을 가리키며, 운영 중 단기 풀백과 자주 동반되는 패턴으로 관측됐습니다.
다음 단계
운영을 돌리는 동안 라벨링 대상 데이터가 약 100만 건까지 쌓였습니다. 다음 버전은 이 데이터를 GPT-5 기준으로 재라벨링해서 학습할 계획입니다. 현재 LQ-KBERT-Base는 GPT-4 라벨로 만들어졌기 때문에, 더 정교한 모델의 라벨이 들어가면 sentiment·certainty·relevance 각 헤드의 정밀도가 한 단계 올라갈 것으로 기대합니다.
추가로 RL(강화학습) 접목도 검토 중입니다. 단순 라벨 정답에 fitting하는 supervised 방식 대신, 분류 결과가 실제 백테스트 수익(혹은 신호 정확도) 같은 downstream metric을 직접 최적화하도록 만드는 방향입니다. 라벨 정답이 애매한 영역(반어법, 풍자, 컨텍스트 의존적 톤)에서 supervised 한계를 넘을 수 있을지가 관건입니다.
긴 글 읽어주셔서 감사합니다. 모델은 Hugging Face에 공개되어 있습니다 — huggingface.co/LangQuant/LQ-Kbert-base. 사용하시면서 발견하신 이슈나 개선 아이디어는 언제든 환영합니다.
랭퀀트의 시그널·리서치 공식 채널은 t.me/langquant_ai 입니다 — 신호 알림과 운영 업데이트를 받아보실 수 있습니다.
Citation
@misc{langquant2025lkbert,
title = {LQ-KBERT-Base: Crypto Market Korean Sentiment & Action Signal Classifier},
author = {LangQuant},
year = {2025},
url = {https://huggingface.co/langquant/LQ-Kbert-base}
}이 모델은 학술 연구 및 실험용으로만 제공됩니다.
본 모델의 출력은 금융/투자 자문으로 간주될 수 없으며, 발생하는 모든 결과에 대해 LangQuant는 책임을 지지 않습니다.