Insights·2026-08-13

What does it mean to predict pharma stocks from clinical trial data

It means filtering pharma and biotech names by trial schedules rather than by charts. When a Phase 3 readout is coming is already written down in a public registry called ClinicalTrials.gov, and institutional order flow starts moving roughly two months before the announcement rather than on the day. So the pipeline keeps only trials whose estimated completion falls inside 60 days, attaches short-selling and order-flow data, and folds six dimensions into a single score out of 100. This piece opens up that pipeline end to end and explains why the most important design decision was deleting a good-looking number from the screen.

임상 완료일 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 주소가 있다.
왼쪽이 보여주지 않기로 한 숫자, 오른쪽이 매 알림에 붙는 실측이다.

What ClinicalTrials.gov is, and why it counts as stock data

ClinicalTrials.gov is the clinical trial registry operated by the US National Institutes of Health. Pharmaceutical companies and hospitals worldwide register trials there when they begin. Registration is legally required for trials seeking US marketing approval, so most significant Korean pharma trials appear there as well. Anyone can query it for free, and there is a public API.

One of the registered fields is the estimated completion date: the date the sponsor itself has written down for when the trial is planned to end. What matters here is not its accuracy but its existence. The event that moves pharma and biotech prices most is the trial readout, and this field means roughly when that event will happen is disclosed in advance.

The perennial problem in predicting from market data is that you know neither what will happen nor when. Clinical trials are a rare domain where half of that is already solved. You do not know the content of the event, success or failure, but you roughly know its timing. That asymmetry is the starting point for this entire pipeline.

Why 60 days specifically

Buying on the day of the readout is late. The announcement arrives after the price has already begun absorbing it. Reviewing 77 past trial events, the correlation between institutional net buying and readout-day return was clear at the 30-day mark, and a large share of names that rose more than 5 percent gave much of it back. The old saying about buying the rumor and selling the news shows up directly in the data.

So the observation window is the two months before the readout. Watching begins at D-60, the judgment is made around D-30, and the position is closed before the announcement. The first version put a full year of trials into the candidate pool and the alerts became unusable. The complaint that too many names were coming through came from the actual user, which was me, so the window went from 365 days to 60. In the code it is a single constant.

That constant is shared by both the cron batch and the manual refresh, so changing one line changes both paths. You can widen it if you want a longer view, but the moment you do, a mass of low-scoring names comes with it.

How the filtering pipeline actually runs

A batch runs every morning in order. First, it pulls trials sponsored by Korean pharma and biotech companies from ClinicalTrials.gov. Second, it keeps only those whose estimated completion falls between 7 and 60 days out. Anything closer than 7 days is treated as already priced in and dropped. Third, the remaining trials are mapped to ticker symbols through a separate company-to-ticker mapping table.

Fourth, each ticker gets 60 days of order-flow data attached: short-selling balance ratio, institutional net buying, and foreign net buying. Fifth, that time series is split into an earlier half and a later half to ask whether the flow is accelerating. The signal is not that institutions are buying but that they are buying more in the later half.

Sixth, five technical strategies each run against the price data and return long, short, or neutral, and their consensus is computed. Seventh, all of it is folded into a single score. Finally the results are written to the database and pushed to Telegram.

What the six dimensions are measuring

Six axes are each scored 0 to 100 and combined into one weighted number. The weights are calibrated by backtest, but if the calibration sample is under 30 cases the calibrated values are discarded and the defaults are restored. That is the overfitting guard.

Above 75 is strong buy, above 60 is buy, above 45 is watch, above 30 is hold, and below that is avoid. One further condition applies. The top grade, strong buy, is only granted when at least three measured outcomes support it, because strong-buy calls that were never validated against measured results turned out to average negative realized returns.

The market dimension is, honestly, half dead right now. Excess-return-versus-market data is not yet collected, so a neutral constant of 50 goes in. Because of that, the code refuses any automatic calibration that tries to assign this dead dimension a large weight. A grid search once handed market a weight of 0.4, and giving 40 percent to a constant is not optimization, it is overfitting.

DimensionWeightWhat it looks at
Clinical25%Trial phase, days remaining to completion, pipeline activity
Order flow25%Combined pattern of institutional and foreign buying and short-selling balance
Backtest20%Measured past performance of the same grade and technical consensus pairing
Technical15%Long and short consensus across five strategies
Market10%Excess return versus market (fixed at neutral 50 while uncollected)
Indication5%Premium or discount by disease category

The strongest signal, and why its number was removed from the screen

Ten order-flow patterns are defined as named combinations. The best performing one is institutional buying accelerating in the later half while the short-selling ratio stays at or below 7 percent. Historically it averaged +8.43 percent with 94.12 percent of cases positive. The worst on the other end, institutional selling combined with foreign selling, averaged -6.63 percent with 10 percent positive.

94 percent is an attractive number. And this system does not show it in the alert.

The reason is simple. That 94.12 percent came from 17 cases. It is 16 out of 17. Seventeen cases is closer to anecdote than sample, and it swings hard if the conditions shift even slightly. Presenting a figure like that as if it were this stock's win rate is not analysis, it is advertising. The principle is written into the alert formatting code as a comment: combination constants are unvalidated backtest values and must not be exposed as forecasts, only actually measured returns may be shown, and the system's cumulative scorecard is disclosed transparently at the bottom.

So every alert carries a measured scorecard. As of 12 August, 15 recommendations have confirmed outcomes, averaging -2.6 percent with 27 percent positive. On a long-only basis the expected value is not yet above zero. It is an alert that reports its own losing record back to me every day.

Making numbers look good is easy. Pick a favorable window, do not grow the sample, write backtest constants as if they were track record. The hard part is deleting the good-looking number yourself and putting the unflattering measured one in its place. The hardest part of this pipeline was not the scoring. It was that decision.

What showed up in the 12 August alert, and how to read it

In the batch that ran early on 12 August 2026, four names passed the filters. Samsung Biologics was the only one to reach a buy grade at a composite 75.9, in Phase 3 with 20 days remaining to estimated completion, which also satisfied the golden signal condition of buy-or-better, Phase 3, and composite of 60 or more. The other three were Ko Bio Labs at 55.3 (watch), Daewon Pharmaceutical at 50.9 (watch), and Boryung at 37.1 (hold).

The reason this must not be read as a stock recommendation is the scorecard in the previous section. The score does not say this name will go up. It says this name scored this well against six conditions I chose. That it is output from a system whose measured expected value is still negative has to be read alongside it.

Asked what the number is good for, my answer is narrowing the field. There are hundreds of listed pharma and biotech names in Korea and far more trials. Cutting that to four every morning at least gives a person something to look at. The judgment after that is still human. This system does not place orders.

How to receive the output, or build your own

The daily output is visible as is on the public Telegram channel t.me/ClinicalSignalKR. Company name, grade, signal combination, trial phase and days remaining, composite score, technical consensus, and the measured scorecard at the bottom go out in the same body the operator receives. There is no separately polished edition.

If you want to build your own, every ingredient is public data. Trial schedules come from the ClinicalTrials.gov public API. Short-selling balances and investor-type trading flows are published by the Korea Exchange. Closing prices and volume are available from broker or public quote APIs. In other words you can start without paid data.

If you change one thing about the order of construction, make it this. Do not build the scoring first. Build the place where measured outcomes are recorded first: the columns for entry price, exit price, and realized return. Without it you will never have a way to falsify your backtest numbers, and then whatever you build, you will end up believing the flattering ones.