Insights·2026-08-13

임상시험 정보로 제약주를 예측한다는 건 무슨 뜻인가

제약·바이오 주가를 차트가 아니라 임상시험 일정으로 거르는 방식입니다. 3상 결과가 언제 나올지는 ClinicalTrials.gov라는 공개 등록부에 이미 적혀 있고, 발표 당일이 아니라 그 두 달 전부터 기관 수급이 먼저 움직입니다. 그래서 완료 예정일이 60일 안쪽인 임상만 남기고 거기에 공매도·수급 데이터를 붙여 여섯 차원 100점으로 점수를 냅니다. 이 글은 그 파이프라인을 처음부터 끝까지 열어 보이고, 가장 중요한 설계 결정이 왜 「좋아 보이는 숫자를 화면에서 지운 것」이었는지를 설명합니다.

임상 완료일 D-60으로 거른 뒤 여섯 차원 100점으로 매기는 파이프라인 요약 도식. 위쪽 흐름도는 임상 등록부 ClinicalTrials.gov에서 완료 예정일 7~60일 필터, 회사명과 종목코드 매핑, 공매도·기관·외국인 수급 60일을 거쳐 통합 100점으로 이어진다. 아래 왼쪽 패널은 백테스트 콤보 상수로 기관 매수 후반부 가속에 공매도 7% 이하 조합이 과거 평균 +8.43%·양수율 94.12%였고 그 값이 17건에서 나온 16/17이라 알림에 띄우지 않는다고 적혀 있다. 오른쪽 패널은 알림 하단에 붙는 실측 15건·평균 -2.6%·양수율 27%다. 맨 아래에 후보 창은 365일에서 60일로, 강매수는 실측 3건 이상일 때만, market 차원은 상수 50, 기록 자리가 스코어링보다 먼저라는 네 항목과 t.me/ClinicalSignalKR 주소가 있다.
왼쪽이 보여주지 않기로 한 숫자, 오른쪽이 매 알림에 붙는 실측이다.

ClinicalTrials.gov가 무엇이고, 왜 주가 데이터인가

ClinicalTrials.gov는 미국 국립보건원(NIH)이 운영하는 임상시험 등록부입니다. 전 세계 제약사와 병원이 임상을 시작할 때 여기에 등록합니다. 미국에서 판매 허가를 받으려는 임상은 법으로 등록이 강제되기 때문에, 국내 제약사의 주요 임상도 대부분 여기에 올라옵니다. 누구나 무료로 조회할 수 있고 공개 API도 있습니다.

등록 항목 중에 「예상 완료일(estimated completion date)」이 있습니다. 이 임상이 언제 끝날 것으로 계획돼 있는지를 제약사가 스스로 적어 둔 날짜입니다. 여기서 중요한 것은 정확도가 아니라 존재 자체입니다. 제약·바이오 주식에서 가장 큰 가격 변동을 만드는 사건은 임상 결과 발표인데, 그 사건이 대략 언제 일어날지가 미리 공개돼 있다는 뜻이기 때문입니다.

주식 데이터로 예측할 때 늘 문제가 되는 것은 「무엇이 언제 일어날지 모른다」는 점입니다. 임상은 그 문제가 부분적으로 풀려 있는 드문 영역입니다. 사건의 내용(성공/실패)은 모르지만 사건의 시점은 대략 압니다. 이 비대칭이 이 파이프라인 전체의 출발점입니다.

왜 하필 D-60인가

결과 발표 당일에 사서는 늦습니다. 발표는 성공이든 실패든 이미 가격에 반영되기 시작한 뒤에 옵니다. 실제로 과거 임상 이벤트 77건을 되짚어 보니, 기관 순매수와 발표일 수익률의 상관이 D-30 기준으로 뚜렷했고, 5% 넘게 오른 뒤에는 상당수가 되돌림을 겪었습니다. 흔히 말하는 「소문에 사서 뉴스에 판다」가 데이터에서 그대로 보입니다.

그래서 관측 구간을 결과 발표 전 두 달로 잡았습니다. D-60에 감시를 시작하고, D-30 언저리에서 판단하고, 발표 직전에 정리하는 리듬입니다. 처음에는 1년치 임상을 전부 후보로 올렸는데 알림이 감당이 안 됐습니다. 「너무 많이 나온다」는 불만이 실제 사용자(제 자신)에게서 나와서 후보 창을 365일에서 60일로 줄였습니다. 코드에서는 상수 하나입니다.

이 상수가 크론 배치와 수동 갱신 양쪽에서 공유되기 때문에 한 줄만 고치면 두 경로가 같이 바뀝니다. 더 넓게 보고 싶으면 이 값을 늘리면 되지만, 늘리는 순간 저점수 종목이 대량으로 딸려 들어옵니다.

후보를 거르는 파이프라인은 어떻게 도는가

매일 새벽 배치가 순서대로 돕니다. 첫째, ClinicalTrials.gov에서 국내 제약·바이오 기업이 스폰서인 임상을 가져옵니다. 둘째, 예상 완료일이 오늘 기준 7일에서 60일 사이인 것만 남깁니다. 너무 임박한 것(7일 미만)은 이미 반영이 끝났다고 보고 뺍니다. 셋째, 남은 임상을 종목 코드에 매핑합니다. 회사 이름과 종목 코드를 잇는 매핑 테이블이 따로 있습니다.

넷째, 종목마다 최근 60일치 수급 데이터를 붙입니다. 공매도 잔고 비율, 기관 순매수, 외국인 순매수 세 가지입니다. 다섯째, 이 수급 시계열을 전반부와 후반부로 갈라 「가속하고 있는가」를 봅니다. 기관이 사고 있다는 사실보다, 후반부에 더 많이 사고 있다는 사실이 신호이기 때문입니다.

여섯째, 가격 데이터로 기술적 분석 다섯 전략을 각각 돌려 매수·매도·중립 의견을 받고 그 합의를 냅니다. 일곱째, 이 모든 것을 하나의 점수로 합칩니다. 마지막으로 결과를 데이터베이스에 쌓고 텔레그램으로 보냅니다.

여섯 차원 100점은 무엇을 재는가

여섯 개의 축을 각각 0~100점으로 매기고 가중 평균해 하나의 점수를 냅니다. 가중치는 백테스트로 보정하되, 표본이 30건 미만이면 보정값을 믿지 않고 기본값으로 되돌립니다. 과적합을 막는 장치입니다.

점수가 75점을 넘으면 강매수, 60점을 넘으면 매수, 45점 위는 관망, 30점 위는 보유, 그 아래는 회피입니다. 여기에 조건을 하나 더 걸어 두었습니다. 최상위 등급인 강매수는 실측 표본이 3건 이상 뒷받침될 때만 줍니다. 실측으로 검증되지 않은 강매수는 나중에 실현 수익이 평균적으로 마이너스였기 때문입니다.

market 차원은 솔직히 말하면 지금 반쯤 죽어 있습니다. 시장 대비 초과수익 데이터를 아직 수집하지 않아 중립값 50이 상수로 들어갑니다. 그래서 자동 보정이 이 죽은 차원에 큰 가중치를 주려고 하면 코드가 거부합니다. 한때 그리드서치가 market에 0.4를 배정한 적이 있는데, 상수에 40%를 주는 것은 최적화가 아니라 과적합입니다.

차원가중치무엇을 보는가
임상25%임상 단계(1~4상), 완료일까지 남은 일수, 파이프라인 활성도
수급25%기관·외국인 순매수와 공매도 잔고의 조합 패턴
백테스트20%같은 등급·같은 기술적 합의 조합의 과거 실측 성과
기술적15%다섯 개 전략의 매수·매도 컨센서스
시장10%시장 대비 초과수익 (미수집 시 중립 50 고정)
적응증5%질환 카테고리별 프리미엄·디스카운트

가장 센 신호와, 그 숫자를 화면에서 지운 이유

수급 패턴을 열 가지 조합으로 정의해 두었습니다. 그중 가장 성적이 좋았던 것은 「기관 매수가 후반부에 가속하면서 공매도 비율이 7% 이하」인 조합입니다. 과거 데이터에서 평균 +8.43%, 양수율 94.12%가 나왔습니다. 반대편 최악은 「기관 매도 + 외국인 매도」로 평균 -6.63%, 양수율 10%였습니다.

94%는 매력적인 숫자입니다. 그리고 이 시스템은 그 숫자를 알림에 띄우지 않습니다.

이유는 단순합니다. 그 94.12%는 17건에서 나온 값입니다. 16/17입니다. 17건은 표본이라기보다 일화에 가깝고, 조건을 조금만 바꿔도 크게 흔들립니다. 그런 수치를 「이 종목의 승률」처럼 보여주면 그건 분석이 아니라 광고입니다. 실제로 알림 포맷 코드에는 이 원칙이 주석으로 박혀 있습니다. 콤보 정의 상수는 백테스트 미검증 값이므로 예측처럼 노출하지 않는다, 수익률 수치는 실제로 측정된 값만 노출한다, 그리고 시스템의 누적 성적표를 하단에 투명하게 공개한다.

그래서 매 알림 아래에는 실측 성적표가 붙습니다. 8월 12일 기준 실제 결과가 확정된 추천은 15건이고, 평균 수익률 -2.6%, 양수율 27%입니다. 롱 포지션 기준으로 기대값이 아직 플러스가 아닙니다. 자기 성적이 마이너스라는 사실을 매일 자기한테 보고하는 알림인 셈입니다.

숫자를 좋아 보이게 만드는 일은 쉽습니다. 유리한 구간을 고르고, 표본을 늘리지 않고, 백테스트 상수를 실적처럼 적으면 됩니다. 어려운 쪽은 좋아 보이는 숫자를 스스로 지우고 초라한 실측을 그 자리에 놓는 것입니다. 이 파이프라인에서 기술적으로 가장 어려웠던 부분은 스코어링이 아니라 이 결정이었습니다.

8월 12일 알림에는 무엇이 떴고, 어떻게 읽어야 하는가

2026년 8월 12일 새벽 배치에서 조건을 통과한 종목은 넷이었습니다. 삼성바이오로직스가 통합 75.9점으로 유일하게 매수 등급을 받았고, 3상에 완료 예정일까지 20일 남은 상태로 골든 시그널(매수 이상·3상·통합 60점 이상) 조건에도 걸렸습니다. 나머지 셋은 고바이오랩 55.3점(관망), 대원제약 50.9점(관망), 보령 37.1점(보유)이었습니다.

이것을 종목 추천으로 읽으면 안 되는 이유가 바로 위 문단의 성적표입니다. 이 점수는 「지금 이 종목이 오른다」가 아니라 「내가 정한 여섯 가지 조건에서 이 종목이 이만큼 나왔다」는 뜻입니다. 시스템의 실측 기대값이 아직 마이너스인 상태에서 나온 출력이라는 사실이 함께 읽혀야 정확합니다.

그럼 이 숫자를 어디에 쓰냐고 물으면, 저는 「후보를 줄이는 데」라고 답합니다. 국내 상장 제약·바이오는 수백 곳이고 임상은 그보다 훨씬 많습니다. 매일 아침 넷으로 줄여 주는 것만으로도 사람이 들여다볼 대상이 생깁니다. 그다음 판단은 여전히 사람이 합니다. 이 시스템은 주문을 내지 않습니다.

결과를 받아보거나 직접 만들어 보려면

매일 아침 나오는 결과는 텔레그램 공개 채널 t.me/ClinicalSignalKR 에서 그대로 볼 수 있습니다. 종목명, 등급, 시그널 조합, 임상 단계와 남은 일수, 통합 점수, 기술적 합의, 그리고 하단의 실측 성적표까지 운영자가 받는 것과 같은 본문이 올라갑니다. 좋아 보이게 편집한 판이 따로 있지 않습니다.

직접 만들어 보고 싶다면 필요한 재료는 전부 공개 데이터입니다. 임상 일정은 ClinicalTrials.gov 공개 API에서 가져옵니다. 공매도 잔고와 투자자별 매매 동향은 한국거래소가 공개합니다. 종가·거래량은 증권사나 공개 시세 API로 충분합니다. 유료 데이터 없이 시작할 수 있다는 뜻입니다.

만들 때 순서를 하나만 바꾸라고 하면 이걸 권합니다. 스코어링을 먼저 만들지 말고, 실측 결과를 기록하는 자리를 먼저 만드세요. 추천한 시점의 가격, 청산 시점의 가격, 실제 수익률을 저장하는 칸입니다. 이게 없으면 백테스트 숫자를 반증할 방법이 영영 생기지 않고, 그러면 무엇을 만들든 결국 잘 나온 숫자를 믿게 됩니다.